diff options
| author | 2016-10-10 17:53:27 +0000 | |
|---|---|---|
| committer | 2016-10-10 17:53:27 +0000 | |
| commit | 41677af6d8df1c860e490ebf9c342c4930b7019b (patch) | |
| tree | 86b28cee7b67942d386530067be98aca21b5adc4 | |
| parent | 56f823be9ad6626234300e7c787a74eb0186ee18 (diff) | |
| parent | 5ef10f1d26993ff1bfa3e4772d38d3db56ffc38f (diff) | |
Support calling start() in onAnimationFinished(...) in AVD am: 679fe6ab6f am: 4a1ea9ba7e
am: 5ef10f1d26
Change-Id: I42025b25e588ff9a72ac932dbee0ecb1339fa9f2
| -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); } } |