diff options
author | Gabriel Peal <gpeal@users.noreply.github.com> | 2019-11-30 11:57:52 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-30 11:57:52 -0800 |
commit | c1a967d03e5e6b5d9a5a5cf824e14c8ad7cca2d2 (patch) | |
tree | 6ce0d79b4f016de0ce5aae41878a0be223cb0f84 | |
parent | c302150c8ccb52595a6c3bf68a9d3068af766a19 (diff) | |
download | lottie-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.kt | 30 | ||||
-rw-r--r-- | lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java | 3 |
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(); |