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
This commit is contained in:
@@ -46,8 +46,17 @@ PropertyValuesAnimatorSet::PropertyValuesAnimatorSet()
|
|||||||
|
|
||||||
void PropertyValuesAnimatorSet::onFinished(BaseRenderNodeAnimator* animator) {
|
void PropertyValuesAnimatorSet::onFinished(BaseRenderNodeAnimator* animator) {
|
||||||
if (mOneShotListener.get()) {
|
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;
|
mOneShotListener = nullptr;
|
||||||
|
listener->onAnimationFinished(animator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user