Fixes bad PIP state when opening Maps from the lock screen
When opening an app that's in PIP from a notification on the lock screen, there's a race condition where the EXIT_PIP transition occurs before the keyguard is removed, causing it to get aborted. This change resets the PIP state and windowing mode manually when we receive the aborted transition. Also fixes an issue with a snapshot being present when entering PIP from this state. Test: Manual check + presubmit Bug: 283783868 Change-Id: I026dd35498210d2b39ccc0235ec225a9c7341dfe
This commit is contained in:
@@ -339,19 +339,36 @@ public class PipTransition extends PipTransitionController {
|
||||
}
|
||||
// This means an expand happened before enter-pip finished and we are now "merging" a
|
||||
// no-op transition that happens to match our exit-pip.
|
||||
// Or that the keyguard is up and preventing the transition from applying, in which case we
|
||||
// want to manually reset pip. (b/283783868)
|
||||
boolean cancelled = false;
|
||||
if (mPipAnimationController.getCurrentAnimator() != null) {
|
||||
mPipAnimationController.getCurrentAnimator().cancel();
|
||||
mPipAnimationController.resetAnimatorState();
|
||||
cancelled = true;
|
||||
}
|
||||
|
||||
// Unset exitTransition AFTER cancel so that finishResize knows we are merging.
|
||||
mExitTransition = null;
|
||||
if (!cancelled || aborted) return;
|
||||
if (!cancelled) return;
|
||||
final ActivityManager.RunningTaskInfo taskInfo = mPipOrganizer.getTaskInfo();
|
||||
if (taskInfo != null) {
|
||||
startExpandAnimation(taskInfo, mPipOrganizer.getSurfaceControl(),
|
||||
mPipBoundsState.getBounds(), mPipBoundsState.getBounds(),
|
||||
new Rect(mExitDestinationBounds), Surface.ROTATION_0, null /* startT */);
|
||||
if (aborted) {
|
||||
// keyguard case - the transition got aborted, so we want to reset state and
|
||||
// windowing mode before reapplying the resize transaction
|
||||
sendOnPipTransitionFinished(TRANSITION_DIRECTION_LEAVE_PIP);
|
||||
mPipOrganizer.onExitPipFinished(taskInfo);
|
||||
|
||||
WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
mPipOrganizer.applyWindowingModeChangeOnExit(wct, TRANSITION_DIRECTION_LEAVE_PIP);
|
||||
wct.setBounds(taskInfo.token, null);
|
||||
mPipOrganizer.applyFinishBoundsResize(wct, TRANSITION_DIRECTION_LEAVE_PIP, false);
|
||||
} else {
|
||||
// merge case
|
||||
startExpandAnimation(taskInfo, mPipOrganizer.getSurfaceControl(),
|
||||
mPipBoundsState.getBounds(), mPipBoundsState.getBounds(),
|
||||
new Rect(mExitDestinationBounds), Surface.ROTATION_0, null /* startT */);
|
||||
}
|
||||
}
|
||||
mExitDestinationBounds.setEmpty();
|
||||
mCurrentPipTaskToken = null;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.wm.shell.startingsurface;
|
||||
|
||||
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
|
||||
import static android.graphics.Color.WHITE;
|
||||
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
|
||||
@@ -77,6 +78,13 @@ public class TaskSnapshotWindow {
|
||||
@NonNull Runnable clearWindowHandler) {
|
||||
final ActivityManager.RunningTaskInfo runningTaskInfo = info.taskInfo;
|
||||
final int taskId = runningTaskInfo.taskId;
|
||||
|
||||
// if we're in PIP we don't want to create the snapshot
|
||||
if (runningTaskInfo.getWindowingMode() == WINDOWING_MODE_PINNED) {
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW,
|
||||
"did not create taskSnapshot due to being in PIP");
|
||||
return null;
|
||||
}
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW,
|
||||
"create taskSnapshot surface for task: %d", taskId);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user