Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/java/com/tunjid/androidx/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
2 changes: 1 addition & 1 deletion libraryVersion.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -339,6 +354,7 @@ class MultiStackNavigatorTest {
backStackType = type,
containerId = activity.containerId,
stopInvalidNavigation = true,
initialIndex = initialIndex
) { NavigationTestFragment.newInstance(TAGS[it]) }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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<StackFragment>
get() = indices
Expand Down Expand Up @@ -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 {
Expand All @@ -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) {
Expand All @@ -333,7 +343,7 @@ internal class MultiStackVisitor(

fun leaveAll(): Unit = delegate.run {
clear()
add(0)
add(initialIndex)
saveState()
}

Expand Down
Loading