diff options
9 files changed, 69 insertions, 35 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java index 94db878233a3..b0756a0afe5d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java @@ -206,6 +206,7 @@ public abstract class TvPipModule { TvPipMenuController tvPipMenuController, SyncTransactionQueue syncTransactionQueue, TvPipBoundsState tvPipBoundsState, + PipSizeSpecHandler pipSizeSpecHandler, PipTransitionState pipTransitionState, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, PipAnimationController pipAnimationController, @@ -217,10 +218,11 @@ public abstract class TvPipModule { PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { return new TvPipTaskOrganizer(context, - syncTransactionQueue, pipTransitionState, tvPipBoundsState, tvPipBoundsAlgorithm, - tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper, - pipTransitionController, pipParamsChangedForwarder, splitScreenControllerOptional, - displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); + syncTransactionQueue, pipTransitionState, tvPipBoundsState, pipSizeSpecHandler, + tvPipBoundsAlgorithm, tvPipMenuController, pipAnimationController, + pipSurfaceTransactionHelper, pipTransitionController, pipParamsChangedForwarder, + splitScreenControllerOptional, displayController, pipUiEventLogger, + shellTaskOrganizer, mainExecutor); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 1135aa36aa4d..efc7d1ff0bb9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -442,6 +442,7 @@ public abstract class WMShellModule { SyncTransactionQueue syncTransactionQueue, PipTransitionState pipTransitionState, PipBoundsState pipBoundsState, + PipSizeSpecHandler pipSizeSpecHandler, PipBoundsAlgorithm pipBoundsAlgorithm, PhonePipMenuController menuPhoneController, PipAnimationController pipAnimationController, @@ -453,10 +454,11 @@ public abstract class WMShellModule { PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { return new PipTaskOrganizer(context, - syncTransactionQueue, pipTransitionState, pipBoundsState, pipBoundsAlgorithm, - menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper, - pipTransitionController, pipParamsChangedForwarder, splitScreenControllerOptional, - displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); + syncTransactionQueue, pipTransitionState, pipBoundsState, pipSizeSpecHandler, + pipBoundsAlgorithm, menuPhoneController, pipAnimationController, + pipSurfaceTransactionHelper, pipTransitionController, pipParamsChangedForwarder, + splitScreenControllerOptional, displayController, pipUiEventLogger, + shellTaskOrganizer, mainExecutor); } @WMSingleton @@ -471,13 +473,14 @@ public abstract class WMShellModule { static PipTransitionController providePipTransitionController(Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm, - PipBoundsState pipBoundsState, PipTransitionState pipTransitionState, - PhonePipMenuController pipMenuController, + PipBoundsState pipBoundsState, PipSizeSpecHandler pipSizeSpecHandler, + PipTransitionState pipTransitionState, PhonePipMenuController pipMenuController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional<SplitScreenController> splitScreenOptional) { return new PipTransition(context, shellInit, shellTaskOrganizer, transitions, - pipBoundsState, pipTransitionState, pipMenuController, pipBoundsAlgorithm, - pipAnimationController, pipSurfaceTransactionHelper, splitScreenOptional); + pipBoundsState, pipSizeSpecHandler, pipTransitionState, pipMenuController, + pipBoundsAlgorithm, pipAnimationController, pipSurfaceTransactionHelper, + splitScreenOptional); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java index 61da10be6b67..5be18d852990 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipBoundsState.java @@ -311,10 +311,10 @@ public class PipBoundsState { mDisplayLayout.set(displayLayout); } - /** Get the display layout. */ + /** Get a copy of the display layout. */ @NonNull public DisplayLayout getDisplayLayout() { - return mDisplayLayout; + return new DisplayLayout(mDisplayLayout); } @VisibleForTesting diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index aad27b991db9..ffb2893e8ffa 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -79,11 +79,13 @@ import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.animation.Interpolators; import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.ScreenshotUtils; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.pip.phone.PipMotionHelper; +import com.android.wm.shell.pip.phone.PipSizeSpecHandler; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.transition.Transitions; @@ -126,6 +128,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, private final Context mContext; private final SyncTransactionQueue mSyncTransactionQueue; private final PipBoundsState mPipBoundsState; + private final PipSizeSpecHandler mPipSizeSpecHandler; private final PipBoundsAlgorithm mPipBoundsAlgorithm; private final @NonNull PipMenuController mPipMenuController; private final PipAnimationController mPipAnimationController; @@ -313,6 +316,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, @NonNull SyncTransactionQueue syncTransactionQueue, @NonNull PipTransitionState pipTransitionState, @NonNull PipBoundsState pipBoundsState, + @NonNull PipSizeSpecHandler pipSizeSpecHandler, @NonNull PipBoundsAlgorithm boundsHandler, @NonNull PipMenuController pipMenuController, @NonNull PipAnimationController pipAnimationController, @@ -328,6 +332,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mSyncTransactionQueue = syncTransactionQueue; mPipTransitionState = pipTransitionState; mPipBoundsState = pipBoundsState; + mPipSizeSpecHandler = pipSizeSpecHandler; mPipBoundsAlgorithm = boundsHandler; mPipMenuController = pipMenuController; mPipTransitionController = pipTransitionController; @@ -1601,7 +1606,12 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, private @Nullable Rect computeRotatedBounds(int rotationDelta, int direction, Rect outDestinationBounds, Rect sourceHintRect) { if (direction == TRANSITION_DIRECTION_TO_PIP) { - mPipBoundsState.getDisplayLayout().rotateTo(mContext.getResources(), mNextRotation); + DisplayLayout layoutCopy = mPipBoundsState.getDisplayLayout(); + + layoutCopy.rotateTo(mContext.getResources(), mNextRotation); + mPipBoundsState.setDisplayLayout(layoutCopy); + mPipSizeSpecHandler.setDisplayLayout(layoutCopy); + final Rect displayBounds = mPipBoundsState.getDisplayBounds(); outDestinationBounds.set(mPipBoundsAlgorithm.getEntryDestinationBounds()); // Transform the destination bounds to current display coordinates. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java index d9d10099e53a..e5c0570841f4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java @@ -65,6 +65,8 @@ import androidx.annotation.Nullable; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.common.DisplayLayout; +import com.android.wm.shell.pip.phone.PipSizeSpecHandler; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.sysui.ShellInit; @@ -83,6 +85,7 @@ public class PipTransition extends PipTransitionController { private final Context mContext; private final PipTransitionState mPipTransitionState; + private final PipSizeSpecHandler mPipSizeSpecHandler; private final int mEnterExitAnimationDuration; private final PipSurfaceTransactionHelper mSurfaceTransactionHelper; private final Optional<SplitScreenController> mSplitScreenOptional; @@ -113,6 +116,7 @@ public class PipTransition extends PipTransitionController { @NonNull ShellTaskOrganizer shellTaskOrganizer, @NonNull Transitions transitions, PipBoundsState pipBoundsState, + PipSizeSpecHandler pipSizeSpecHandler, PipTransitionState pipTransitionState, PipMenuController pipMenuController, PipBoundsAlgorithm pipBoundsAlgorithm, @@ -123,6 +127,7 @@ public class PipTransition extends PipTransitionController { pipBoundsAlgorithm, pipAnimationController); mContext = context; mPipTransitionState = pipTransitionState; + mPipSizeSpecHandler = pipSizeSpecHandler; mEnterExitAnimationDuration = context.getResources() .getInteger(R.integer.config_pipResizeAnimationDuration); mSurfaceTransactionHelper = pipSurfaceTransactionHelper; @@ -308,7 +313,12 @@ public class PipTransition extends PipTransitionController { // initial state under the new rotation. int rotationDelta = deltaRotation(startRotation, endRotation); if (rotationDelta != Surface.ROTATION_0) { - mPipBoundsState.getDisplayLayout().rotateTo(mContext.getResources(), endRotation); + DisplayLayout layoutCopy = mPipBoundsState.getDisplayLayout(); + + layoutCopy.rotateTo(mContext.getResources(), endRotation); + mPipBoundsState.setDisplayLayout(layoutCopy); + mPipSizeSpecHandler.setDisplayLayout(layoutCopy); + final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); wct.setBounds(mRequestedEnterTask, destinationBounds); return true; @@ -824,7 +834,12 @@ public class PipTransition extends PipTransitionController { /** Computes destination bounds in old rotation and updates source hint rect if available. */ private void computeEnterPipRotatedBounds(int rotationDelta, int startRotation, int endRotation, TaskInfo taskInfo, Rect outDestinationBounds, @Nullable Rect outSourceHintRect) { - mPipBoundsState.getDisplayLayout().rotateTo(mContext.getResources(), endRotation); + DisplayLayout layoutCopy = mPipBoundsState.getDisplayLayout(); + + layoutCopy.rotateTo(mContext.getResources(), endRotation); + mPipBoundsState.setDisplayLayout(layoutCopy); + mPipSizeSpecHandler.setDisplayLayout(layoutCopy); + final Rect displayBounds = mPipBoundsState.getDisplayBounds(); outDestinationBounds.set(mPipBoundsAlgorithm.getEntryDestinationBounds()); // Transform the destination bounds to current display coordinates. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index d86468a838d9..4958b2557d09 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -1032,7 +1032,11 @@ public class PipController implements PipTransitionController.PipTransitionCallb private void onDisplayRotationChangedNotInPip(Context context, int toRotation) { // Update the display layout, note that we have to do this on every rotation even if we // aren't in PIP since we need to update the display layout to get the right resources - mPipBoundsState.getDisplayLayout().rotateTo(context.getResources(), toRotation); + DisplayLayout layoutCopy = mPipBoundsState.getDisplayLayout(); + + layoutCopy.rotateTo(context.getResources(), toRotation); + mPipBoundsState.setDisplayLayout(layoutCopy); + mPipSizeSpecHandler.setDisplayLayout(layoutCopy); } /** @@ -1069,7 +1073,11 @@ public class PipController implements PipTransitionController.PipTransitionCallb mPipBoundsState.getStashedState()); // Update the display layout - mPipBoundsState.getDisplayLayout().rotateTo(context.getResources(), toRotation); + DisplayLayout layoutCopy = mPipBoundsState.getDisplayLayout(); + + layoutCopy.rotateTo(context.getResources(), toRotation); + mPipBoundsState.setDisplayLayout(layoutCopy); + mPipSizeSpecHandler.setDisplayLayout(layoutCopy); // Calculate the stack bounds in the new orientation based on same fraction along the // rotated movement bounds. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipSizeSpecHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipSizeSpecHandler.java index e787ed97da0c..d03d075b38af 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipSizeSpecHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipSizeSpecHandler.java @@ -409,12 +409,6 @@ public class PipSizeSpecHandler { return new Rect(0, 0, mDisplayLayout.width(), mDisplayLayout.height()); } - /** Get the display layout. */ - @NonNull - public DisplayLayout getDisplayLayout() { - return mDisplayLayout; - } - /** Update the display layout. */ public void setDisplayLayout(@NonNull DisplayLayout displayLayout) { mDisplayLayout.set(displayLayout); @@ -429,12 +423,11 @@ public class PipSizeSpecHandler { */ public Rect getInsetBounds() { Rect insetBounds = new Rect(); - final DisplayLayout displayLayout = getDisplayLayout(); - Rect insets = getDisplayLayout().stableInsets(); + Rect insets = mDisplayLayout.stableInsets(); insetBounds.set(insets.left + mScreenEdgeInsets.x, insets.top + mScreenEdgeInsets.y, - displayLayout.width() - insets.right - mScreenEdgeInsets.x, - displayLayout.height() - insets.bottom - mScreenEdgeInsets.y); + mDisplayLayout.width() - insets.right - mScreenEdgeInsets.x, + mDisplayLayout.height() - insets.bottom - mScreenEdgeInsets.y); return insetBounds; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java index 42fd1aab44f8..be9b9361b359 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTaskOrganizer.java @@ -36,6 +36,7 @@ import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.pip.PipTransitionState; import com.android.wm.shell.pip.PipUiEventLogger; import com.android.wm.shell.pip.PipUtils; +import com.android.wm.shell.pip.phone.PipSizeSpecHandler; import com.android.wm.shell.splitscreen.SplitScreenController; import java.util.Objects; @@ -50,6 +51,7 @@ public class TvPipTaskOrganizer extends PipTaskOrganizer { @NonNull SyncTransactionQueue syncTransactionQueue, @NonNull PipTransitionState pipTransitionState, @NonNull PipBoundsState pipBoundsState, + @NonNull PipSizeSpecHandler pipSizeSpecHandler, @NonNull PipBoundsAlgorithm boundsHandler, @NonNull PipMenuController pipMenuController, @NonNull PipAnimationController pipAnimationController, @@ -61,10 +63,11 @@ public class TvPipTaskOrganizer extends PipTaskOrganizer { @NonNull PipUiEventLogger pipUiEventLogger, @NonNull ShellTaskOrganizer shellTaskOrganizer, ShellExecutor mainExecutor) { - super(context, syncTransactionQueue, pipTransitionState, pipBoundsState, boundsHandler, - pipMenuController, pipAnimationController, surfaceTransactionHelper, - pipTransitionController, pipParamsChangedForwarder, splitScreenOptional, - displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); + super(context, syncTransactionQueue, pipTransitionState, pipBoundsState, pipSizeSpecHandler, + boundsHandler, pipMenuController, pipAnimationController, + surfaceTransactionHelper, pipTransitionController, pipParamsChangedForwarder, + splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer, + mainExecutor); } @Override diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java index 2da4af80fd18..e907cd3ca0ad 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java @@ -104,8 +104,8 @@ public class PipTaskOrganizerTest extends ShellTestCase { new PipSnapAlgorithm(), new PipKeepClearAlgorithmInterface() {}, mPipSizeSpecHandler); mMainExecutor = new TestShellExecutor(); - mPipTaskOrganizer = new PipTaskOrganizer(mContext, - mMockSyncTransactionQueue, mPipTransitionState, mPipBoundsState, + mPipTaskOrganizer = new PipTaskOrganizer(mContext, mMockSyncTransactionQueue, + mPipTransitionState, mPipBoundsState, mPipSizeSpecHandler, mPipBoundsAlgorithm, mMockPhonePipMenuController, mMockPipAnimationController, mMockPipSurfaceTransactionHelper, mMockPipTransitionController, mMockPipParamsChangedForwarder, mMockOptionalSplitScreen, mMockDisplayController, |