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

Commit cf763956 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of [20391545] into tm-qpr2-release.

Change-Id: If3152e673a22003536db2fe98b8480e5ec30837d
parents e95bc0fe d2727e6c
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.RemoteAction;
@@ -70,11 +69,6 @@ public interface PipMenuController {
     */
    void setAppActions(List<RemoteAction> appActions, RemoteAction closeAction);

    /**
     * Wait until the next frame to run the given Runnable.
     */
    void runWithNextFrame(@NonNull Runnable runnable);

    /**
     * Resize the PiP menu with the given bounds. The PiP SurfaceControl is given if there is a
     * need to synchronize the movements on the same frame as PiP.
+5 −35
Original line number Diff line number Diff line
@@ -179,10 +179,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                // This is necessary in case there was a resize animation ongoing when exit PIP
                // started, in which case the first resize will be skipped to let the exit
                // operation handle the final resize out of PIP mode. See b/185306679.
                finishResizeDelayedIfNeeded(() -> {
                finishResize(tx, destinationBounds, direction, animationType);
                sendOnPipTransitionFinished(direction);
                });
            }
        }

@@ -198,34 +196,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        }
    };

    /**
     * Finishes resizing the PiP, delaying the operation if it has to be synced with the PiP menu.
     *
     * This is done to avoid a race condition between the last transaction applied in
     * onAnimationUpdate and the finishResize in onAnimationEnd. finishResize creates a
     * WindowContainerTransaction, which is to be applied by WmCore later. It may happen that it
     * gets applied before the transaction created by the last onAnimationUpdate. As a result of
     * this, the PiP surface may get scaled after the new bounds are applied by WmCore, which
     * makes the PiP surface have unexpected bounds. To avoid this, we delay the finishResize
     * operation until the next frame. This aligns the last onAnimationUpdate transaction with the
     * WCT application.
     *
     * The race only happens when the PiP surface transaction has to be synced with the PiP menu
     * due to the necessity for a delay when syncing the PiP surface, the PiP menu surface and
     * the PiP menu contents.
     */
    private void finishResizeDelayedIfNeeded(Runnable finishResizeRunnable) {
        if (!shouldSyncPipTransactionWithMenu()) {
            finishResizeRunnable.run();
            return;
        }
        mPipMenuController.runWithNextFrame(finishResizeRunnable);
    }

    private boolean shouldSyncPipTransactionWithMenu() {
        return mPipMenuController.isMenuVisible();
    }

    @VisibleForTesting
    final PipTransitionController.PipTransitionCallback mPipTransitionCallback =
            new PipTransitionController.PipTransitionCallback() {
@@ -251,7 +221,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                @Override
                public boolean handlePipTransaction(SurfaceControl leash,
                        SurfaceControl.Transaction tx, Rect destinationBounds) {
                    if (shouldSyncPipTransactionWithMenu()) {
                    if (mPipMenuController.isMenuVisible()) {
                        mPipMenuController.movePipMenu(leash, tx, destinationBounds);
                        return true;
                    }
@@ -1253,7 +1223,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        mSurfaceTransactionHelper
                .crop(tx, mLeash, toBounds)
                .round(tx, mLeash, mPipTransitionState.isInPip());
        if (shouldSyncPipTransactionWithMenu()) {
        if (mPipMenuController.isMenuVisible()) {
            mPipMenuController.resizePipMenu(mLeash, tx, toBounds);
        } else {
            tx.apply();
@@ -1295,7 +1265,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        mSurfaceTransactionHelper
                .scale(tx, mLeash, startBounds, toBounds, degrees)
                .round(tx, mLeash, startBounds, toBounds);
        if (shouldSyncPipTransactionWithMenu()) {
        if (mPipMenuController.isMenuVisible()) {
            mPipMenuController.movePipMenu(mLeash, tx, toBounds);
        } else {
            tx.apply();
+0 −12
Original line number Diff line number Diff line
@@ -305,18 +305,6 @@ public class PhonePipMenuController implements PipMenuController {
                showResizeHandle);
    }

    @Override
    public void runWithNextFrame(Runnable runnable) {
        if (mPipMenuView == null || mPipMenuView.getViewRootImpl() == null) {
            runnable.run();
        }

        mPipMenuView.getViewRootImpl().registerRtFrameCallback(frame -> {
            mMainHandler.post(runnable);
        });
        mPipMenuView.invalidate();
    }

    /**
     * Move the PiP menu, which does a translation and possibly a scale transformation.
     */
+0 −12
Original line number Diff line number Diff line
@@ -465,18 +465,6 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis
        return mSystemWindows.getViewSurface(v);
    }

    @Override
    public void runWithNextFrame(Runnable runnable) {
        if (mPipMenuView == null || mPipMenuView.getViewRootImpl() == null) {
            runnable.run();
        }

        mPipMenuView.getViewRootImpl().registerRtFrameCallback(frame -> {
            mMainHandler.post(runnable);
        });
        mPipMenuView.invalidate();
    }

    @Override
    public void movePipMenu(SurfaceControl pipLeash, SurfaceControl.Transaction transaction,
            Rect pipDestBounds) {