Updating picture-in-picture API.
- Consolidating to enterPictureInPictureMode(), the new method will
attempt to put the activity into picture-in-picture mode if the
activity is visible or pausing in a state that would allow us to
pip it. Also consolidate the setting of the PiP aspect ratio and
actions into setPictureInPictureArgs().
- Fixing issue with onPause not completing when moving the
paused activity between stacks while dispatching onPause
Bug: 33692987
Test: android.server.cts.ActivityManagerPinnedStackTests
Change-Id: I3af2365f31a9b95de4a92eae46b77108947b2a49
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 4fe8939..1224abd 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2617,6 +2617,7 @@
final ActivityStack prevStack = task.getStack();
final boolean wasFocused = isFocusedStack(prevStack) && (topRunningActivityLocked() == r);
final boolean wasResumed = prevStack.mResumedActivity == r;
+ final boolean wasPaused = prevStack.mPausingActivity == r;
// In some cases the focused stack isn't the front stack. E.g. pinned stack.
// Whenever we are moving the top activity from the front stack we want to make sure to move
// the stack to the front.
@@ -2641,10 +2642,19 @@
task.mTemporarilyUnresizable = false;
task.reparent(stack.mStackId, toTop ? MAX_VALUE : 0, reason);
+ // Reset the resumed activity on the previous stack
+ if (wasResumed) {
+ prevStack.mResumedActivity = null;
+ }
+ // Reset the paused activity on the previous stack
+ if (wasPaused) {
+ prevStack.mPausingActivity = null;
+ }
+
// If the task had focus before (or we're requested to move focus),
// move focus to the new stack by moving the stack to the front.
- stack.moveToFrontAndResumeStateIfNeeded(
- r, forceFocus || wasFocused || wasFront, wasResumed, reason);
+ stack.moveToFrontAndResumeStateIfNeeded(r, forceFocus || wasFocused || wasFront, wasResumed,
+ wasPaused, reason);
return stack;
}
@@ -2795,8 +2805,12 @@
if (task.mActivities.size() == 1) {
// There is only one activity in the task. So, we can just move the task over to
- // the stack without re-parenting the activity in a different task.
- if (moveHomeStackToFront && task.getTaskToReturnTo() == HOME_ACTIVITY_TYPE) {
+ // the stack without re-parenting the activity in a different task. We don't
+ // move the home stack forward if we are currently entering picture-in-picture
+ // while pausing because that changes the focused stack and may prevent the new
+ // starting activity from resuming.
+ if (moveHomeStackToFront && task.getTaskToReturnTo() == HOME_ACTIVITY_TYPE
+ && !r.supportsPictureInPictureWhilePausing) {
// Move the home stack forward if the task we just moved to the pinned stack
// was launched from home so home should be visible behind it.
moveHomeStackToFront(reason);
@@ -2808,6 +2822,10 @@
// reveal/leave the other activities in their original task
stack.moveActivityToStack(r);
}
+
+ // Reset the state that indicates it can enter PiP while pausing after we've moved it
+ // to the pinned stack
+ r.supportsPictureInPictureWhilePausing = false;
} finally {
mWindowManager.continueSurfaceLayout();
}