summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorAleksandr Granin <aleksandr@mullvad.net>2021-02-26 12:22:47 +0100
committerAleksandr Granin <aleksandr@mullvad.net>2021-02-26 13:53:01 +0100
commit0bbd96c6c1079dad1f9a49e020043a9cbb77e4ce (patch)
tree61358776bafb216ffa88f4210d23ced8559817cb /android/src
parent120d3050eca4df169f98dce056572f7f12e465a7 (diff)
downloadmullvadvpn-0bbd96c6c1079dad1f9a49e020043a9cbb77e4ce.tar.xz
mullvadvpn-0bbd96c6c1079dad1f9a49e020043a9cbb77e4ce.zip
Add transition animation listener for enter
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/BaseFragment.kt21
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt28
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)