Merge "Set fullscreen mode to task at the end of exit-pip animation" into udc-dev am: 35f2750e30

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22929277

Change-Id: I9ab5bc85c36ac063f31e3c645fb347450a3acee0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Riddle Hsu
2023-05-03 06:07:03 +00:00
committed by Automerger Merge Worker
3 changed files with 35 additions and 8 deletions

View File

@@ -27,6 +27,7 @@ import static com.android.wm.shell.ShellTaskOrganizer.TASK_LISTENER_TYPE_PIP;
import static com.android.wm.shell.ShellTaskOrganizer.taskListenerTypeToString; import static com.android.wm.shell.ShellTaskOrganizer.taskListenerTypeToString;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED;
import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_ALPHA; import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_ALPHA;
import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_BOUNDS; import static com.android.wm.shell.pip.PipAnimationController.ANIM_TYPE_BOUNDS;
import static com.android.wm.shell.pip.PipAnimationController.FRACTION_START; import static com.android.wm.shell.pip.PipAnimationController.FRACTION_START;
@@ -524,12 +525,18 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
} }
} }
final Rect destinationBounds = getExitDestinationBounds(); final Rect displayBounds = mPipBoundsState.getDisplayBounds();
final Rect destinationBounds = new Rect(displayBounds);
final int direction = syncWithSplitScreenBounds(destinationBounds, requestEnterSplit) final int direction = syncWithSplitScreenBounds(destinationBounds, requestEnterSplit)
? TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN ? TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN
: TRANSITION_DIRECTION_LEAVE_PIP; : TRANSITION_DIRECTION_LEAVE_PIP;
// For exiting to fullscreen, the windowing mode of task will be changed to fullscreen
// until the animation is finished. Otherwise if the activity is resumed and focused at the
// begin of aniamtion, the app may do something too early to distub the animation.
final boolean toFullscreen = destinationBounds.equals(displayBounds);
if (Transitions.ENABLE_SHELL_TRANSITIONS && direction == TRANSITION_DIRECTION_LEAVE_PIP) { if (Transitions.SHELL_TRANSITIONS_ROTATION || (Transitions.ENABLE_SHELL_TRANSITIONS
&& !toFullscreen)) {
// When exit to fullscreen with Shell transition enabled, we update the Task windowing // When exit to fullscreen with Shell transition enabled, we update the Task windowing
// mode directly so that it can also trigger display rotation and visibility update in // mode directly so that it can also trigger display rotation and visibility update in
// the same transition if there will be any. // the same transition if there will be any.
@@ -605,7 +612,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
removePip(); removePip();
} }
private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) { void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) {
// Reset the final windowing mode. // Reset the final windowing mode.
wct.setWindowingMode(mToken, getOutPipWindowingMode()); wct.setWindowingMode(mToken, getOutPipWindowingMode());
// Simply reset the activity mode set prior to the animation running. // Simply reset the activity mode set prior to the animation running.
@@ -1771,15 +1778,27 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
* @return {@code true} if destinationBounds is altered for split screen * @return {@code true} if destinationBounds is altered for split screen
*/ */
private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut, boolean enterSplit) { private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut, boolean enterSplit) {
if (!enterSplit || !mSplitScreenOptional.isPresent()) { if (mSplitScreenOptional.isEmpty()) {
return false;
}
final SplitScreenController split = mSplitScreenOptional.get();
final int position = mTaskInfo.lastParentTaskIdBeforePip > 0
? split.getSplitPosition(mTaskInfo.lastParentTaskIdBeforePip)
: SPLIT_POSITION_UNDEFINED;
if (position == SPLIT_POSITION_UNDEFINED && !enterSplit) {
return false; return false;
} }
final Rect topLeft = new Rect(); final Rect topLeft = new Rect();
final Rect bottomRight = new Rect(); final Rect bottomRight = new Rect();
mSplitScreenOptional.get().getStageBounds(topLeft, bottomRight); split.getStageBounds(topLeft, bottomRight);
if (enterSplit) {
destinationBoundsOut.set(isPipToTopLeft() ? topLeft : bottomRight); destinationBoundsOut.set(isPipToTopLeft() ? topLeft : bottomRight);
return true; return true;
} }
// Moving to an existing split task.
destinationBoundsOut.set(position == SPLIT_POSITION_TOP_OR_LEFT ? topLeft : bottomRight);
return false;
}
/** /**
* Fades out and removes an overlay surface. * Fades out and removes an overlay surface.

View File

@@ -508,8 +508,16 @@ public class PipTransition extends PipTransitionController {
currentBounds.offset(-offset.x, -offset.y); currentBounds.offset(-offset.x, -offset.y);
startTransaction.setPosition(pipLeash, currentBounds.left, currentBounds.top); startTransaction.setPosition(pipLeash, currentBounds.left, currentBounds.top);
final WindowContainerToken pipTaskToken = pipChange.getContainer();
final boolean toFullscreen = pipChange.getEndAbsBounds().equals(
mPipBoundsState.getDisplayBounds());
mFinishCallback = (wct, wctCB) -> { mFinishCallback = (wct, wctCB) -> {
mPipOrganizer.onExitPipFinished(taskInfo); mPipOrganizer.onExitPipFinished(taskInfo);
if (!Transitions.SHELL_TRANSITIONS_ROTATION && toFullscreen) {
wct = wct != null ? wct : new WindowContainerTransaction();
wct.setBounds(pipTaskToken, null);
mPipOrganizer.applyWindowingModeChangeOnExit(wct, TRANSITION_DIRECTION_LEAVE_PIP);
}
finishCallback.onTransitionFinished(wct, wctCB); finishCallback.onTransitionFinished(wct, wctCB);
}; };
mFinishTransaction = finishTransaction; mFinishTransaction = finishTransaction;

View File

@@ -2267,7 +2267,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
// Display won't be rotated for multi window Task, so the fixed rotation // Display won't be rotated for multi window Task, so the fixed rotation
// won't be applied. This can happen when the windowing mode is changed // won't be applied. This can happen when the windowing mode is changed
// before the previous fixed rotation is applied. // before the previous fixed rotation is applied.
&& !task.inMultiWindowMode()) { && (!task.inMultiWindowMode() || !topRunningActivity.inMultiWindowMode())) {
// If Activity is in fixed rotation, its will be applied with the next rotation, // If Activity is in fixed rotation, its will be applied with the next rotation,
// when the Task is still in the previous rotation. // when the Task is still in the previous rotation.
final int taskRotation = task.getWindowConfiguration().getDisplayRotation(); final int taskRotation = task.getWindowConfiguration().getDisplayRotation();