diff options
author | 2016-07-29 16:45:24 -0700 | |
---|---|---|
committer | 2016-08-01 21:42:15 +0000 | |
commit | c82e879e563ad692cabf19f61a08559c6220171e (patch) | |
tree | 52afc004a494c4185fca4cef1bace8df200cc6fa | |
parent | 7dd40cd4117cb7cf57d37f04088e4c55be423c1c (diff) |
Put VD animators on paused list when RT stops drawing
When we stop scheduling for new frames on RenderThread, we should
put the running animations on pause, rather than purge the list
of the running animations, such that in the next full
sync, the animations that were paused will continue to run.
BUG: 30226711
Change-Id: I36ff6f5d26ffa7999f60ca0ff676a35157577dc2
-rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 16 | ||||
-rw-r--r-- | libs/hwui/AnimationContext.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 2 |
3 files changed, 15 insertions, 5 deletions
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 3669da8a9cd8..7cd0d2a3e888 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -242,6 +242,16 @@ public: mPausedVDAnimators.clear(); } + // Move all the animators to the paused list, and send a delayed message to notify the finished + // listener. + void pauseAnimators() { + mPausedVDAnimators.insert(mRunningVDAnimators.begin(), mRunningVDAnimators.end()); + for (auto& anim : mRunningVDAnimators) { + detachVectorDrawableAnimator(anim.get()); + } + mRunningVDAnimators.clear(); + } + void doAttachAnimatingNodes(AnimationContext* context) { for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) { RenderNode* node = mPendingAnimatingRenderNodes[i].get(); @@ -415,8 +425,8 @@ public: postOnFinishedEvents(); } - virtual void detachAnimators() override { - mRootNode->detachAnimators(); + virtual void pauseAnimators() override { + mRootNode->pauseAnimators(); } virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) { @@ -426,7 +436,7 @@ public: virtual void destroy() { AnimationContext::destroy(); - detachAnimators(); + mRootNode->detachAnimators(); postOnFinishedEvents(); } diff --git a/libs/hwui/AnimationContext.h b/libs/hwui/AnimationContext.h index 801fd8719a14..11d305c3c8d0 100644 --- a/libs/hwui/AnimationContext.h +++ b/libs/hwui/AnimationContext.h @@ -100,7 +100,7 @@ public: ANDROID_API virtual void destroy(); - ANDROID_API virtual void detachAnimators() {} + ANDROID_API virtual void pauseAnimators() {} private: friend class AnimationHandle; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index d68f0e383152..30920a75210c 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -326,7 +326,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, void CanvasContext::stopDrawing() { mRenderThread.removeFrameCallback(this); - mAnimationContext->detachAnimators(); + mAnimationContext->pauseAnimators(); } void CanvasContext::notifyFramePending() { |