Reset LottieDrawable when setting the same composition a second time
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
index 4240035..ca8d13b 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
@@ -553,6 +553,10 @@
// We can avoid re-setting the drawable, and invalidating the view, since the composition
// hasn't changed.
return;
+ } else if (!isNewComposition) {
+ // The current drawable isn't lottieDrawable but the drawable already has the right composition.
+ setImageDrawable(null);
+ setImageDrawable(lottieDrawable);
}
// This is needed to makes sure that the animation is properly played/paused for the current visibility state.
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 976bc4a..a10e4a7 100644
--- a/sample/src/androidTest/java/com/airbnb/lottie/samples/LottieAnimationViewTest.kt
+++ b/sample/src/androidTest/java/com/airbnb/lottie/samples/LottieAnimationViewTest.kt
@@ -1,7 +1,11 @@
package com.airbnb.lottie.samples
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
import androidx.fragment.app.Fragment
+import androidx.fragment.app.testing.FragmentScenario
import androidx.fragment.app.testing.launchFragmentInContainer
+import androidx.lifecycle.Lifecycle
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers
@@ -9,6 +13,10 @@
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import com.airbnb.lottie.LottieAnimationView
+import com.airbnb.lottie.LottieCompositionFactory
+import com.airbnb.lottie.LottieDrawable
+import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
@@ -21,4 +29,21 @@
launchFragmentInContainer<TestFragment>()
onView(withId(R.id.animation_view)).check(matches(isDisplayed()))
}
+
+ @Test
+ fun testCanSetAnAnimationAndChangeItBack() {
+ 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)
+ assertTrue(view.drawable is LottieDrawable)
+ view.setImageDrawable(ColorDrawable(Color.GREEN))
+ assertTrue(view.drawable is ColorDrawable)
+ view.setComposition(composition)
+ assertTrue(view.drawable is LottieDrawable)
+ }
+ }
}