aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Peal <gpeal@users.noreply.github.com>2019-11-30 11:57:52 -0800
committerGitHub <noreply@github.com>2019-11-30 11:57:52 -0800
commitc1a967d03e5e6b5d9a5a5cf824e14c8ad7cca2d2 (patch)
tree6ce0d79b4f016de0ce5aae41878a0be223cb0f84
parentc302150c8ccb52595a6c3bf68a9d3068af766a19 (diff)
downloadlottie-c1a967d03e5e6b5d9a5a5cf824e14c8ad7cca2d2.tar.gz
Save play state in SavedState even if view was detached from the window first (#1442)
Test failed before but passes now Fixes #1428
-rw-r--r--LottieSample/src/androidTest/java/com/airbnb/lottie/samples/FragmentVisibilityTests.kt30
-rw-r--r--lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java3
2 files changed, 32 insertions, 1 deletions
diff --git a/LottieSample/src/androidTest/java/com/airbnb/lottie/samples/FragmentVisibilityTests.kt b/LottieSample/src/androidTest/java/com/airbnb/lottie/samples/FragmentVisibilityTests.kt
index f929d38c..fc338b93 100644
--- a/LottieSample/src/androidTest/java/com/airbnb/lottie/samples/FragmentVisibilityTests.kt
+++ b/LottieSample/src/androidTest/java/com/airbnb/lottie/samples/FragmentVisibilityTests.kt
@@ -3,6 +3,8 @@ package com.airbnb.lottie.samples
import android.animation.Animator
import android.content.Intent
import android.os.Bundle
+import android.os.Parcelable
+import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -421,6 +423,34 @@ class FragmentVisibilityTests {
scenario.onFragment { assertFalse(it.animationView!!.isAnimating) }
}
+ @Test
+ fun testResumesWhenStateSavedAndRestored() {
+ class TestFragment : Fragment() {
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ return inflater.inflate(R.layout.auto_play, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ IdlingRegistry.getInstance().register(LottieIdlingResource(view.findViewById(R.id.animation_view)))
+ }
+ }
+
+ val scenario = launchFragmentInContainer<TestFragment>()
+ onView(withId(R.id.animation_view)).check(matches(isAnimating()))
+ scenario.onFragment { frag ->
+ val savedState = SparseArray<Parcelable>()
+ val animationView = frag.requireView().findViewById<LottieAnimationView>(R.id.animation_view)
+ val parent = animationView.parent as ViewGroup
+ val fragmentViewParent = frag.requireView().parent as ViewGroup
+ fragmentViewParent.removeView(parent)
+ parent.saveHierarchyState(savedState)
+ fragmentViewParent.addView(parent)
+ parent.restoreHierarchyState(savedState)
+
+ }
+ onView(withId(R.id.animation_view)).check(matches(isAnimating()))
+ }
+
private fun FragmentScenario<*>.waitForState(desiredState: Lifecycle.State) {
var isState = false
while (!isState) {
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
index 44b58bb0..757a5693 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
@@ -23,6 +23,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RawRes;
import androidx.appcompat.widget.AppCompatImageView;
+import androidx.core.view.ViewCompat;
import com.airbnb.lottie.model.KeyPath;
import com.airbnb.lottie.parser.moshi.JsonReader;
@@ -247,7 +248,7 @@ import static com.airbnb.lottie.RenderMode.HARDWARE;
ss.animationName = animationName;
ss.animationResId = animationResId;
ss.progress = lottieDrawable.getProgress();
- ss.isAnimating = lottieDrawable.isAnimating();
+ ss.isAnimating = lottieDrawable.isAnimating() || (!ViewCompat.isAttachedToWindow(this) && wasAnimatingWhenDetached);
ss.imageAssetsFolder = lottieDrawable.getImageAssetsFolder();
ss.repeatMode = lottieDrawable.getRepeatMode();
ss.repeatCount = lottieDrawable.getRepeatCount();