From 162fbe8a0c1577ebb69b4832c496714b828d1e16 Mon Sep 17 00:00:00 2001 From: Kevin Block <112961407+KevinBlock-GC@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:02:46 -0400 Subject: [PATCH 1/2] Allow overriding of the default stack index --- .../java/com/tunjid/androidx/MainActivity.kt | 1 + .../tabnav/navigator/MultipleStacksFragment.kt | 1 + libraryVersion.properties | 2 +- .../androidx/navigation/MultiStackNavigator.kt | 18 ++++++++++++++---- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/tunjid/androidx/MainActivity.kt b/app/src/main/java/com/tunjid/androidx/MainActivity.kt index 745b98ac..47adf0f8 100644 --- a/app/src/main/java/com/tunjid/androidx/MainActivity.kt +++ b/app/src/main/java/com/tunjid/androidx/MainActivity.kt @@ -37,6 +37,7 @@ class MainActivity : AppCompatActivity(), GlobalUiHost, Navigator.Controller { backStackType = MultiStackNavigator.BackStackType.Unlimited, stopInvalidNavigation = true, rootFunction = RouteFragment.Companion::newInstance, + initialIndex = 0 ) public override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt b/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt index 76ce9e41..4d1b7573 100644 --- a/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt +++ b/app/src/main/java/com/tunjid/androidx/tabnav/navigator/MultipleStacksFragment.kt @@ -57,6 +57,7 @@ class MultipleStacksFragment : Fragment(R.layout.fragment_multiple_stack) { stackCount = DESTINATIONS.size, containerId = R.id.inner_container, stopInvalidNavigation = true, + initialIndex = 0, rootFunction = { index -> MultipleStackChildFragment.newInstance(getChildName(index), 1) } diff --git a/libraryVersion.properties b/libraryVersion.properties index 230e9cc3..7de0a07b 100755 --- a/libraryVersion.properties +++ b/libraryVersion.properties @@ -6,7 +6,7 @@ view_version=1.2.0 material_version=1.0.4 functions_version=1.0.0 savedstate_version=1.0.1 -navigation_version=1.2.2 +navigation_version=1.2.3 recyclerview_version=1.2.0 viewpager2_version=1.0.0 communications_version=1.0.0 diff --git a/navigation/src/main/java/com/tunjid/androidx/navigation/MultiStackNavigator.kt b/navigation/src/main/java/com/tunjid/androidx/navigation/MultiStackNavigator.kt index b2a3bf0a..f66adbb5 100644 --- a/navigation/src/main/java/com/tunjid/androidx/navigation/MultiStackNavigator.kt +++ b/navigation/src/main/java/com/tunjid/androidx/navigation/MultiStackNavigator.kt @@ -26,6 +26,7 @@ const val MULTI_STACK_NAVIGATOR = "com.tunjid.androidx.navigation.MultiStackNavi fun Fragment.childMultiStackNavigationController( stackCount: Int, @IdRes containerId: Int, + initialIndex: Int, backStackType: MultiStackNavigator.BackStackType = MultiStackNavigator.BackStackType.UniqueEntries, stopInvalidNavigation: Boolean, rootFunction: (Int) -> Fragment, @@ -34,6 +35,7 @@ fun Fragment.childMultiStackNavigationController( stackCount = stackCount, stateContainer = savedStateFor(this@childMultiStackNavigationController, "$MULTI_STACK_NAVIGATOR-$containerId"), fragmentManager = childFragmentManager, + initialIndex = initialIndex, containerId = containerId, backStackType = backStackType, rootFunction = rootFunction, @@ -44,6 +46,7 @@ fun Fragment.childMultiStackNavigationController( fun FragmentActivity.multiStackNavigationController( stackCount: Int, @IdRes containerId: Int, + initialIndex: Int, backStackType: MultiStackNavigator.BackStackType = MultiStackNavigator.BackStackType.UniqueEntries, stopInvalidNavigation: Boolean, rootFunction: (Int) -> Fragment, @@ -52,6 +55,7 @@ fun FragmentActivity.multiStackNavigationController( stackCount = stackCount, stateContainer = savedStateFor(this@multiStackNavigationController, "$MULTI_STACK_NAVIGATOR-$containerId"), fragmentManager = supportFragmentManager, + initialIndex = initialIndex, containerId = containerId, backStackType = backStackType, rootFunction = rootFunction, @@ -66,6 +70,7 @@ fun FragmentActivity.multiStackNavigationController( class MultiStackNavigator( stackCount: Int, stateContainer: LifecycleSavedStateContainer, + private val initialIndex: Int, private val fragmentManager: FragmentManager, @IdRes override val containerId: Int, backStackType: BackStackType = BackStackType.UniqueEntries, @@ -98,7 +103,11 @@ class MultiStackNavigator( } private val indices = 0 until stackCount - internal val stackVisitor = MultiStackVisitor(backStackType, stateContainer) + internal val stackVisitor = MultiStackVisitor( + backStackType = backStackType, + container = stateContainer, + initialIndex = initialIndex + ) internal val stackFragments: List get() = indices @@ -300,7 +309,8 @@ class StackFragment : Fragment() { internal class MultiStackVisitor( private val backStackType: MultiStackNavigator.BackStackType, - private val container: LifecycleSavedStateContainer + private val container: LifecycleSavedStateContainer, + private val initialIndex: Int ) { init { @@ -309,7 +319,7 @@ internal class MultiStackVisitor( } private val delegate = (container.savedState.getIntArray(NAV_STACK_ORDER) - ?: intArrayOf(0)).toMutableList() + ?: intArrayOf(initialIndex)).toMutableList() fun visit(value: Int) = delegate.run { when (backStackType) { @@ -333,7 +343,7 @@ internal class MultiStackVisitor( fun leaveAll(): Unit = delegate.run { clear() - add(0) + add(initialIndex) saveState() } From dad2cbb5ea1f87d96135c1e0e37d108b460ad484 Mon Sep 17 00:00:00 2001 From: Kevin Block <112961407+KevinBlock-GC@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:48:43 -0400 Subject: [PATCH 2/2] Fix and add tests --- .../navigation/MultiStackNavigatorTest.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt b/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt index 11528d9f..406192fc 100644 --- a/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt +++ b/navigation/src/androidTest/java/com/tunjid/androidx/navigation/MultiStackNavigatorTest.kt @@ -325,11 +325,26 @@ class MultiStackNavigatorTest { } } + @Test + fun passingInitialIndexShows() = runBlocking { + val multiStackNavigator = multiStackNavigator(MultiStackNavigator.BackStackType.UniqueEntries, initialIndex = 1) + assertSame(ROOT_TAG_1, multiStackNavigator.current?.tag) + } + + @Test + fun noInitialIndexShowsFirstIndex() = runBlocking { + val multiStackNavigator = multiStackNavigator(MultiStackNavigator.BackStackType.UniqueEntries, initialIndex = 0) + assertSame(ROOT_TAG_0, multiStackNavigator.current?.tag) + } + private fun MultiStackNavigator.assertNavigatorIndices(vararg tags: String?) { tags.forEachIndexed { index, tag -> assertEquals(tag, navigatorAt(index)?.current?.tag) } } - private fun multiStackNavigator(type: MultiStackNavigator.BackStackType): MultiStackNavigator { + private fun multiStackNavigator( + type: MultiStackNavigator.BackStackType, + initialIndex: Int = 0 + ): MultiStackNavigator { var navigator: MultiStackNavigator? = null instrumentation.runOnMainSync { navigator = MultiStackNavigator( @@ -339,6 +354,7 @@ class MultiStackNavigatorTest { backStackType = type, containerId = activity.containerId, stopInvalidNavigation = true, + initialIndex = initialIndex ) { NavigationTestFragment.newInstance(TAGS[it]) } }