Skip to content

Commit b86ffdb

Browse files
committed
feat(sample): [Nav3 Lifecycle 5] Add multi-root scenarios
Add runnable multi-Activity and multi-Fragment Navigation 3 scenarios with shared transaction history so lifecycle handoffs can be exercised in the Android sample.\n\nRefs JAVA-274
1 parent efc6686 commit b86ffdb

19 files changed

Lines changed: 1238 additions & 61 deletions

File tree

‎sentry-android-navigation3/src/main/kotlin/io/sentry/compose/navigation3/SentryNavOptions.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package io.sentry.compose.navigation3
33
import androidx.compose.runtime.Immutable
44
import org.jetbrains.annotations.ApiStatus
55

6-
// Keep the default low: every captured entry may require argument extraction and recursive
6+
// Keep the default low, as every captured entry may require argument extraction and recursive
77
// sanitization when navigation changes are observed.
88
private const val DEFAULT_MAX_CAPTURED_BACK_STACK_ENTRIES = 5
99

‎sentry-android-navigation3/src/main/kotlin/io/sentry/compose/navigation3/lifecycle/StagedNavData.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import io.sentry.IScope
44
import io.sentry.PropagationContext
55

66
/**
7-
* Holds navigation state staged for publication: a screen name and back stack nav context.
7+
* Holds navigation state staged for publication.
88
*
99
* Only state that occupies a single slot in the shared [IScope] is staged. Nav events (i.e.,
1010
* breadcrumbs) only append to the scope, so they can't overwrite another instance's data and are

‎sentry-samples/sentry-samples-android/build.gradle.kts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ dependencies {
208208
implementation(libs.androidx.navigation3.runtime)
209209
implementation(libs.androidx.navigation3.ui)
210210
implementation(libs.androidx.recyclerview)
211+
implementation(libs.androidx.viewpager2)
211212
implementation(libs.androidx.browser)
212213
implementation(libs.androidx.room3.runtime)
213214
implementation(libs.bundles.androidx.room2)
@@ -230,6 +231,9 @@ dependencies {
230231

231232
debugImplementation(projects.sentryAndroidDistribution)
232233
debugImplementation(libs.leakcanary)
234+
235+
testImplementation(libs.google.truth)
236+
testImplementation(libs.kotlin.test.junit)
233237
}
234238

235239
abstract class ToggleNativeLoggingTask : Exec() {

‎sentry-samples/sentry-samples-android/src/main/AndroidManifest.xml‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,30 @@
123123
android:screenOrientation="portrait"
124124
android:theme="@style/AppTheme.Main" />
125125

126+
<activity
127+
android:name=".navigation.nav3.Nav3ProductsActivity"
128+
android:exported="false"
129+
android:screenOrientation="portrait"
130+
android:theme="@style/AppTheme.Main" />
131+
132+
<activity
133+
android:name=".navigation.nav3.Nav3CheckoutActivity"
134+
android:exported="false"
135+
android:screenOrientation="portrait"
136+
android:theme="@style/AppTheme.Main" />
137+
138+
<!-- No screenOrientation: translucent Activities can't request one on Android 8.0. -->
139+
<activity
140+
android:name=".navigation.nav3.Nav3TranslucentCheckoutActivity"
141+
android:exported="false"
142+
android:theme="@style/AppTheme.Main.Translucent" />
143+
144+
<activity
145+
android:name=".navigation.nav3.Nav3FragmentsActivity"
146+
android:exported="false"
147+
android:screenOrientation="portrait"
148+
android:theme="@style/AppTheme.Main" />
149+
126150
<activity
127151
android:name=".FrameDataForSpansActivity"
128152
android:exported="false" />

‎sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/navigation/nav3/Nav3Activity.kt‎

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import androidx.compose.ui.ExperimentalComposeUiApi
3939
import androidx.compose.ui.Modifier
4040
import androidx.compose.ui.draw.drawWithContent
4141
import androidx.compose.ui.platform.LocalContext
42+
import androidx.compose.ui.semantics.semantics
43+
import androidx.compose.ui.semantics.testTagsAsResourceId
4244
import androidx.navigation3.runtime.entryProvider
4345
import androidx.navigation3.ui.NavDisplay
4446
import io.sentry.compose.navigation3.SentryBackStackEntry
@@ -75,9 +77,6 @@ class Nav3Activity : ComponentActivity() {
7577

7678
private var routeWorkOptions by mutableStateOf(setOf(RouteWorkOption.MANUAL_CHILD_SPAN))
7779

78-
private var isTransactionHistoryActive = false
79-
private val transactionHistory =
80-
NavigationTransactionHistory(isActive = { isTransactionHistoryActive })
8180
private var showTransactionHistorySheet by mutableStateOf(false)
8281

8382
private var showActivityUiLoadTransactionDelayMessage = false
@@ -99,14 +98,14 @@ class Nav3Activity : ComponentActivity() {
9998
cancelCurrentActivityUiLoadTransaction()
10099
}
101100

102-
transactionHistory.install()
101+
NavigationTransactionHistory.install()
103102

104103
setContent {
105104
Nav3SampleTheme {
106105
Nav3SampleApp(
107106
performanceState = performanceState,
108107
configuration = configuration,
109-
transactions = transactionHistory.transactions,
108+
transactions = NavigationTransactionHistory.transactions,
110109
showActivityUiLoadTransactionDelayMessage = showActivityUiLoadTransactionDelayMessage,
111110
routeWorkOptions = routeWorkOptions,
112111
showTransactionHistorySheet = showTransactionHistorySheet,
@@ -124,13 +123,7 @@ class Nav3Activity : ComponentActivity() {
124123
}
125124
}
126125

127-
override fun onStart() {
128-
super.onStart()
129-
isTransactionHistoryActive = true
130-
}
131-
132126
override fun onStop() {
133-
isTransactionHistoryActive = false
134127
performanceState.stopAutomaticWork()
135128
super.onStop()
136129
}
@@ -139,7 +132,6 @@ class Nav3Activity : ComponentActivity() {
139132
if (isFinishing) {
140133
previousConfig.applyToCurrentOptions()
141134
}
142-
transactionHistory.uninstall()
143135
super.onDestroy()
144136
}
145137

@@ -361,7 +353,9 @@ private fun Nav3SampleApp(
361353
}
362354

363355
Scaffold(
364-
modifier = Modifier.fillMaxSize().safeDrawingPadding(),
356+
// Expose test tags as resource IDs so adb/uiautomator can target them.
357+
modifier =
358+
Modifier.fillMaxSize().safeDrawingPadding().semantics { testTagsAsResourceId = true },
365359
containerColor = MaterialTheme.colorScheme.background,
366360
topBar = {
367361
Nav3TopBar(
@@ -464,6 +458,28 @@ private fun Nav3SampleApp(
464458
)
465459
}
466460
}
461+
entry<Nav3Route.MultiActivity> { route ->
462+
TracedNav3Route(route, selectedScenario) {
463+
Nav3RouteWorkEffect(route, routeWorkOptions)
464+
MultiActivityRoute {
465+
activity?.startActivity(
466+
Intent(activity, Nav3ProductsActivity::class.java)
467+
.putExtras(Bundle().apply { putNav3SampleConfiguration(configuration) })
468+
)
469+
}
470+
}
471+
}
472+
entry<Nav3Route.MultiFragment> { route ->
473+
TracedNav3Route(route, selectedScenario) {
474+
Nav3RouteWorkEffect(route, routeWorkOptions)
475+
MultiFragmentRoute {
476+
activity?.startActivity(
477+
Intent(activity, Nav3FragmentsActivity::class.java)
478+
.putExtras(Bundle().apply { putNav3SampleConfiguration(configuration) })
479+
)
480+
}
481+
}
482+
}
467483
entry<Nav3Route.Landing> { route ->
468484
TracedNav3Route(route, selectedScenario) {
469485
Nav3RouteWorkEffect(route, routeWorkOptions)

0 commit comments

Comments
 (0)