summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Doris Liu <tianliu@google.com> 2016-10-08 23:52:20 +0000
committer android-build-merger <android-build-merger@google.com> 2016-10-08 23:52:20 +0000
commit4a1ea9ba7ed48b2c0e5096dbc0dd10b13830de50 (patch)
tree4a61e35f7f3b11f3b195391f83037985428b7c81
parent180ebf16c934b029d2da22db3a6be3658d9f5a1e (diff)
parent679fe6ab6f4b9252ef414a0c0c5ad9633f3d0294 (diff)
Support calling start() in onAnimationFinished(...) in AVD
am: 679fe6ab6f Change-Id: I2999f6fc543f56d73cd03fe74b466c033d6c7d1a
-rw-r--r--libs/hwui/PropertyValuesAnimatorSet.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/libs/hwui/PropertyValuesAnimatorSet.cpp b/libs/hwui/PropertyValuesAnimatorSet.cpp
index 38fb70a92e43..e3258e3c1a48 100644
--- a/libs/hwui/PropertyValuesAnimatorSet.cpp
+++ b/libs/hwui/PropertyValuesAnimatorSet.cpp
@@ -46,8 +46,17 @@ PropertyValuesAnimatorSet::PropertyValuesAnimatorSet()
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);
}
}