diff --git a/backstack/api/android/backstack.api b/backstack/api/android/backstack.api index 2834bc2db..949be305f 100644 --- a/backstack/api/android/backstack.api +++ b/backstack/api/android/backstack.api @@ -16,7 +16,7 @@ public final class com/slack/circuit/backstack/BackStackKt { } public abstract interface class com/slack/circuit/backstack/NavDecoration { - public abstract fun DecoratedContent (Ljava/util/List;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V + public abstract fun DecoratedContent (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V } public final class com/slack/circuit/backstack/SaveableBackStack : com/slack/circuit/backstack/BackStack { diff --git a/backstack/api/backstack.klib.api b/backstack/api/backstack.klib.api index e556f7957..f67bce7a5 100644 --- a/backstack/api/backstack.klib.api +++ b/backstack/api/backstack.klib.api @@ -18,7 +18,7 @@ abstract interface <#A: com.slack.circuit.backstack/BackStack.Record> com.slack. } abstract interface com.slack.circuit.backstack/NavDecoration { // com.slack.circuit.backstack/NavDecoration|null[0] - abstract fun <#A1: com.slack.circuit.runtime.navigation/NavArgument> DecoratedContent(kotlin.collections/List<#A1>, androidx.compose.ui/Modifier, kotlin/Function3<#A1, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.backstack/NavDecoration.DecoratedContent|DecoratedContent(kotlin.collections.List<0:0>;androidx.compose.ui.Modifier;kotlin.Function3<0:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){0§}[0] + abstract fun <#A1: com.slack.circuit.runtime.navigation/NavArgument> DecoratedContent(com.slack.circuit.runtime.navigation/NavStackList<#A1>, androidx.compose.ui/Modifier, kotlin/Function3<#A1, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.backstack/NavDecoration.DecoratedContent|DecoratedContent(com.slack.circuit.runtime.navigation.NavStackList<0:0>;androidx.compose.ui.Modifier;kotlin.Function3<0:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){0§}[0] } final class com.slack.circuit.backstack/SaveableBackStack : com.slack.circuit.backstack/BackStack { // com.slack.circuit.backstack/SaveableBackStack|null[0] diff --git a/backstack/api/jvm/backstack.api b/backstack/api/jvm/backstack.api index 2834bc2db..949be305f 100644 --- a/backstack/api/jvm/backstack.api +++ b/backstack/api/jvm/backstack.api @@ -16,7 +16,7 @@ public final class com/slack/circuit/backstack/BackStackKt { } public abstract interface class com/slack/circuit/backstack/NavDecoration { - public abstract fun DecoratedContent (Ljava/util/List;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V + public abstract fun DecoratedContent (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V } public final class com/slack/circuit/backstack/SaveableBackStack : com/slack/circuit/backstack/BackStack { diff --git a/backstack/src/commonMain/kotlin/com/slack/circuit/backstack/Navigation.kt b/backstack/src/commonMain/kotlin/com/slack/circuit/backstack/Navigation.kt index 773bd8a61..fdf226759 100644 --- a/backstack/src/commonMain/kotlin/com/slack/circuit/backstack/Navigation.kt +++ b/backstack/src/commonMain/kotlin/com/slack/circuit/backstack/Navigation.kt @@ -19,6 +19,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.ui.Modifier import com.slack.circuit.runtime.navigation.NavArgument +import com.slack.circuit.runtime.navigation.NavStackList import com.slack.circuit.runtime.screen.Screen import kotlin.DeprecationLevel.WARNING @@ -27,7 +28,7 @@ import kotlin.DeprecationLevel.WARNING public interface NavDecoration { @Composable public fun DecoratedContent( - args: List, + args: NavStackList, modifier: Modifier, content: @Composable (T) -> Unit, ) diff --git a/circuit-foundation/api/android/circuit-foundation.api b/circuit-foundation/api/android/circuit-foundation.api index afff4be5f..45c4c8f31 100644 --- a/circuit-foundation/api/android/circuit-foundation.api +++ b/circuit-foundation/api/android/circuit-foundation.api @@ -180,8 +180,9 @@ public final class com/slack/circuit/foundation/NavEventKt { public final class com/slack/circuit/foundation/NavigableCircuitContentKt { public static final fun NavigableCircuitContent (Lcom/slack/circuit/runtime/Navigator;Lcom/slack/circuit/backstack/BackStack;Landroidx/compose/ui/Modifier;Lcom/slack/circuit/foundation/Circuit;Ljava/util/Map;Lcom/slack/circuit/backstack/NavDecoration;Lcom/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V + public static final fun NavigableCircuitContent (Lcom/slack/circuit/runtime/Navigator;Lcom/slack/circuit/runtime/navigation/NavStack;Landroidx/compose/ui/Modifier;Lcom/slack/circuit/foundation/Circuit;Ljava/util/Map;Lcom/slack/circuit/backstack/NavDecoration;Lcom/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V public static final fun getLocalAnsweringResultHandler ()Landroidx/compose/runtime/ProvidableCompositionLocal; - public static final fun getLocalBackStack ()Landroidx/compose/runtime/ProvidableCompositionLocal; + public static final fun getLocalNavStack ()Landroidx/compose/runtime/ProvidableCompositionLocal; } public final class com/slack/circuit/foundation/NavigatorDefaults { @@ -194,21 +195,20 @@ public final class com/slack/circuit/foundation/NavigatorDefaults$DefaultDecorat public fun ()V public fun Decoration (Landroidx/compose/animation/AnimatedContentScope;Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V public synthetic fun Decoration (Landroidx/compose/animation/AnimatedContentScope;Lcom/slack/circuit/foundation/animation/AnimatedNavState;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V - public fun targetState (Ljava/util/List;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; - public synthetic fun targetState (Ljava/util/List;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; + public fun targetState (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; + public synthetic fun targetState (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; public fun transitionSpec (Landroidx/compose/animation/AnimatedContentTransitionScope;Lcom/slack/circuit/foundation/animation/AnimatedNavEvent;)Landroidx/compose/animation/ContentTransform; - public fun updateTransition (Ljava/util/List;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; + public fun updateTransition (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; } public final class com/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState : com/slack/circuit/foundation/animation/AnimatedNavState { public static final field $stable I - public fun (Ljava/util/List;)V - public final fun component1 ()Ljava/util/List; - public final fun copy (Ljava/util/List;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; - public static synthetic fun copy$default (Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState;Ljava/util/List;ILjava/lang/Object;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; + public fun (Lcom/slack/circuit/runtime/navigation/NavStackList;)V + public final fun component1 ()Lcom/slack/circuit/runtime/navigation/NavStackList; + public final fun copy (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; + public static synthetic fun copy$default (Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState;Lcom/slack/circuit/runtime/navigation/NavStackList;ILjava/lang/Object;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; public fun equals (Ljava/lang/Object;)Z - public final fun getArgs ()Ljava/util/List; - public fun getBackStack ()Ljava/util/List; + public fun getNavStack ()Lcom/slack/circuit/runtime/navigation/NavStackList; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -222,7 +222,7 @@ public final class com/slack/circuit/foundation/NavigatorDefaults$DefaultDecorat public final class com/slack/circuit/foundation/NavigatorDefaults$EmptyDecoration : com/slack/circuit/backstack/NavDecoration { public static final field $stable I public static final field INSTANCE Lcom/slack/circuit/foundation/NavigatorDefaults$EmptyDecoration; - public fun DecoratedContent (Ljava/util/List;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V + public fun DecoratedContent (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V } public final class com/slack/circuit/foundation/NavigatorImplKt { @@ -235,6 +235,7 @@ public final class com/slack/circuit/foundation/NavigatorImplKt { public final class com/slack/circuit/foundation/Navigator_androidKt { public static final fun rememberCircuitNavigator (Lcom/slack/circuit/backstack/BackStack;ZLandroidx/compose/runtime/Composer;II)Lcom/slack/circuit/runtime/Navigator; + public static final fun rememberCircuitNavigator (Lcom/slack/circuit/runtime/navigation/NavStack;ZLandroidx/compose/runtime/Composer;II)Lcom/slack/circuit/runtime/Navigator; } public abstract interface class com/slack/circuit/foundation/NonPausablePresenter : com/slack/circuit/runtime/presenter/Presenter { @@ -256,14 +257,14 @@ public final class com/slack/circuit/foundation/RecordLifecycleKt { public final class com/slack/circuit/foundation/animation/AnimatedNavDecoration : com/slack/circuit/backstack/NavDecoration { public static final field $stable I public fun (Ljava/util/Map;Lcom/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory;)V - public fun DecoratedContent (Ljava/util/List;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V + public fun DecoratedContent (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V } public abstract interface class com/slack/circuit/foundation/animation/AnimatedNavDecorator { public abstract fun Decoration (Landroidx/compose/animation/AnimatedContentScope;Lcom/slack/circuit/foundation/animation/AnimatedNavState;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V - public abstract fun targetState (Ljava/util/List;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; + public abstract fun targetState (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; public abstract fun transitionSpec (Landroidx/compose/animation/AnimatedContentTransitionScope;Lcom/slack/circuit/foundation/animation/AnimatedNavEvent;)Landroidx/compose/animation/ContentTransform; - public abstract fun updateTransition (Ljava/util/List;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; + public abstract fun updateTransition (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; } public abstract interface class com/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory { @@ -271,6 +272,8 @@ public abstract interface class com/slack/circuit/foundation/animation/AnimatedN } public final class com/slack/circuit/foundation/animation/AnimatedNavEvent : java/lang/Enum { + public static final field Backward Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; + public static final field Forward Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; public static final field GoTo Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; public static final field Pop Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; public static final field RootReset Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; @@ -280,10 +283,8 @@ public final class com/slack/circuit/foundation/animation/AnimatedNavEvent : jav } public abstract interface class com/slack/circuit/foundation/animation/AnimatedNavState { - public abstract fun getBackStack ()Ljava/util/List; - public fun getBackStackDepth ()I - public fun getRoot ()Lcom/slack/circuit/runtime/navigation/NavArgument; - public fun getTop ()Lcom/slack/circuit/runtime/navigation/NavArgument; + public fun getActive ()Lcom/slack/circuit/runtime/screen/Screen; + public abstract fun getNavStack ()Lcom/slack/circuit/runtime/navigation/NavStackList; } public final class com/slack/circuit/foundation/animation/PartialContentTransform { diff --git a/circuit-foundation/api/circuit-foundation.klib.api b/circuit-foundation/api/circuit-foundation.klib.api index fb7bd236e..aa35d2224 100644 --- a/circuit-foundation/api/circuit-foundation.klib.api +++ b/circuit-foundation/api/circuit-foundation.klib.api @@ -11,6 +11,8 @@ open annotation class com.slack.circuit.foundation/DelicateCircuitFoundationApi } final enum class com.slack.circuit.foundation.animation/AnimatedNavEvent : kotlin/Enum { // com.slack.circuit.foundation.animation/AnimatedNavEvent|null[0] + enum entry Backward // com.slack.circuit.foundation.animation/AnimatedNavEvent.Backward|null[0] + enum entry Forward // com.slack.circuit.foundation.animation/AnimatedNavEvent.Forward|null[0] enum entry GoTo // com.slack.circuit.foundation.animation/AnimatedNavEvent.GoTo|null[0] enum entry Pop // com.slack.circuit.foundation.animation/AnimatedNavEvent.Pop|null[0] enum entry RootReset // com.slack.circuit.foundation.animation/AnimatedNavEvent.RootReset|null[0] @@ -33,8 +35,8 @@ abstract fun interface com.slack.circuit.foundation.navstack/ProvidedValues { // abstract interface <#A: com.slack.circuit.runtime.navigation/NavArgument, #B: com.slack.circuit.foundation.animation/AnimatedNavState> com.slack.circuit.foundation.animation/AnimatedNavDecorator { // com.slack.circuit.foundation.animation/AnimatedNavDecorator|null[0] abstract fun (androidx.compose.animation/AnimatedContentScope).Decoration(#B, kotlin/Function3<#A, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.foundation.animation/AnimatedNavDecorator.Decoration|Decoration@androidx.compose.animation.AnimatedContentScope(1:1;kotlin.Function3<1:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){}[0] abstract fun (androidx.compose.animation/AnimatedContentTransitionScope).transitionSpec(com.slack.circuit.foundation.animation/AnimatedNavEvent): androidx.compose.animation/ContentTransform // com.slack.circuit.foundation.animation/AnimatedNavDecorator.transitionSpec|transitionSpec@androidx.compose.animation.AnimatedContentTransitionScope(com.slack.circuit.foundation.animation.AnimatedNavEvent){}[0] - abstract fun targetState(kotlin.collections/List<#A>): #B // com.slack.circuit.foundation.animation/AnimatedNavDecorator.targetState|targetState(kotlin.collections.List<1:0>){}[0] - abstract fun updateTransition(kotlin.collections/List<#A>, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.animation.core/Transition<#B> // com.slack.circuit.foundation.animation/AnimatedNavDecorator.updateTransition|updateTransition(kotlin.collections.List<1:0>;androidx.compose.runtime.Composer?;kotlin.Int){}[0] + abstract fun targetState(com.slack.circuit.runtime.navigation/NavStackList<#A>): #B // com.slack.circuit.foundation.animation/AnimatedNavDecorator.targetState|targetState(com.slack.circuit.runtime.navigation.NavStackList<1:0>){}[0] + abstract fun updateTransition(com.slack.circuit.runtime.navigation/NavStackList<#A>, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.animation.core/Transition<#B> // com.slack.circuit.foundation.animation/AnimatedNavDecorator.updateTransition|updateTransition(com.slack.circuit.runtime.navigation.NavStackList<1:0>;androidx.compose.runtime.Composer?;kotlin.Int){}[0] abstract interface Factory { // com.slack.circuit.foundation.animation/AnimatedNavDecorator.Factory|null[0] abstract fun <#A2: com.slack.circuit.runtime.navigation/NavArgument> create(): com.slack.circuit.foundation.animation/AnimatedNavDecorator<#A2, *> // com.slack.circuit.foundation.animation/AnimatedNavDecorator.Factory.create|create(){0§}[0] @@ -44,14 +46,10 @@ abstract interface <#A: com.slack.circuit.runtime.navigation/NavArgument, #B: co abstract interface <#A: com.slack.circuit.runtime/CircuitUiState> com.slack.circuit.foundation/NonPausablePresenter : com.slack.circuit.runtime.presenter/Presenter<#A> // com.slack.circuit.foundation/NonPausablePresenter|null[0] abstract interface com.slack.circuit.foundation.animation/AnimatedNavState { // com.slack.circuit.foundation.animation/AnimatedNavState|null[0] - abstract val backStack // com.slack.circuit.foundation.animation/AnimatedNavState.backStack|{}backStack[0] - abstract fun (): kotlin.collections/List // com.slack.circuit.foundation.animation/AnimatedNavState.backStack.|(){}[0] - open val backStackDepth // com.slack.circuit.foundation.animation/AnimatedNavState.backStackDepth|{}backStackDepth[0] - open fun (): kotlin/Int // com.slack.circuit.foundation.animation/AnimatedNavState.backStackDepth.|(){}[0] - open val root // com.slack.circuit.foundation.animation/AnimatedNavState.root|{}root[0] - open fun (): com.slack.circuit.runtime.navigation/NavArgument // com.slack.circuit.foundation.animation/AnimatedNavState.root.|(){}[0] - open val top // com.slack.circuit.foundation.animation/AnimatedNavState.top|{}top[0] - open fun (): com.slack.circuit.runtime.navigation/NavArgument // com.slack.circuit.foundation.animation/AnimatedNavState.top.|(){}[0] + abstract val navStack // com.slack.circuit.foundation.animation/AnimatedNavState.navStack|{}navStack[0] + abstract fun (): com.slack.circuit.runtime.navigation/NavStackList // com.slack.circuit.foundation.animation/AnimatedNavState.navStack.|(){}[0] + open val active // com.slack.circuit.foundation.animation/AnimatedNavState.active|{}active[0] + open fun (): com.slack.circuit.runtime.screen/Screen // com.slack.circuit.foundation.animation/AnimatedNavState.active.|(){}[0] } abstract interface com.slack.circuit.foundation/EventListener { // com.slack.circuit.foundation/EventListener|null[0] @@ -143,7 +141,7 @@ sealed interface com.slack.circuit.foundation/NavEvent : com.slack.circuit.runti final class com.slack.circuit.foundation.animation/AnimatedNavDecoration : com.slack.circuit.backstack/NavDecoration { // com.slack.circuit.foundation.animation/AnimatedNavDecoration|null[0] constructor (kotlin.collections/Map, com.slack.circuit.foundation.animation/AnimatedScreenTransform>, com.slack.circuit.foundation.animation/AnimatedNavDecorator.Factory) // com.slack.circuit.foundation.animation/AnimatedNavDecoration.|(kotlin.collections.Map,com.slack.circuit.foundation.animation.AnimatedScreenTransform>;com.slack.circuit.foundation.animation.AnimatedNavDecorator.Factory){}[0] - final fun <#A1: com.slack.circuit.runtime.navigation/NavArgument> DecoratedContent(kotlin.collections/List<#A1>, androidx.compose.ui/Modifier, kotlin/Function3<#A1, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.foundation.animation/AnimatedNavDecoration.DecoratedContent|DecoratedContent(kotlin.collections.List<0:0>;androidx.compose.ui.Modifier;kotlin.Function3<0:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){0§}[0] + final fun <#A1: com.slack.circuit.runtime.navigation/NavArgument> DecoratedContent(com.slack.circuit.runtime.navigation/NavStackList<#A1>, androidx.compose.ui/Modifier, kotlin/Function3<#A1, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.foundation.animation/AnimatedNavDecoration.DecoratedContent|DecoratedContent(com.slack.circuit.runtime.navigation.NavStackList<0:0>;androidx.compose.ui.Modifier;kotlin.Function3<0:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){0§}[0] } final class com.slack.circuit.foundation.animation/PartialContentTransform { // com.slack.circuit.foundation.animation/PartialContentTransform|null[0] @@ -308,19 +306,17 @@ final object com.slack.circuit.foundation/NavigatorDefaults { // com.slack.circu final fun (androidx.compose.animation/AnimatedContentScope).Decoration(com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState<#A1>, kotlin/Function3<#A1, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.Decoration|Decoration@androidx.compose.animation.AnimatedContentScope(com.slack.circuit.foundation.NavigatorDefaults.DefaultDecorator.DefaultAnimatedState<1:0>;kotlin.Function3<1:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){}[0] final fun (androidx.compose.animation/AnimatedContentTransitionScope).transitionSpec(com.slack.circuit.foundation.animation/AnimatedNavEvent): androidx.compose.animation/ContentTransform // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.transitionSpec|transitionSpec@androidx.compose.animation.AnimatedContentTransitionScope(com.slack.circuit.foundation.animation.AnimatedNavEvent){}[0] - final fun targetState(kotlin.collections/List<#A1>): com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState<#A1> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.targetState|targetState(kotlin.collections.List<1:0>){}[0] - final fun updateTransition(kotlin.collections/List<#A1>, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.animation.core/Transition> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.updateTransition|updateTransition(kotlin.collections.List<1:0>;androidx.compose.runtime.Composer?;kotlin.Int){}[0] + final fun targetState(com.slack.circuit.runtime.navigation/NavStackList<#A1>): com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState<#A1> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.targetState|targetState(com.slack.circuit.runtime.navigation.NavStackList<1:0>){}[0] + final fun updateTransition(com.slack.circuit.runtime.navigation/NavStackList<#A1>, androidx.compose.runtime/Composer?, kotlin/Int): androidx.compose.animation.core/Transition> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.updateTransition|updateTransition(com.slack.circuit.runtime.navigation.NavStackList<1:0>;androidx.compose.runtime.Composer?;kotlin.Int){}[0] final class <#A2: com.slack.circuit.runtime.navigation/NavArgument> DefaultAnimatedState : com.slack.circuit.foundation.animation/AnimatedNavState { // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState|null[0] - constructor (kotlin.collections/List<#A2>) // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.|(kotlin.collections.List<1:0>){}[0] + constructor (com.slack.circuit.runtime.navigation/NavStackList<#A2>) // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.|(com.slack.circuit.runtime.navigation.NavStackList<1:0>){}[0] - final val args // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.args|{}args[0] - final fun (): kotlin.collections/List<#A2> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.args.|(){}[0] - final val backStack // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.backStack|{}backStack[0] - final fun (): kotlin.collections/List // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.backStack.|(){}[0] + final val navStack // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.navStack|{}navStack[0] + final fun (): com.slack.circuit.runtime.navigation/NavStackList<#A2> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.navStack.|(){}[0] - final fun component1(): kotlin.collections/List<#A2> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.component1|component1(){}[0] - final fun copy(kotlin.collections/List<#A2> = ...): com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState<#A2> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.copy|copy(kotlin.collections.List<1:0>){}[0] + final fun component1(): com.slack.circuit.runtime.navigation/NavStackList<#A2> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.component1|component1(){}[0] + final fun copy(com.slack.circuit.runtime.navigation/NavStackList<#A2> = ...): com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState<#A2> // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.copy|copy(com.slack.circuit.runtime.navigation.NavStackList<1:0>){}[0] final fun equals(kotlin/Any?): kotlin/Boolean // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.equals|equals(kotlin.Any?){}[0] final fun hashCode(): kotlin/Int // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.hashCode|hashCode(){}[0] final fun toString(): kotlin/String // com.slack.circuit.foundation/NavigatorDefaults.DefaultDecorator.DefaultAnimatedState.toString|toString(){}[0] @@ -332,7 +328,7 @@ final object com.slack.circuit.foundation/NavigatorDefaults { // com.slack.circu } final object EmptyDecoration : com.slack.circuit.backstack/NavDecoration { // com.slack.circuit.foundation/NavigatorDefaults.EmptyDecoration|null[0] - final fun <#A2: com.slack.circuit.runtime.navigation/NavArgument> DecoratedContent(kotlin.collections/List<#A2>, androidx.compose.ui/Modifier, kotlin/Function3<#A2, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.foundation/NavigatorDefaults.EmptyDecoration.DecoratedContent|DecoratedContent(kotlin.collections.List<0:0>;androidx.compose.ui.Modifier;kotlin.Function3<0:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){0§}[0] + final fun <#A2: com.slack.circuit.runtime.navigation/NavArgument> DecoratedContent(com.slack.circuit.runtime.navigation/NavStackList<#A2>, androidx.compose.ui/Modifier, kotlin/Function3<#A2, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int) // com.slack.circuit.foundation/NavigatorDefaults.EmptyDecoration.DecoratedContent|DecoratedContent(com.slack.circuit.runtime.navigation.NavStackList<0:0>;androidx.compose.ui.Modifier;kotlin.Function3<0:0,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){0§}[0] } } @@ -346,10 +342,10 @@ final val com.slack.circuit.foundation.navstack/com_slack_circuit_foundation_nav final val com.slack.circuit.foundation.navstack/com_slack_circuit_foundation_navstack_SaveableNavStack_Record$stableprop // com.slack.circuit.foundation.navstack/com_slack_circuit_foundation_navstack_SaveableNavStack_Record$stableprop|#static{}com_slack_circuit_foundation_navstack_SaveableNavStack_Record$stableprop[0] final val com.slack.circuit.foundation/LocalAnsweringResultHandler // com.slack.circuit.foundation/LocalAnsweringResultHandler|{}LocalAnsweringResultHandler[0] final fun (): androidx.compose.runtime/ProvidableCompositionLocal // com.slack.circuit.foundation/LocalAnsweringResultHandler.|(){}[0] -final val com.slack.circuit.foundation/LocalBackStack // com.slack.circuit.foundation/LocalBackStack|{}LocalBackStack[0] - final fun (): androidx.compose.runtime/ProvidableCompositionLocal?> // com.slack.circuit.foundation/LocalBackStack.|(){}[0] final val com.slack.circuit.foundation/LocalCircuit // com.slack.circuit.foundation/LocalCircuit|{}LocalCircuit[0] final fun (): androidx.compose.runtime/ProvidableCompositionLocal // com.slack.circuit.foundation/LocalCircuit.|(){}[0] +final val com.slack.circuit.foundation/LocalNavStack // com.slack.circuit.foundation/LocalNavStack|{}LocalNavStack[0] + final fun (): androidx.compose.runtime/ProvidableCompositionLocal?> // com.slack.circuit.foundation/LocalNavStack.|(){}[0] final val com.slack.circuit.foundation/LocalRecordLifecycle // com.slack.circuit.foundation/LocalRecordLifecycle|{}LocalRecordLifecycle[0] final fun (): androidx.compose.runtime/ProvidableCompositionLocal // com.slack.circuit.foundation/LocalRecordLifecycle.|(){}[0] final val com.slack.circuit.foundation/com_slack_circuit_foundation_AnsweringResultHandler$stableprop // com.slack.circuit.foundation/com_slack_circuit_foundation_AnsweringResultHandler$stableprop|#static{}com_slack_circuit_foundation_AnsweringResultHandler$stableprop[0] @@ -378,8 +374,9 @@ final var com.slack.circuit.foundation/config // com.slack.circuit.foundation/co final fun (androidx.compose.animation/ContentTransform).com.slack.circuit.foundation.animation/asPartialContentTransform(): com.slack.circuit.foundation.animation/PartialContentTransform // com.slack.circuit.foundation.animation/asPartialContentTransform|asPartialContentTransform@androidx.compose.animation.ContentTransform(){}[0] final fun (com.slack.circuit.runtime/Navigator).com.slack.circuit.foundation/onNavEvent(com.slack.circuit.foundation/NavEvent) // com.slack.circuit.foundation/onNavEvent|onNavEvent@com.slack.circuit.runtime.Navigator(com.slack.circuit.foundation.NavEvent){}[0] -final fun <#A: com.slack.circuit.backstack/BackStack.Record> com.slack.circuit.foundation/NavigableCircuitContent(com.slack.circuit.runtime/Navigator, com.slack.circuit.backstack/BackStack<#A>, androidx.compose.ui/Modifier?, com.slack.circuit.foundation/Circuit?, kotlin.collections/Map?, com.slack.circuit.backstack/NavDecoration?, com.slack.circuit.foundation.animation/AnimatedNavDecorator.Factory?, kotlin/Function4?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.slack.circuit.foundation/NavigableCircuitContent|NavigableCircuitContent(com.slack.circuit.runtime.Navigator;com.slack.circuit.backstack.BackStack<0:0>;androidx.compose.ui.Modifier?;com.slack.circuit.foundation.Circuit?;kotlin.collections.Map?;com.slack.circuit.backstack.NavDecoration?;com.slack.circuit.foundation.animation.AnimatedNavDecorator.Factory?;kotlin.Function4?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§}[0] +final fun <#A: com.slack.circuit.backstack/BackStack.Record> com.slack.circuit.foundation/NavigableCircuitContent(com.slack.circuit.runtime/Navigator, com.slack.circuit.backstack/BackStack<#A>, androidx.compose.ui/Modifier?, com.slack.circuit.foundation/Circuit?, kotlin.collections/Map?, com.slack.circuit.backstack/NavDecoration?, com.slack.circuit.foundation.animation/AnimatedNavDecorator.Factory?, kotlin/Function4?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.slack.circuit.foundation/NavigableCircuitContent|NavigableCircuitContent(com.slack.circuit.runtime.Navigator;com.slack.circuit.backstack.BackStack<0:0>;androidx.compose.ui.Modifier?;com.slack.circuit.foundation.Circuit?;kotlin.collections.Map?;com.slack.circuit.backstack.NavDecoration?;com.slack.circuit.foundation.animation.AnimatedNavDecorator.Factory?;kotlin.Function4?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§}[0] final fun <#A: com.slack.circuit.runtime.navigation/NavStack.Record> com.slack.circuit.foundation.navstack/providedValuesForNavStack(com.slack.circuit.runtime.navigation/NavStack<#A>, kotlin.collections/List>?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): kotlin.collections/Map<#A, com.slack.circuit.foundation.navstack/ProvidedValues> // com.slack.circuit.foundation.navstack/providedValuesForNavStack|providedValuesForNavStack(com.slack.circuit.runtime.navigation.NavStack<0:0>;kotlin.collections.List>?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§}[0] +final fun <#A: com.slack.circuit.runtime.navigation/NavStack.Record> com.slack.circuit.foundation/NavigableCircuitContent(com.slack.circuit.runtime/Navigator, com.slack.circuit.runtime.navigation/NavStack<#A>, androidx.compose.ui/Modifier?, com.slack.circuit.foundation/Circuit?, kotlin.collections/Map?, com.slack.circuit.backstack/NavDecoration?, com.slack.circuit.foundation.animation/AnimatedNavDecorator.Factory?, kotlin/Function4?, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.slack.circuit.foundation/NavigableCircuitContent|NavigableCircuitContent(com.slack.circuit.runtime.Navigator;com.slack.circuit.runtime.navigation.NavStack<0:0>;androidx.compose.ui.Modifier?;com.slack.circuit.foundation.Circuit?;kotlin.collections.Map?;com.slack.circuit.backstack.NavDecoration?;com.slack.circuit.foundation.animation.AnimatedNavDecorator.Factory?;kotlin.Function4?;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§}[0] final fun <#A: com.slack.circuit.runtime.screen/PopResult> com.slack.circuit.foundation/rememberAnsweringNavigator(com.slack.circuit.runtime/Navigator, kotlin.reflect/KClass<#A>, kotlin/Function1<#A, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int): com.slack.circuit.runtime/GoToNavigator // com.slack.circuit.foundation/rememberAnsweringNavigator|rememberAnsweringNavigator(com.slack.circuit.runtime.Navigator;kotlin.reflect.KClass<0:0>;kotlin.Function1<0:0,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int){0§}[0] final fun <#A: com.slack.circuit.runtime/CircuitUiState> com.slack.circuit.foundation/CircuitContent(com.slack.circuit.runtime.screen/Screen, com.slack.circuit.runtime.presenter/Presenter<#A>, com.slack.circuit.runtime.ui/Ui<#A>, androidx.compose.ui/Modifier?, com.slack.circuit.foundation/EventListener?, kotlin/Any?, kotlin/Boolean, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.slack.circuit.foundation/CircuitContent|CircuitContent(com.slack.circuit.runtime.screen.Screen;com.slack.circuit.runtime.presenter.Presenter<0:0>;com.slack.circuit.runtime.ui.Ui<0:0>;androidx.compose.ui.Modifier?;com.slack.circuit.foundation.EventListener?;kotlin.Any?;kotlin.Boolean;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§}[0] final fun <#A: kotlin/Any?> com.slack.circuit.foundation/pausableState(kotlin/String?, kotlin/Boolean, kotlin/Function2, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int): #A // com.slack.circuit.foundation/pausableState|pausableState(kotlin.String?;kotlin.Boolean;kotlin.Function2;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§}[0] diff --git a/circuit-foundation/api/jvm/circuit-foundation.api b/circuit-foundation/api/jvm/circuit-foundation.api index a092ec717..83eed8347 100644 --- a/circuit-foundation/api/jvm/circuit-foundation.api +++ b/circuit-foundation/api/jvm/circuit-foundation.api @@ -180,8 +180,9 @@ public final class com/slack/circuit/foundation/NavEventKt { public final class com/slack/circuit/foundation/NavigableCircuitContentKt { public static final fun NavigableCircuitContent (Lcom/slack/circuit/runtime/Navigator;Lcom/slack/circuit/backstack/BackStack;Landroidx/compose/ui/Modifier;Lcom/slack/circuit/foundation/Circuit;Ljava/util/Map;Lcom/slack/circuit/backstack/NavDecoration;Lcom/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V + public static final fun NavigableCircuitContent (Lcom/slack/circuit/runtime/Navigator;Lcom/slack/circuit/runtime/navigation/NavStack;Landroidx/compose/ui/Modifier;Lcom/slack/circuit/foundation/Circuit;Ljava/util/Map;Lcom/slack/circuit/backstack/NavDecoration;Lcom/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V public static final fun getLocalAnsweringResultHandler ()Landroidx/compose/runtime/ProvidableCompositionLocal; - public static final fun getLocalBackStack ()Landroidx/compose/runtime/ProvidableCompositionLocal; + public static final fun getLocalNavStack ()Landroidx/compose/runtime/ProvidableCompositionLocal; } public final class com/slack/circuit/foundation/NavigatorDefaults { @@ -194,21 +195,20 @@ public final class com/slack/circuit/foundation/NavigatorDefaults$DefaultDecorat public fun ()V public fun Decoration (Landroidx/compose/animation/AnimatedContentScope;Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V public synthetic fun Decoration (Landroidx/compose/animation/AnimatedContentScope;Lcom/slack/circuit/foundation/animation/AnimatedNavState;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V - public fun targetState (Ljava/util/List;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; - public synthetic fun targetState (Ljava/util/List;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; + public fun targetState (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; + public synthetic fun targetState (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; public fun transitionSpec (Landroidx/compose/animation/AnimatedContentTransitionScope;Lcom/slack/circuit/foundation/animation/AnimatedNavEvent;)Landroidx/compose/animation/ContentTransform; - public fun updateTransition (Ljava/util/List;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; + public fun updateTransition (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; } public final class com/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState : com/slack/circuit/foundation/animation/AnimatedNavState { public static final field $stable I - public fun (Ljava/util/List;)V - public final fun component1 ()Ljava/util/List; - public final fun copy (Ljava/util/List;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; - public static synthetic fun copy$default (Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState;Ljava/util/List;ILjava/lang/Object;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; + public fun (Lcom/slack/circuit/runtime/navigation/NavStackList;)V + public final fun component1 ()Lcom/slack/circuit/runtime/navigation/NavStackList; + public final fun copy (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; + public static synthetic fun copy$default (Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState;Lcom/slack/circuit/runtime/navigation/NavStackList;ILjava/lang/Object;)Lcom/slack/circuit/foundation/NavigatorDefaults$DefaultDecorator$DefaultAnimatedState; public fun equals (Ljava/lang/Object;)Z - public final fun getArgs ()Ljava/util/List; - public fun getBackStack ()Ljava/util/List; + public fun getNavStack ()Lcom/slack/circuit/runtime/navigation/NavStackList; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -222,7 +222,7 @@ public final class com/slack/circuit/foundation/NavigatorDefaults$DefaultDecorat public final class com/slack/circuit/foundation/NavigatorDefaults$EmptyDecoration : com/slack/circuit/backstack/NavDecoration { public static final field $stable I public static final field INSTANCE Lcom/slack/circuit/foundation/NavigatorDefaults$EmptyDecoration; - public fun DecoratedContent (Ljava/util/List;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V + public fun DecoratedContent (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V } public final class com/slack/circuit/foundation/NavigatorImplKt { @@ -252,14 +252,14 @@ public final class com/slack/circuit/foundation/RecordLifecycleKt { public final class com/slack/circuit/foundation/animation/AnimatedNavDecoration : com/slack/circuit/backstack/NavDecoration { public static final field $stable I public fun (Ljava/util/Map;Lcom/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory;)V - public fun DecoratedContent (Ljava/util/List;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V + public fun DecoratedContent (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V } public abstract interface class com/slack/circuit/foundation/animation/AnimatedNavDecorator { public abstract fun Decoration (Landroidx/compose/animation/AnimatedContentScope;Lcom/slack/circuit/foundation/animation/AnimatedNavState;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V - public abstract fun targetState (Ljava/util/List;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; + public abstract fun targetState (Lcom/slack/circuit/runtime/navigation/NavStackList;)Lcom/slack/circuit/foundation/animation/AnimatedNavState; public abstract fun transitionSpec (Landroidx/compose/animation/AnimatedContentTransitionScope;Lcom/slack/circuit/foundation/animation/AnimatedNavEvent;)Landroidx/compose/animation/ContentTransform; - public abstract fun updateTransition (Ljava/util/List;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; + public abstract fun updateTransition (Lcom/slack/circuit/runtime/navigation/NavStackList;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; } public abstract interface class com/slack/circuit/foundation/animation/AnimatedNavDecorator$Factory { @@ -267,6 +267,8 @@ public abstract interface class com/slack/circuit/foundation/animation/AnimatedN } public final class com/slack/circuit/foundation/animation/AnimatedNavEvent : java/lang/Enum { + public static final field Backward Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; + public static final field Forward Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; public static final field GoTo Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; public static final field Pop Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; public static final field RootReset Lcom/slack/circuit/foundation/animation/AnimatedNavEvent; @@ -276,10 +278,8 @@ public final class com/slack/circuit/foundation/animation/AnimatedNavEvent : jav } public abstract interface class com/slack/circuit/foundation/animation/AnimatedNavState { - public abstract fun getBackStack ()Ljava/util/List; - public fun getBackStackDepth ()I - public fun getRoot ()Lcom/slack/circuit/runtime/navigation/NavArgument; - public fun getTop ()Lcom/slack/circuit/runtime/navigation/NavArgument; + public fun getActive ()Lcom/slack/circuit/runtime/screen/Screen; + public abstract fun getNavStack ()Lcom/slack/circuit/runtime/navigation/NavStackList; } public final class com/slack/circuit/foundation/animation/PartialContentTransform { diff --git a/circuit-foundation/src/androidMain/kotlin/com/slack/circuit/foundation/Navigator.android.kt b/circuit-foundation/src/androidMain/kotlin/com/slack/circuit/foundation/Navigator.android.kt index c2472680c..c23449e41 100644 --- a/circuit-foundation/src/androidMain/kotlin/com/slack/circuit/foundation/Navigator.android.kt +++ b/circuit-foundation/src/androidMain/kotlin/com/slack/circuit/foundation/Navigator.android.kt @@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable import com.slack.circuit.backstack.BackStack import com.slack.circuit.backstack.BackStack.Record import com.slack.circuit.runtime.Navigator +import com.slack.circuit.runtime.navigation.NavStack import com.slack.circuit.runtime.screen.PopResult /** @@ -24,7 +25,28 @@ public fun rememberCircuitNavigator( enableBackHandler: Boolean = true, ): Navigator { return rememberCircuitNavigator( - backStack = backStack, + navStack = backStack, + onRootPop = backDispatcherRootPop(), + enableBackHandler = enableBackHandler, + ) +} + +/** + * Returns a new [Navigator] for navigating within [CircuitContents][CircuitContent]. Delegates + * onRootPop to the [LocalOnBackPressedDispatcherOwner]. + * + * @param navStack The backing [NavStack] to navigate. + * @param enableBackHandler Indicates whether or not [Navigator.pop] should be called by the system + * back handler. Defaults to true. + * @see NavigableCircuitContent + */ +@Composable +public fun rememberCircuitNavigator( + navStack: NavStack, + enableBackHandler: Boolean = true, +): Navigator { + return rememberCircuitNavigator( + navStack = navStack, onRootPop = backDispatcherRootPop(), enableBackHandler = enableBackHandler, ) diff --git a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/AnsweringNavigator.kt b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/AnsweringNavigator.kt index 64167035c..9031f911b 100644 --- a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/AnsweringNavigator.kt +++ b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/AnsweringNavigator.kt @@ -11,10 +11,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue -import com.slack.circuit.backstack.BackStack import com.slack.circuit.runtime.ExperimentalCircuitApi import com.slack.circuit.runtime.GoToNavigator import com.slack.circuit.runtime.Navigator +import com.slack.circuit.runtime.navigation.NavStack import com.slack.circuit.runtime.screen.PopResult import com.slack.circuit.runtime.screen.Screen import kotlin.reflect.KClass @@ -28,7 +28,7 @@ import kotlin.uuid.Uuid @OptIn(ExperimentalCircuitApi::class) @Composable public fun answeringNavigationAvailable(): Boolean = - LocalBackStack.current != null && LocalAnsweringResultHandler.current != null + LocalNavStack.current != null && LocalAnsweringResultHandler.current != null /** * A reified version of [rememberAnsweringNavigator]. See documented overloads of this function for @@ -51,9 +51,9 @@ public fun rememberAnsweringNavigator( resultType: KClass, block: (result: T) -> Unit, ): GoToNavigator { - val backStack = LocalBackStack.current ?: return fallbackNavigator + val navStack = LocalNavStack.current ?: return fallbackNavigator val resultHandler = LocalAnsweringResultHandler.current ?: return fallbackNavigator - return rememberAnsweringNavigator(backStack, resultHandler, resultType, block) + return rememberAnsweringNavigator(navStack, resultHandler, resultType, block) } /** @@ -63,11 +63,11 @@ public fun rememberAnsweringNavigator( @ExperimentalCircuitApi @Composable public inline fun rememberAnsweringNavigator( - backStack: BackStack, + navStack: NavStack, answeringResultHandler: AnsweringResultHandler, noinline block: (result: T) -> Unit, ): GoToNavigator { - return rememberAnsweringNavigator(backStack, answeringResultHandler, T::class, block) + return rememberAnsweringNavigator(navStack, answeringResultHandler, T::class, block) } /** @@ -99,12 +99,12 @@ public inline fun rememberAnsweringNavigator( @ExperimentalCircuitApi @Composable public fun rememberAnsweringNavigator( - backStack: BackStack, + navStack: NavStack, answeringResultHandler: AnsweringResultHandler, resultType: KClass, block: (result: T) -> Unit, ): GoToNavigator { - val currentBackStack by rememberUpdatedState(backStack) + val currentBackStack by rememberUpdatedState(navStack) val currentResultType by rememberUpdatedState(resultType) // Top screen at the start, so we can ensure we only collect the result if diff --git a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/NavigableCircuitContent.kt b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/NavigableCircuitContent.kt index 2b9f5d341..7501f116c 100644 --- a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/NavigableCircuitContent.kt +++ b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/NavigableCircuitContent.kt @@ -42,10 +42,7 @@ import androidx.compose.runtime.toString import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.slack.circuit.backstack.BackStack -import com.slack.circuit.backstack.BackStack.Record import com.slack.circuit.backstack.NavDecoration -import com.slack.circuit.backstack.isEmpty -import com.slack.circuit.backstack.rememberSaveableBackStack import com.slack.circuit.foundation.NavigatorDefaults.DefaultDecorator.DefaultAnimatedState import com.slack.circuit.foundation.animation.AnimatedNavDecoration import com.slack.circuit.foundation.animation.AnimatedNavDecorator @@ -53,6 +50,7 @@ import com.slack.circuit.foundation.animation.AnimatedNavEvent import com.slack.circuit.foundation.animation.AnimatedNavState import com.slack.circuit.foundation.navstack.ProvidedValues import com.slack.circuit.foundation.navstack.providedValuesForNavStack +import com.slack.circuit.foundation.navstack.rememberSaveableNavStack import com.slack.circuit.retained.LocalRetainedStateRegistry import com.slack.circuit.retained.RetainedStateHolder import com.slack.circuit.retained.rememberRetained @@ -62,21 +60,27 @@ import com.slack.circuit.runtime.ExperimentalCircuitApi import com.slack.circuit.runtime.InternalCircuitApi import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.navigation.NavArgument +import com.slack.circuit.runtime.navigation.NavStack +import com.slack.circuit.runtime.navigation.NavStack.Record +import com.slack.circuit.runtime.navigation.NavStackList +import com.slack.circuit.runtime.navigation.isEmpty +import com.slack.circuit.runtime.navigation.transform import com.slack.circuit.runtime.screen.PopResult import com.slack.circuit.runtime.screen.Screen +import kotlin.collections.mutableSetOf /** * A composable that provides the core navigation and state management for Circuit-based navigation - * systems. It manages the rendering of screens from a backstack, handles navigation transitions, - * and coordinates result passing between screens when navigating backward. This is the primary - * entry point for creating navigable content surfaces in Circuit. + * systems. It manages the rendering of screens from a navstack, handles navigation transitions, and + * coordinates result passing between screens when navigating backward. This is the primary entry + * point for creating navigable content surfaces in Circuit. * * This function automatically wraps your navigator with result handling capabilities via * [rememberAnsweringResultNavigator], enabling screens to pass results back when using * [rememberAnsweringNavigator]. * * ## Features - * - **State Management**: Manages saveable and retained state for each screen in the backstack with + * - **State Management**: Manages saveable and retained state for each screen in the navstack with * automatic preservation across configuration changes * - **Navigation Transitions**: Handles animated transitions between screens using [NavDecoration] * or custom [AnimatedNavDecorator] @@ -87,27 +91,27 @@ import com.slack.circuit.runtime.screen.Screen * * ```kotlin * setContent { - * val backStack = rememberSaveableBackStack(root = HomeScreen) - * val navigator = rememberCircuitNavigator(backStack) - * NavigableCircuitContent(navigator, backStack) + * val navStack = rememberSaveableNavStack(root = HomeScreen) + * val navigator = rememberCircuitNavigator(navStack) + * NavigableCircuitContent(navigator, navStack) * } * ``` * * ## State Management * This creates an isolated retained state registry for the navigation graph to ensure proper state * preservation across configuration changes when using [rememberRetained]. This prevents state loss - * for off-screen backstack records, even when they're not actively composed. See the implementation + * for off-screen navstack records, even when they're not actively composed. See the implementation * comments for technical details. * * @param navigator The [Navigator] used to handle navigation events. Typically created via * [rememberCircuitNavigator]. - * @param backStack The [BackStack] containing the stack of [Record]s to display. Must have at least - * one record. Typically created via [rememberSaveableBackStack]. + * @param navStack The [NavStack] containing the stack of [Record]s to display. Must have at least + * one record. Typically created via [rememberSaveableNavStack]. * @param modifier The [Modifier] to apply to the content. * @param circuit The [Circuit] instance providing UI factories and configuration. Defaults to * [LocalCircuit]. * @param providedValues Optional map of [ProvidedValues] to make available to specific records in - * the backstack. These values will be provided via composition locals when the corresponding + * the navstack. These values will be provided via composition locals when the corresponding * record is displayed. * @param decoration The [NavDecoration] used to decorate navigation transitions. Defaults to the * circuit's default decoration. @@ -117,11 +121,40 @@ import com.slack.circuit.runtime.screen.Screen * UI factory available). Defaults to the circuit's [Circuit.onUnavailableContent]. * @see rememberAnsweringNavigator for requesting results from child screens * @see rememberAnsweringResultNavigator for the underlying result navigator creation - * @see rememberSaveableBackStack for creating a backstack + * @see rememberSaveableNavStack for creating a navstack * @see rememberCircuitNavigator for creating a navigator */ @OptIn(ExperimentalCircuitApi::class) @Composable +public fun NavigableCircuitContent( + navigator: Navigator, + navStack: NavStack, + modifier: Modifier = Modifier, + circuit: Circuit = requireNotNull(LocalCircuit.current), + providedValues: Map = emptyMap(), + decoration: NavDecoration = circuit.defaultNavDecoration, + decoratorFactory: AnimatedNavDecorator.Factory? = null, + unavailableRoute: (@Composable (screen: Screen, modifier: Modifier) -> Unit) = + circuit.onUnavailableContent, +) { + NavigableCircuitContent( + navigator = rememberAnsweringResultNavigator(navigator, navStack), + modifier = modifier, + circuit = circuit, + providedValues = providedValues, + decoration = decoration, + decoratorFactory = decoratorFactory, + unavailableRoute = unavailableRoute, + ) +} + +/** + * A legacy variant of [NavigableCircuitContent] that takes a [Navigator] and a [BackStack]. + * + * @see NavigableCircuitContent for the standard overload that takes a [Navigator] and [NavStack]. + */ +@OptIn(ExperimentalCircuitApi::class) +@Composable public fun NavigableCircuitContent( navigator: Navigator, backStack: BackStack, @@ -134,7 +167,8 @@ public fun NavigableCircuitContent( circuit.onUnavailableContent, ) { NavigableCircuitContent( - navigator = rememberAnsweringResultNavigator(navigator, backStack), + navigator = navigator, + navStack = backStack, modifier = modifier, circuit = circuit, providedValues = providedValues, @@ -153,15 +187,15 @@ public fun NavigableCircuitContent( * shared result handling, or when you need custom control over the result handler lifecycle. * * For most use cases, prefer the standard [NavigableCircuitContent] overload that takes a - * [Navigator] and [BackStack], as it automatically creates and manages the result navigator. + * [Navigator] and [NavStack], as it automatically creates and manages the result navigator. * * ## Usage * * ```kotlin * setContent { - * val backStack = rememberSaveableBackStack(root = HomeScreen) - * val baseNavigator = rememberCircuitNavigator(backStack) - * val navigator = rememberAnsweringResultNavigator(baseNavigator, backStack) + * val navStack = rememberSaveableNavStack(root = HomeScreen) + * val baseNavigator = rememberCircuitNavigator(navStack) + * val navigator = rememberAnsweringResultNavigator(baseNavigator, navStack) * NavigableCircuitContent(navigator) * } * ``` @@ -179,7 +213,7 @@ public fun NavigableCircuitContent( */ @ExperimentalCircuitApi // For AnsweringResultNavigator @Composable -public fun NavigableCircuitContent( +public fun NavigableCircuitContent( navigator: AnsweringResultNavigator, modifier: Modifier = Modifier, circuit: Circuit = requireNotNull(LocalCircuit.current), @@ -189,7 +223,7 @@ public fun NavigableCircuitContent( unavailableRoute: (@Composable (screen: Screen, modifier: Modifier) -> Unit) = circuit.onUnavailableContent, ) { - if (navigator.backStack.isEmpty) return + if (navigator.navStack.isEmpty) return /* * We store the RetainedStateRegistries for each back stack entry into an 'navigation content' * RetainedStateRegistry. If we don't do this, those registries would be stored directly in the @@ -253,14 +287,15 @@ public fun NavigableCircuitContent( lastCircuit = circuit lastUnavailableRoute = unavailableRoute } - val activeContentProviders = buildCircuitContentProviders(backStack = navigator.backStack) + val activeContentProviders = + buildCircuitContentProviders(navStack = navigator.navStack) ?: return@CompositionLocalProvider val circuitProvidedValues = - providedValuesForNavStack(navigator.backStack, circuit.navStackLocalProviders) + providedValuesForNavStack(navigator.navStack, circuit.navStackLocalProviders) navDecoration.DecoratedContent(activeContentProviders, modifier) { provider -> val record = provider.record // Remember the `providedValues` lookup because this composition can live longer than - // the record is present in the backstack, if the decoration is animated for example. + // the record is present in the navstack, if the decoration is animated for example. val values = remember(record) { providedValues[record] }?.provideValues() val circuitProvidedValues = remember(record) { circuitProvidedValues[record] }?.provideValues() @@ -268,10 +303,10 @@ public fun NavigableCircuitContent( remember(values, circuitProvidedValues) { (values.orEmpty() + circuitProvidedValues.orEmpty()).toTypedArray() } - val localBackstack = contentProviderState.lastNavigator.backStack + val localNavStack = contentProviderState.lastNavigator.navStack val localResultHandler = contentProviderState.lastNavigator.answeringResultHandler CompositionLocalProvider( - LocalBackStack provides localBackstack, + LocalNavStack provides localNavStack, LocalAnsweringResultHandler provides localResultHandler, *providedLocals, ) { @@ -285,12 +320,12 @@ public fun NavigableCircuitContent( * Creates and remembers an [AnsweringResultNavigator] that wraps a base [Navigator] with result * handling capabilities. * - * This is a convenience function that combines a regular navigator, backstack, and result handler + * This is a convenience function that combines a regular navigator, navstack, and result handler * into a single [AnsweringResultNavigator] instance that automatically manages result passing when * screens are popped. * * @param navigator The base [Navigator] to wrap with result handling. - * @param backStack The [BackStack] used for tracking navigation state. + * @param navStack The [NavStack] used for tracking navigation state. * @param answeringResultHandler The [AnsweringResultHandler] for managing screen results. Defaults * to a new instance created via [rememberAnsweringResultHandler]. Only provide a custom handler * if you need to share result handling across multiple navigation graphs or require custom result @@ -303,11 +338,11 @@ public fun NavigableCircuitContent( @Composable public fun rememberAnsweringResultNavigator( navigator: Navigator, - backStack: BackStack, + navStack: NavStack, answeringResultHandler: AnsweringResultHandler = rememberAnsweringResultHandler(), ): AnsweringResultNavigator { - return remember(navigator, backStack, answeringResultHandler) { - AnsweringResultNavigator(navigator, backStack, answeringResultHandler) + return remember(navigator, navStack, answeringResultHandler) { + AnsweringResultNavigator(navigator, navStack, answeringResultHandler) } } @@ -315,7 +350,7 @@ public fun rememberAnsweringResultNavigator( @ExperimentalCircuitApi public class AnsweringResultNavigator( internal val originalNavigator: Navigator, - internal val backStack: BackStack, + internal val navStack: NavStack, internal val answeringResultHandler: AnsweringResultHandler, ) : Navigator by originalNavigator { override fun pop(result: PopResult?): Screen? { @@ -324,7 +359,7 @@ public class AnsweringResultNavigator( val popped = originalNavigator.pop(result) if (result != null) { // Send the pending result to our new top record, but only if it's expecting one - backStack.topRecord?.apply { + navStack.topRecord?.apply { if (answeringResultHandler.expectingResult(key)) { answeringResultHandler.sendResult(key, result) } @@ -361,37 +396,37 @@ public class RecordContentProvider( @ExperimentalCircuitApi @Composable private fun buildCircuitContentProviders( - backStack: BackStack -): List> { + navStack: NavStack +): NavStackList>? { val previousContentProviders = remember { mutableMapOf>() } val activeRecordKeys = remember { mutableSetOf() } - val recordKeys by - remember { mutableStateOf(emptySet()) } - .apply { value = backStack.mapTo(mutableSetOf()) { it.key } } - val latestBackStack by rememberUpdatedState(backStack) + + val navStackList = navStack.snapshot() + val recordKeys = remember(navStackList) { buildSet { navStackList?.forEach { add(it.key) } } } + val latestNavStack by rememberUpdatedState(navStack) DisposableEffect(recordKeys) { - // Delay cleanup until the next backstack change. + // Delay cleanup until the next navstack change. // - Any record in composition is considered active - // - Any record in the backstack can be shown by a decorator + // - Any record in the navstack can be shown by a decorator // - Any reachable record can be shown on a root reset - val contentNotInBackStack = + val contentNotInNavStack = previousContentProviders.keys.filterNot { it in activeRecordKeys || it in recordKeys || // Depth of 2 to exclude records that are late at leaving the composition. - latestBackStack.isRecordReachable(key = it, depth = 2, includeSaved = true) + latestNavStack.isRecordReachable(key = it, depth = 2, includeSaved = true) } onDispose { - // Only remove the keys that are no longer in the backstack or composition. - contentNotInBackStack + // Only remove the keys that are no longer in the navstack or composition. + contentNotInNavStack .filterNot { - latestBackStack.isRecordReachable(key = it, depth = 1, includeSaved = true) || + latestNavStack.isRecordReachable(key = it, depth = 1, includeSaved = true) || it in activeRecordKeys } .forEach { previousContentProviders.remove(it) } } } - return backStack.map { record -> + return navStackList?.transform { record -> // Query the previous content providers map, so that we use the same // RecordContentProvider instances across calls. previousContentProviders.getOrPut(record.key) { @@ -444,7 +479,7 @@ private fun createRecordContent(onActive: () -> Unit, onDispose: () with(contentProviderState) { val lifecycle = remember { MutableRecordLifecycle() } - .apply { isActive = lastNavigator.backStack.topRecord == record } + .apply { isActive = lastNavigator.navStack.topRecord == record } saveableStateHolder.SaveableStateProvider(record.registryKey) { // Provides a RetainedStateRegistry that is maintained independently for each record while // the record exists in the back stack. @@ -463,7 +498,7 @@ private fun createRecordContent(onActive: () -> Unit, onDispose: () // Remove saved states for records that are no longer in the back stack DisposableEffect(record.registryKey) { onDispose { - if (!lastNavigator.backStack.containsRecord(record, includeSaved = true)) { + if (!lastNavigator.navStack.containsRecord(record, includeSaved = true)) { retainedStateHolder.removeState(record.registryKey) saveableStateHolder.removeState(record.registryKey) } @@ -564,16 +599,16 @@ public object NavigatorDefaults { public class DefaultDecorator : AnimatedNavDecorator> { - public data class DefaultAnimatedState(val args: List) : AnimatedNavState { - override val backStack: List = args - } + public data class DefaultAnimatedState( + override val navStack: NavStackList + ) : AnimatedNavState - override fun targetState(args: List): DefaultAnimatedState { + override fun targetState(args: NavStackList): DefaultAnimatedState { return DefaultAnimatedState(args) } @Composable - public override fun updateTransition(args: List): Transition> { + override fun updateTransition(args: NavStackList): Transition> { return updateTransition(targetState(args)) } @@ -585,8 +620,12 @@ public object NavigatorDefaults { // the transitionSpec recomposing. // The states are available as `targetState` and `initialState`. return when (animatedNavEvent) { + AnimatedNavEvent.Forward, AnimatedNavEvent.GoTo -> forward + + AnimatedNavEvent.Backward, AnimatedNavEvent.Pop -> backward + AnimatedNavEvent.RootReset -> fadeIn() togetherWith fadeOut() }.using( // Disable clipping since the faded slide-in/out should @@ -600,7 +639,7 @@ public object NavigatorDefaults { targetState: DefaultAnimatedState, innerContent: @Composable (T) -> Unit, ) { - innerContent(targetState.args.first()) + innerContent(targetState.navStack.active) } } @@ -608,17 +647,17 @@ public object NavigatorDefaults { public object EmptyDecoration : NavDecoration { @Composable override fun DecoratedContent( - args: List, + args: NavStackList, modifier: Modifier, content: @Composable (T) -> Unit, ) { - Box(modifier = modifier) { content(args.first()) } + Box(modifier = modifier) { content(args.active) } } } } /** - * Delicate API to access the [BackStack] from within a [CircuitContent] or + * Delicate API to access the [NavStack] from within a [CircuitContent] or * [rememberAnsweringNavigator] composable, useful for cases where we create nested nav handling. * * This is generally considered an internal API to Circuit, but can be useful for interop cases and @@ -626,7 +665,7 @@ public object NavigatorDefaults { * [DelicateCircuitFoundationApi]. */ @DelicateCircuitFoundationApi -public val LocalBackStack: ProvidableCompositionLocal?> = compositionLocalOf { +public val LocalNavStack: ProvidableCompositionLocal?> = compositionLocalOf { null } diff --git a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecoration.kt b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecoration.kt index 5d7ab72f3..34539e843 100644 --- a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecoration.kt +++ b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecoration.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier import com.slack.circuit.backstack.NavDecoration import com.slack.circuit.runtime.ExperimentalCircuitApi import com.slack.circuit.runtime.navigation.NavArgument +import com.slack.circuit.runtime.navigation.NavStackList import com.slack.circuit.runtime.screen.Screen import com.slack.circuit.sharedelements.ProvideAnimatedTransitionScope import com.slack.circuit.sharedelements.SharedElementTransitionScope @@ -78,7 +79,7 @@ import kotlin.reflect.KClass * ```kotlin * NavigableCircuitContent( * navigator = navigator, - * backStack = backStack, + * navStack = navStack, * decoratorFactory = remember { CustomAnimatedNavDecoratorFactory() }, * ) * ``` @@ -97,7 +98,7 @@ public class AnimatedNavDecoration( @Composable public override fun DecoratedContent( - args: List, + args: NavStackList, modifier: Modifier, content: @Composable (T) -> Unit, ) { @@ -110,6 +111,7 @@ public class AnimatedNavDecoration( transition.AnimatedContent( modifier = modifier, transitionSpec = transitionSpec(animatedScreenTransforms), + contentKey = { it.navStack.active.key }, ) { targetState -> ProvideAnimatedTransitionScope(Navigation, this) { Decoration(targetState) { content(it) } } } @@ -123,17 +125,46 @@ public class AnimatedNavDecoration( private fun AnimatedNavDecorator.transitionSpec( animatedScreenTransforms: Map, AnimatedScreenTransform> ): AnimatedContentTransitionScope.() -> ContentTransform = spec@{ + val initialStack = initialState.navStack + val targetStack = targetState.navStack + + val previous = initialStack.active + val current = targetStack.active + + val initialBackStack = initialStack.backwardItems + val initialForwardStack = initialStack.forwardItems + + val targetBackStack = targetStack.backwardItems + val targetForwardStack = targetStack.forwardItems + val animatedNavEvent = - if (targetState.root != initialState.root) { - AnimatedNavEvent.RootReset - } else if (targetState.top == initialState.top) { - // Target screen has not changed, probably we should not show any animation even if the back - // stack is changed - return@spec EnterTransition.None togetherWith ExitTransition.None - } else if (initialState.backStack.contains(targetState.top)) { - AnimatedNavEvent.Pop - } else { - AnimatedNavEvent.GoTo + when { + // Root reset happened. + initialStack.root != targetStack.root -> { + AnimatedNavEvent.RootReset + } + // Target screen has not changed, don't show an animation. + previous == current -> { + return@spec EnterTransition.None togetherWith ExitTransition.None + } + // Navigated backward with the screen moving to the forward stack. + current in initialBackStack && + previous !in initialForwardStack && + previous in targetForwardStack -> { + AnimatedNavEvent.Backward + } + // Popped the screen off the nav stack. + current in initialBackStack && previous !in targetForwardStack -> { + AnimatedNavEvent.Pop + } + // Navigated forward with the screen moving out of the forward stack. + current in initialForwardStack && current !in targetForwardStack -> { + AnimatedNavEvent.Forward + } + // Fallback to a normal GoTo. + else -> { + AnimatedNavEvent.GoTo + } } val baseTransform = transitionSpec(animatedNavEvent) @@ -148,9 +179,9 @@ private fun AnimatedContentTransitionScope.screenSpecificOverr ): PartialContentTransform { // Read any screen specific overrides val targetAnimatedScreenTransform = - animatedScreenTransforms[targetState.top.screen::class] ?: NoOpAnimatedScreenTransform + animatedScreenTransforms[targetState.active::class] ?: NoOpAnimatedScreenTransform val initialAnimatedScreenTransform = - animatedScreenTransforms[initialState.top.screen::class] ?: NoOpAnimatedScreenTransform + animatedScreenTransforms[initialState.active::class] ?: NoOpAnimatedScreenTransform return PartialContentTransform( enter = targetAnimatedScreenTransform.run { enterTransition(animatedNavEvent) }, diff --git a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecorator.kt b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecorator.kt index 52431d311..c4e1b869c 100644 --- a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecorator.kt +++ b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavDecorator.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import com.slack.circuit.backstack.NavDecoration import com.slack.circuit.runtime.navigation.NavArgument +import com.slack.circuit.runtime.navigation.NavStackList import com.slack.circuit.runtime.screen.Screen /** @@ -94,14 +95,14 @@ import com.slack.circuit.runtime.screen.Screen @Stable public interface AnimatedNavDecorator { /** For the args create the expected target [AnimatedNavState]. */ - public fun targetState(args: List): S + public fun targetState(args: NavStackList): S /** * Sets up a [Transition] for driving an [AnimatedContent] used to navigate between screens. The * transition should be setup from the current [NavDecoration.DecoratedContent] arguments, and * then updated when the arguments change. */ - @Composable public fun updateTransition(args: List): Transition + @Composable public fun updateTransition(args: NavStackList): Transition /** Builds the default [AnimatedContent] transition spec. */ public fun AnimatedContentTransitionScope.transitionSpec( @@ -122,18 +123,10 @@ public interface AnimatedNavDecorator { /** A state created for the [Transition] in [AnimatedNavDecorator.Decoration]. */ @Stable public interface AnimatedNavState { - /** The [Screen] associated with this state. */ - public val top: NavArgument - get() = backStack.first() - - /** The root screen of the back stack at the time this state was created. */ - public val root: NavArgument - get() = backStack.last() - - /** The depth of the back stack at the time this state was created. */ - public val backStackDepth: Int - get() = backStack.size + /** The active [Screen] associated with this state. */ + public val active: Screen + get() = navStack.active.screen /** Snapshot of the back stack at the time this state was created. */ - public val backStack: List + public val navStack: NavStackList } diff --git a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavEvent.kt b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavEvent.kt index a90214f66..3017627ef 100644 --- a/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavEvent.kt +++ b/circuit-foundation/src/commonMain/kotlin/com/slack/circuit/foundation/animation/AnimatedNavEvent.kt @@ -13,4 +13,6 @@ public enum class AnimatedNavEvent { GoTo, Pop, RootReset, + Forward, + Backward, } diff --git a/circuit-foundation/src/jvmTest/kotlin/com/slack/circuit/foundation/NavResultTest.kt b/circuit-foundation/src/jvmTest/kotlin/com/slack/circuit/foundation/NavResultTest.kt index 6ab50cfca..c27e1272f 100644 --- a/circuit-foundation/src/jvmTest/kotlin/com/slack/circuit/foundation/NavResultTest.kt +++ b/circuit-foundation/src/jvmTest/kotlin/com/slack/circuit/foundation/NavResultTest.kt @@ -327,7 +327,7 @@ class TestResultPresenter(private val navigator: Navigator, private val screen: */ @Composable fun UnscrupulousResultListenerEffect() { - val backStack = LocalBackStack.current!! + val backStack = LocalNavStack.current!! val resultHandler = LocalAnsweringResultHandler.current!! LaunchedEffect(Unit) { resultHandler diff --git a/circuitx/gesture-navigation/src/androidMain/kotlin/com/slack/circuitx/gesturenavigation/AndroidPredictiveBackNavigationDecoration.kt b/circuitx/gesture-navigation/src/androidMain/kotlin/com/slack/circuitx/gesturenavigation/AndroidPredictiveBackNavigationDecoration.kt index 990b9b413..e42c67e95 100644 --- a/circuitx/gesture-navigation/src/androidMain/kotlin/com/slack/circuitx/gesturenavigation/AndroidPredictiveBackNavigationDecoration.kt +++ b/circuitx/gesture-navigation/src/androidMain/kotlin/com/slack/circuitx/gesturenavigation/AndroidPredictiveBackNavigationDecoration.kt @@ -58,10 +58,12 @@ internal class AndroidPredictiveBackNavDecorator(onBackInvoked: ): ContentTransform { return when (animatedNavEvent) { // adding to back stack + AnimatedNavEvent.Forward, AnimatedNavEvent.GoTo -> { NavigatorDefaults.forward } // come back from back stack + AnimatedNavEvent.Backward, AnimatedNavEvent.Pop -> { if (showPrevious) { // Handle all the animation in predictiveBackMotion @@ -95,7 +97,7 @@ internal class AndroidPredictiveBackNavDecorator(onBackInvoked: progress = { seekableTransitionState.fraction }, ) ) { - innerContent(targetState.args.first()) + innerContent(targetState.navStack.active) } } diff --git a/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/GestureNavTransitionHolder.kt b/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/GestureNavTransitionHolder.kt index 1ccd25652..08e56287a 100644 --- a/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/GestureNavTransitionHolder.kt +++ b/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/GestureNavTransitionHolder.kt @@ -5,13 +5,13 @@ package com.slack.circuitx.gesturenavigation import androidx.compose.runtime.Immutable import com.slack.circuit.foundation.animation.AnimatedNavState import com.slack.circuit.runtime.navigation.NavArgument +import com.slack.circuit.runtime.navigation.NavStackList /** * A holder class used by the `AnimatedContent` composables. This enables us to pass through all of * the necessary information as an argument, which is optimal for `AnimatedContent`. */ @Immutable -internal data class GestureNavTransitionHolder(val args: List) : - AnimatedNavState { - override val backStack: List = args -} +internal data class GestureNavTransitionHolder( + override val navStack: NavStackList +) : AnimatedNavState diff --git a/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/PredictiveBackNavigationDecorator.kt b/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/PredictiveBackNavigationDecorator.kt index d209ce950..81fccdb3f 100644 --- a/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/PredictiveBackNavigationDecorator.kt +++ b/circuitx/gesture-navigation/src/commonMain/kotlin/com/slack/circuitx/gesturenavigation/PredictiveBackNavigationDecorator.kt @@ -20,6 +20,8 @@ import androidx.compose.ui.geometry.Offset import com.slack.circuit.foundation.animation.AnimatedNavDecorator import com.slack.circuit.runtime.internal.rememberStableCoroutineScope import com.slack.circuit.runtime.navigation.NavArgument +import com.slack.circuit.runtime.navigation.NavStackList +import com.slack.circuit.runtime.navigation.navStackListOf import kotlin.math.abs import kotlinx.coroutines.CancellationException import kotlinx.coroutines.launch @@ -44,19 +46,24 @@ internal abstract class PredictiveBackNavigationDecorator( protected var swipeOffset: Offset by mutableStateOf(Offset.Zero) private set - override fun targetState(args: List): GestureNavTransitionHolder { + override fun targetState(args: NavStackList): GestureNavTransitionHolder { return GestureNavTransitionHolder(args) } @OptIn(ExperimentalComposeUiApi::class) @Composable - override fun updateTransition(args: List): Transition> { + override fun updateTransition(args: NavStackList): Transition> { val scope = rememberStableCoroutineScope() val current = remember(args) { targetState(args) } val previous = remember(args) { - if (args.size > 1) { - targetState(args.subList(1, args.size)) + val hasBackward = args.backwardItems.iterator().hasNext() + if (hasBackward) { + // Building the state we'd go to if we go backwards. + val forward = listOf(args.active) + args.forwardItems + val current = args.backwardItems.first() + val backward = args.backwardItems.drop(1) + targetState(navStackListOf(forward, current, backward)) } else null } @@ -84,7 +91,7 @@ internal abstract class PredictiveBackNavigationDecorator( } } - if (args.size > 1) { + if (previous != null) { BackHandler( onBackProgress = { progress, offset -> showPrevious = progress != 0f diff --git a/circuitx/gesture-navigation/src/iosMain/kotlin/com/slack/circuitx/gesturenavigation/iOSPredictiveBackNavigationDecoration.kt b/circuitx/gesture-navigation/src/iosMain/kotlin/com/slack/circuitx/gesturenavigation/iOSPredictiveBackNavigationDecoration.kt index f189fe761..5db7d10b5 100644 --- a/circuitx/gesture-navigation/src/iosMain/kotlin/com/slack/circuitx/gesturenavigation/iOSPredictiveBackNavigationDecoration.kt +++ b/circuitx/gesture-navigation/src/iosMain/kotlin/com/slack/circuitx/gesturenavigation/iOSPredictiveBackNavigationDecoration.kt @@ -75,12 +75,14 @@ internal class IOSPredictiveBackNavDecorator( animatedNavEvent: AnimatedNavEvent ): ContentTransform { return when (animatedNavEvent) { + AnimatedNavEvent.Forward, AnimatedNavEvent.GoTo -> { slideInHorizontally(initialOffsetX = End) .togetherWith( slideOutHorizontally { width -> -(enterOffsetFraction * width).roundToInt() } ) } + AnimatedNavEvent.Backward, AnimatedNavEvent.Pop -> { slideInHorizontally { width -> -(enterOffsetFraction * width).roundToInt() } .togetherWith( @@ -111,7 +113,7 @@ internal class IOSPredictiveBackNavDecorator( swipeOffset = { swipeOffset }, ) ) { - innerContent(targetState.args.first()) + innerContent(targetState.navStack.active) } } diff --git a/samples/bottom-navigation/src/androidMain/kotlin/com/slack/circuit/sample/navigation/MainActivity.kt b/samples/bottom-navigation/src/androidMain/kotlin/com/slack/circuit/sample/navigation/MainActivity.kt index 21a0d7863..945a2c727 100644 --- a/samples/bottom-navigation/src/androidMain/kotlin/com/slack/circuit/sample/navigation/MainActivity.kt +++ b/samples/bottom-navigation/src/androidMain/kotlin/com/slack/circuit/sample/navigation/MainActivity.kt @@ -13,8 +13,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.core.net.toUri import androidx.core.view.WindowCompat -import com.slack.circuit.backstack.rememberSaveableBackStack import com.slack.circuit.foundation.CircuitCompositionLocals +import com.slack.circuit.foundation.navstack.rememberSaveableNavStack import com.slack.circuit.foundation.rememberCircuitNavigator import com.slack.circuit.runtime.screen.Screen import com.slack.circuitx.android.IntentScreen @@ -46,8 +46,8 @@ class MainActivity : AppCompatActivity() { val tabs = TabScreen.all setContent { MaterialTheme { - val backStack = rememberSaveableBackStack(tabs.first()) - val navigator = rememberCircuitNavigator(backStack) + val navStack = rememberSaveableNavStack(tabs.first()) + val navigator = rememberCircuitNavigator(navStack = navStack) // Build the delegate Navigator. val interceptingNavigator = rememberInterceptingNavigator( @@ -66,7 +66,7 @@ class MainActivity : AppCompatActivity() { .build() } CircuitCompositionLocals(circuit) { - ContentScaffold(backStack, interceptingNavigator, tabs, Modifier.fillMaxSize()) + ContentScaffold(navStack, interceptingNavigator, tabs, Modifier.fillMaxSize()) } } } diff --git a/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/ContentScaffold.kt b/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/ContentScaffold.kt index cada912b4..74e4dc1b3 100644 --- a/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/ContentScaffold.kt +++ b/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/ContentScaffold.kt @@ -31,26 +31,26 @@ import androidx.compose.ui.semantics.selected import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.slack.circuit.backstack.BackStack -import com.slack.circuit.backstack.SaveableBackStack.Record import com.slack.circuit.foundation.NavigableCircuitContent import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.Navigator.StateOptions +import com.slack.circuit.runtime.navigation.NavStack +import com.slack.circuit.runtime.navigation.NavStack.Record @Composable fun ContentScaffold( - backStack: BackStack, + navStack: NavStack, navigator: Navigator, tabs: List, modifier: Modifier = Modifier, ) { Scaffold( modifier = modifier.testTag(ContentTags.TAG_SCAFFOLD).fillMaxSize(), - bottomBar = { BottomTabRow(tabs, backStack, navigator) }, + bottomBar = { BottomTabRow(tabs, navStack, navigator) }, ) { innerPadding -> NavigableCircuitContent( navigator = navigator, - backStack = backStack, + navStack = navStack, modifier = Modifier.padding(innerPadding).fillMaxSize(), ) } @@ -59,7 +59,7 @@ fun ContentScaffold( @Composable private fun BottomTabRow( tabs: List, - backStack: BackStack, + navStack: NavStack, navigator: Navigator, modifier: Modifier = Modifier, ) { @@ -71,7 +71,7 @@ private fun BottomTabRow( .windowInsetsPadding(WindowInsets.safeContent.only(WindowInsetsSides.Bottom)), ) { tabs.forEach { tab -> - val selected = tab == backStack.rootRecord?.screen + val selected = tab == navStack.rootRecord?.screen Text( text = tab.label, color = if (selected) MaterialTheme.colorScheme.onSecondary else Color.Unspecified, diff --git a/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/TabScreen.kt b/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/TabScreen.kt index d9a53ffef..d2fb38b6e 100644 --- a/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/TabScreen.kt +++ b/samples/bottom-navigation/src/commonMain/kotlin/com/slack/circuit/sample/navigation/TabScreen.kt @@ -4,25 +4,34 @@ package com.slack.circuit.sample.navigation import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowForward +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.slack.circuit.foundation.DelicateCircuitFoundationApi -import com.slack.circuit.foundation.LocalBackStack import com.slack.circuit.internal.runtime.Parcelize import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.CircuitUiEvent import com.slack.circuit.runtime.CircuitUiState import com.slack.circuit.runtime.Navigator +import com.slack.circuit.runtime.navigation.NavStackList import com.slack.circuit.runtime.presenter.Presenter import com.slack.circuit.runtime.screen.Screen import com.slack.circuit.runtime.ui.Ui @@ -61,10 +70,18 @@ sealed interface TabScreen : Screen { object TabScreenCircuit { - data class State(val label: String, val eventSink: (Event) -> Unit) : CircuitUiState + data class State( + val label: String, + val navStack: NavStackList?, + val eventSink: (Event) -> Unit, + ) : CircuitUiState sealed interface Event : CircuitUiEvent { data object Next : Event + + data object Forward : Event + + data object Backward : Event } } @@ -72,9 +89,12 @@ class TabPresenter(private val screen: TabScreen, private val navigator: Navigat Presenter { @Composable override fun present(): TabScreenCircuit.State { - return TabScreenCircuit.State(label = screen.label) { event -> + val navStack = navigator.peekNavStack() + return TabScreenCircuit.State(label = screen.label, navStack = navStack) { event -> when (event) { - TabScreenCircuit.Event.Next -> navigator.goTo(screen.next()) + is TabScreenCircuit.Event.Backward -> navigator.backward() + is TabScreenCircuit.Event.Forward -> navigator.forward() + is TabScreenCircuit.Event.Next -> navigator.goTo(screen.next()) } } } @@ -97,29 +117,44 @@ class TabPresenter(private val screen: TabScreen, private val navigator: Navigat @OptIn(DelicateCircuitFoundationApi::class) @Composable fun TabUI(state: TabScreenCircuit.State, modifier: Modifier = Modifier) { - val backStack = LocalBackStack.current?.toList().orEmpty() Column(modifier = modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)) { - Text( - text = state.label, - style = MaterialTheme.typography.headlineMedium, - modifier = - Modifier.testTag(ContentTags.TAG_LABEL) - .fillMaxWidth() - .padding(horizontal = 16.dp) - .padding(top = 24.dp, bottom = 8.dp), - ) + Box(modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp)) { + Row(modifier = Modifier.align(Alignment.CenterStart)) { + IconButton( + enabled = state.navStack?.backwardItems?.firstOrNull() != null, + onClick = { state.eventSink(TabScreenCircuit.Event.Backward) }, + ) { + Icon(Icons.AutoMirrored.Default.ArrowBack, contentDescription = "Back") + } + IconButton( + enabled = state.navStack?.forwardItems?.firstOrNull() != null, + onClick = { state.eventSink(TabScreenCircuit.Event.Forward) }, + ) { + Icon(Icons.AutoMirrored.Default.ArrowForward, contentDescription = "Forward") + } + } + Text( + text = state.label, + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.testTag(ContentTags.TAG_LABEL).align(Alignment.Center), + ) + } LazyColumn( modifier = Modifier.fillMaxSize().testTag(ContentTags.TAG_CONTENT).clickable { state.eventSink(TabScreenCircuit.Event.Next) } ) { - itemsIndexed(backStack) { i, item -> - Text( - text = "$i: ${item.screen}", - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp), - ) + state.navStack?.let { navStack -> + itemsIndexed(navStack.toList()) { i, item -> + val isActive = navStack.active === item + Text( + text = "$i: $item", + fontWeight = if (isActive) FontWeight.Bold else null, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp), + ) + } } } } diff --git a/samples/bottom-navigation/src/iosMain/kotlin/com/slack/circuit/sample/navigation/iosMain.kt b/samples/bottom-navigation/src/iosMain/kotlin/com/slack/circuit/sample/navigation/iosMain.kt index 6ab556579..d56c47b5c 100644 --- a/samples/bottom-navigation/src/iosMain/kotlin/com/slack/circuit/sample/navigation/iosMain.kt +++ b/samples/bottom-navigation/src/iosMain/kotlin/com/slack/circuit/sample/navigation/iosMain.kt @@ -9,8 +9,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.window.ComposeUIViewController -import com.slack.circuit.backstack.rememberSaveableBackStack import com.slack.circuit.foundation.CircuitCompositionLocals +import com.slack.circuit.foundation.navstack.rememberSaveableNavStack import com.slack.circuit.foundation.rememberCircuitNavigator import com.slack.circuit.runtime.screen.Screen import com.slack.circuitx.gesturenavigation.GestureNavigationDecorationFactory @@ -37,8 +37,8 @@ fun MainViewController(): UIViewController { val tabs = TabScreen.all return ComposeUIViewController { MaterialTheme { - val backStack = rememberSaveableBackStack(tabs.first()) - val navigator = rememberCircuitNavigator(backStack) {} + val navStack = rememberSaveableNavStack(tabs.first()) + val navigator = rememberCircuitNavigator(navStack = navStack) {} // Build the delegate Navigator. val interceptingNavigator = rememberInterceptingNavigator( @@ -57,7 +57,7 @@ fun MainViewController(): UIViewController { .build() } CircuitCompositionLocals(circuit) { - ContentScaffold(backStack, interceptingNavigator, tabs, Modifier.fillMaxSize()) + ContentScaffold(navStack, interceptingNavigator, tabs, Modifier.fillMaxSize()) } } } diff --git a/samples/bottom-navigation/src/jvmMain/kotlin/com/slack/circuit/sample/navigation/main.kt b/samples/bottom-navigation/src/jvmMain/kotlin/com/slack/circuit/sample/navigation/main.kt index db1e84d4b..e54145e6d 100644 --- a/samples/bottom-navigation/src/jvmMain/kotlin/com/slack/circuit/sample/navigation/main.kt +++ b/samples/bottom-navigation/src/jvmMain/kotlin/com/slack/circuit/sample/navigation/main.kt @@ -10,8 +10,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.window.Window import androidx.compose.ui.window.application -import com.slack.circuit.backstack.rememberSaveableBackStack import com.slack.circuit.foundation.CircuitCompositionLocals +import com.slack.circuit.foundation.navstack.rememberSaveableNavStack import com.slack.circuit.foundation.rememberCircuitNavigator import com.slack.circuit.sharedelements.SharedElementTransitionLayout import com.slack.circuitx.navigation.intercepting.rememberInterceptingNavigator @@ -24,8 +24,8 @@ fun main() { application { Window(title = "Navigation Sample", onCloseRequest = ::exitApplication) { MaterialTheme { - val backStack = rememberSaveableBackStack(tabs.first()) - val navigator = rememberCircuitNavigator(backStack) { exitApplication() } + val navStack = rememberSaveableNavStack(tabs.first()) + val navigator = rememberCircuitNavigator(navStack) { exitApplication() } // CircuitX Navigation val uriHandler = LocalUriHandler.current val interceptors = remember { listOf(InfoScreenInterceptor(uriHandler)) } @@ -33,7 +33,7 @@ fun main() { rememberInterceptingNavigator(navigator = navigator, interceptors = interceptors) CircuitCompositionLocals(circuit) { SharedElementTransitionLayout { - ContentScaffold(backStack, interceptingNavigator, tabs, Modifier.fillMaxSize()) + ContentScaffold(navStack, interceptingNavigator, tabs, Modifier.fillMaxSize()) } } } diff --git a/samples/star/src/commonMain/kotlin/com/slack/circuit/star/animation/AnimatedNavigationOverride.kt b/samples/star/src/commonMain/kotlin/com/slack/circuit/star/animation/AnimatedNavigationOverride.kt index 63106e23a..1577fa1e9 100644 --- a/samples/star/src/commonMain/kotlin/com/slack/circuit/star/animation/AnimatedNavigationOverride.kt +++ b/samples/star/src/commonMain/kotlin/com/slack/circuit/star/animation/AnimatedNavigationOverride.kt @@ -21,8 +21,8 @@ object PetDetailAnimatedScreenTransform : AnimatedScreenTransform { animatedNavEvent: AnimatedNavEvent ): EnterTransition? { // Going to the detail screen - if (initialState.top.screen !is HomeScreen) return null - if (!targetState.top.screen.isSharedElementDetailScreen()) return null + if (initialState.active !is HomeScreen) return null + if (!targetState.active.isSharedElementDetailScreen()) return null return EnterTransition.None } @@ -30,8 +30,8 @@ object PetDetailAnimatedScreenTransform : AnimatedScreenTransform { animatedNavEvent: AnimatedNavEvent ): ExitTransition? { // Going back to the home screen - if (targetState.top.screen !is HomeScreen) return null - if (!initialState.top.screen.isSharedElementDetailScreen()) return null + if (targetState.active !is HomeScreen) return null + if (!initialState.active.isSharedElementDetailScreen()) return null return ExitTransition.None } } @@ -44,14 +44,14 @@ object HomeAnimatedScreenTransform : AnimatedScreenTransform { animatedNavEvent: AnimatedNavEvent ): EnterTransition? { // Coming from the detail screen with shared elements - return if (initialState.top.screen.isSharedElementDetailScreen()) EnterTransition.None else null + return if (initialState.active.isSharedElementDetailScreen()) EnterTransition.None else null } override fun AnimatedContentTransitionScope.exitTransition( animatedNavEvent: AnimatedNavEvent ): ExitTransition? { // Going to the detail screen with shared elements - return if (targetState.top.screen.isSharedElementDetailScreen()) ExitTransition.None else null + return if (targetState.active.isSharedElementDetailScreen()) ExitTransition.None else null } }