diff options
| author | 2016-10-08 23:52:20 +0000 | |
|---|---|---|
| committer | 2016-10-08 23:52:20 +0000 | |
| commit | 4a1ea9ba7ed48b2c0e5096dbc0dd10b13830de50 (patch) | |
| tree | 4a61e35f7f3b11f3b195391f83037985428b7c81 | |
| parent | 180ebf16c934b029d2da22db3a6be3658d9f5a1e (diff) | |
| parent | 679fe6ab6f4b9252ef414a0c0c5ad9633f3d0294 (diff) | |
Support calling start() in onAnimationFinished(...) in AVD
am: 679fe6ab6f
Change-Id: I2999f6fc543f56d73cd03fe74b466c033d6c7d1a
| -rw-r--r-- | libs/hwui/PropertyValuesAnimatorSet.cpp | 11 |
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); } } |