Skip to content

Commit 7ea1f4c

Browse files
committed
ref(android-nav3): Clarify route translator contracts
Document host callback containment and newest-first route processing for budgeted arguments.
1 parent 061c4c3 commit 7ea1f4c

2 files changed

Lines changed: 14 additions & 3 deletions

File tree

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import io.sentry.util.ExceptionUtils
66
import java.util.IdentityHashMap
77
import org.jetbrains.annotations.TestOnly
88

9-
/** Translates app-defined back stack entries into a list of input-ordered [Route]s. */
9+
/** Translates app-defined back stack entries into input-ordered [Route]s. */
1010
internal class RouteTranslator<T : Any>(
1111
private val resolvers: () -> RouteResolvers<T>,
1212
private val logger: ILogger,
@@ -16,7 +16,12 @@ internal class RouteTranslator<T : Any>(
1616
internal const val UNKNOWN_ROUTE_NAME = "/unknown"
1717
}
1818

19-
/** Translates the provided [backStackEntries] into [Route]s and returns them in input order. */
19+
/**
20+
* Translates the provided [backStackEntries] into [Route]s and returns them in input order.
21+
*
22+
* Callers should provide entries newest first so the shared argument budget preserves data for
23+
* the destinations most relevant to the current navigation state.
24+
*/
2025
fun translate(backStackEntries: List<T>): List<Route> {
2126
val warningState = WarningState()
2227
val sanitizer = ArgumentSanitizer(logger, warningState)
@@ -49,6 +54,7 @@ internal class RouteTranslator<T : Any>(
4954
try {
5055
resolvers.invoke().getName(backStackEntry)
5156
} catch (t: Throwable) {
57+
// Route name extractors are host app callbacks.
5258
ExceptionUtils.rethrowIfFatal(t)
5359
warningState.logNameExtractorFailureWarning(logger, t)
5460
return UNKNOWN_ROUTE_NAME
@@ -80,6 +86,7 @@ internal class RouteTranslator<T : Any>(
8086
try {
8187
resolvers.invoke().getArguments(backStackEntry) ?: return emptyMap()
8288
} catch (t: Throwable) {
89+
// Route argument extractors are host app callbacks.
8390
ExceptionUtils.rethrowIfFatal(t)
8491
logger.log(
8592
WARNING,
@@ -129,6 +136,7 @@ internal class RouteTranslator<T : Any>(
129136
logger.log(WARNING, drop.warning)
130137
emptyMap()
131138
} catch (t: Throwable) {
139+
// Extracted maps may invoke host app code while iterating or stringifying values.
132140
ExceptionUtils.rethrowIfFatal(t)
133141
logger.log(WARNING, STRUCTURE_WARNING, t)
134142
emptyMap()

‎sentry-android-navigation3/src/test/kotlin/io/sentry/compose/navigation3/RouteTranslatorTest.kt‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ class RouteTranslatorTest {
6060

6161
@Test
6262
fun `translate preserves newer entry arguments when the shared budget overflows`() {
63+
val newest = SettingsRoute("privacy")
64+
val middle = ProfileRoute("123")
65+
val oldest = HomeRoute()
6366
val sut =
6467
getSut(
6568
argumentsExtractor =
@@ -73,7 +76,7 @@ class RouteTranslatorTest {
7376
}
7477
)
7578

76-
val routes = sut.translate(listOf(SettingsRoute("privacy"), ProfileRoute("123"), HomeRoute()))
79+
val routes = sut.translate(listOf(newest, middle, oldest))
7780

7881
assertThat(routes).hasSize(3)
7982
assertThat(routes[0]).isEqualTo(Route("/SettingsRoute", mapOf("section" to "privacy")))

0 commit comments

Comments
 (0)