From c0d0a212f8ea046414dc37344ba7926c825b3da7 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Mon, 13 Apr 2026 16:03:43 +0200 Subject: [PATCH 1/5] feat(examples): Add Paparazzi snapshot setup to instrumentation sample Enable the Sentry snapshot integration in the android-instrumentation-sample by applying the Paparazzi plugin and adding @Preview composables. The CI pre-merge workflow now records and uploads snapshots when SENTRY_AUTH_TOKEN is available. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/pre-merge.yaml | 4 ++++ .../build.gradle.kts | 6 ++++++ .../instrumentation/ui/ComposeActivity.kt | 21 +++++++++++++++---- gradle/libs.versions.toml | 2 ++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pre-merge.yaml b/.github/workflows/pre-merge.yaml index 3a29d778f..dc9bf0992 100644 --- a/.github/workflows/pre-merge.yaml +++ b/.github/workflows/pre-merge.yaml @@ -46,3 +46,7 @@ jobs: - name: Build the Debug and Release variants run: ./gradlew assemble + + - name: Record and upload snapshots + if: env.SENTRY_AUTH_TOKEN != '' + run: ./gradlew :examples:android-instrumentation-sample:sentryUploadSnapshotsStagingDebug diff --git a/examples/android-instrumentation-sample/build.gradle.kts b/examples/android-instrumentation-sample/build.gradle.kts index cd7c3253c..3504f0963 100644 --- a/examples/android-instrumentation-sample/build.gradle.kts +++ b/examples/android-instrumentation-sample/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.androidApplication) version BuildPluginsVersion.AGP alias(libs.plugins.kotlinAndroid) version BuildPluginsVersion.KOTLIN alias(libs.plugins.ksp) + alias(libs.plugins.paparazzi) id("io.sentry.android.gradle") id("io.sentry.kotlin.compiler.gradle") } @@ -86,6 +87,7 @@ dependencies { implementation(libs.sample.androidx.composeFoundation) implementation(libs.sample.androidx.composeFoundationLayout) implementation(libs.sample.androidx.composeNavigation) + implementation(libs.sample.androidx.composeUiToolingPreview) implementation(libs.sample.coroutines.core) implementation(libs.sample.coroutines.android) @@ -113,4 +115,8 @@ sentry { telemetryDsn.set(CI.SENTRY_SDKS_DSN) tracingInstrumentation { forceInstrumentDependencies.set(true) } + + snapshots { + enabled.set(true) + } } diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt index 8671c6200..09b1c9619 100644 --- a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt +++ b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicText import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -62,25 +63,37 @@ class ComposeActivity : ComponentActivity() { } } +@Preview @Composable -fun HomeText(navController: NavController, pillShape: RoundedCornerShape) { +fun HomeTextPreview() { + HomeText(pillShape = RoundedCornerShape(50)) +} + +@Composable +fun HomeText(navController: NavController? = null, pillShape: RoundedCornerShape) { BasicText( modifier = Modifier.border(2.dp, Color.Gray, pillShape) .clip(pillShape) - .clickable { navController.navigate(Destination.Details.route) } + .clickable { navController?.navigate(Destination.Details.route) } .padding(24.dp), text = "Home. Tap to go to Details.", ) } +@Preview +@Composable +fun DetailsTextPreview() { + DetailsText(pillShape = RoundedCornerShape(50)) +} + @Composable -fun DetailsText(navController: NavController, pillShape: RoundedCornerShape) { +fun DetailsText(navController: NavController? = null, pillShape: RoundedCornerShape) { BasicText( modifier = Modifier.border(2.dp, Color.Gray, pillShape) .clip(pillShape) - .clickable { navController.popBackStack() } + .clickable { navController?.popBackStack() } .padding(24.dp), text = "Details. Tap or press back to return.", ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 46d2472bb..462286294 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,6 +28,7 @@ buildConfig = { id = "com.github.gmazzo.buildconfig", version = "4.2.0" } springBoot = { id = "org.springframework.boot", version = "3.4.1" } springDependencyManagement = { id = "io.spring.dependency-management", version = "1.1.7" } composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version = "2.1.0" } +paparazzi = { id = "app.cash.paparazzi", version = "2.0.0-alpha04" } [libraries] junit = { group = "junit", name = "junit", version = "4.13.2" } @@ -70,6 +71,7 @@ sample-androidx-composeNavigation = "androidx.navigation:navigation-compose:2.5. sample-androidx-composeActivity = "androidx.activity:activity-compose:1.4.0" sample-androidx-composeFoundation = "androidx.compose.foundation:foundation:1.5.4" sample-androidx-composeFoundationLayout = "androidx.compose.foundation:foundation-layout:1.5.4" +sample-androidx-composeUiToolingPreview = "androidx.compose.ui:ui-tooling-preview:1.5.4" sample-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "sampleCoroutines" } sample-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "sampleCoroutines" } From 951e48371f09d7b3e79e1817115642d0114c2662 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Mon, 13 Apr 2026 16:09:59 +0200 Subject: [PATCH 2/5] fix(examples): Use rememberNavController() in previews Keep the original composable signatures non-nullable by passing a dummy NavController from rememberNavController() in the preview functions instead. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../samples/instrumentation/ui/ComposeActivity.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt index 09b1c9619..714891046 100644 --- a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt +++ b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt @@ -66,16 +66,16 @@ class ComposeActivity : ComponentActivity() { @Preview @Composable fun HomeTextPreview() { - HomeText(pillShape = RoundedCornerShape(50)) + HomeText(rememberNavController(), RoundedCornerShape(50)) } @Composable -fun HomeText(navController: NavController? = null, pillShape: RoundedCornerShape) { +fun HomeText(navController: NavController, pillShape: RoundedCornerShape) { BasicText( modifier = Modifier.border(2.dp, Color.Gray, pillShape) .clip(pillShape) - .clickable { navController?.navigate(Destination.Details.route) } + .clickable { navController.navigate(Destination.Details.route) } .padding(24.dp), text = "Home. Tap to go to Details.", ) @@ -84,16 +84,16 @@ fun HomeText(navController: NavController? = null, pillShape: RoundedCornerShape @Preview @Composable fun DetailsTextPreview() { - DetailsText(pillShape = RoundedCornerShape(50)) + DetailsText(rememberNavController(), RoundedCornerShape(50)) } @Composable -fun DetailsText(navController: NavController? = null, pillShape: RoundedCornerShape) { +fun DetailsText(navController: NavController, pillShape: RoundedCornerShape) { BasicText( modifier = Modifier.border(2.dp, Color.Gray, pillShape) .clip(pillShape) - .clickable { navController?.popBackStack() } + .clickable { navController.popBackStack() } .padding(24.dp), text = "Details. Tap or press back to return.", ) From d01af3477eee30f347fadc3ceaab9e0f3b886d52 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Mon, 13 Apr 2026 16:52:03 +0200 Subject: [PATCH 3/5] fix(ci): Bump JDK to 21 for Paparazzi compatibility Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/pre-merge.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pre-merge.yaml b/.github/workflows/pre-merge.yaml index dc9bf0992..5853f1e2e 100644 --- a/.github/workflows/pre-merge.yaml +++ b/.github/workflows/pre-merge.yaml @@ -28,7 +28,7 @@ jobs: uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - name: Setup Gradle uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # pin@v4 From a05806d67a43b637cf01a7cb4a1d329f1f92e047 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Mon, 13 Apr 2026 17:13:04 +0200 Subject: [PATCH 4/5] style(examples): Apply spotless formatting Co-Authored-By: Claude Opus 4.6 (1M context) --- .../io/sentry/samples/instrumentation/ui/ComposeActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt index 714891046..f69d90b05 100644 --- a/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt +++ b/examples/android-instrumentation-sample/src/main/java/io/sentry/samples/instrumentation/ui/ComposeActivity.kt @@ -12,11 +12,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicText import androidx.compose.runtime.Composable -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.navigation.NavController import androidx.navigation.compose.NavHost From aa263dc57ad26c41891a6af6b8f940c8c5136ba2 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Mon, 13 Apr 2026 17:37:14 +0200 Subject: [PATCH 5/5] Fix spotless --- examples/android-instrumentation-sample/build.gradle.kts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/android-instrumentation-sample/build.gradle.kts b/examples/android-instrumentation-sample/build.gradle.kts index 3504f0963..04487f9bf 100644 --- a/examples/android-instrumentation-sample/build.gradle.kts +++ b/examples/android-instrumentation-sample/build.gradle.kts @@ -116,7 +116,5 @@ sentry { tracingInstrumentation { forceInstrumentDependencies.set(true) } - snapshots { - enabled.set(true) - } + snapshots { enabled.set(true) } }