Skip to content

Commit 386be21

Browse files
committed
Use fade animation when replacing Placeholder
1 parent 8c20770 commit 386be21

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ class LoggedInFlowNode(
636636
) { contentModifier ->
637637
Box(modifier = contentModifier) {
638638
val ftueState by ftueService.state.collectAsState()
639-
BackstackView()
639+
BackstackView(transitionHandler = rememberLoggedInFlowTransitionHandler(backstack))
640640
if (ftueState is FtueState.Complete) {
641641
PermanentChild(permanentNavModel = permanentNavModel, navTarget = NavTarget.LoggedInPermanent)
642642
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright (c) 2026 Element Creations Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package io.element.android.appnav
9+
10+
import androidx.compose.animation.core.Spring
11+
import androidx.compose.animation.core.Transition
12+
import androidx.compose.animation.core.spring
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.runtime.remember
15+
import androidx.compose.ui.Modifier
16+
import com.bumble.appyx.core.navigation.transition.ModifierTransitionHandler
17+
import com.bumble.appyx.core.navigation.transition.TransitionDescriptor
18+
import com.bumble.appyx.navmodel.backstack.BackStack
19+
import com.bumble.appyx.navmodel.backstack.transitionhandler.rememberBackstackFader
20+
import com.bumble.appyx.navmodel.backstack.transitionhandler.rememberBackstackSlider
21+
22+
/**
23+
* A TransitionHandler that uses fade transition when Placeholder is being removed,
24+
* and slide transition for all other cases.
25+
*/
26+
class LoggedInFlowTransitionHandler(
27+
private val backstack: BackStack<LoggedInFlowNode.NavTarget>,
28+
private val slider: ModifierTransitionHandler<LoggedInFlowNode.NavTarget, BackStack.State>,
29+
private val fader: ModifierTransitionHandler<LoggedInFlowNode.NavTarget, BackStack.State>,
30+
) : ModifierTransitionHandler<LoggedInFlowNode.NavTarget, BackStack.State>() {
31+
override fun createModifier(
32+
modifier: Modifier,
33+
transition: Transition<BackStack.State>,
34+
descriptor: TransitionDescriptor<LoggedInFlowNode.NavTarget, BackStack.State>
35+
): Modifier {
36+
val isPlaceholderBeingRemoved = backstack.elements.value.any { element ->
37+
element.key.navTarget == LoggedInFlowNode.NavTarget.Placeholder &&
38+
element.targetState != BackStack.State.ACTIVE
39+
}
40+
val handler = if (isPlaceholderBeingRemoved) fader else slider
41+
return handler.createModifier(modifier, transition, descriptor)
42+
}
43+
}
44+
45+
@Composable
46+
fun rememberLoggedInFlowTransitionHandler(
47+
backstack: BackStack<LoggedInFlowNode.NavTarget>,
48+
): ModifierTransitionHandler<LoggedInFlowNode.NavTarget, BackStack.State> {
49+
val slider = rememberBackstackSlider<LoggedInFlowNode.NavTarget>(
50+
transitionSpec = { spring(stiffness = Spring.StiffnessMediumLow) },
51+
)
52+
val fader = rememberBackstackFader<LoggedInFlowNode.NavTarget>(
53+
transitionSpec = { spring(stiffness = Spring.StiffnessMediumLow) },
54+
)
55+
return remember(backstack, slider, fader) {
56+
LoggedInFlowTransitionHandler(backstack, slider, fader)
57+
}
58+
}

0 commit comments

Comments
 (0)