diff options
| author | Winson Chung <winsonc@google.com> | 2018-12-11 02:43:58 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-12-11 02:43:58 +0000 |
| commit | fb402f2c5eba6c0c1ff5d7756b0293c269b49c76 (patch) | |
| tree | 417e3a9a20858e5f32bc33066f0832e240b01383 /core/java | |
| parent | 183f1ccbf32daf8af0bf3c46a73775a9ad498165 (diff) | |
| parent | f213111bd3faa71dda01cf126b62f86285ac2453 (diff) | |
Merge "Ensure frame callback applied during scroll handling is applied."
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 29 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 11 |
2 files changed, 27 insertions, 13 deletions
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index bf1a005bad18..34d076fba54d 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -299,6 +299,8 @@ public final class ThreadedRenderer extends HardwareRenderer { private boolean mEnabled; private boolean mRequested = true; + private FrameDrawingCallback mNextRtFrameCallback; + ThreadedRenderer(Context context, boolean translucent, String name) { super(); setName(name); @@ -432,6 +434,17 @@ public final class ThreadedRenderer extends HardwareRenderer { } /** + * Registers a callback to be executed when the next frame is being drawn on RenderThread. This + * callback will be executed on a RenderThread worker thread, and only used for the next frame + * and thus it will only fire once. + * + * @param callback The callback to register. + */ + void registerRtFrameCallback(FrameDrawingCallback callback) { + mNextRtFrameCallback = callback; + } + + /** * Destroys all hardware rendering resources associated with the specified * view hierarchy. * @@ -562,6 +575,15 @@ public final class ThreadedRenderer extends HardwareRenderer { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Record View#draw()"); updateViewTreeDisplayList(view); + // Consume and set the frame callback after we dispatch draw to the view above, but before + // onPostDraw below which may reset the callback for the next frame. This ensures that + // updates to the frame callback during scroll handling will also apply in this frame. + final FrameDrawingCallback callback = mNextRtFrameCallback; + mNextRtFrameCallback = null; + if (callback != null) { + setFrameCallback(callback); + } + if (mRootNodeNeedsUpdate || !mRootNode.hasDisplayList()) { RecordingCanvas canvas = mRootNode.startRecording(mSurfaceWidth, mSurfaceHeight); try { @@ -619,10 +641,8 @@ public final class ThreadedRenderer extends HardwareRenderer { * * @param view The view to draw. * @param attachInfo AttachInfo tied to the specified view. - * @param callbacks Callbacks invoked when drawing happens. */ - void draw(View view, AttachInfo attachInfo, DrawCallbacks callbacks, - FrameDrawingCallback frameDrawingCallback) { + void draw(View view, AttachInfo attachInfo, DrawCallbacks callbacks) { final Choreographer choreographer = attachInfo.mViewRootImpl.mChoreographer; choreographer.mFrameInfo.markDrawStart(); @@ -642,9 +662,6 @@ public final class ThreadedRenderer extends HardwareRenderer { attachInfo.mPendingAnimatingRenderNodes = null; } - if (frameDrawingCallback != null) { - setFrameCallback(frameDrawingCallback); - } int syncResult = syncAndDrawFrame(choreographer.mFrameInfo); if ((syncResult & SYNC_LOST_SURFACE_REWARD_IF_FOUND) != 0) { setEnabled(false); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index cb4788624935..4b9a2b98f154 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -200,8 +200,6 @@ public final class ViewRootImpl implements ViewParent, static final ArrayList<Runnable> sFirstDrawHandlers = new ArrayList(); static boolean sFirstDrawComplete = false; - private FrameDrawingCallback mNextRtFrameCallback; - /** * Callback for notifying about global configuration changes. */ @@ -1052,7 +1050,9 @@ public final class ViewRootImpl implements ViewParent, * @param callback The callback to register. */ public void registerRtFrameCallback(FrameDrawingCallback callback) { - mNextRtFrameCallback = callback; + if (mAttachInfo.mThreadedRenderer != null) { + mAttachInfo.mThreadedRenderer.registerRtFrameCallback(callback); + } } @UnsupportedAppUsage @@ -3534,10 +3534,7 @@ public final class ViewRootImpl implements ViewParent, useAsyncReport = true; - // draw(...) might invoke post-draw, which might register the next callback already. - final FrameDrawingCallback callback = mNextRtFrameCallback; - mNextRtFrameCallback = null; - mAttachInfo.mThreadedRenderer.draw(mView, mAttachInfo, this, callback); + mAttachInfo.mThreadedRenderer.draw(mView, mAttachInfo, this); } else { // If we get here with a disabled & requested hardware renderer, something went // wrong (an invalidate posted right before we destroyed the hardware surface |
