diff options
author | 2019-06-27 12:29:30 +0200 | |
---|---|---|
committer | 2019-06-28 15:48:17 +0200 | |
commit | 935935660c47cf2daee0fd34e429a100e07bed14 (patch) | |
tree | f95c8b9e90b3dd776cd23e728e1b0609d50a2cfd | |
parent | 2dbd527be4e502a3db3562588ff7ebc7daa9c8fb (diff) |
Extend ViewRootImpl to support multiple FrameDrawingCallback
Bug: 136150954
Test: WIP
Change-Id: I690005fece924c38a5269cb35309061d0ccb6f1e
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 24 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 2 |
2 files changed, 18 insertions, 8 deletions
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 3d3d5dc7db32..f18aa81b95e5 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -17,6 +17,7 @@ package android.view; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.content.res.TypedArray; import android.graphics.HardwareRenderer; @@ -35,6 +36,7 @@ import com.android.internal.R; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; /** * Threaded renderer that proxies the rendering to a render thread. Most calls @@ -300,7 +302,8 @@ public final class ThreadedRenderer extends HardwareRenderer { private boolean mEnabled; private boolean mRequested = true; - private FrameDrawingCallback mNextRtFrameCallback; + @Nullable + private ArrayList<FrameDrawingCallback> mNextRtFrameCallbacks; ThreadedRenderer(Context context, boolean translucent, String name) { super(); @@ -441,8 +444,11 @@ public final class ThreadedRenderer extends HardwareRenderer { * * @param callback The callback to register. */ - void registerRtFrameCallback(FrameDrawingCallback callback) { - mNextRtFrameCallback = callback; + void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) { + if (mNextRtFrameCallbacks == null) { + mNextRtFrameCallbacks = new ArrayList<>(); + } + mNextRtFrameCallbacks.add(callback); } /** @@ -583,10 +589,14 @@ public final class ThreadedRenderer extends HardwareRenderer { // 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 (mNextRtFrameCallbacks != null) { + final ArrayList<FrameDrawingCallback> frameCallbacks = mNextRtFrameCallbacks; + mNextRtFrameCallbacks = null; + setFrameCallback(frame -> { + for (int i = 0; i < frameCallbacks.size(); ++i) { + frameCallbacks.get(i).onFrameDraw(frame); + } + }); } if (mRootNodeNeedsUpdate || !mRootNode.hasDisplayList()) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index cb51545a8a69..613ddcf577ed 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1132,7 +1132,7 @@ public final class ViewRootImpl implements ViewParent, * * @param callback The callback to register. */ - public void registerRtFrameCallback(FrameDrawingCallback callback) { + public void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) { if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mThreadedRenderer.registerRtFrameCallback(frame -> { try { |