Skip to content
This repository has been archived by the owner on Jan 31, 2025. It is now read-only.

Commit

Permalink
add navigateWithLog
Browse files Browse the repository at this point in the history
  • Loading branch information
matsumo0922 committed Dec 15, 2023
1 parent c936571 commit 2cdeda2
Show file tree
Hide file tree
Showing 58 changed files with 352 additions and 96 deletions.
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ dependencies {
implementation(project(":core:repository"))
implementation(project(":core:ui"))
implementation(project(":core:billing"))
implementation(project(":core:logs"))

implementation(project(":feature:report"))
implementation(project(":feature:library"))
Expand Down
20 changes: 19 additions & 1 deletion app/src/main/java/caios/android/fanbox/PixiViewApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import android.content.Intent
import android.os.Build
import caios.android.fanbox.core.common.PixiViewConfig
import caios.android.fanbox.core.common.PixiViewDebugTree
import caios.android.fanbox.core.logs.puree.PureeConfigurator
import caios.android.fanbox.core.repository.UserDataRepository
import caios.android.fanbox.feature.report.CrashReportActivity
import coil.Coil
import coil.ImageLoader
Expand All @@ -17,12 +19,18 @@ import com.google.android.material.color.DynamicColors
import com.google.firebase.FirebaseApp
import com.google.firebase.FirebaseOptions
import dagger.hilt.android.HiltAndroidApp
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject

@HiltAndroidApp
class PixiViewApplication : Application() {

@Inject
lateinit var userDataRepository: UserDataRepository

@Inject
lateinit var pixiViewConfig: PixiViewConfig

Expand All @@ -39,8 +47,8 @@ class PixiViewApplication : Application() {
startCrushReportActivity(e)
}

setupLogger()
setupCoil()

setupFirebase()
}

Expand Down Expand Up @@ -101,4 +109,14 @@ class PixiViewApplication : Application() {

FirebaseApp.initializeApp(this, builder.build())
}

private fun setupLogger() {
MainScope().launch {
PureeConfigurator.configure(
context = this@PixiViewApplication,
pixiViewConfig = pixiViewConfig,
userData = userDataRepository.userData.first(),
)
}
}
}
1 change: 1 addition & 0 deletions core/billing/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ dependencies {
implementation(project(":core:common"))
implementation(project(":core:repository"))
implementation(project(":core:datastore"))
implementation(project(":core:logs"))

api(libs.bundles.billing)
}

This file was deleted.

