Merge "Revert "Fix pip update transaction out of order"" into tm-qpr-dev

This commit is contained in:
Galia Peycheva
2022-11-07 10:03:28 +00:00
committed by Android (Google) Code Review
4 changed files with 5 additions and 65 deletions

View File

@@ -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.

View File

@@ -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);
});
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();

View File

@@ -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.
*/

View File

@@ -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) {