diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntry.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntry.kt index cd36ef971c..a900406e71 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntry.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntry.kt @@ -1,11 +1,12 @@ package com.bumble.appyx.core.children +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.state.SavedStateMap // custom equals/hashCode for MutableStateFlow and equality checks -sealed class ChildEntry { +sealed class ChildEntry { abstract val key: NavKey override fun equals(other: Any?): Boolean = @@ -18,12 +19,12 @@ sealed class ChildEntry { "$key@${javaClass.simpleName}" /** All public APIs should return this type of child which is ready to work with. */ - class Initialized( + class Initialized( override val key: NavKey, val node: Node, ) : ChildEntry() - class Suspended( + class Suspended( override val key: NavKey, val savedState: SavedStateMap?, ) : ChildEntry() diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntryExt.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntryExt.kt index d5ee48a42e..bef7beee0d 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntryExt.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildEntryExt.kt @@ -1,8 +1,9 @@ package com.bumble.appyx.core.children +import android.os.Parcelable import com.bumble.appyx.core.node.Node -val ChildEntry.nodeOrNull: Node? +val ChildEntry.nodeOrNull: Node? get() = when (this) { is ChildEntry.Initialized -> node diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildNodeCreationManager.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildNodeCreationManager.kt index 1b020aa960..59b312db5a 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildNodeCreationManager.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/children/ChildNodeCreationManager.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.children +import android.os.Parcelable import androidx.lifecycle.coroutineScope import com.bumble.appyx.core.modality.AncestryInfo import com.bumble.appyx.core.modality.BuildContext @@ -21,7 +22,7 @@ import kotlinx.coroutines.launch * * Lifecycle of these nodes is managed in [com.bumble.appyx.core.lifecycle.ChildNodeLifecycleManager]. */ -internal class ChildNodeCreationManager( +internal class ChildNodeCreationManager( private var savedStateMap: SavedStateMap?, private val customisations: NodeCustomisationDirectory, private val keepMode: ChildEntry.KeepMode, diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Child.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Child.kt index 39f9ff9ca3..c8fe862de9 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Child.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Child.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.composable +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable @@ -32,7 +33,7 @@ import com.bumble.appyx.core.navigation.transition.TransitionParams import kotlinx.coroutines.flow.map @Composable -fun ParentNode.Child( +fun ParentNode.Child( navElement: NavElement, saveableStateHolder: SaveableStateHolder, transitionParams: TransitionParams, @@ -87,7 +88,7 @@ private class ChildRendererImpl( } @Composable -fun ParentNode.Child( +fun ParentNode.Child( navElement: NavElement, modifier: Modifier = Modifier, transitionHandler: TransitionHandler = JumpToEndTransitionHandler(), @@ -125,7 +126,7 @@ fun ParentNode.Child( } } -private fun NavElement.createDescriptor( +private fun NavElement.createDescriptor( transitionParams: TransitionParams ) = TransitionDescriptor( @@ -137,7 +138,7 @@ private fun NavElement.createDescript ) @Composable -fun NavModel?.childrenAsState(): State> = +fun NavModel?.childrenAsState(): State> = if (this != null) { elements.collectAsState() } else { @@ -145,7 +146,7 @@ fun NavModel?.childrenAsState(): State> = } @Composable -fun NavModel?.visibleChildrenAsState(): State> = +fun NavModel?.visibleChildrenAsState(): State> = if (this != null) { val visibleElementsFlow = remember { screenState.map { it.onScreen } } visibleElementsFlow.collectAsState(emptyList()) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Children.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Children.kt index 55937df26d..b7e22e5c41 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Children.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/composable/Children.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.composable +import android.os.Parcelable import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -26,7 +27,7 @@ import kotlinx.coroutines.flow.map import kotlin.reflect.KClass @Composable -inline fun ParentNode.Children( +inline fun ParentNode.Children( navModel: NavModel, modifier: Modifier = Modifier, transitionHandler: TransitionHandler = JumpToEndTransitionHandler(), @@ -63,7 +64,7 @@ inline fun ParentNode.Children( } } -class ChildrenTransitionScope( +class ChildrenTransitionScope( private val transitionHandler: TransitionHandler, private val transitionParams: TransitionParams, private val navModel: NavModel diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/lifecycle/ChildNodeLifecycleManager.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/lifecycle/ChildNodeLifecycleManager.kt index 59d6996faa..637ed6e81f 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/lifecycle/ChildNodeLifecycleManager.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/lifecycle/ChildNodeLifecycleManager.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.lifecycle +import android.os.Parcelable import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleRegistry import com.bumble.appyx.core.children.ChildEntry @@ -23,7 +24,7 @@ import kotlinx.coroutines.launch * Hosts [LifecycleRegistry] to manage the current node lifecycle * and updates lifecycle of children nodes when updated. */ -internal class ChildNodeLifecycleManager( +internal class ChildNodeLifecycleManager( private val navModel: NavModel, private val children: StateFlow>, private val coroutineScope: CoroutineScope, @@ -86,7 +87,7 @@ internal class ChildNodeLifecycleManager( } } - private fun Flow>.keys() = + private fun Flow>.keys() = this .map { screenState -> ScreenState( @@ -100,7 +101,7 @@ internal class ChildNodeLifecycleManager( nodeOrNull?.updateLifecycleState(state) } - private data class ScreenState( + private data class ScreenState( val onScreen: List> = emptyList(), val offScreen: List> = emptyList(), ) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/BaseNavModel.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/BaseNavModel.kt index 82546b4553..df5a00faf9 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/BaseNavModel.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/BaseNavModel.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation +import android.os.Parcelable import androidx.activity.OnBackPressedCallback import com.bumble.appyx.core.mapState import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BackPressHandlerStrategy @@ -28,7 +29,7 @@ import kotlin.coroutines.EmptyCoroutineContext * * If more granular configuration is required, you should inherit NavModel interface instead. */ -abstract class BaseNavModel( +abstract class BaseNavModel( private val backPressHandler: BackPressHandlerStrategy = DontHandleBackPress(), private val operationStrategy: OperationStrategy = ExecuteImmediately(), private val screenResolver: OnScreenStateResolver, diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/EmptyNavModel.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/EmptyNavModel.kt index 330d8c5172..fa4a8eed2e 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/EmptyNavModel.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/EmptyNavModel.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation +import android.os.Parcelable import com.bumble.appyx.core.navigation.onscreen.OnScreenStateResolver /** @@ -7,11 +8,11 @@ import com.bumble.appyx.core.navigation.onscreen.OnScreenStateResolver * This is potentially useful if your ParentNode only uses * [com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel] */ -class EmptyNavModel : BaseNavModel( +class EmptyNavModel : BaseNavModel( savedStateMap = null, finalState = null, screenResolver = OnScreenStateResolver { true } ) { - override val initialElements: NavElements + override val initialElements: NavElements get() = emptyList() } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/EmptyState.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/EmptyState.kt new file mode 100644 index 0000000000..e6d8fe80e1 --- /dev/null +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/EmptyState.kt @@ -0,0 +1,12 @@ +package com.bumble.appyx.core.navigation + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Suppress("PARCELABLE_PRIMARY_CONSTRUCTOR_IS_EMPTY") +@Parcelize +class EmptyState internal constructor() : Parcelable { + companion object { + val INSTANCE = EmptyState() + } +} diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavElement.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavElement.kt index 2a06ceb480..a9977e9f3b 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavElement.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavElement.kt @@ -7,18 +7,18 @@ import kotlinx.parcelize.RawValue @Parcelize @Immutable -class NavElement private constructor( - val key: @RawValue NavKey, - val fromState: @RawValue State, - val targetState: @RawValue State, - val operation: @RawValue Operation, +class NavElement private constructor( + val key: NavKey, + val fromState: State, + val targetState: State, + val operation: Operation, val transitionHistory: List> ) : Parcelable { constructor( - key: @RawValue NavKey, - fromState: @RawValue State, - targetState: @RawValue State, - operation: @RawValue Operation, + key: NavKey, + fromState: State, + targetState: State, + operation: Operation, ) : this( key, fromState, diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavKey.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavKey.kt index 138a6c5ffe..9e2869df77 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavKey.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavKey.kt @@ -8,12 +8,12 @@ import java.util.UUID @Parcelize @Immutable -class NavKey private constructor( - val navTarget: @RawValue NavTarget, +class NavKey private constructor( + val navTarget: NavTarget, val id: String ) : Parcelable { - constructor(navTarget: @RawValue NavTarget) : this( + constructor(navTarget: NavTarget) : this( navTarget = navTarget, id = UUID.randomUUID().toString() ) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModel.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModel.kt index 1e9453f5e1..ed541f1797 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModel.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModel.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation +import android.os.Parcelable import androidx.compose.runtime.Stable import com.bumble.appyx.core.plugin.BackPressHandler import com.bumble.appyx.core.plugin.SavesInstanceState @@ -7,7 +8,7 @@ import com.bumble.appyx.core.plugin.UpNavigationHandler import kotlinx.coroutines.flow.StateFlow @Stable -interface NavModel : NavModelAdapter, +interface NavModel : NavModelAdapter, UpNavigationHandler, SavesInstanceState, BackPressHandler { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModelAdapter.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModelAdapter.kt index ca524a2cbb..b07a59849a 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModelAdapter.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/NavModelAdapter.kt @@ -1,14 +1,15 @@ package com.bumble.appyx.core.navigation +import android.os.Parcelable import androidx.compose.runtime.Stable import kotlinx.coroutines.flow.StateFlow @Stable -interface NavModelAdapter { +interface NavModelAdapter { val screenState: StateFlow> - data class ScreenState( + data class ScreenState( val onScreen: NavElements = emptyList(), val offScreen: NavElements = emptyList(), ) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/Operation.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/Operation.kt index 53f42e32e2..496e87ac86 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/Operation.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/Operation.kt @@ -3,7 +3,7 @@ package com.bumble.appyx.core.navigation import android.os.Parcelable import kotlinx.parcelize.Parcelize -interface Operation : +interface Operation : (NavElements) -> NavElements, Parcelable { fun isApplicable(elements: NavElements): Boolean @@ -67,7 +67,7 @@ interface Operation : } @Parcelize - class Noop : Operation { + class Noop : Operation { override fun isApplicable(elements: NavElements) = false diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BackPressHandlerStrategy.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BackPressHandlerStrategy.kt index a0a1b6ef4e..ea383b14a3 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BackPressHandlerStrategy.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BackPressHandlerStrategy.kt @@ -1,10 +1,11 @@ package com.bumble.appyx.core.navigation.backpresshandlerstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.BaseNavModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.StateFlow -interface BackPressHandlerStrategy { +interface BackPressHandlerStrategy { fun init(navModel: BaseNavModel, scope: CoroutineScope) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BaseBackPressHandlerStrategy.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BaseBackPressHandlerStrategy.kt index 42dfb6dcf8..21848c0c19 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BaseBackPressHandlerStrategy.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/BaseBackPressHandlerStrategy.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation.backpresshandlerstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.BaseNavModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -7,7 +8,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn -abstract class BaseBackPressHandlerStrategy +abstract class BaseBackPressHandlerStrategy : BackPressHandlerStrategy { protected lateinit var scope: CoroutineScope diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/DontHandleBackPress.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/DontHandleBackPress.kt index 6ad8f54630..ca55530933 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/DontHandleBackPress.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/backpresshandlerstrategies/DontHandleBackPress.kt @@ -1,9 +1,10 @@ package com.bumble.appyx.core.navigation.backpresshandlerstrategies +import android.os.Parcelable import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf -class DontHandleBackPress : +class DontHandleBackPress : BaseBackPressHandlerStrategy() { override val canHandleBackPressFlow: Flow = diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/CombinedNavModel.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/CombinedNavModel.kt index f7e31836ca..572b7a8c88 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/CombinedNavModel.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/CombinedNavModel.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation.model.combined +import android.os.Parcelable import androidx.activity.OnBackPressedCallback import com.bumble.appyx.core.combineState import com.bumble.appyx.core.navigation.NavElements @@ -14,9 +15,9 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.StateFlow import kotlin.coroutines.EmptyCoroutineContext -class CombinedNavModel( +class CombinedNavModel( val navModels: List>, -) : NavModel, Destroyable { +) : NavModel, Destroyable { constructor(vararg navModels: NavModel) : this(navModels.toList()) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/NavModelExt.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/NavModelExt.kt index 692f4a05a8..25ede220ab 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/NavModelExt.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/combined/NavModelExt.kt @@ -1,8 +1,9 @@ package com.bumble.appyx.core.navigation.model.combined +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavModel -operator fun NavModel.plus( +operator fun NavModel.plus( other: NavModel, ): CombinedNavModel { val currentModels = if (this is CombinedNavModel) navModels else listOf(this) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElement.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElement.kt index dda0fc620b..107f97d690 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElement.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElement.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation.model.permanent +import com.bumble.appyx.core.navigation.EmptyState import com.bumble.appyx.core.navigation.NavElement -typealias PermanentElement = NavElement +typealias PermanentElement = NavElement diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElements.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElements.kt index 71ece421fa..5337e03037 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElements.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentElements.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation.model.permanent +import com.bumble.appyx.core.navigation.EmptyState import com.bumble.appyx.core.navigation.NavElements -typealias PermanentElements = NavElements +typealias PermanentElements = NavElements diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentNavModel.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentNavModel.kt index a5e6800246..13cadf9335 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentNavModel.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/PermanentNavModel.kt @@ -1,6 +1,8 @@ package com.bumble.appyx.core.navigation.model.permanent +import android.os.Parcelable import com.bumble.appyx.core.mapState +import com.bumble.appyx.core.navigation.EmptyState import com.bumble.appyx.core.navigation.NavElement import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.core.navigation.NavModel @@ -15,11 +17,11 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update import kotlin.coroutines.EmptyCoroutineContext -class PermanentNavModel( +class PermanentNavModel( navTargets: Set = emptySet(), savedStateMap: SavedStateMap?, private val key: String = requireNotNull(PermanentNavModel::class.qualifiedName), -) : NavModel { +) : NavModel { private val scope: CoroutineScope = CoroutineScope(EmptyCoroutineContext + Dispatchers.Unconfined) @@ -37,8 +39,8 @@ class PermanentNavModel( savedStateMap.restore() ?: navTargets.map { key -> PermanentElement( key = NavKey(navTarget = key), - fromState = 0, - targetState = 0, + fromState = EmptyState.INSTANCE, + targetState = EmptyState.INSTANCE, operation = Operation.Noop() ) } @@ -47,7 +49,7 @@ class PermanentNavModel( override val elements: StateFlow> get() = state - override val screenState: StateFlow> by lazy { + override val screenState: StateFlow> by lazy { state.mapState(scope) { NavModelAdapter.ScreenState(onScreen = it) } } @@ -55,7 +57,7 @@ class PermanentNavModel( // no-op } - override fun accept(operation: Operation) { + override fun accept(operation: Operation) { if (operation.isApplicable(state.value)) { state.update { operation(it) } } @@ -65,7 +67,7 @@ class PermanentNavModel( state[key] = this.state.value } - private fun SavedStateMap?.restore(): List>? = + private fun SavedStateMap?.restore(): List>? = (this?.get(key) as? PermanentElements) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/Add.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/Add.kt index 9fd6642aa5..c7cc73fb5c 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/Add.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/Add.kt @@ -1,5 +1,7 @@ package com.bumble.appyx.core.navigation.model.permanent.operation +import android.os.Parcelable +import com.bumble.appyx.core.navigation.EmptyState import com.bumble.appyx.core.navigation.NavElement import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey @@ -7,28 +9,28 @@ import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel import kotlinx.parcelize.Parcelize @Parcelize -data class Add( +data class Add( private val key: NavKey ) : PermanentOperation { - override fun isApplicable(elements: NavElements): Boolean = + override fun isApplicable(elements: NavElements): Boolean = !elements.any { it.key == key } override fun invoke( - elements: NavElements - ): NavElements = + elements: NavElements + ): NavElements = if (elements.any { it.key == key }) { elements } else { elements + NavElement( key = key, - fromState = 0, - targetState = 0, + fromState = EmptyState.INSTANCE, + targetState = EmptyState.INSTANCE, operation = this, ) } } -fun PermanentNavModel.add(navKey: NavKey) { +fun PermanentNavModel.add(navKey: NavKey) { accept(Add(navKey)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/AddUnique.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/AddUnique.kt index 287bd47111..1430e80cdd 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/AddUnique.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/AddUnique.kt @@ -1,5 +1,7 @@ package com.bumble.appyx.core.navigation.model.permanent.operation +import android.os.Parcelable +import com.bumble.appyx.core.navigation.EmptyState import com.bumble.appyx.core.navigation.NavElement import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey @@ -11,28 +13,28 @@ import kotlinx.parcelize.RawValue * Adds [NavTarget] into [PermanentNavModel] only if it is not there yet. */ @Parcelize -data class AddUnique( - private val navTarget: @RawValue NavTarget, +data class AddUnique( + private val navTarget: NavTarget, ) : PermanentOperation { - override fun isApplicable(elements: NavElements): Boolean = + override fun isApplicable(elements: NavElements): Boolean = !elements.any { it.key.navTarget == navTarget } override fun invoke( - elements: NavElements - ): NavElements = + elements: NavElements + ): NavElements = if (elements.any { it.key.navTarget == navTarget }) { elements } else { elements + NavElement( key = NavKey(navTarget), - fromState = 0, - targetState = 0, + fromState = EmptyState.INSTANCE, + targetState = EmptyState.INSTANCE, operation = this, ) } } -fun PermanentNavModel.addUnique(navTarget: NavTarget) { +fun PermanentNavModel.addUnique(navTarget: NavTarget) { accept(AddUnique(navTarget)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/PermanentOperation.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/PermanentOperation.kt index 364b7c4818..a049979486 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/PermanentOperation.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/model/permanent/operation/PermanentOperation.kt @@ -1,5 +1,7 @@ package com.bumble.appyx.core.navigation.model.permanent.operation +import android.os.Parcelable +import com.bumble.appyx.core.navigation.EmptyState import com.bumble.appyx.core.navigation.Operation -interface PermanentOperation : Operation +interface PermanentOperation : Operation diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/onscreen/OnScreenStateResolverExt.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/onscreen/OnScreenStateResolverExt.kt index ea12b891cf..d10a3f9704 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/onscreen/OnScreenStateResolverExt.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/onscreen/OnScreenStateResolverExt.kt @@ -1,8 +1,9 @@ package com.bumble.appyx.core.navigation.onscreen +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElement -fun OnScreenStateResolver.isOnScreen(element: NavElement<*, out State>): Boolean = +fun OnScreenStateResolver.isOnScreen(element: NavElement<*, out State>): Boolean = if (element.transitionHistory.isEmpty()) { isOnScreen(element.fromState) || isOnScreen(element.targetState) } else { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/BaseOperationStrategy.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/BaseOperationStrategy.kt index 8f5a645afa..c2f5548abd 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/BaseOperationStrategy.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/BaseOperationStrategy.kt @@ -1,10 +1,11 @@ package com.bumble.appyx.core.navigation.operationstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.core.navigation.NavModel import kotlinx.coroutines.CoroutineScope -abstract class BaseOperationStrategy : OperationStrategy { +abstract class BaseOperationStrategy : OperationStrategy { protected lateinit var scope: CoroutineScope protected lateinit var navModel: NavModel diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/ExecuteImmediately.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/ExecuteImmediately.kt index e70177e056..3ef25fb5c0 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/ExecuteImmediately.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/ExecuteImmediately.kt @@ -1,8 +1,9 @@ package com.bumble.appyx.core.navigation.operationstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation -class ExecuteImmediately : BaseOperationStrategy() { +class ExecuteImmediately : BaseOperationStrategy() { override fun accept(operation: Operation) { executeOperation(operation) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/FinishTransitionsOnNewOperation.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/FinishTransitionsOnNewOperation.kt index 4da87da04a..0e58e5714e 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/FinishTransitionsOnNewOperation.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/FinishTransitionsOnNewOperation.kt @@ -1,10 +1,12 @@ package com.bumble.appyx.core.navigation.operationstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.core.navigation.isTransitioning -class FinishTransitionsOnNewOperation : BaseOperationStrategy() { +class FinishTransitionsOnNewOperation : + BaseOperationStrategy() { override fun accept(operation: Operation) { finishUnfinishedTransitions() diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/IgnoreIfThereAreUnfinishedTransitions.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/IgnoreIfThereAreUnfinishedTransitions.kt index 92e4f2d920..206f5ae8e4 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/IgnoreIfThereAreUnfinishedTransitions.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/IgnoreIfThereAreUnfinishedTransitions.kt @@ -1,9 +1,11 @@ package com.bumble.appyx.core.navigation.operationstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.core.navigation.isTransitioning -class IgnoreIfThereAreUnfinishedTransitions : BaseOperationStrategy() { +class IgnoreIfThereAreUnfinishedTransitions : + BaseOperationStrategy() { override fun accept(operation: Operation) { if (hasNoUnfinishedTransitions()) { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/OperationStrategy.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/OperationStrategy.kt index 761cea9f6c..0ab1a76051 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/OperationStrategy.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/OperationStrategy.kt @@ -1,10 +1,11 @@ package com.bumble.appyx.core.navigation.operationstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.core.navigation.NavModel import kotlinx.coroutines.CoroutineScope -interface OperationStrategy { +interface OperationStrategy { fun init( navModel: NavModel, diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/QueueOperations.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/QueueOperations.kt index cc56670450..d2aa7b6172 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/QueueOperations.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/operationstrategies/QueueOperations.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.navigation.operationstrategies +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.isTransitioning @@ -7,7 +8,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import java.util.LinkedList -class QueueOperations : BaseOperationStrategy() { +class QueueOperations : BaseOperationStrategy() { private val operationQueue = LinkedList>() private lateinit var collectJob: Job diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/CombinedHandler.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/CombinedHandler.kt index f11c5af6d3..bd09621936 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/CombinedHandler.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/CombinedHandler.kt @@ -1,13 +1,14 @@ package com.bumble.appyx.core.navigation.transition import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import com.bumble.appyx.core.collections.ImmutableList -class CombinedHandler( +class CombinedHandler( private val handlers: List> ) : ModifierTransitionHandler() { @@ -33,11 +34,11 @@ class CombinedHandler( ) ) @Composable -fun rememberCombinedHandler(handlers: List>): ModifierTransitionHandler = +fun rememberCombinedHandler(handlers: List>): ModifierTransitionHandler = remember { CombinedHandler(handlers = handlers) } @Composable -fun rememberCombinedHandler( +fun rememberCombinedHandler( handlers: ImmutableList> ): ModifierTransitionHandler = remember(handlers) { CombinedHandler(handlers = handlers) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/JumpToEndTransitionHandler.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/JumpToEndTransitionHandler.kt index 80b4365b9e..1af4c9a19d 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/JumpToEndTransitionHandler.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/JumpToEndTransitionHandler.kt @@ -1,11 +1,12 @@ package com.bumble.appyx.core.navigation.transition import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.ui.Modifier @Suppress("TransitionPropertiesLabel") -class JumpToEndTransitionHandler : ModifierTransitionHandler() { +class JumpToEndTransitionHandler : ModifierTransitionHandler() { @SuppressLint("ModifierFactoryExtensionFunction") override fun createModifier( diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/ModifierTransitionHandler.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/ModifierTransitionHandler.kt index 85878c0fcc..8b77a30d26 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/ModifierTransitionHandler.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/ModifierTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.core.navigation.transition import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.MutableTransitionState import androidx.compose.animation.core.Transition import androidx.compose.animation.core.updateTransition @@ -12,7 +13,7 @@ import androidx.compose.ui.draw.clipToBounds import com.bumble.appyx.core.composable.ChildTransitionScope import com.bumble.appyx.core.composable.ChildTransitionScopeImpl -abstract class ModifierTransitionHandler(open val clipToBounds: Boolean = false) : +abstract class ModifierTransitionHandler(open val clipToBounds: Boolean = false) : TransitionHandler { private val clipToBoundsModifier: Modifier by lazy(LazyThreadSafetyMode.NONE) { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionDescriptor.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionDescriptor.kt index cb76eab0a9..0740660d64 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionDescriptor.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionDescriptor.kt @@ -1,10 +1,11 @@ package com.bumble.appyx.core.navigation.transition +import android.os.Parcelable import androidx.compose.runtime.Immutable import com.bumble.appyx.core.navigation.Operation @Immutable -data class TransitionDescriptor( +data class TransitionDescriptor( val params: TransitionParams, val operation: Operation, val element: NavTarget, diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionHandler.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionHandler.kt index 32dc4a1142..0e843f0c6b 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionHandler.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/navigation/transition/TransitionHandler.kt @@ -1,11 +1,12 @@ package com.bumble.appyx.core.navigation.transition +import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import com.bumble.appyx.core.composable.ChildTransitionScope @Stable -interface TransitionHandler { +interface TransitionHandler { @Composable fun handle( diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/EmptyNodeViews.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/EmptyNodeViews.kt index bcbde45ca5..a52023d429 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/EmptyNodeViews.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/EmptyNodeViews.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.node +import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -9,7 +10,7 @@ object EmptyNodeView : NodeView { override fun View(modifier: Modifier) = Unit } -class EmptyParentNodeView : ParentNodeView { +class EmptyParentNodeView : ParentNodeView { @Composable override fun ParentNode.NodeView(modifier: Modifier) = Unit diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNode.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNode.kt index 8d2611771e..83b59e6ab6 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNode.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNode.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.core.node +import android.os.Parcelable import androidx.annotation.CallSuper import androidx.annotation.VisibleForTesting import androidx.compose.runtime.Composable @@ -49,7 +50,7 @@ import kotlin.reflect.KClass @Suppress("TooManyFunctions") @Stable -abstract class ParentNode( +abstract class ParentNode( navModel: NavModel, buildContext: BuildContext, view: ParentNodeView = EmptyParentNodeView(), diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNodeView.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNodeView.kt index d91e2cb1d6..9c27adef40 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNodeView.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/core/node/ParentNodeView.kt @@ -1,9 +1,10 @@ package com.bumble.appyx.core.node +import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -interface ParentNodeView : NodeView { +interface ParentNodeView : NodeView { @Composable fun ParentNode.NodeView(modifier: Modifier) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStack.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStack.kt index 8b001d25e7..dd41087a76 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStack.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStack.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack +import android.os.Parcelable import com.bumble.appyx.core.navigation.BaseNavModel import com.bumble.appyx.core.navigation.Operation.Noop import com.bumble.appyx.core.navigation.NavKey @@ -12,8 +13,9 @@ import com.bumble.appyx.navmodel.backstack.BackStack.State.DESTROYED import com.bumble.appyx.navmodel.backstack.backpresshandler.PopBackPressHandler import com.bumble.appyx.core.state.SavedStateMap import com.bumble.appyx.navmodel.backstack.BackStack.State.ACTIVE +import kotlinx.parcelize.Parcelize -class BackStack( +class BackStack( initialElement: NavTarget, savedStateMap: SavedStateMap?, key: String = KEY_NAV_MODEL, @@ -29,7 +31,8 @@ class BackStack( key = key, ) { - enum class State { + @Parcelize + enum class State : Parcelable { CREATED, ACTIVE, STASHED, DESTROYED, } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStackExt.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStackExt.kt index 7e9b184de8..2338d8a66c 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStackExt.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/BackStackExt.kt @@ -1,18 +1,19 @@ package com.bumble.appyx.navmodel.backstack +import android.os.Parcelable import com.bumble.appyx.navmodel.backstack.BackStack.State.ACTIVE -val BackStackElements.active: BackStackElement? +val BackStackElements.active: BackStackElement? get() = lastOrNull { it.targetState == ACTIVE } -val BackStack.active: BackStackElement? +val BackStack.active: BackStackElement? get() = elements.value.active -val BackStackElements.activeElement: T? +val BackStackElements.activeElement: T? get() = active?.key?.navTarget -val BackStack.activeElement: T? +val BackStack.activeElement: T? get() = elements.value.activeElement -val BackStackElements.activeIndex: Int +val BackStackElements.activeIndex: Int get() = indexOfLast { it.targetState == ACTIVE } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/backpresshandler/PopBackPressHandler.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/backpresshandler/PopBackPressHandler.kt index 666206b20a..d1e072d234 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/backpresshandler/PopBackPressHandler.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/backpresshandler/PopBackPressHandler.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStackElements @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.backstack.operation.Pop import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class PopBackPressHandler : +class PopBackPressHandler : BaseBackPressHandlerStrategy() { override val canHandleBackPressFlow: Flow by lazy { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/BackStackOperation.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/BackStackOperation.kt index 2ad7830ef3..2e8d9476d6 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/BackStackOperation.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/BackStackOperation.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.backstack.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.navmodel.backstack.BackStack -interface BackStackOperation : Operation +interface BackStackOperation : Operation diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/NewRoot.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/NewRoot.kt index 691ad3401c..1f106c9b7a 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/NewRoot.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/NewRoot.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStackElement @@ -16,8 +17,8 @@ import kotlinx.parcelize.RawValue * [A, B, C] + NewRoot(D) = [ D ] */ @Parcelize -data class NewRoot( - private val element: @RawValue T +data class NewRoot( + private val element: T ) : BackStackOperation { override fun isApplicable(elements: BackStackElements): Boolean = true @@ -48,6 +49,6 @@ data class NewRoot( } } -fun BackStack.newRoot(element: T) { +fun BackStack.newRoot(element: T) { accept(NewRoot(element)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Pop.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Pop.kt index 39f0ddc081..4c320b5c84 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Pop.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Pop.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStackElements import com.bumble.appyx.navmodel.backstack.activeIndex @@ -11,7 +12,7 @@ import kotlinx.parcelize.Parcelize * [A, B, C] + Pop = [A, B] */ @Parcelize -class Pop : BackStackOperation { +class Pop : BackStackOperation { override fun isApplicable(elements: BackStackElements): Boolean = elements.any { it.targetState == BackStack.State.ACTIVE } && @@ -46,6 +47,6 @@ class Pop : BackStackOperation { override fun hashCode(): Int = this.javaClass.hashCode() } -fun BackStack.pop() { +fun BackStack.pop() { accept(Pop()) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Push.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Push.kt index a2c3f82b33..439a8b8334 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Push.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Push.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStackElement @@ -17,8 +18,8 @@ import kotlinx.parcelize.RawValue * [A, B, C] + Push(D) = [A, B, C, D] */ @Parcelize -data class Push( - private val element: @RawValue T +data class Push( + private val element: T ) : BackStackOperation { override fun isApplicable(elements: BackStackElements): Boolean = @@ -35,6 +36,6 @@ data class Push( ) } -fun BackStack.push(element: T) { +fun BackStack.push(element: T) { accept(Push(element)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Remove.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Remove.kt index f365332b2d..674beebc0a 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Remove.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Remove.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStackElements @@ -12,7 +13,7 @@ import kotlinx.parcelize.Parcelize * [A, B, C] + Remove(id of B) = [A, C] */ @Parcelize -data class Remove( +data class Remove( private val key: NavKey ) : BackStackOperation { @@ -61,6 +62,6 @@ data class Remove( } } -fun BackStack.remove(key: NavKey) { +fun BackStack.remove(key: NavKey) { accept(Remove(key)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Replace.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Replace.kt index ecde3a8212..9ef70f6e52 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Replace.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/Replace.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStack.State.ACTIVE @@ -18,8 +19,8 @@ import kotlinx.parcelize.RawValue * [A, B, C] + Replace(D) = [A, B, D] */ @Parcelize -data class Replace( - private val element: @RawValue T +data class Replace( + private val element: T ) : BackStackOperation { override fun isApplicable(elements: BackStackElements): Boolean = @@ -41,6 +42,6 @@ data class Replace( } } -fun BackStack.replace(element: T) { +fun BackStack.replace(element: T) { accept(Replace(element)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/SingleTop.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/SingleTop.kt index 32b1941bc7..d91fb05cef 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/SingleTop.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/operation/SingleTop.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.backstack.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStackElement @@ -18,11 +19,11 @@ import kotlinx.parcelize.RawValue * [A, B, C, D] + SingleTop(B') = [A, B'] // of same type but not equals, acts as n * Pop + Replace * [A, B, C, D] + SingleTop(E) = [A, B, C, D, E] // not found, acts as Push */ -sealed class SingleTop : BackStackOperation { +sealed class SingleTop : BackStackOperation { @Parcelize - class SingleTopReactivateBackStackOperation( - private val element: @RawValue T, + class SingleTopReactivateBackStackOperation( + private val element: T, private val position: Int ) : SingleTop() { @@ -52,8 +53,8 @@ sealed class SingleTop : BackStackOperation { } @Parcelize - class SingleTopReplaceBackStackOperation( - private val element: @RawValue T, + class SingleTopReplaceBackStackOperation( + private val element: T, private val position: Int, ) : SingleTop() { @@ -85,7 +86,7 @@ sealed class SingleTop : BackStackOperation { companion object { - fun init( + fun init( element: T, elements: BackStackElements ): BackStackOperation { @@ -112,6 +113,6 @@ sealed class SingleTop : BackStackOperation { } } -fun BackStack.singleTop(element: T) { +fun BackStack.singleTop(element: T) { accept(SingleTop.init(element, elements.value)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackFader.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackFader.kt index b781fccb10..8f05138825 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackFader.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackFader.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.backstack.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.spring @@ -15,7 +16,7 @@ import com.bumble.appyx.core.navigation.transition.TransitionSpec import com.bumble.appyx.navmodel.backstack.BackStack @Suppress("TransitionPropertiesLabel") -class BackStackFader( +class BackStackFader( private val transitionSpec: TransitionSpec = { spring() } ) : ModifierTransitionHandler() { @@ -39,7 +40,7 @@ class BackStackFader( } @Composable -fun rememberBackstackFader( +fun rememberBackstackFader( transitionSpec: TransitionSpec = { spring() } ): ModifierTransitionHandler = remember { BackStackFader(transitionSpec = transitionSpec) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackSlider.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackSlider.kt index abfa73fb09..4bbc70c32a 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackSlider.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/backstack/transitionhandler/BackStackSlider.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.backstack.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateOffset @@ -27,7 +28,7 @@ import com.bumble.appyx.navmodel.backstack.operation.SingleTop.SingleTopReplaceB import com.bumble.appyx.navmodel.toIntOffset @Suppress("TransitionPropertiesLabel") -class BackStackSlider( +class BackStackSlider( private val transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessVeryLow) }, @@ -77,7 +78,7 @@ class BackStackSlider( } @Composable -fun rememberBackstackSlider( +fun rememberBackstackSlider( transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessVeryLow) }, clipToBounds: Boolean = false ): ModifierTransitionHandler = remember { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/Spotlight.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/Spotlight.kt index ac8317193c..a8e75c8756 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/Spotlight.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/Spotlight.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight +import android.os.Parcelable import com.bumble.appyx.core.navigation.BaseNavModel import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BackPressHandlerStrategy import com.bumble.appyx.core.navigation.onscreen.OnScreenStateResolver @@ -9,8 +10,9 @@ import com.bumble.appyx.core.state.SavedStateMap import com.bumble.appyx.navmodel.spotlight.Spotlight.State import com.bumble.appyx.navmodel.spotlight.backpresshandler.GoToDefault import com.bumble.appyx.navmodel.spotlight.operation.toSpotlightElements +import kotlinx.parcelize.Parcelize -class Spotlight( +class Spotlight( items: List, initialActiveIndex: Int = 0, savedStateMap: SavedStateMap?, @@ -29,7 +31,8 @@ class Spotlight( key = key, ) { - enum class State { + @Parcelize + enum class State : Parcelable { INACTIVE_BEFORE, ACTIVE, INACTIVE_AFTER; } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightElementExt.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightElementExt.kt index 4bf5a184c9..bc06a8a9dd 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightElementExt.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightElementExt.kt @@ -1,9 +1,10 @@ package com.bumble.appyx.navmodel.spotlight +import android.os.Parcelable import com.bumble.appyx.navmodel.spotlight.Spotlight.State.ACTIVE -val SpotlightElements.current: SpotlightElement? +val SpotlightElements.current: SpotlightElement? get() = this.lastOrNull { it.targetState == ACTIVE } -val SpotlightElements.currentIndex: Int +val SpotlightElements.currentIndex: Int get() = this.indexOfLast { it.targetState == ACTIVE } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightExt.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightExt.kt index ffaa66bc1c..0f5e40540f 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightExt.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/SpotlightExt.kt @@ -1,18 +1,19 @@ package com.bumble.appyx.navmodel.spotlight +import android.os.Parcelable import kotlinx.coroutines.flow.map -fun Spotlight.hasNext() = +fun Spotlight.hasNext() = elements.map { value -> value.lastIndex != elements.value.currentIndex } -fun Spotlight.hasPrevious() = +fun Spotlight.hasPrevious() = elements.map { value -> value.currentIndex != 0 } -fun Spotlight.activeIndex() = +fun Spotlight.activeIndex() = elements.map { value -> value.currentIndex } -fun Spotlight.current() = +fun Spotlight.current() = elements.map { value -> value.current?.key?.navTarget } -fun Spotlight.elementsCount() = +fun Spotlight.elementsCount() = elements.value.size diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToDefault.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToDefault.kt index 0e85f9555b..8d8e950023 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToDefault.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToDefault.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.spotlight.Spotlight import com.bumble.appyx.navmodel.spotlight.Spotlight.State.ACTIVE @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.spotlight.operation.Activate import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class GoToDefault( +class GoToDefault( private val defaultElementIndex: Int = 0 ) : BaseBackPressHandlerStrategy() { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToPrevious.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToPrevious.kt index 604d861342..faa669afb2 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToPrevious.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/GoToPrevious.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.spotlight.Spotlight import com.bumble.appyx.navmodel.spotlight.SpotlightElements @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.spotlight.operation.Previous import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class GoToPrevious : +class GoToPrevious : BaseBackPressHandlerStrategy() { override val canHandleBackPressFlow: Flow by lazy { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/UndoHistory.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/UndoHistory.kt index 53b52a665d..232aca6b1b 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/UndoHistory.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/backpresshandler/UndoHistory.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.spotlight.Spotlight import com.bumble.appyx.navmodel.spotlight.Spotlight.State.ACTIVE @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.spotlight.operation.Activate import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class UndoHistory( +class UndoHistory( private val historyLimit: Int = 10 ) : BaseBackPressHandlerStrategy() { diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Activate.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Activate.kt index 13e08c5f5f..62ddec5f08 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Activate.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Activate.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlight.Spotlight import com.bumble.appyx.navmodel.spotlight.Spotlight.State @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.spotlight.currentIndex import kotlinx.parcelize.Parcelize @Parcelize -class Activate( +class Activate( private val index: Int ) : SpotlightOperation { @@ -43,6 +44,6 @@ class Activate( } -fun Spotlight.activate(index: Int) { +fun Spotlight.activate(index: Int) { accept(Activate(index)) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Next.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Next.kt index 7a629b59d5..0f9fd6d117 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Next.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Next.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlight.Spotlight import com.bumble.appyx.navmodel.spotlight.Spotlight.State @@ -9,7 +10,7 @@ import com.bumble.appyx.navmodel.spotlight.Spotlight.State.INACTIVE_BEFORE import kotlinx.parcelize.Parcelize @Parcelize -class Next : SpotlightOperation { +class Next : SpotlightOperation { override fun isApplicable(elements: NavElements) = elements.any { it.fromState == INACTIVE_AFTER && it.targetState == INACTIVE_AFTER } @@ -40,7 +41,7 @@ class Next : SpotlightOperation { } } -fun Spotlight.next() { +fun Spotlight.next() { accept(Next()) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Previous.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Previous.kt index 7a8b138630..125b44eee2 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Previous.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/Previous.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlight.Spotlight import com.bumble.appyx.navmodel.spotlight.Spotlight.State.ACTIVE @@ -9,7 +10,7 @@ import kotlinx.parcelize.Parcelize @Parcelize -class Previous : SpotlightOperation { +class Previous : SpotlightOperation { override fun isApplicable(elements: NavElements) = elements.any { it.fromState == INACTIVE_BEFORE && it.targetState == INACTIVE_BEFORE } @@ -42,7 +43,7 @@ class Previous : SpotlightOperation { } } -fun Spotlight.previous() { +fun Spotlight.previous() { accept(Previous()) } diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/UpdateElements.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/UpdateElements.kt index 336c42eedf..63dab3effb 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/UpdateElements.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/operation/UpdateElements.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlight.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation.Noop import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey @@ -14,8 +15,8 @@ import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue @Parcelize -class UpdateElements( - private val elements: @RawValue List, +class UpdateElements( + private val elements: List, private val initialActiveIndex: Int? = null, ) : SpotlightOperation { @@ -46,14 +47,14 @@ class UpdateElements( } } -fun Spotlight.updateElements( +fun Spotlight.updateElements( items: List, initialActiveItem: Int? = null ) { accept(UpdateElements(items, initialActiveItem)) } -internal fun List.toSpotlightElements(activeIndex: Int): SpotlightElements = +internal fun List.toSpotlightElements(activeIndex: Int): SpotlightElements = mapIndexed { index, item -> val state = when { index < activeIndex -> INACTIVE_BEFORE diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightFader.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightFader.kt index 0299f43171..51b1336995 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightFader.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightFader.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.spotlight.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.spring @@ -16,7 +17,7 @@ import com.bumble.appyx.navmodel.spotlight.Spotlight @Suppress("TransitionPropertiesLabel") -class SpotlightFader( +class SpotlightFader( private val transitionSpec: TransitionSpec = { spring() } ) : ModifierTransitionHandler() { @@ -40,7 +41,7 @@ class SpotlightFader( } @Composable -fun rememberSpotlightFader( +fun rememberSpotlightFader( transitionSpec: TransitionSpec = { spring() } ): ModifierTransitionHandler = remember { SpotlightFader(transitionSpec = transitionSpec) diff --git a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightSlider.kt b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightSlider.kt index 9bdb12c048..d4322837bc 100644 --- a/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightSlider.kt +++ b/libraries/core/src/main/kotlin/com/bumble/appyx/navmodel/spotlight/transitionhandler/SpotlightSlider.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.spotlight.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateOffset @@ -19,7 +20,7 @@ import com.bumble.appyx.navmodel.spotlight.Spotlight import com.bumble.appyx.navmodel.toIntOffset @Suppress("TransitionPropertiesLabel") -class SpotlightSlider( +class SpotlightSlider( private val transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessVeryLow) }, @@ -57,7 +58,7 @@ class SpotlightSlider( } @Composable -fun rememberSpotlightSlider( +fun rememberSpotlightSlider( transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessVeryLow) }, clipToBounds: Boolean = false ): ModifierTransitionHandler = remember { diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/InsideTheBackStack.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/InsideTheBackStack.kt index 4dd7c01fe9..28a89ad15a 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/InsideTheBackStack.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/InsideTheBackStack.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.app.node.backstack +import android.os.Parcelable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -30,6 +31,7 @@ import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.ParentNode import kotlinx.coroutines.delay import kotlinx.coroutines.isActive +import kotlinx.parcelize.Parcelize class InsideTheBackStack( buildContext: BuildContext, @@ -61,7 +63,8 @@ class InsideTheBackStack( } } - sealed class NavTarget { + sealed class NavTarget : Parcelable { + @Parcelize data class Child(val index: Int) : NavTarget() { override fun toString(): String = index.toString() } diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/composable/PeekInsideBackStack.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/composable/PeekInsideBackStack.kt index dc1e1950b1..e500c615fb 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/composable/PeekInsideBackStack.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/composable/PeekInsideBackStack.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.app.node.backstack.app.composable +import android.os.Parcelable import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.isSystemInDarkTheme @@ -35,7 +36,7 @@ import com.bumble.appyx.core.navigation.NavElement import java.util.Locale @Composable -fun PeekInsideBackStack( +fun PeekInsideBackStack( backStack: IndexedBackStack, modifier: Modifier = Modifier ) { @@ -63,7 +64,7 @@ fun PeekInsideBackStack( } @Composable -private fun BackStackElement( +private fun BackStackElement( element: NavElement, ) { Column( diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/IndexedBackStack.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/IndexedBackStack.kt index aeb1973213..fa7172d197 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/IndexedBackStack.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/IndexedBackStack.kt @@ -1,12 +1,14 @@ package com.bumble.appyx.app.node.backstack.app.indexedbackstack +import android.os.Parcelable import com.bumble.appyx.core.navigation.BaseNavModel import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.core.state.SavedStateMap +import kotlinx.parcelize.Parcelize -class IndexedBackStack( +class IndexedBackStack( savedState: SavedStateMap?, initialElement: NavTarget ) : BaseNavModel( @@ -15,14 +17,20 @@ class IndexedBackStack( savedStateMap = savedState ) { - sealed interface State { + sealed interface State : Parcelable { + @Parcelize object Created : State + + @Parcelize object Active : State + + @Parcelize class Stashed( val index: Int, val size: Int ) : State + @Parcelize object Destroyed : State } diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/IndexedBackStackOperation.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/IndexedBackStackOperation.kt index 16f8282f57..c0782f9c79 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/IndexedBackStackOperation.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/IndexedBackStackOperation.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.app.node.backstack.app.indexedbackstack.operation +import android.os.Parcelable import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack import com.bumble.appyx.core.navigation.Operation -interface IndexedBackStackOperation : Operation +interface IndexedBackStackOperation : Operation diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Pop.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Pop.kt index 67e9997cdb..6b3f18c45b 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Pop.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Pop.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.app.node.backstack.app.indexedbackstack.operation +import android.os.Parcelable import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack.State import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack.State.Active @@ -9,7 +10,7 @@ import com.bumble.appyx.core.navigation.NavElements import kotlinx.parcelize.Parcelize @Parcelize -class Pop : IndexedBackStackOperation { +class Pop : IndexedBackStackOperation { override fun isApplicable(elements: NavElements): Boolean = elements.any { it.targetState is Active } && @@ -25,7 +26,7 @@ class Pop : IndexedBackStackOperation { } } -fun IndexedBackStack.pop() { +fun IndexedBackStack.pop() { accept(Pop()) accept(UpdateSize()) } diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Push.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Push.kt index 8c27b76259..8fed54a570 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Push.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/Push.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.app.node.backstack.app.indexedbackstack.operation +import android.os.Parcelable import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack.State.Created import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack.State.Active @@ -11,8 +12,8 @@ import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue @Parcelize -class Push( - private val element: @RawValue T +class Push( + private val element: T ) : IndexedBackStackOperation { override fun isApplicable(elements: NavElements): Boolean = @@ -36,7 +37,7 @@ class Push( } } -fun IndexedBackStack.push(element: T) { +fun IndexedBackStack.push(element: T) { accept(Push(element)) accept(UpdateSize()) } diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/UpdateSize.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/UpdateSize.kt index c369e7b129..4ab04d6307 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/UpdateSize.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/operation/UpdateSize.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.app.node.backstack.app.indexedbackstack.operation +import android.os.Parcelable import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack.State.Destroyed import com.bumble.appyx.app.node.backstack.app.indexedbackstack.IndexedBackStack.State.Stashed @@ -7,7 +8,7 @@ import com.bumble.appyx.core.navigation.NavElements import kotlinx.parcelize.Parcelize @Parcelize -class UpdateSize : IndexedBackStackOperation { +class UpdateSize : IndexedBackStackOperation { override fun isApplicable(elements: NavElements): Boolean = true diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/transition/RecentsTransitionHandler.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/transition/RecentsTransitionHandler.kt index 9baffbb56c..3b83d2850f 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/transition/RecentsTransitionHandler.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/backstack/app/indexedbackstack/transition/RecentsTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.app.node.backstack.app.indexedbackstack.transition import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat @@ -28,7 +29,7 @@ import com.bumble.appyx.core.navigation.transition.TransitionDescriptor import com.bumble.appyx.core.navigation.transition.TransitionSpec import kotlin.math.roundToInt -class RecentsTransitionHandler( +class RecentsTransitionHandler( private val specFloat: TransitionSpec = { spring() }, private val specOffset: TransitionSpec = { spring() }, ) : ModifierTransitionHandler() { @@ -170,7 +171,7 @@ class RecentsTransitionHandler( } @Composable -fun rememberRecentsTransitionHandler( +fun rememberRecentsTransitionHandler( specFloat: TransitionSpec = { spring(stiffness = Spring.StiffnessMediumLow) }, specOffset: TransitionSpec = { spring(stiffness = Spring.StiffnessMediumLow) }, ): ModifierTransitionHandler = diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/samples/SamplesSelectorNode.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/samples/SamplesSelectorNode.kt index 1870e1ad3d..8c4dc12c74 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/samples/SamplesSelectorNode.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/samples/SamplesSelectorNode.kt @@ -32,7 +32,7 @@ class SamplesSelectorNode( buildContext: BuildContext, private val outputFunc: (Output) -> Unit ) : ParentNode( - navModel = EmptyNavModel(), + navModel = EmptyNavModel(), buildContext = buildContext ) { sealed class NavTarget : Parcelable { @@ -53,7 +53,7 @@ class SamplesSelectorNode( object OpenCardsExample : Output() object OpenOnboarding : Output() object OpenComposeNavigation : Output() - object OpenInsideTheBackStack: Output() + object OpenInsideTheBackStack : Output() } @ExperimentalUnitApi diff --git a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/teaser/backstack/transitionhandler/CustomBackStackTransitionHandler.kt b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/teaser/backstack/transitionhandler/CustomBackStackTransitionHandler.kt index 664b382ac3..3c40d139d8 100644 --- a/samples/app/src/main/kotlin/com/bumble/appyx/app/node/teaser/backstack/transitionhandler/CustomBackStackTransitionHandler.kt +++ b/samples/app/src/main/kotlin/com/bumble/appyx/app/node/teaser/backstack/transitionhandler/CustomBackStackTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.app.node.teaser.backstack.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat @@ -21,7 +22,7 @@ import com.bumble.appyx.navmodel.backstack.BackStack import kotlin.math.roundToInt @Suppress("TransitionPropertiesLabel") -class CustomBackStackTransitionHandler : ModifierTransitionHandler() { +class CustomBackStackTransitionHandler : ModifierTransitionHandler() { @SuppressLint("ModifierFactoryExtensionFunction") override fun createModifier( @@ -75,6 +76,6 @@ class CustomBackStackTransitionHandler : ModifierTransitionHandler rememberCustomHandler(): ModifierTransitionHandler = remember { +fun rememberCustomHandler(): ModifierTransitionHandler = remember { CustomBackStackTransitionHandler() } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/Cards.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/Cards.kt index 4d085875bf..cdc30df30d 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/Cards.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/Cards.kt @@ -14,7 +14,7 @@ import com.bumble.appyx.navmodel.cards.Cards.State.VoteLike import com.bumble.appyx.navmodel.cards.Cards.State.VotePass import kotlinx.parcelize.Parcelize -class Cards( +class Cards( initialItems: List = listOf(), ) : BaseNavModel( screenResolver = CardsOnScreenResolver, diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/CardsOperation.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/CardsOperation.kt index c2dedd84ca..840fc24d22 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/CardsOperation.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/CardsOperation.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.cards.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.navmodel.cards.Cards -interface CardsOperation : Operation +interface CardsOperation : Operation diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicateLike.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicateLike.kt index b709e6a412..e1aa7f3de3 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicateLike.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicateLike.kt @@ -1,15 +1,16 @@ package com.bumble.appyx.navmodel.cards.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.cards.Cards import com.bumble.appyx.navmodel.cards.Cards.Companion.TOP_STATES import com.bumble.appyx.navmodel.cards.CardsElements import kotlinx.parcelize.Parcelize @Parcelize -class IndicateLike : TopCardOperation( +class IndicateLike : TopCardOperation( newTargetState = Cards.State.IndicateLike ) -fun Cards.indicateLike() { +fun Cards.indicateLike() { accept(IndicateLike()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicatePass.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicatePass.kt index 569bfd138e..11f617f890 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicatePass.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/IndicatePass.kt @@ -1,14 +1,15 @@ package com.bumble.appyx.navmodel.cards.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.cards.Cards import com.bumble.appyx.navmodel.cards.Cards.State.IndicatePass import kotlinx.parcelize.Parcelize @Parcelize -class IndicatePass : TopCardOperation( +class IndicatePass : TopCardOperation( newTargetState = IndicatePass ) -fun Cards.indicatePass() { +fun Cards.indicatePass() { accept(IndicatePass()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/PromoteAll.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/PromoteAll.kt index d1a120f73b..efd315b656 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/PromoteAll.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/PromoteAll.kt @@ -1,19 +1,20 @@ package com.bumble.appyx.navmodel.cards.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.cards.Cards import com.bumble.appyx.navmodel.cards.CardsElements import kotlinx.parcelize.Parcelize @Parcelize -internal class PromoteAll : CardsOperation { +internal class PromoteAll : CardsOperation { override fun isApplicable(elements: CardsElements): Boolean = true - override fun invoke(elements: CardsElements, ): CardsElements = + override fun invoke(elements: CardsElements): CardsElements = elements.transitionTo { it.targetState.next() } } -internal fun Cards.promoteAll() { +internal fun Cards.promoteAll() { accept(PromoteAll()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/TopCardOperation.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/TopCardOperation.kt index eafd7efa02..f26ada74f8 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/TopCardOperation.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/TopCardOperation.kt @@ -1,11 +1,12 @@ package com.bumble.appyx.navmodel.cards.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.cards.Cards import com.bumble.appyx.navmodel.cards.CardsElements -abstract class TopCardOperation( +abstract class TopCardOperation( private val newTargetState: Cards.State - ) : CardsOperation { +) : CardsOperation { override fun isApplicable(elements: CardsElements): Boolean = elements.any { it.targetState in Cards.TOP_STATES } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VoteLike.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VoteLike.kt index 8024475436..8a9c9c3ad9 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VoteLike.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VoteLike.kt @@ -1,14 +1,15 @@ package com.bumble.appyx.navmodel.cards.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.cards.Cards import kotlinx.parcelize.Parcelize @Parcelize -class VoteLike internal constructor() : TopCardOperation( +class VoteLike internal constructor() : TopCardOperation( newTargetState = Cards.State.VoteLike ) -fun Cards.voteLike() { +fun Cards.voteLike() { accept(VoteLike()) promoteAll() } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VotePass.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VotePass.kt index d793fb0d77..708a6cc4d5 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VotePass.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/operation/VotePass.kt @@ -1,16 +1,17 @@ package com.bumble.appyx.navmodel.cards.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.cards.Cards import com.bumble.appyx.navmodel.cards.Cards.Companion.FINAL_STATES import com.bumble.appyx.navmodel.cards.CardsElements import kotlinx.parcelize.Parcelize @Parcelize -class VotePass internal constructor() : TopCardOperation( +class VotePass internal constructor() : TopCardOperation( newTargetState = Cards.State.VotePass ) -fun Cards.votePass() { +fun Cards.votePass() { accept(VotePass()) promoteAll() } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/transitionhandler/CardsTransitionHandler.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/transitionhandler/CardsTransitionHandler.kt index 6dfc283f69..70b725554c 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/transitionhandler/CardsTransitionHandler.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/cards/transitionhandler/CardsTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.cards.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat @@ -35,7 +36,7 @@ import kotlin.math.roundToInt import kotlin.math.sin @Suppress("TransitionPropertiesLabel", "MagicNumber") -class CardsTransitionHandler( +class CardsTransitionHandler( private val transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessVeryLow) } ) : ModifierTransitionHandler(clipToBounds = true) { @@ -154,7 +155,7 @@ class CardsTransitionHandler( } @Composable -fun rememberCardsTransitionHandler( +fun rememberCardsTransitionHandler( transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessVeryLow) } ): ModifierTransitionHandler = remember { CardsTransitionHandler(transitionSpec) diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/Modal.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/Modal.kt index b8641aed9b..a6f9a28bb6 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/Modal.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/Modal.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal +import android.os.Parcelable import com.bumble.appyx.core.navigation.BaseNavModel import com.bumble.appyx.core.navigation.Operation.Noop import com.bumble.appyx.core.navigation.NavElements @@ -13,8 +14,9 @@ import com.bumble.appyx.navmodel.modal.Modal.State import com.bumble.appyx.navmodel.modal.Modal.State.CREATED import com.bumble.appyx.navmodel.modal.Modal.State.DESTROYED import com.bumble.appyx.navmodel.modal.backpresshandler.RevertBackPressHandler +import kotlinx.parcelize.Parcelize -class Modal( +class Modal( initialElement: NavTarget, savedStateMap: SavedStateMap?, key: String = KEY_NAV_MODEL, @@ -30,7 +32,8 @@ class Modal( finalState = DESTROYED ) { - enum class State { + @Parcelize + enum class State : Parcelable { CREATED, MODAL, FULL_SCREEN, DESTROYED } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/ModalTransitionHandler.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/ModalTransitionHandler.kt index 4a555f7916..a795ba5b08 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/ModalTransitionHandler.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/ModalTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.modal import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.tween @@ -21,7 +22,7 @@ import com.bumble.appyx.core.navigation.transition.TransitionSpec import com.bumble.appyx.navmodel.modal.Modal.State @Suppress("TransitionPropertiesLabel") -class ModalTransitionHandler( +class ModalTransitionHandler( private val transitionSpec: TransitionSpec = { tween(500) } ) : ModifierTransitionHandler() { diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/backpresshandler/RevertBackPressHandler.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/backpresshandler/RevertBackPressHandler.kt index a212613084..b985e21147 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/backpresshandler/RevertBackPressHandler.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/backpresshandler/RevertBackPressHandler.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.modal.Modal.State import com.bumble.appyx.navmodel.modal.Modal.State.FULL_SCREEN @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.modal.operation.Revert import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class RevertBackPressHandler : +class RevertBackPressHandler : BaseBackPressHandlerStrategy() { override val canHandleBackPressFlow: Flow by lazy { diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Add.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Add.kt index 6e1870a809..b6d5c730e9 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Add.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Add.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.modal.Modal import com.bumble.appyx.navmodel.modal.Modal.State.CREATED import com.bumble.appyx.navmodel.modal.ModalElement @@ -9,8 +10,8 @@ import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue @Parcelize -data class Add( - private val element: @RawValue T +data class Add( + private val element: T ) : ModalOperation { override fun isApplicable(elements: ModalElements) = true @@ -25,6 +26,6 @@ data class Add( } } -fun Modal.add(element: T) { +fun Modal.add(element: T) { accept(Add(element)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Destroy.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Destroy.kt index e6d2d62c31..39a6d68187 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Destroy.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Destroy.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.modal.Modal import com.bumble.appyx.navmodel.modal.Modal.State.DESTROYED import com.bumble.appyx.navmodel.modal.ModalElements @@ -7,7 +8,7 @@ import com.bumble.appyx.core.navigation.NavKey import kotlinx.parcelize.Parcelize @Parcelize -data class Destroy( +data class Destroy( private val key: NavKey ) : ModalOperation { @@ -27,6 +28,6 @@ data class Destroy( } } -fun Modal.destroy(key: NavKey) { +fun Modal.destroy(key: NavKey) { accept(Destroy(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Dismiss.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Dismiss.kt index a627a178bd..faa90d2dc3 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Dismiss.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Dismiss.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.modal.Modal import com.bumble.appyx.navmodel.modal.Modal.State.CREATED import com.bumble.appyx.navmodel.modal.ModalElements @@ -7,7 +8,7 @@ import com.bumble.appyx.core.navigation.NavKey import kotlinx.parcelize.Parcelize @Parcelize -data class Dismiss( +data class Dismiss( private val key: NavKey ) : ModalOperation { @@ -27,6 +28,6 @@ data class Dismiss( } } -fun Modal.dismiss(key: NavKey) { +fun Modal.dismiss(key: NavKey) { accept(Dismiss(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/FullScreen.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/FullScreen.kt index 1eeecc0137..f12d0dbff3 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/FullScreen.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/FullScreen.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.modal.Modal import com.bumble.appyx.navmodel.modal.Modal.State.FULL_SCREEN import com.bumble.appyx.navmodel.modal.ModalElements @@ -7,7 +8,7 @@ import com.bumble.appyx.core.navigation.NavKey import kotlinx.parcelize.Parcelize @Parcelize -data class FullScreen( +data class FullScreen( private val key: NavKey ) : ModalOperation { @@ -27,6 +28,6 @@ data class FullScreen( } } -fun Modal.fullScreen(key: NavKey) { +fun Modal.fullScreen(key: NavKey) { accept(FullScreen(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/ModalOperation.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/ModalOperation.kt index 789bd03ca9..352a51c47f 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/ModalOperation.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/ModalOperation.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.modal.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.modal.Modal.State import com.bumble.appyx.core.navigation.Operation -interface ModalOperation : Operation +interface ModalOperation : Operation diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Revert.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Revert.kt index 678d078c1a..80b1aac4a0 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Revert.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Revert.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.modal.Modal import com.bumble.appyx.navmodel.modal.Modal.State.FULL_SCREEN import com.bumble.appyx.navmodel.modal.Modal.State.MODAL @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.modal.ModalElements import kotlinx.parcelize.Parcelize @Parcelize -class Revert : ModalOperation { +class Revert : ModalOperation { override fun isApplicable(elements: ModalElements): Boolean = true @@ -35,6 +36,6 @@ class Revert : ModalOperation { } } -fun Modal.revert() { +fun Modal.revert() { accept(Revert()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Show.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Show.kt index e3c9c3f84c..2e4ae82b49 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Show.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/modal/operation/Show.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.modal.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.modal.Modal import com.bumble.appyx.navmodel.modal.Modal.State.MODAL import com.bumble.appyx.navmodel.modal.ModalElements @@ -7,7 +8,7 @@ import com.bumble.appyx.core.navigation.NavKey import kotlinx.parcelize.Parcelize @Parcelize -data class Show( +data class Show( private val key: NavKey ) : ModalOperation { @@ -27,6 +28,6 @@ data class Show( } } -fun Modal.show(key: NavKey) { +fun Modal.show(key: NavKey) { accept(Show(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/Promoter.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/Promoter.kt index 9ac073ea76..ab42ba4754 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/Promoter.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/Promoter.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.promoter.navmodel +import android.os.Parcelable import com.bumble.appyx.navmodel.promoter.navmodel.Promoter.State import com.bumble.appyx.navmodel.promoter.navmodel.Promoter.State.CREATED import com.bumble.appyx.navmodel.promoter.navmodel.Promoter.State.DESTROYED @@ -7,8 +8,9 @@ import com.bumble.appyx.navmodel.promoter.navmodel.Promoter.State.STAGE1 import com.bumble.appyx.core.navigation.BaseNavModel import com.bumble.appyx.core.navigation.Operation.Noop import com.bumble.appyx.core.navigation.NavKey +import kotlinx.parcelize.Parcelize -class Promoter( +class Promoter( initialItems: List = listOf(), ) : BaseNavModel( screenResolver = PromoterOnScreenResolver, @@ -16,7 +18,8 @@ class Promoter( savedStateMap = null ) { - enum class State { + @Parcelize + enum class State : Parcelable { CREATED, STAGE1, STAGE2, STAGE3, STAGE4, SELECTED, DESTROYED; fun next(): State = diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/AddFirst.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/AddFirst.kt index 21480ed43f..2db948d379 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/AddFirst.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/AddFirst.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.promoter.navmodel.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.promoter.navmodel.Promoter import com.bumble.appyx.navmodel.promoter.navmodel.Promoter.State.CREATED import com.bumble.appyx.navmodel.promoter.navmodel.PromoterElement @@ -10,8 +11,8 @@ import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue @Parcelize -data class AddFirst( - private val element: @RawValue T +data class AddFirst( + private val element: T ) : PromoterOperation { override fun isApplicable(elements: PromoterElements): Boolean = @@ -31,6 +32,6 @@ data class AddFirst( } } -fun Promoter.addFirst(element: T) { +fun Promoter.addFirst(element: T) { accept(AddFirst(element)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoteAll.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoteAll.kt index ae0cddf4e0..4c1c380813 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoteAll.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoteAll.kt @@ -1,12 +1,13 @@ package com.bumble.appyx.navmodel.promoter.navmodel.operation +import android.os.Parcelable import com.bumble.appyx.navmodel.promoter.navmodel.Promoter import com.bumble.appyx.navmodel.promoter.navmodel.PromoterElements import com.bumble.appyx.core.navigation.NavElements import kotlinx.parcelize.Parcelize @Parcelize -class PromoteAll : PromoterOperation { +class PromoteAll : PromoterOperation { override fun isApplicable(elements: PromoterElements): Boolean = true @@ -17,6 +18,6 @@ class PromoteAll : PromoterOperation { elements.transitionTo { it.targetState.next() } } -fun Promoter.promoteAll() { +fun Promoter.promoteAll() { accept(PromoteAll()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoterOperation.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoterOperation.kt index f21c368b21..85682e6519 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoterOperation.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/navmodel/operation/PromoterOperation.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.promoter.navmodel.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.navmodel.promoter.navmodel.Promoter -interface PromoterOperation : Operation +interface PromoterOperation : Operation diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/transitionhandler/PromoterTransitionHandler.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/transitionhandler/PromoterTransitionHandler.kt index 3952de6514..4b841c027a 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/transitionhandler/PromoterTransitionHandler.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/promoter/transitionhandler/PromoterTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.promoter.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.tween @@ -28,7 +29,7 @@ import kotlin.math.roundToInt import kotlin.math.sin @Suppress("TransitionPropertiesLabel") -class PromoterTransitionHandler( +class PromoterTransitionHandler( private val childSize: Dp, private val transitionSpec: TransitionSpec = { tween(500) } ) : ModifierTransitionHandler() { @@ -160,7 +161,7 @@ class PromoterTransitionHandler( } @Composable -fun rememberPromoterTransitionHandler( +fun rememberPromoterTransitionHandler( childSize: Dp, transitionSpec: TransitionSpec = { tween(500) } ): ModifierTransitionHandler = remember { diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvanced.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvanced.kt index c55caf23bf..a44bd22894 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvanced.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvanced.kt @@ -12,7 +12,7 @@ import com.bumble.appyx.navmodel.spotlightadvanced.backpresshandler.GoToDefault import com.bumble.appyx.navmodel.spotlightadvanced.operation.toSpotlightAdvancedElements import kotlinx.parcelize.Parcelize -class SpotlightAdvanced( +class SpotlightAdvanced( items: List, initialActiveIndex: Int = 0, savedStateMap: SavedStateMap?, diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedElementExt.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedElementExt.kt index 33883ca108..80103c2ec0 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedElementExt.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedElementExt.kt @@ -1,9 +1,10 @@ package com.bumble.appyx.navmodel.spotlightadvanced +import android.os.Parcelable import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State.Active -val SpotlightAdvancedElements.current: SpotlightAdvancedElement? +val SpotlightAdvancedElements.current: SpotlightAdvancedElement? get() = this.lastOrNull { it.targetState == Active } -val SpotlightAdvancedElements.currentIndex: Int +val SpotlightAdvancedElements.currentIndex: Int get() = this.indexOfLast { it.targetState == Active } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedExt.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedExt.kt index 3615a7e69f..0c6e33ad16 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedExt.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/SpotlightAdvancedExt.kt @@ -1,19 +1,20 @@ package com.bumble.appyx.navmodel.spotlightadvanced +import android.os.Parcelable import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -fun SpotlightAdvanced.hasNext() = +fun SpotlightAdvanced.hasNext() = elements.map { value -> value.lastIndex != elements.value.currentIndex } -fun SpotlightAdvanced.hasPrevious() = +fun SpotlightAdvanced.hasPrevious() = elements.map { value -> value.currentIndex != 0 } -fun SpotlightAdvanced.activeIndex() = +fun SpotlightAdvanced.activeIndex() = elements.map { value -> value.currentIndex } -fun SpotlightAdvanced.elementsCount() = +fun SpotlightAdvanced.elementsCount() = elements.value.size -fun SpotlightAdvanced.isCarousel(): Flow = +fun SpotlightAdvanced.isCarousel(): Flow = elements.map { it.any { it.targetState is SpotlightAdvanced.State.Carousel } } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToDefault.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToDefault.kt index d8a74db8c7..9acb4a0fff 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToDefault.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToDefault.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State.Active @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.spotlightadvanced.operation.Activate import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class GoToDefault( +class GoToDefault( private val defaultElementIndex: Int = 0 ) : BaseBackPressHandlerStrategy() { diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToPrevious.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToPrevious.kt index 5c1f568758..e58deb1e7e 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToPrevious.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/GoToPrevious.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvancedElements @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.spotlightadvanced.operation.Previous import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class GoToPrevious : +class GoToPrevious : BaseBackPressHandlerStrategy() { override val canHandleBackPressFlow: Flow by lazy { diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/UndoHistory.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/UndoHistory.kt index a6445a3ef3..68235075cf 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/UndoHistory.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/backpresshandler/UndoHistory.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.backpresshandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State.Active @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.spotlightadvanced.operation.Activate import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class UndoHistory( +class UndoHistory( private val historyLimit: Int = 10 ) : BaseBackPressHandlerStrategy() { diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Activate.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Activate.kt index e092449dd7..2b9b9223c8 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Activate.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Activate.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.spotlightadvanced.currentIndex import kotlinx.parcelize.Parcelize @Parcelize -class Activate( +class Activate( private val index: Int ) : SpotlightAdvancedOperation { @@ -42,6 +43,6 @@ class Activate( } } -fun SpotlightAdvanced.activate(index: Int) { +fun SpotlightAdvanced.activate(index: Int) { accept(Activate(index)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Next.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Next.kt index ec00d13416..93f45c182e 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Next.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Next.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State @@ -10,7 +11,7 @@ import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State.Inact import kotlinx.parcelize.Parcelize @Parcelize -class Next : SpotlightAdvancedOperation { +class Next : SpotlightAdvancedOperation { override fun isApplicable(elements: NavElements) = elements.any { (it.fromState == InactiveAfter && it.targetState == InactiveAfter) || it.fromState is Carousel } @@ -61,7 +62,7 @@ class Next : SpotlightAdvancedOperation { } } -fun SpotlightAdvanced.next() { +fun SpotlightAdvanced.next() { accept(Next()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Previous.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Previous.kt index b6c73aacc6..7396af311d 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Previous.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/Previous.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State @@ -11,7 +12,7 @@ import kotlinx.parcelize.Parcelize @Parcelize -class Previous : SpotlightAdvancedOperation { +class Previous : SpotlightAdvancedOperation { override fun isApplicable(elements: NavElements) = elements.any { @@ -72,6 +73,6 @@ class Previous : SpotlightAdvancedOperation { } } -fun SpotlightAdvanced.previous() { +fun SpotlightAdvanced.previous() { accept(Previous()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToCarousel.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToCarousel.kt index b506f63f9c..0e5cc8006a 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToCarousel.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToCarousel.kt @@ -1,12 +1,13 @@ package com.bumble.appyx.navmodel.spotlightadvanced.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State import kotlinx.parcelize.Parcelize @Parcelize -class SwitchToCarousel: SpotlightAdvancedOperation { +class SwitchToCarousel : SpotlightAdvancedOperation { override fun isApplicable(elements: NavElements) = elements.all { it.fromState !is State.Carousel } @@ -26,6 +27,6 @@ class SwitchToCarousel: SpotlightAdvancedOperation { } } -fun SpotlightAdvanced.switchToCarousel() { +fun SpotlightAdvanced.switchToCarousel() { accept(SwitchToCarousel()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToPager.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToPager.kt index 68483d1645..bc6bb41ae9 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToPager.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/SwitchToPager.kt @@ -1,12 +1,13 @@ package com.bumble.appyx.navmodel.spotlightadvanced.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced import com.bumble.appyx.navmodel.spotlightadvanced.SpotlightAdvanced.State import kotlinx.parcelize.Parcelize @Parcelize -class SwitchToPager : SpotlightAdvancedOperation { +class SwitchToPager : SpotlightAdvancedOperation { override fun isApplicable(elements: NavElements) = elements.all { it.fromState is State.Carousel } @@ -36,6 +37,6 @@ class SwitchToPager : SpotlightAdvancedOperation { } -fun SpotlightAdvanced.switchToPager() { +fun SpotlightAdvanced.switchToPager() { accept(SwitchToPager()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/UpdateElements.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/UpdateElements.kt index cf56430b99..1acb566431 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/UpdateElements.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/operation/UpdateElements.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.core.navigation.Operation @@ -14,8 +15,8 @@ import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue @Parcelize -class UpdateElements( - private val elements: @RawValue List, +class UpdateElements( + private val elements: List, private val initialActiveIndex: Int? = null, ) : SpotlightAdvancedOperation { @@ -46,14 +47,14 @@ class UpdateElements( } } -fun SpotlightAdvanced.updateElements( +fun SpotlightAdvanced.updateElements( items: List, initialActiveItem: Int? = null ) { accept(UpdateElements(items, initialActiveItem)) } -internal fun List.toSpotlightAdvancedElements(activeIndex: Int): SpotlightAdvancedElements = +internal fun List.toSpotlightAdvancedElements(activeIndex: Int): SpotlightAdvancedElements = mapIndexed { index, item -> val state = when { index < activeIndex -> InactiveBefore diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/transitionhandler/SpotlightAdvancedSlider.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/transitionhandler/SpotlightAdvancedSlider.kt index 11d6c76ccd..6f4e585724 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/transitionhandler/SpotlightAdvancedSlider.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/spotlightadvanced/transitionhandler/SpotlightAdvancedSlider.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.spotlightadvanced.transitionhandler +import android.os.Parcelable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat @@ -33,7 +34,7 @@ import kotlin.math.roundToInt import kotlin.math.sin @Suppress("TransitionPropertiesLabel") -class SpotlightAdvancedSlider( +class SpotlightAdvancedSlider( private val transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessLow) } @@ -140,7 +141,7 @@ class SpotlightAdvancedSlider( } @Composable -fun rememberSpotlightAdvancedSlider( +fun rememberSpotlightAdvancedSlider( transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessLow) } ): ModifierTransitionHandler = remember { SpotlightAdvancedSlider( diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/Tiles.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/Tiles.kt index ea3943579f..ffa6e829f2 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/Tiles.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/Tiles.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles +import android.os.Parcelable import com.bumble.appyx.core.navigation.BaseNavModel import com.bumble.appyx.core.navigation.Operation.Noop import com.bumble.appyx.core.navigation.NavKey @@ -8,8 +9,9 @@ import com.bumble.appyx.navmodel.tiles.backPressHandler.DeselectAllTiles import com.bumble.appyx.navmodel.tiles.Tiles.State import com.bumble.appyx.navmodel.tiles.Tiles.State.CREATED import com.bumble.appyx.navmodel.tiles.Tiles.State.STANDARD +import kotlinx.parcelize.Parcelize -class Tiles( +class Tiles( initialItems: List, backPressHandler: BackPressHandlerStrategy = DeselectAllTiles() ) : BaseNavModel( @@ -19,7 +21,8 @@ class Tiles( savedStateMap = null, ) { - enum class State { + @Parcelize + enum class State : Parcelable { CREATED, STANDARD, SELECTED, DESTROYED } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/backPressHandler/DeselectAllTiles.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/backPressHandler/DeselectAllTiles.kt index 7c75b7d554..4d9092c050 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/backPressHandler/DeselectAllTiles.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/backPressHandler/DeselectAllTiles.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.backPressHandler +import android.os.Parcelable import com.bumble.appyx.core.navigation.backpresshandlerstrategies.BaseBackPressHandlerStrategy import com.bumble.appyx.navmodel.tiles.Tiles import com.bumble.appyx.navmodel.tiles.TilesElements @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.tiles.operation.DeselectAll import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class DeselectAllTiles : +class DeselectAllTiles : BaseBackPressHandlerStrategy() { override val canHandleBackPressFlow: Flow by lazy { diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Add.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Add.kt index b541df28ae..f1618066b0 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Add.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Add.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.tiles.Tiles @@ -11,8 +12,8 @@ import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue @Parcelize -data class Add( - private val element: @RawValue T +data class Add( + private val element: T ) : TilesOperation { override fun isApplicable(elements: TilesElements): Boolean = true @@ -28,6 +29,6 @@ data class Add( ) } -fun Tiles.add(element: T) { +fun Tiles.add(element: T) { accept(Add(element)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Deselect.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Deselect.kt index 5da20d196e..17f95b9295 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Deselect.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Deselect.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.tiles.Tiles @@ -9,7 +10,7 @@ import com.bumble.appyx.navmodel.tiles.TilesElements import kotlinx.parcelize.Parcelize @Parcelize -data class Deselect( +data class Deselect( private val key: NavKey ) : TilesOperation { @@ -23,6 +24,6 @@ data class Deselect( } } -fun Tiles.deselect(key: NavKey) { +fun Tiles.deselect(key: NavKey) { accept(Deselect(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/DeselectAll.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/DeselectAll.kt index d1ff4b7a1a..24a4713517 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/DeselectAll.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/DeselectAll.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.tiles.Tiles import com.bumble.appyx.navmodel.tiles.Tiles.State.SELECTED @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.tiles.TilesElements import kotlinx.parcelize.Parcelize @Parcelize -class DeselectAll : TilesOperation { +class DeselectAll : TilesOperation { override fun isApplicable(elements: TilesElements): Boolean = true @@ -24,6 +25,6 @@ class DeselectAll : TilesOperation { override fun hashCode(): Int = this.javaClass.hashCode() } -fun Tiles.deselectAll() { +fun Tiles.deselectAll() { accept(DeselectAll()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Destroy.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Destroy.kt index 0af151f9b6..73a4d74165 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Destroy.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Destroy.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.tiles.Tiles @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.tiles.TilesElements import kotlinx.parcelize.Parcelize @Parcelize -data class Destroy( +data class Destroy( private val key: NavKey ) : TilesOperation { @@ -22,6 +23,6 @@ data class Destroy( } } -fun Tiles.destroy(key: NavKey) { +fun Tiles.destroy(key: NavKey) { accept(Destroy(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/RemoveSelected.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/RemoveSelected.kt index 42fae5d2b1..5b4f30125e 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/RemoveSelected.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/RemoveSelected.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.navmodel.tiles.Tiles import com.bumble.appyx.navmodel.tiles.Tiles.State.DESTROYED @@ -8,7 +9,7 @@ import com.bumble.appyx.navmodel.tiles.TilesElements import kotlinx.parcelize.Parcelize @Parcelize -class RemoveSelected : TilesOperation { +class RemoveSelected : TilesOperation { override fun isApplicable(elements: TilesElements): Boolean = true @@ -24,6 +25,6 @@ class RemoveSelected : TilesOperation { override fun hashCode(): Int = this.javaClass.hashCode() } -fun Tiles.removeSelected() { +fun Tiles.removeSelected() { accept(RemoveSelected()) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Select.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Select.kt index d64c069a3f..605fe66b1c 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Select.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/Select.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.tiles.Tiles @@ -9,7 +10,7 @@ import com.bumble.appyx.navmodel.tiles.TilesElements import kotlinx.parcelize.Parcelize @Parcelize -data class Select( +data class Select( private val key: NavKey ) : TilesOperation { @@ -23,6 +24,6 @@ data class Select( } } -fun Tiles.select(key: NavKey) { +fun Tiles.select(key: NavKey) { accept(Select(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/TilesOperation.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/TilesOperation.kt index 8c691dea45..fadf5d35b8 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/TilesOperation.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/TilesOperation.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.Operation import com.bumble.appyx.navmodel.tiles.Tiles -interface TilesOperation : Operation +interface TilesOperation : Operation diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/ToggleSelection.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/ToggleSelection.kt index 0067540524..deeff4b43d 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/ToggleSelection.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/operation/ToggleSelection.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.navmodel.tiles.operation +import android.os.Parcelable import com.bumble.appyx.core.navigation.NavElements import com.bumble.appyx.core.navigation.NavKey import com.bumble.appyx.navmodel.tiles.Tiles @@ -7,7 +8,7 @@ import com.bumble.appyx.navmodel.tiles.TilesElements import kotlinx.parcelize.Parcelize @Parcelize -data class ToggleSelection( +data class ToggleSelection( private val key: NavKey ) : TilesOperation { @@ -35,6 +36,6 @@ data class ToggleSelection( } } -fun Tiles.toggleSelection(key: NavKey) { +fun Tiles.toggleSelection(key: NavKey) { accept(ToggleSelection(key)) } diff --git a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/transitionhandler/TilesTransitionHandler.kt b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/transitionhandler/TilesTransitionHandler.kt index 0a601648a4..82b14f28ab 100644 --- a/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/transitionhandler/TilesTransitionHandler.kt +++ b/samples/navmodel-samples/src/main/kotlin/com/bumble/appyx/navmodel/tiles/transitionhandler/TilesTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.navmodel.tiles.transitionhandler import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Spring import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat @@ -20,7 +21,7 @@ import com.bumble.appyx.navmodel.tiles.Tiles import kotlin.math.roundToInt @Suppress("TransitionPropertiesLabel") -class TilesTransitionHandler( +class TilesTransitionHandler( private val transitionSpec: TransitionSpec = { spring() } ) : ModifierTransitionHandler() { @@ -62,7 +63,7 @@ class TilesTransitionHandler( } @Composable -fun rememberTilesTransitionHandler( +fun rememberTilesTransitionHandler( transitionSpec: TransitionSpec = { spring(stiffness = Spring.StiffnessVeryLow) } ): ModifierTransitionHandler = remember { TilesTransitionHandler(transitionSpec) diff --git a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/backstack/BackStackExampleTransitionHandler.kt b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/backstack/BackStackExampleTransitionHandler.kt index df1526deca..0d30b3e859 100644 --- a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/backstack/BackStackExampleTransitionHandler.kt +++ b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/backstack/BackStackExampleTransitionHandler.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.sandbox.client.backstack import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.Transition import androidx.compose.runtime.Composable import androidx.compose.runtime.remember @@ -12,7 +13,7 @@ import com.bumble.appyx.navmodel.backstack.operation.Replace import com.bumble.appyx.navmodel.backstack.transitionhandler.BackStackFader import com.bumble.appyx.navmodel.backstack.transitionhandler.BackStackSlider -class BackStackExampleTransitionHandler : +class BackStackExampleTransitionHandler : ModifierTransitionHandler(clipToBounds = true) { private val slider = BackStackSlider(clipToBounds = clipToBounds) @@ -31,7 +32,7 @@ class BackStackExampleTransitionHandler : } @Composable -fun rememberBackStackExampleTransitionHandler( +fun rememberBackStackExampleTransitionHandler( ): ModifierTransitionHandler = remember { BackStackExampleTransitionHandler() } diff --git a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/list/LazyListContainerNode.kt b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/list/LazyListContainerNode.kt index 1eb67a0b81..d542a8c1c8 100644 --- a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/list/LazyListContainerNode.kt +++ b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/list/LazyListContainerNode.kt @@ -85,7 +85,7 @@ class LazyListContainerNode constructor( } @Composable - private fun ColumnExample(elements: ImmutableList>) { + private fun ColumnExample(elements: ImmutableList>) { LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(horizontal = 16.dp), @@ -99,7 +99,7 @@ class LazyListContainerNode constructor( } @Composable - private fun RowExample(elements: ImmutableList>) { + private fun RowExample(elements: ImmutableList>) { LazyRow( modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(vertical = 16.dp), @@ -112,7 +112,7 @@ class LazyListContainerNode constructor( } @Composable - private fun GridExample(elements: ImmutableList>) { + private fun GridExample(elements: ImmutableList>) { LazyVerticalGrid( columns = Fixed(2), modifier = Modifier.fillMaxSize(), diff --git a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/spotlight/SpotlightFaderThrough.kt b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/spotlight/SpotlightFaderThrough.kt index 9a9168ea28..9a5d2e81a9 100644 --- a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/spotlight/SpotlightFaderThrough.kt +++ b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/spotlight/SpotlightFaderThrough.kt @@ -1,6 +1,7 @@ package com.bumble.appyx.sandbox.client.spotlight import android.annotation.SuppressLint +import android.os.Parcelable import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat @@ -19,7 +20,7 @@ import com.bumble.appyx.navmodel.spotlight.Spotlight * Fade through transition from material design * [Specification](https://m2.material.io/design/motion/the-motion-system.html#fade-through) */ -class SpotlightFaderThrough : ModifierTransitionHandler() { +class SpotlightFaderThrough : ModifierTransitionHandler() { @SuppressLint("ModifierFactoryExtensionFunction") override fun createModifier( @@ -91,5 +92,5 @@ class SpotlightFaderThrough : ModifierTransitionHandler() } @Composable -fun rememberSpotlightFaderThrough(): ModifierTransitionHandler = +fun rememberSpotlightFaderThrough(): ModifierTransitionHandler = remember { SpotlightFaderThrough() } diff --git a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/tiles/TilesExampleNode.kt b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/tiles/TilesExampleNode.kt index 9dae329535..600818c944 100644 --- a/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/tiles/TilesExampleNode.kt +++ b/samples/sandbox/src/main/kotlin/com/bumble/appyx/sandbox/client/tiles/TilesExampleNode.kt @@ -1,5 +1,6 @@ package com.bumble.appyx.sandbox.client.tiles +import android.os.Parcelable import android.util.Log import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -36,6 +37,7 @@ import com.bumble.appyx.sandbox.client.tiles.TilesExampleNode.NavTarget.Child1 import com.bumble.appyx.sandbox.client.tiles.TilesExampleNode.NavTarget.Child2 import com.bumble.appyx.sandbox.client.tiles.TilesExampleNode.NavTarget.Child3 import com.bumble.appyx.sandbox.client.tiles.TilesExampleNode.NavTarget.Child4 +import kotlinx.parcelize.Parcelize class TilesExampleNode( buildContext: BuildContext, @@ -49,7 +51,8 @@ class TilesExampleNode( buildContext = buildContext, ) { - enum class NavTarget { + @Parcelize + enum class NavTarget : Parcelable { Child1, Child2, Child3, Child4, }