diff options
5 files changed, 44 insertions, 15 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl index e77987963b48..37779077f9b6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/IPip.aidl @@ -16,6 +16,7 @@ package com.android.wm.shell.common.pip; +import android.app.ActivityManager; import android.app.PictureInPictureParams; import android.view.SurfaceControl; import android.content.ComponentName; @@ -41,9 +42,8 @@ interface IPip { bounds * @return destination bounds the PiP window should land into */ - Rect startSwipePipToHome(in ComponentName componentName, in ActivityInfo activityInfo, - in PictureInPictureParams pictureInPictureParams, - int launcherRotation, in Rect hotseatKeepClearArea) = 1; + Rect startSwipePipToHome(in ActivityManager.RunningTaskInfo taskInfo, int launcherRotation, + in Rect hotseatKeepClearArea) = 1; /** * Notifies the swiping Activity to PiP onto home transition is finished diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java index c8d0dab39837..793bdf0b5614 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java @@ -83,13 +83,14 @@ public abstract class Pip2Module { @NonNull PipTransitionState pipStackListenerController, @NonNull PipDisplayLayoutState pipDisplayLayoutState, @NonNull PipUiStateChangeController pipUiStateChangeController, + DisplayController displayController, Optional<DesktopUserRepositories> desktopUserRepositoriesOptional, Optional<DesktopWallpaperActivityTokenProvider> desktopWallpaperActivityTokenProviderOptional) { return new PipTransition(context, shellInit, shellTaskOrganizer, transitions, pipBoundsState, null, pipBoundsAlgorithm, pipTaskListener, pipScheduler, pipStackListenerController, pipDisplayLayoutState, - pipUiStateChangeController, desktopUserRepositoriesOptional, + pipUiStateChangeController, displayController, desktopUserRepositoriesOptional, desktopWallpaperActivityTokenProviderOptional); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index 9c3e815b389d..912d3839fae7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -1317,14 +1317,14 @@ public class PipController implements PipTransitionController.PipTransitionCallb } @Override - public Rect startSwipePipToHome(ComponentName componentName, ActivityInfo activityInfo, - PictureInPictureParams pictureInPictureParams, int launcherRotation, - Rect keepClearArea) { + public Rect startSwipePipToHome(ActivityManager.RunningTaskInfo taskInfo, + int launcherRotation, Rect keepClearArea) { Rect[] result = new Rect[1]; executeRemoteCallWithTaskPermission(mController, "startSwipePipToHome", (controller) -> { - result[0] = controller.startSwipePipToHome(componentName, activityInfo, - pictureInPictureParams, launcherRotation, keepClearArea); + result[0] = controller.startSwipePipToHome(taskInfo.topActivity, + taskInfo.topActivityInfo, taskInfo.pictureInPictureParams, + launcherRotation, keepClearArea); }, true /* blocking */); return result[0]; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java index 562b26014bf3..b1984ccef4cb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java @@ -40,6 +40,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLog; import com.android.internal.util.Preconditions; +import com.android.window.flags.Flags; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayChangeController; @@ -358,10 +359,21 @@ public class PipController implements ConfigurationChangeListener, // private Rect getSwipePipToHomeBounds(ComponentName componentName, ActivityInfo activityInfo, - PictureInPictureParams pictureInPictureParams, + int displayId, PictureInPictureParams pictureInPictureParams, int launcherRotation, Rect hotseatKeepClearArea) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "getSwipePipToHomeBounds: %s", componentName); + + // If PiP is enabled on Connected Displays, update PipDisplayLayoutState to have the correct + // display info that PiP is entering in. + if (Flags.enableConnectedDisplaysPip()) { + final DisplayLayout displayLayout = mDisplayController.getDisplayLayout(displayId); + if (displayLayout != null) { + mPipDisplayLayoutState.setDisplayId(displayId); + mPipDisplayLayoutState.setDisplayLayout(displayLayout); + } + } + // Preemptively add the keep clear area for Hotseat, so that it is taken into account // when calculating the entry destination bounds of PiP window. mPipBoundsState.setNamedUnrestrictedKeepClearArea( @@ -592,14 +604,14 @@ public class PipController implements ConfigurationChangeListener, } @Override - public Rect startSwipePipToHome(ComponentName componentName, ActivityInfo activityInfo, - PictureInPictureParams pictureInPictureParams, int launcherRotation, - Rect keepClearArea) { + public Rect startSwipePipToHome(ActivityManager.RunningTaskInfo taskInfo, + int launcherRotation, Rect keepClearArea) { Rect[] result = new Rect[1]; executeRemoteCallWithTaskPermission(mController, "startSwipePipToHome", (controller) -> { - result[0] = controller.getSwipePipToHomeBounds(componentName, activityInfo, - pictureInPictureParams, launcherRotation, keepClearArea); + result[0] = controller.getSwipePipToHomeBounds(taskInfo.topActivity, + taskInfo.topActivityInfo, taskInfo.displayId, + taskInfo.pictureInPictureParams, launcherRotation, keepClearArea); }, true /* blocking */); return result[0]; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java index 4902455cae16..ba82e959f4e4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java @@ -59,6 +59,8 @@ import com.android.internal.util.Preconditions; import com.android.window.flags.Flags; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.ComponentUtils; +import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDisplayLayoutState; @@ -112,6 +114,7 @@ public class PipTransition extends PipTransitionController implements private final PipScheduler mPipScheduler; private final PipTransitionState mPipTransitionState; private final PipDisplayLayoutState mPipDisplayLayoutState; + private final DisplayController mDisplayController; private final Optional<DesktopUserRepositories> mDesktopUserRepositoriesOptional; private final Optional<DesktopWallpaperActivityTokenProvider> mDesktopWallpaperActivityTokenProviderOptional; @@ -151,6 +154,7 @@ public class PipTransition extends PipTransitionController implements PipTransitionState pipTransitionState, PipDisplayLayoutState pipDisplayLayoutState, PipUiStateChangeController pipUiStateChangeController, + DisplayController displayController, Optional<DesktopUserRepositories> desktopUserRepositoriesOptional, Optional<DesktopWallpaperActivityTokenProvider> desktopWallpaperActivityTokenProviderOptional) { @@ -164,6 +168,7 @@ public class PipTransition extends PipTransitionController implements mPipTransitionState = pipTransitionState; mPipTransitionState.addPipTransitionStateChangedListener(this); mPipDisplayLayoutState = pipDisplayLayoutState; + mDisplayController = displayController; mDesktopUserRepositoriesOptional = desktopUserRepositoriesOptional; mDesktopWallpaperActivityTokenProviderOptional = desktopWallpaperActivityTokenProviderOptional; @@ -824,6 +829,17 @@ public class PipTransition extends PipTransitionController implements mPipBoundsState.setBoundsStateForEntry(pipTask.topActivity, pipTask.topActivityInfo, pipParams, mPipBoundsAlgorithm); + // If PiP is enabled on Connected Displays, update PipDisplayLayoutState to have the correct + // display info that PiP is entering in. + if (Flags.enableConnectedDisplaysPip()) { + final DisplayLayout displayLayout = mDisplayController.getDisplayLayout( + pipTask.displayId); + if (displayLayout != null) { + mPipDisplayLayoutState.setDisplayId(pipTask.displayId); + mPipDisplayLayoutState.setDisplayLayout(displayLayout); + } + } + // calculate the entry bounds and notify core to move task to pinned with final bounds final Rect entryBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); mPipBoundsState.setBounds(entryBounds); |