Merge "Set fullscreen mode to task at the end of exit-pip animation" into udc-dev
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user