Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java +0 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +5 −35 Original line number Diff line number Diff line Loading @@ -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); }); } } Loading @@ -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() { Loading @@ -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; } Loading Loading @@ -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(); Loading Loading @@ -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(); Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java +0 −12 Original line number Diff line number Diff line Loading @@ -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. */ Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java +0 −12 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java +0 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +5 −35 Original line number Diff line number Diff line Loading @@ -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); }); } } Loading @@ -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() { Loading @@ -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; } Loading Loading @@ -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(); Loading Loading @@ -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(); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java +0 −12 Original line number Diff line number Diff line Loading @@ -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. */ Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java +0 −12 Original line number Diff line number Diff line Loading @@ -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) { Loading