Skip to content

Commit

Permalink
Fix wrong animation direction when child replaced
Browse files Browse the repository at this point in the history
  • Loading branch information
arkivanov committed Mar 29, 2021
1 parent 18f5e4b commit 325fccc
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@ package com.arkivanov.decompose.extensions.compose.jetbrains.animation.child

import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.animation.core.tween
import androidx.compose.runtime.remember
import com.arkivanov.decompose.Child
import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.extensions.compose.jetbrains.ChildAnimation
import com.arkivanov.decompose.extensions.compose.jetbrains.animation.page.PageAnimation
import com.arkivanov.decompose.extensions.compose.jetbrains.animation.page.PageAnimator
import com.arkivanov.decompose.extensions.compose.jetbrains.animation.page.PageArrangement
import java.util.WeakHashMap

internal val defaultChildAnimationSpec: FiniteAnimationSpec<Float> = tween()

/**
* A handy API for the [Children][com.arkivanov.decompose.extensions.compose.jetbrains.Children] animations
* A handy API for the [Children][com.arkivanov.decompose.extensions.compose.jetpack.Children] animations
*
* @param animationSpec a [FiniteAnimationSpec] to configure the animation
* @param animator see [PageAnimator] for details
Expand All @@ -23,14 +25,18 @@ fun <C : Any, T : Any> childAnimation(
animator: PageAnimator<Child.Created<C, T>>
): ChildAnimation<C, T> =
{ routerState, content ->
val stack = routerState.backStack + routerState.activeChild
val indicesMap: MutableMap<Child<C, T>, Int> = remember(::WeakHashMap)
routerState.backStack.forEachIndexed { index, child ->
indicesMap[child] = index
}
indicesMap[routerState.activeChild] = routerState.backStack.size

PageAnimation(
key = routerState.activeChild,
animationSpec = animationSpec,
arranger = { new, old ->
val indexOfNew = stack.indexOf(new).takeIf { it >= 0 } ?: Int.MAX_VALUE
val indexOfOld = stack.indexOf(old).takeIf { it >= 0 } ?: Int.MAX_VALUE
val indexOfNew = indicesMap[new] ?: Int.MAX_VALUE
val indexOfOld = indicesMap[old] ?: Int.MAX_VALUE
if (indexOfNew >= indexOfOld) PageArrangement.FOLLOWING else PageArrangement.PREVIOUS
},
animator = animator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ private fun <T : Any> PageAnimationFrame(
}
}

private class AnimationItem<T>(
private class AnimationItem<out T>(
val key: T,
val arrangement: PageArrangement,
val direction: PageAnimationDirection
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package com.arkivanov.decompose.extensions.compose.jetpack.animation.child

import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.animation.core.tween
import androidx.compose.runtime.remember
import com.arkivanov.decompose.Child
import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.extensions.compose.jetpack.ChildAnimation
import com.arkivanov.decompose.extensions.compose.jetpack.animation.page.PageAnimation
import com.arkivanov.decompose.extensions.compose.jetpack.animation.page.PageAnimator
import com.arkivanov.decompose.extensions.compose.jetpack.animation.page.PageArrangement
import java.util.WeakHashMap

internal val defaultChildAnimationSpec: FiniteAnimationSpec<Float> = tween()

Expand All @@ -23,14 +25,18 @@ fun <C : Any, T : Any> childAnimation(
animator: PageAnimator<Child.Created<C, T>>
): ChildAnimation<C, T> =
{ routerState, content ->
val stack = routerState.backStack + routerState.activeChild
val indicesMap: MutableMap<Child<C, T>, Int> = remember(::WeakHashMap)
routerState.backStack.forEachIndexed { index, child ->
indicesMap[child] = index
}
indicesMap[routerState.activeChild] = routerState.backStack.size

PageAnimation(
key = routerState.activeChild,
animationSpec = animationSpec,
arranger = { new, old ->
val indexOfNew = stack.indexOf(new).takeIf { it >= 0 } ?: Int.MAX_VALUE
val indexOfOld = stack.indexOf(old).takeIf { it >= 0 } ?: Int.MAX_VALUE
val indexOfNew = indicesMap[new] ?: Int.MAX_VALUE
val indexOfOld = indicesMap[old] ?: Int.MAX_VALUE
if (indexOfNew >= indexOfOld) PageArrangement.FOLLOWING else PageArrangement.PREVIOUS
},
animator = animator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ private fun <T : Any> PageAnimationFrame(
}
}

private class AnimationItem<T>(
private class AnimationItem<out T>(
val key: T,
val arrangement: PageArrangement,
val direction: PageAnimationDirection
Expand Down

0 comments on commit 325fccc

Please sign in to comment.