1 change: 1 addition & 0 deletions core/datastore/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ protobuf {
dependencies {
implementation(project(":core:common"))
implementation(project(":core:model"))
implementation(project(":core:logs"))

implementation(libs.androidx.datastore)
implementation(libs.protobuf.kotlin.lite)
Expand Down
1 change: 1 addition & 0 deletions core/logs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
18 changes: 18 additions & 0 deletions core/logs/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
plugins {
id("pixiview.library")
id("pixiview.detekt")
id("pixiview.hilt")
id("pixiview.firebase")
alias(libs.plugins.protobuf)
}

android {
namespace = "caios.android.fanbox.core.logs"
}

dependencies {
implementation(project(":core:common"))
implementation(project(":core:model"))

implementation(libs.puree)
}
4 changes: 4 additions & 0 deletions core/logs/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

</manifest>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package caios.android.fanbox.core.common.logs
package caios.android.fanbox.core.logs

import org.json.JSONObject

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package caios.android.fanbox.core.common.logs.category
package caios.android.fanbox.core.logs.category

import kotlinx.serialization.json.JsonObject

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package caios.android.fanbox.core.logs.category

import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put

// This class is automatically generated by generate-log-classes.
sealed class NavigationLog : LogCategory {
class Navigate internal constructor(
private val screenRoute: String
) : NavigationLog() {
override val properties: JsonObject = buildJsonObject {
put("event_category", "navigation")
put("event_name", "navigate")
put("screen_route", screenRoute)
}
}

companion object {
// 画面遷移したときのログ
fun navigate(
screenRoute: String
) = Navigate(screenRoute)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package caios.android.fanbox.core.logs.puree

import android.os.Build
import caios.android.fanbox.core.common.PixiViewConfig
import caios.android.fanbox.core.logs.CommonPayload
import caios.android.fanbox.core.model.BuildConfig
import caios.android.fanbox.core.model.UserData
import com.cookpad.puree.kotlin.PureeFilter
import org.json.JSONObject
import java.time.ZoneId

class PixiViewLogFilter(
private val pixiViewConfig: PixiViewConfig,
private val userData: UserData,
private val userAgent: String,
) : PureeFilter {

override fun applyFilter(log: JSONObject): JSONObject {
val commonPayload = CommonPayload(
pixiviewId = userData.pixiViewId,
userAgent = userAgent,
isPlus = userData.isPlusMode,
isDeveloper = userData.isDeveloperMode,
isTester = userData.isTestUser,
osVersion = Build.VERSION.SDK_INT.toString(),
applicationVariant = BuildConfig.BUILD_TYPE,
applicationVersionCode = pixiViewConfig.versionCode.toLong(),
applicationVersionName = pixiViewConfig.versionName,
timeZone = ZoneId.systemDefault().id
)

return commonPayload.applyToJsonObject(log)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package caios.android.fanbox.core.logs.puree

import com.cookpad.puree.kotlin.output.PureeBufferedOutput
import org.json.JSONObject
import timber.log.Timber
import java.time.Duration

class PixiViewLogOutput: PureeBufferedOutput("pixiview_activity_log") {

override val flushInterval: Duration = Duration.ofSeconds(15)

override fun emit(logs: List<JSONObject>, onSuccess: () -> Unit, onFailed: (Throwable) -> Unit) {
Timber.d("PureeLog: $logs")
onSuccess.invoke()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package caios.android.fanbox.core.logs.puree

import caios.android.fanbox.core.logs.category.LogCategory
import com.cookpad.puree.kotlin.PureeLog
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put

internal object PixiViewActivityLogger {
fun post(logCategory: LogCategory) = logCategory.run {
PixiViewActivityLog(properties).also {
Puree.send(it)
}
}
}

@Serializable
data class PixiViewActivityLog internal constructor(
private var properties: JsonObject,
) : PureeLog {

init {
properties = buildJsonObject {
for (key in properties.keys) {
put(key, properties[key]!!)
}

put("table_name", tableName)
}
}

companion object {
private const val tableName: String = "android_pixiview_activity"
}
}

fun LogCategory.send() = PixiViewActivityLogger.post(this)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package caios.android.fanbox.core.logs.puree

import com.cookpad.puree.kotlin.PureeLog
import com.cookpad.puree.kotlin.PureeLogger

object Puree {
private var pureeLoggerInstance: LoggerWrapper? = null
private val pureeLogger: LoggerWrapper
get() = checkNotNull(pureeLoggerInstance) { "PureeLogger instance is not set" }

fun setPureeLogger(pureeLogger: LoggerWrapper) {
pureeLoggerInstance = pureeLogger
}

@JvmStatic
fun send(log: PureeLog) {
pureeLogger.postLog(log)
}

@JvmStatic
fun flush() {
pureeLogger.flush()
}

interface LoggerWrapper {
fun postLog(log: PureeLog)
fun flush()
}
}

class PureeLoggerWrapper(private val logger: PureeLogger) : Puree.LoggerWrapper {
override fun postLog(log: PureeLog) {
logger.postLog(log)
}

override fun flush() {
logger.flush()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package caios.android.fanbox.core.logs.puree

import android.content.Context
import androidx.lifecycle.ProcessLifecycleOwner
import caios.android.fanbox.core.common.PixiViewConfig
import caios.android.fanbox.core.model.UserData
import com.cookpad.puree.kotlin.PureeLogger
import com.cookpad.puree.kotlin.store.DbPureeLogStore
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json

object PureeConfigurator {

@OptIn(ExperimentalSerializationApi::class)
private val formatter = Json {
isLenient = true
prettyPrint = true
ignoreUnknownKeys = true
coerceInputValues = true
encodeDefaults = true
explicitNulls = false
}

fun configure(
context: Context,
pixiViewConfig: PixiViewConfig,
userData: UserData,
) {
val logger = buildPureeLogger(context, pixiViewConfig, userData)

Puree.setPureeLogger(PureeLoggerWrapper(logger))
Puree.flush()
}

private fun buildPureeLogger(
context: Context,
pixiViewConfig: PixiViewConfig,
userData: UserData,
): PureeLogger {
return PureeLogger.Builder(
lifecycle = ProcessLifecycleOwner.get().lifecycle,
logSerializer = PureeKotlinSerializer(formatter),
logStore = DbPureeLogStore(context, "puree-kotlin.db")
)
.filter(
PixiViewLogFilter(pixiViewConfig, userData, userAgent = "PixiView"),
PixiViewActivityLog::class.java
)
.output(
PixiViewLogOutput(),
PixiViewActivityLog::class.java
)
.build()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package caios.android.fanbox.core.logs.puree

import com.cookpad.puree.kotlin.PureeLog
import com.cookpad.puree.kotlin.serializer.PureeLogSerializer
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.json.JSONObject

class PureeKotlinSerializer(
private val formatter: Json,
) : PureeLogSerializer {
override fun serialize(log: PureeLog): JSONObject {
return JSONObject(formatter.encodeToString(log as PixiViewActivityLog))
}
}
1 change: 1 addition & 0 deletions core/repository/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ dependencies {
implementation(project(":core:common"))
implementation(project(":core:model"))
implementation(project(":core:datastore"))
implementation(project(":core:logs"))

implementation(libs.bundles.ktor)
implementation(libs.androidx.paging)
Expand Down
Loading

0 comments on commit 2cdeda2

Please sign in to comment.