summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Issei Suzuki <issei@google.com> 2019-06-27 12:29:30 +0200
committer Issei Suzuki <issei@google.com> 2019-06-28 15:48:17 +0200
commit935935660c47cf2daee0fd34e429a100e07bed14 (patch)
treef95c8b9e90b3dd776cd23e728e1b0609d50a2cfd
parent2dbd527be4e502a3db3562588ff7ebc7daa9c8fb (diff)
Extend ViewRootImpl to support multiple FrameDrawingCallback
Bug: 136150954 Test: WIP Change-Id: I690005fece924c38a5269cb35309061d0ccb6f1e
-rw-r--r--core/java/android/view/ThreadedRenderer.java24
-rw-r--r--core/java/android/view/ViewRootImpl.java2
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 {