Cancel animations when LottieDrawable is unschedules
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
index ca8d13b..8441d44 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
@@ -238,6 +238,15 @@
super.setImageBitmap(bm);
}
+ @Override public void unscheduleDrawable(Drawable who) {
+ if (who == lottieDrawable && lottieDrawable.isAnimating()) {
+ cancelAnimation();
+ } else if (who instanceof LottieDrawable && ((LottieDrawable) who).isAnimating()) {
+ ((LottieDrawable) who).cancelAnimation();
+ }
+ super.unscheduleDrawable(who);
+ }
+
@Override public void invalidateDrawable(@NonNull Drawable dr) {
if (getDrawable() == lottieDrawable) {
// We always want to invalidate the root drawable so it redraws the whole drawable.
diff --git a/sample/src/androidTest/java/com/airbnb/lottie/samples/LottieAnimationViewTest.kt b/sample/src/androidTest/java/com/airbnb/lottie/samples/LottieAnimationViewTest.kt
index a10e4a7..60b31c8 100644
--- a/sample/src/androidTest/java/com/airbnb/lottie/samples/LottieAnimationViewTest.kt
+++ b/sample/src/androidTest/java/com/airbnb/lottie/samples/LottieAnimationViewTest.kt
@@ -16,6 +16,7 @@
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.LottieDrawable
+import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
@@ -46,4 +47,19 @@
assertTrue(view.drawable is LottieDrawable)
}
}
+
+ @Test
+ fun testStopsPlayingWhenDrawableSwitched() {
+ class TestFragment : Fragment(R.layout.lottie_activity_main)
+ val scenario = launchFragmentInContainer<TestFragment>()
+ scenario.moveToState(Lifecycle.State.RESUMED)
+ scenario.onFragment { fragment ->
+ val composition = LottieCompositionFactory.fromRawResSync(fragment.requireContext(), R.raw.hamburger_arrow).value!!
+ val view = fragment.requireView().findViewById<LottieAnimationView>(R.id.animation_view)
+ view.setComposition(composition)
+ view.playAnimation()
+ view.setImageDrawable(ColorDrawable(Color.GREEN))
+ assertFalse(view.isAnimating)
+ }
+ }
}