Support calling start() in onAnimationFinished(...) in AVD

This CL fixed an issue where calling start() from onAnimationFinished()
caused AnimationListenerBridge::onAnimationFinished(...) to be unsafely
re-entered and the new start listener was (incorrectly) reset to null.

BUG: 31971397
Test: test apk in the bug linked above
Change-Id: Ica809ef2dab884950b93b54f2d0cb4b81e9830f1
diff --git a/libs/hwui/PropertyValuesAnimatorSet.cpp b/libs/hwui/PropertyValuesAnimatorSet.cpp
index 38fb70a..e3258e3 100644
--- a/libs/hwui/PropertyValuesAnimatorSet.cpp
+++ b/libs/hwui/PropertyValuesAnimatorSet.cpp
@@ -46,8 +46,17 @@
 
 void PropertyValuesAnimatorSet::onFinished(BaseRenderNodeAnimator* animator) {
     if (mOneShotListener.get()) {
-        mOneShotListener->onAnimationFinished(animator);
+        sp<AnimationListener> listener = std::move(mOneShotListener);
+        // Set the listener to nullptr before the onAnimationFinished callback, rather than after,
+        // for two reasons:
+        // 1) We need to prevent changes to mOneShotListener during the onAnimationFinished
+        // callback (specifically in AnimationListenerBridge::onAnimationFinished(...) from
+        // triggering dtor of the bridge and potentially unsafely re-entering
+        // AnimationListenerBridge::onAnimationFinished(...).
+        // 2) It's possible that there are changes to the listener during the callback, therefore
+        // we need to reset the listener before the callback rather than afterwards.
         mOneShotListener = nullptr;
+        listener->onAnimationFinished(animator);
     }
 }