diff options
| author | Aleksandr Granin <aleksandr@mullvad.net> | 2021-02-26 12:22:47 +0100 |
|---|---|---|
| committer | Aleksandr Granin <aleksandr@mullvad.net> | 2021-02-26 13:53:01 +0100 |
| commit | 0bbd96c6c1079dad1f9a49e020043a9cbb77e4ce (patch) | |
| tree | 61358776bafb216ffa88f4210d23ced8559817cb /android/src/main | |
| parent | 120d3050eca4df169f98dce056572f7f12e465a7 (diff) | |
| download | mullvadvpn-0bbd96c6c1079dad1f9a49e020043a9cbb77e4ce.tar.xz mullvadvpn-0bbd96c6c1079dad1f9a49e020043a9cbb77e4ce.zip | |
Add transition animation listener for enter
Diffstat (limited to 'android/src/main')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/BaseFragment.kt | 21 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt | 28 |
2 files changed, 47 insertions, 2 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/BaseFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/BaseFragment.kt index 1d615dbde0..17bcc740a5 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/BaseFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/BaseFragment.kt @@ -1,11 +1,22 @@ package net.mullvad.mullvadvpn.ui.fragments import android.view.animation.Animation +import android.view.animation.AnimationUtils +import androidx.annotation.LayoutRes import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow import net.mullvad.mullvadvpn.R +import net.mullvad.mullvadvpn.util.transitionFinished + +abstract class BaseFragment : Fragment { + constructor() : super() + constructor (@LayoutRes contentLayoutId: Int) : super(contentLayoutId) + + protected var transitionFinishedFlow: Flow<Unit> = emptyFlow() + private set -abstract class BaseFragment : Fragment() { override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { val zAdjustment = if (animationsToAdjustZorder.contains(nextAnim)) { 1f @@ -13,7 +24,13 @@ abstract class BaseFragment : Fragment() { 0f } ViewCompat.setTranslationZ(requireView(), zAdjustment) - return super.onCreateAnimation(transit, enter, nextAnim) + return if (nextAnim != 0 && enter) { + AnimationUtils.loadAnimation(context, nextAnim)?.apply { + transitionFinishedFlow = transitionFinished() + } + } else { + super.onCreateAnimation(transit, enter, nextAnim) + } } companion object { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt new file mode 100644 index 0000000000..45c45f4e16 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt @@ -0,0 +1,28 @@ +package net.mullvad.mullvadvpn.util + +import android.view.animation.Animation +import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.SendChannel +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.take + +fun <T> SendChannel<T>.safeOffer(element: T): Boolean { + return runCatching { offer(element) }.getOrDefault(false) +} + +fun Animation.transitionFinished(): Flow<Unit> = callbackFlow<Unit> { + val transitionAnimationListener = object : Animation.AnimationListener { + override fun onAnimationStart(animation: Animation?) {} + override fun onAnimationEnd(animation: Animation?) { safeOffer(Unit) } + override fun onAnimationRepeat(animation: Animation?) {} + } + setAnimationListener(transitionAnimationListener) + awaitClose { + Dispatchers.Main.dispatch(EmptyCoroutineContext) { + setAnimationListener(null) + } + } +}.take(1) |
