From 5a28c5b6cdfd088e8ce20e5791ab4fe211b90c6e Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Thu, 17 Feb 2022 15:43:41 -0800 Subject: [PATCH] Disable PiP entry when switching tasks via recents With shell transitions, the recents activity gets brought to the front. This sets enter-pip-on-task-switch so once we actually switch tasks, the previous one goes to pip. In legacy, because of launch-behind, enter-pip-on-task-switch doesn't get set. In order to match the current behavior (don't PiP during recents switch), we prevent enter-pip-on-task-switch into transient activities. Then, only if the transient-launch is actually committed, we enable the flag before attempting to pip. Bug: 220196913 Test: open an auto-pip app. quickswitch to another app. Change-Id: Ib7d2fa36c74eca9b166a957a907b2681f48e9d0e --- services/core/java/com/android/server/wm/Task.java | 7 +++++-- .../core/java/com/android/server/wm/Transition.java | 12 +++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index ffa1a601d41b5..98c74f8ad81dc 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -5149,10 +5149,13 @@ class Task extends TaskFragment { // Ensure that we do not trigger entering PiP an activity on the root pinned task return false; } + final boolean isTransient = opts != null && opts.getTransientLaunch(); final Task targetRootTask = toFrontTask != null ? toFrontTask.getRootTask() : toFrontActivity.getRootTask(); - if (targetRootTask != null && targetRootTask.isActivityTypeAssistant()) { - // Ensure the task/activity being brought forward is not the assistant + if (targetRootTask != null && (targetRootTask.isActivityTypeAssistant() || isTransient)) { + // Ensure the task/activity being brought forward is not the assistant and is not + // transient. In the case of transient-launch, we want to wait until the end of the + // transition and only allow switch if the transient launch was committed. return false; } return true; diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 0b965c37a2ba4..3a3103e752ad2 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -459,9 +459,19 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe // activity in a bad state. if (!visibleAtTransitionEnd && !ar.isVisibleRequested()) { boolean commitVisibility = true; - if (ar.getDeferHidingClient() && ar.getTask() != null) { + if (ar.isVisible() && ar.getTask() != null) { if (ar.pictureInPictureArgs != null && ar.pictureInPictureArgs.isAutoEnterEnabled()) { + if (mTransientLaunches != null) { + for (int j = 0; j < mTransientLaunches.size(); ++j) { + if (mTransientLaunches.valueAt(j).isVisibleRequested()) { + // force enable pip-on-task-switch now that we've committed + // to actually launching to the transient activity. + ar.supportsEnterPipOnTaskSwitch = true; + break; + } + } + } mController.mAtm.enterPictureInPictureMode(ar, ar.pictureInPictureArgs); // Avoid commit visibility to false here, or else we will get a sudden // "flash" / surface going invisible for a split second.