From fe1de082c79ced2068ca292f805485c9d2a2ec04 Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 14:25:45 +0200 Subject: [PATCH 01/16] Introduce foundational `crashlogging` module --- app/build.gradle.kts | 1 + .../com/gravatar/app/GravatarApplication.kt | 5 ++ .../java/com/gravatar/app/di/AppModule.kt | 2 + crashlogging/build.gradle.kts | 18 ++++++++ .../ContextBasedLocaleProvider.kt | 13 ++++++ .../GravatarCrashLoggingDataProvider.kt | 46 +++++++++++++++++++ .../gravatar/crashlogging/LocaleProvider.kt | 7 +++ .../crashlogging/di/CrashLoggingModule.kt | 29 ++++++++++++ gradle/libs.versions.toml | 2 + settings.gradle.kts | 1 + 10 files changed, 124 insertions(+) create mode 100644 crashlogging/build.gradle.kts create mode 100644 crashlogging/src/main/java/com/gravatar/crashlogging/ContextBasedLocaleProvider.kt create mode 100644 crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt create mode 100644 crashlogging/src/main/java/com/gravatar/crashlogging/LocaleProvider.kt create mode 100644 crashlogging/src/main/java/com/gravatar/crashlogging/di/CrashLoggingModule.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 503a88fc..34bf5349 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { implementation(project(":clock")) implementation(project(":design")) implementation(project(":networkMonitor")) + implementation(project(":crashlogging")) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) diff --git a/app/src/main/java/com/gravatar/app/GravatarApplication.kt b/app/src/main/java/com/gravatar/app/GravatarApplication.kt index 5b28f6df..d594021f 100644 --- a/app/src/main/java/com/gravatar/app/GravatarApplication.kt +++ b/app/src/main/java/com/gravatar/app/GravatarApplication.kt @@ -1,7 +1,9 @@ package com.gravatar.app import android.app.Application +import com.automattic.android.tracks.crashlogging.CrashLogging import com.gravatar.app.di.appModule +import org.koin.android.ext.android.get import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin @@ -14,5 +16,8 @@ class GravatarApplication : Application() { androidContext(this@GravatarApplication) modules(appModule) } + + val crashLogging: CrashLogging = get() + crashLogging.initialize() } } diff --git a/app/src/main/java/com/gravatar/app/di/AppModule.kt b/app/src/main/java/com/gravatar/app/di/AppModule.kt index 7396acbe..2c872745 100644 --- a/app/src/main/java/com/gravatar/app/di/AppModule.kt +++ b/app/src/main/java/com/gravatar/app/di/AppModule.kt @@ -5,6 +5,7 @@ import com.gravatar.app.clock.di.clockModule import com.gravatar.app.homeUi.di.homeUiModule import com.gravatar.app.loginUi.di.loginUiModule import com.gravatar.app.networkmonitor.di.networkMonitorModule +import com.gravatar.crashlogging.di.crashLoggingModule import org.koin.dsl.module val appModule = module { @@ -16,5 +17,6 @@ val appModule = module { clockModule, networkMonitorModule, buildConfigModule, + crashLoggingModule, ) } diff --git a/crashlogging/build.gradle.kts b/crashlogging/build.gradle.kts new file mode 100644 index 00000000..dd17a8b7 --- /dev/null +++ b/crashlogging/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + alias(libs.plugins.gravatar.android.library) + alias(libs.plugins.kotlin.android) +} + +android { + namespace = "com.gravatar.crashlogging" + buildFeatures.buildConfig = true +} + +dependencies { + implementation(project.dependencies.platform(libs.koin.bom)) + implementation(libs.koin.core) + implementation(libs.koin.android) + api(libs.automattic.crashlogging) + implementation(libs.kotlinx.coroutines) + implementation(libs.androidx.core.ktx) +} diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/ContextBasedLocaleProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/ContextBasedLocaleProvider.kt new file mode 100644 index 00000000..599f8ac9 --- /dev/null +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/ContextBasedLocaleProvider.kt @@ -0,0 +1,13 @@ +package com.gravatar.crashlogging + +import android.app.Application +import androidx.core.os.ConfigurationCompat +import java.util.Locale + +internal class ContextBasedLocaleProvider( + private val context: Application, +) : LocaleProvider { + override fun provideLocale(): Locale? { + return ConfigurationCompat.getLocales(context.resources.configuration)[0] + } +} diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt new file mode 100644 index 00000000..1ce4f22f --- /dev/null +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -0,0 +1,46 @@ +package com.gravatar.crashlogging + +import com.automattic.android.tracks.crashlogging.CrashLoggingDataProvider +import com.automattic.android.tracks.crashlogging.CrashLoggingUser +import com.automattic.android.tracks.crashlogging.EventLevel +import com.automattic.android.tracks.crashlogging.ExtraKnownKey +import com.automattic.android.tracks.crashlogging.PerformanceMonitoringConfig +import com.automattic.android.tracks.crashlogging.ReleaseName +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow + +internal class GravatarCrashLoggingDataProvider( + localeProvider: LocaleProvider +) : CrashLoggingDataProvider { + + override val applicationContextProvider = emptyFlow>() + + override val buildType = BuildConfig.BUILD_TYPE + + override val enableCrashLoggingLogs = BuildConfig.DEBUG + + override val locale = localeProvider.provideLocale() + + override val performanceMonitoringConfig = PerformanceMonitoringConfig.Disabled + + override val releaseName = ReleaseName.SetByTracksLibrary + + override val sentryDSN: String = "" + + override val user: Flow = emptyFlow() + + override fun crashLoggingEnabled(): Boolean = true + + override fun extraKnownKeys(): List = emptyList() + + override fun provideExtrasForEvent( + currentExtras: Map, + eventLevel: EventLevel + ): Map = emptyMap() + + override fun shouldDropWrappingException( + module: String, + type: String, + value: String + ): Boolean = false +} \ No newline at end of file diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/LocaleProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/LocaleProvider.kt new file mode 100644 index 00000000..ddb3e3d6 --- /dev/null +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/LocaleProvider.kt @@ -0,0 +1,7 @@ +package com.gravatar.crashlogging + +import java.util.Locale + +internal fun interface LocaleProvider { + fun provideLocale(): Locale? +} diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/di/CrashLoggingModule.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/di/CrashLoggingModule.kt new file mode 100644 index 00000000..73412d52 --- /dev/null +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/di/CrashLoggingModule.kt @@ -0,0 +1,29 @@ +package com.gravatar.crashlogging.di + +import com.automattic.android.tracks.crashlogging.CrashLoggingDataProvider +import com.automattic.android.tracks.crashlogging.CrashLoggingProvider +import com.gravatar.crashlogging.ContextBasedLocaleProvider +import com.gravatar.crashlogging.GravatarCrashLoggingDataProvider +import com.gravatar.crashlogging.LocaleProvider +import org.koin.android.ext.koin.androidApplication +import org.koin.core.module.dsl.bind +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.module + +val crashLoggingModule = module { + factory { + ContextBasedLocaleProvider( + context = androidApplication() + ) + } + factoryOf(::GravatarCrashLoggingDataProvider) { + bind() + } + single { + CrashLoggingProvider.createInstance( + context = get(), + dataProvider = get(), + appScope = get() + ) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 99639ff2..2ecc4115 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,6 +29,7 @@ androidxTestCore = "1.6.1" constraintLayout = "1.1.0" qrose= "1.0.1" moshi = "1.15.2" +core = "1.16.0" [libraries] kotlinx-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinCoroutines" } @@ -42,6 +43,7 @@ androidx-material3 = { group = "androidx.compose.material3", name = "material3" androidx-constraintLayout-compose = { group = "androidx.constraintlayout", name = "constraintlayout-compose", version.ref = "constraintLayout" } androidx-test-core = { group = "androidx.test", name = "core", version.ref = "androidxTestCore" } # Tracks - Analytics and Crash Reporting +automattic-crashlogging = { module = "com.automattic.tracks:crashlogging", version.ref = "tracks" } automattic-tracks = { module = "com.automattic:Automattic-Tracks-Android", version.ref = "tracks" } androidx-ui = { group = "androidx.compose.ui", name = "ui" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 2046cba4..f9774c22 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -40,3 +40,4 @@ include(":clock") include(":design") include(":networkMonitor") include(":api") +include(":crashlogging") From 248dc1f32d42bcc0e2d72abd775acfc51e818229 Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 14:49:09 +0200 Subject: [PATCH 02/16] Provide a valid Sentry DSN --- .configure | 2 +- .configure-files/secrets.properties.enc | Bin 320 -> 416 bytes crashlogging/build.gradle.kts | 14 ++++++++++++++ .../GravatarCrashLoggingDataProvider.kt | 2 +- loginUi/build.gradle.kts | 5 ++--- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.configure b/.configure index 6d696dca..626e2924 100644 --- a/.configure +++ b/.configure @@ -1,7 +1,7 @@ { "project_name": "Gravatar-Android", "branch": "trunk", - "pinned_hash": "8045b892223ecaf5d62dd0cd2dc3165c6ffd44d7", + "pinned_hash": "3c8238c6aa7b0098bd4ccf24e0a7b6178e3ee2a7", "files_to_copy": [ { "file": "android/Gravatar-Android/secrets.properties", diff --git a/.configure-files/secrets.properties.enc b/.configure-files/secrets.properties.enc index d490c69f5c2410656de0ff64a0305de27a375848..0b858af603fd5ed1013effafed2e9caf5a5780f7 100644 GIT binary patch delta 120 zcmV-;0Ehp;0-yu1FadB|AO)Z=>La3Ci{G26le-t&z{Ab#2<;^H6w`_77}6F69(x^@ zy9oc|-OCZSw2SdLD?#%rq1QnGM|e29`a{)*Pq7zmU;2X5rJ+0mctI-V!TvBWM+aCT asbTa3%L1YEW|r3^7DMsX$taH-`ZaK=13C}@ delta 24 gcmZ3$e1K_#0i(dpk{b{5Y-A5SfB2{%S?Ndw0ESQto&W#< diff --git a/crashlogging/build.gradle.kts b/crashlogging/build.gradle.kts index dd17a8b7..85ea3da5 100644 --- a/crashlogging/build.gradle.kts +++ b/crashlogging/build.gradle.kts @@ -1,11 +1,25 @@ +import java.util.Properties + plugins { alias(libs.plugins.gravatar.android.library) alias(libs.plugins.kotlin.android) } +fun secretsProperties(): Properties { + return rootProject.extra["secretsProperties"] as Properties +} + android { namespace = "com.gravatar.crashlogging" buildFeatures.buildConfig = true + + defaultConfig { + buildConfigField( + "String", + "SENTRY_DSN", + "\"${secretsProperties()["sentryDsn"]?.toString() ?: ""}\"", + ) + } } dependencies { diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index 1ce4f22f..48bf9767 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -25,7 +25,7 @@ internal class GravatarCrashLoggingDataProvider( override val releaseName = ReleaseName.SetByTracksLibrary - override val sentryDSN: String = "" + override val sentryDSN: String = BuildConfig.SENTRY_DSN override val user: Flow = emptyFlow() diff --git a/loginUi/build.gradle.kts b/loginUi/build.gradle.kts index 99c0aa69..41748bfc 100644 --- a/loginUi/build.gradle.kts +++ b/loginUi/build.gradle.kts @@ -1,4 +1,3 @@ -import java.io.FileInputStream import java.util.Properties plugins { @@ -7,7 +6,7 @@ plugins { alias(libs.plugins.gravatar.android.compose) } -fun localProperties(): Properties { +fun secretsProperties(): Properties { return rootProject.extra["secretsProperties"] as Properties } @@ -16,7 +15,7 @@ android { buildFeatures.buildConfig = true defaultConfig { - localProperties().let { properties -> + secretsProperties().let { properties -> buildConfigField( "String", "OAUTH_CLIENT_ID", From 7cffc1ca68361109d3ba030a3d17c244f4d86ad9 Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 15:39:55 +0200 Subject: [PATCH 03/16] Introduce&configure Sentry Gradle Plugin --- build-logic/convention/build.gradle.kts | 1 + ...GravatarAndroidApplicationConventionPlugin.kt | 16 ++++++++++++++++ gradle/libs.versions.toml | 3 ++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 76fb5c45..b17fc4ce 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { compileOnly(libs.compose.compiler.gradlePlugin) compileOnly(libs.detekt.gradlePlugin) implementation(libs.roborazzi.gradlePlugin) + implementation(libs.sentry.gradlePlugin) } tasks { diff --git a/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt index 6ef1175b..eefffee4 100644 --- a/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt @@ -2,6 +2,8 @@ import com.android.build.api.dsl.ApplicationExtension import com.android.build.gradle.AppPlugin import com.gravatar.app.configureDetekt import com.gravatar.app.configureKotlinAndroid +import io.sentry.android.gradle.SentryPlugin +import io.sentry.android.gradle.extensions.SentryPluginExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -18,6 +20,7 @@ class GravatarAndroidApplicationConventionPlugin : Plugin { with(target) { apply() apply() + apply() extensions.configure { configureKotlinAndroid(this) @@ -35,6 +38,8 @@ class GravatarAndroidApplicationConventionPlugin : Plugin { checkDependencies = true } } + + configureSentry() configureDetekt() } } @@ -76,4 +81,15 @@ class GravatarAndroidApplicationConventionPlugin : Plugin { } } } + + private fun Project.configureSentry() { + configure { + includeProguardMapping.set(System.getenv("CI").toBoolean()) + includeSourceContext.set(System.getenv("CI").toBoolean()) + authToken.set(System.getenv("SENTRY_AUTH_TOKEN")) + + autoInstallation.enabled.set(false) + ignoredBuildTypes.set(listOf("debug")) + } + } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2ecc4115..2743f787 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxTestCore = "1.6.1" constraintLayout = "1.1.0" qrose= "1.0.1" moshi = "1.15.2" -core = "1.16.0" +sentry = "5.9.0" [libraries] kotlinx-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinCoroutines" } @@ -92,6 +92,7 @@ kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-pl compose-compiler-gradlePlugin = { group = "org.jetbrains.kotlin.plugin.compose", name = "org.jetbrains.kotlin.plugin.compose.gradle.plugin", version.ref = "kotlin" } detekt-gradlePlugin = { group = "io.gitlab.arturbosch.detekt", name = "io.gitlab.arturbosch.detekt.gradle.plugin", version.ref = "detekt" } roborazzi-gradlePlugin = { group = "io.github.takahirom.roborazzi", name = "io.github.takahirom.roborazzi.gradle.plugin", version.ref = "roborazzi" } +sentry-gradlePlugin = { group = "io.sentry", name = "sentry-android-gradle-plugin", version.ref = "sentry" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } From f672f1836269f864d15401e4d160501e1c907064 Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 15:40:24 +0200 Subject: [PATCH 04/16] Temp: send Sentry issue on the app start --- app/src/main/java/com/gravatar/app/MainActivity.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/gravatar/app/MainActivity.kt b/app/src/main/java/com/gravatar/app/MainActivity.kt index b091424d..45e2df54 100644 --- a/app/src/main/java/com/gravatar/app/MainActivity.kt +++ b/app/src/main/java/com/gravatar/app/MainActivity.kt @@ -4,8 +4,10 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import com.automattic.android.tracks.crashlogging.CrashLogging import com.gravatar.app.design.theme.GravatarAppTheme import com.gravatar.app.navigation.RootNavigation +import org.koin.android.ext.android.get class MainActivity : ComponentActivity() { @@ -13,6 +15,9 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) enableEdgeToEdge() + val crashLogging: CrashLogging = get() + crashLogging.sendReport(exception = Exception("Dev test"), message = "This is just a test") + setContent { GravatarAppTheme { RootNavigation() From eb5826b67459d06dc3df1e4712b41b5765aaa41f Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 16:07:20 +0200 Subject: [PATCH 05/16] Provide user data to Sentry issue --- crashlogging/build.gradle.kts | 2 ++ .../GravatarCrashLoggingDataProvider.kt | 13 +++++++++++-- userComponent/build.gradle.kts | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/crashlogging/build.gradle.kts b/crashlogging/build.gradle.kts index 85ea3da5..c74dab02 100644 --- a/crashlogging/build.gradle.kts +++ b/crashlogging/build.gradle.kts @@ -23,6 +23,8 @@ android { } dependencies { + implementation(project(":userComponent")) + implementation(project.dependencies.platform(libs.koin.bom)) implementation(libs.koin.core) implementation(libs.koin.android) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index 48bf9767..c0876fbe 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -6,11 +6,14 @@ import com.automattic.android.tracks.crashlogging.EventLevel import com.automattic.android.tracks.crashlogging.ExtraKnownKey import com.automattic.android.tracks.crashlogging.PerformanceMonitoringConfig import com.automattic.android.tracks.crashlogging.ReleaseName +import com.gravatar.app.usercomponent.domain.repository.UserRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.map internal class GravatarCrashLoggingDataProvider( - localeProvider: LocaleProvider + localeProvider: LocaleProvider, + private val profileRepository: UserRepository ) : CrashLoggingDataProvider { override val applicationContextProvider = emptyFlow>() @@ -27,7 +30,13 @@ internal class GravatarCrashLoggingDataProvider( override val sentryDSN: String = BuildConfig.SENTRY_DSN - override val user: Flow = emptyFlow() + override val user: Flow = profileRepository.getProfile().map { profile -> + CrashLoggingUser( + userID = profile?.userId?.toString(), + email = null, + username = profile?.displayName, + ) + } override fun crashLoggingEnabled(): Boolean = true diff --git a/userComponent/build.gradle.kts b/userComponent/build.gradle.kts index 80e94584..7b6f2f4b 100644 --- a/userComponent/build.gradle.kts +++ b/userComponent/build.gradle.kts @@ -30,7 +30,7 @@ dependencies { implementation(libs.ktor.okhttp) implementation(libs.ktor.content.negotiation) implementation(libs.ktor.serialization.json) - implementation(libs.gravatar.core) + api(libs.gravatar.core) // Room implementation(libs.room.runtime) From ef87a6cf10a462d3084e4d534c7ecfa285ac3c6b Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 16:07:50 +0200 Subject: [PATCH 06/16] Add empty line --- .../gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index c0876fbe..d304430c 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -52,4 +52,4 @@ internal class GravatarCrashLoggingDataProvider( type: String, value: String ): Boolean = false -} \ No newline at end of file +} From f1595f3e23bdd78f1b4ff22b6c3938fdaaa641ea Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 17:07:51 +0200 Subject: [PATCH 07/16] Set org and project name directly in the `SentryPluginExtension` --- .../kotlin/GravatarAndroidApplicationConventionPlugin.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt index eefffee4..ccaeb728 100644 --- a/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/GravatarAndroidApplicationConventionPlugin.kt @@ -84,9 +84,12 @@ class GravatarAndroidApplicationConventionPlugin : Plugin { private fun Project.configureSentry() { configure { + org.set("a8c") + projectName.set("gravatar-android") + authToken.set(System.getenv("SENTRY_AUTH_TOKEN")) + includeProguardMapping.set(System.getenv("CI").toBoolean()) includeSourceContext.set(System.getenv("CI").toBoolean()) - authToken.set(System.getenv("SENTRY_AUTH_TOKEN")) autoInstallation.enabled.set(false) ignoredBuildTypes.set(listOf("debug")) From 25e9146f5048a71f77ea2f73e1f9c4f2756890bf Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 17:59:21 +0200 Subject: [PATCH 08/16] Update tracks to the newest stable version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2743f787..b89fd9e1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ retrofit = "3.0.0" roborazzi = "1.45.1" robolectric = "4.14.1" room = "2.7.2" -tracks = "6.0.3" +tracks = "6.0.5" turbine = "1.2.1" browser = "1.8.0" ktor = "3.1.3" From f27f8cb67d10f8c7da620e8b7e4415938c2a440b Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 18:16:43 +0200 Subject: [PATCH 09/16] `userRepository` doesn't have to be a field in `GravatarCrashLoggingDataProvider` --- .../gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index d304430c..22fd435e 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.map internal class GravatarCrashLoggingDataProvider( localeProvider: LocaleProvider, - private val profileRepository: UserRepository + userRepository: UserRepository ) : CrashLoggingDataProvider { override val applicationContextProvider = emptyFlow>() @@ -30,7 +30,7 @@ internal class GravatarCrashLoggingDataProvider( override val sentryDSN: String = BuildConfig.SENTRY_DSN - override val user: Flow = profileRepository.getProfile().map { profile -> + override val user: Flow = userRepository.getProfile().map { profile -> CrashLoggingUser( userID = profile?.userId?.toString(), email = null, From 791097cd715cf08165ae4962db93efe1edef8f7a Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Tue, 12 Aug 2025 18:19:09 +0200 Subject: [PATCH 10/16] Remove koin-bom dependency It doesn't seem to be needed in the current configuration --- crashlogging/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crashlogging/build.gradle.kts b/crashlogging/build.gradle.kts index c74dab02..4d20c4e6 100644 --- a/crashlogging/build.gradle.kts +++ b/crashlogging/build.gradle.kts @@ -25,10 +25,10 @@ android { dependencies { implementation(project(":userComponent")) - implementation(project.dependencies.platform(libs.koin.bom)) implementation(libs.koin.core) implementation(libs.koin.android) - api(libs.automattic.crashlogging) implementation(libs.kotlinx.coroutines) implementation(libs.androidx.core.ktx) + + api(libs.automattic.crashlogging) } From c5383e7ef0759b2fe7faccd7f1f42a6c31b850ee Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Wed, 13 Aug 2025 17:09:36 +0200 Subject: [PATCH 11/16] Use `Profile#hash` for crashlogging user's mail --- .../gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index 22fd435e..23a0ef60 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -33,7 +33,7 @@ internal class GravatarCrashLoggingDataProvider( override val user: Flow = userRepository.getProfile().map { profile -> CrashLoggingUser( userID = profile?.userId?.toString(), - email = null, + email = profile?.hash, username = profile?.displayName, ) } From a0f1392a6c9038b61349dd79381a73b905fdc3cf Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Wed, 13 Aug 2025 17:16:42 +0200 Subject: [PATCH 12/16] When app runs in `debug`, set a constant value for crashlogging release --- .../crashlogging/GravatarCrashLoggingDataProvider.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index 23a0ef60..f211a2f4 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -26,7 +26,11 @@ internal class GravatarCrashLoggingDataProvider( override val performanceMonitoringConfig = PerformanceMonitoringConfig.Disabled - override val releaseName = ReleaseName.SetByTracksLibrary + override val releaseName = if (BuildConfig.DEBUG) { + ReleaseName.SetByApplication(DEBUG_RELEASE_NAME) + } else { + ReleaseName.SetByTracksLibrary + } override val sentryDSN: String = BuildConfig.SENTRY_DSN @@ -52,4 +56,8 @@ internal class GravatarCrashLoggingDataProvider( type: String, value: String ): Boolean = false + + companion object { + const val DEBUG_RELEASE_NAME = "debug" + } } From 0399e57cf9b522c7e5cad3d564048f8b9c2be41a Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Wed, 13 Aug 2025 17:21:50 +0200 Subject: [PATCH 13/16] Remove redundant type declarations for properties and function return types. --- .../crashlogging/GravatarCrashLoggingDataProvider.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index f211a2f4..e2ca2a77 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -32,9 +32,9 @@ internal class GravatarCrashLoggingDataProvider( ReleaseName.SetByTracksLibrary } - override val sentryDSN: String = BuildConfig.SENTRY_DSN + override val sentryDSN = BuildConfig.SENTRY_DSN - override val user: Flow = userRepository.getProfile().map { profile -> + override val user = userRepository.getProfile().map { profile -> CrashLoggingUser( userID = profile?.userId?.toString(), email = profile?.hash, @@ -42,20 +42,20 @@ internal class GravatarCrashLoggingDataProvider( ) } - override fun crashLoggingEnabled(): Boolean = true + override fun crashLoggingEnabled() = true - override fun extraKnownKeys(): List = emptyList() + override fun extraKnownKeys() = emptyList() override fun provideExtrasForEvent( currentExtras: Map, eventLevel: EventLevel - ): Map = emptyMap() + ) = emptyMap() override fun shouldDropWrappingException( module: String, type: String, value: String - ): Boolean = false + ) = false companion object { const val DEBUG_RELEASE_NAME = "debug" From f376c136259144a217ec7d7a429d5c8c3a09405b Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Wed, 13 Aug 2025 17:22:23 +0200 Subject: [PATCH 14/16] Remove unused import --- .../gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index e2ca2a77..10a2ee9a 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -7,7 +7,6 @@ import com.automattic.android.tracks.crashlogging.ExtraKnownKey import com.automattic.android.tracks.crashlogging.PerformanceMonitoringConfig import com.automattic.android.tracks.crashlogging.ReleaseName import com.gravatar.app.usercomponent.domain.repository.UserRepository -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.map From 2159ba2cfa633b8869809e8dc52214939e194210 Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Wed, 13 Aug 2025 17:23:00 +0200 Subject: [PATCH 15/16] Disable crash logging. It's planned to be enabled in the future. --- .../gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt index 10a2ee9a..8fbf2f91 100644 --- a/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt +++ b/crashlogging/src/main/java/com/gravatar/crashlogging/GravatarCrashLoggingDataProvider.kt @@ -41,7 +41,7 @@ internal class GravatarCrashLoggingDataProvider( ) } - override fun crashLoggingEnabled() = true + override fun crashLoggingEnabled() = false override fun extraKnownKeys() = emptyList() From d90ac40fdf9891413aa5dc6e4b564f37a7b4a202 Mon Sep 17 00:00:00 2001 From: Wojtek Zieba Date: Wed, 13 Aug 2025 17:25:38 +0200 Subject: [PATCH 16/16] Revert "Temp: send Sentry issue on the app start" This reverts commit f672f1836269f864d15401e4d160501e1c907064. --- app/src/main/java/com/gravatar/app/MainActivity.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/com/gravatar/app/MainActivity.kt b/app/src/main/java/com/gravatar/app/MainActivity.kt index 45e2df54..b091424d 100644 --- a/app/src/main/java/com/gravatar/app/MainActivity.kt +++ b/app/src/main/java/com/gravatar/app/MainActivity.kt @@ -4,10 +4,8 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import com.automattic.android.tracks.crashlogging.CrashLogging import com.gravatar.app.design.theme.GravatarAppTheme import com.gravatar.app.navigation.RootNavigation -import org.koin.android.ext.android.get class MainActivity : ComponentActivity() { @@ -15,9 +13,6 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) enableEdgeToEdge() - val crashLogging: CrashLogging = get() - crashLogging.sendReport(exception = Exception("Dev test"), message = "This is just a test") - setContent { GravatarAppTheme { RootNavigation()