Merge "Pip entry bounds incorrect upon rotation" into tm-qpr-dev am: 5f5fe88458
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21341823 Change-Id: Id2af6eb67b2e83ce16d75a558e1064568f92e881 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user