Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9127d3cf authored by Issei Suzuki's avatar Issei Suzuki
Browse files

DO NOT MERGE: Extend ViewRootImpl to support multiple FrameDrawingCallback

Bug: 136150954
Bug: 130442248
Test: Manual, Bubble test app to check if the callback is triggered.
Change-Id: I690005fece924c38a5269cb35309061d0ccb6f1e
(cherry picked from commit 93593566)
parent 6fb6743b
Loading
Loading
Loading
Loading
+17 −7
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package android.view;
package android.view;


import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.content.res.TypedArray;
import android.content.res.TypedArray;
import android.graphics.HardwareRenderer;
import android.graphics.HardwareRenderer;
@@ -35,6 +36,7 @@ import com.android.internal.R;


import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;


/**
/**
 * Threaded renderer that proxies the rendering to a render thread. Most calls
 * 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 mEnabled;
    private boolean mRequested = true;
    private boolean mRequested = true;


    private FrameDrawingCallback mNextRtFrameCallback;
    @Nullable
    private ArrayList<FrameDrawingCallback> mNextRtFrameCallbacks;


    ThreadedRenderer(Context context, boolean translucent, String name) {
    ThreadedRenderer(Context context, boolean translucent, String name) {
        super();
        super();
@@ -441,8 +444,11 @@ public final class ThreadedRenderer extends HardwareRenderer {
     *
     *
     * @param callback The callback to register.
     * @param callback The callback to register.
     */
     */
    void registerRtFrameCallback(FrameDrawingCallback callback) {
    void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) {
        mNextRtFrameCallback = 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
        // 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
        // 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.
        // updates to the frame callback during scroll handling will also apply in this frame.
        final FrameDrawingCallback callback = mNextRtFrameCallback;
        if (mNextRtFrameCallbacks != null) {
        mNextRtFrameCallback = null;
            final ArrayList<FrameDrawingCallback> frameCallbacks = mNextRtFrameCallbacks;
        if (callback != null) {
            mNextRtFrameCallbacks = null;
            setFrameCallback(callback);
            setFrameCallback(frame -> {
                for (int i = 0; i < frameCallbacks.size(); ++i) {
                    frameCallbacks.get(i).onFrameDraw(frame);
                }
            });
        }
        }


        if (mRootNodeNeedsUpdate || !mRootNode.hasDisplayList()) {
        if (mRootNodeNeedsUpdate || !mRootNode.hasDisplayList()) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -1129,7 +1129,7 @@ public final class ViewRootImpl implements ViewParent,
     *
     *
     * @param callback The callback to register.
     * @param callback The callback to register.
     */
     */
    public void registerRtFrameCallback(FrameDrawingCallback callback) {
    public void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) {
        if (mAttachInfo.mThreadedRenderer != null) {
        if (mAttachInfo.mThreadedRenderer != null) {
            mAttachInfo.mThreadedRenderer.registerRtFrameCallback(frame -> {
            mAttachInfo.mThreadedRenderer.registerRtFrameCallback(frame -> {
                try {
                try {