Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java +9 −3 Original line number Diff line number Diff line Loading @@ -288,10 +288,16 @@ public class PipController implements ConfigurationChangeListener, public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "onActivityRestartAttempt: topActivity=%s, wasVisible=%b", task.topActivity, wasVisible); "onActivityRestartAttempt: topActivity=%s, wasVisible=%b, displayId=%s, " + "pipDisplayLayoutState#displayId=%s", task.topActivity, wasVisible, task.displayId, mPipDisplayLayoutState.getDisplayId()); boolean keepPipFromLockscreen = !wasVisible && !Flags.dismissPipFromLockscreen(); if (task.getWindowingMode() != WINDOWING_MODE_PINNED || keepPipFromLockscreen) { boolean isPipLaunchingOnDifferentDisplay = DesktopExperienceFlags.ENABLE_CROSS_DISPLAYS_PIP_TASK_LAUNCH.isTrue() && task.displayId != mPipDisplayLayoutState.getDisplayId(); if (task.getWindowingMode() != WINDOWING_MODE_PINNED || keepPipFromLockscreen || isPipLaunchingOnDifferentDisplay) { return; } mPipScheduler.scheduleExitPipViaExpand(wasVisible); Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java +20 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,26 @@ public class PipScheduler implements PipTransitionState.PipTransitionStateChange return wct; } /** * Returns a wct for exiting PiP and expanding on a different display. */ @Nullable public WindowContainerTransaction getExitPipViaExpandIntoDisplayTransaction(int displayId) { WindowContainerToken pipToken = mPipTransitionState.getPipTaskToken(); WindowContainerTransaction wct = getExitPipViaExpandTransaction(); DisplayAreaInfo displayAreaInfo = mPipDesktopState.getRootTaskDisplayAreaOrganizer().getDisplayAreaInfo( displayId); if (pipToken == null || wct == null || displayAreaInfo == null) { return null; } wct.reparent(pipToken, displayAreaInfo.token, true); wct.setDensityDpi(pipToken, displayAreaInfo.configuration.densityDpi); return wct; } @Nullable private WindowContainerTransaction getRemovePipTransaction() { WindowContainerToken pipTaskToken = mPipTransitionState.getPipTaskToken(); Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +9 −1 Original line number Diff line number Diff line Loading @@ -195,7 +195,7 @@ public class PipTransition extends PipTransitionController implements mExpandHandler = new PipExpandHandler(mContext, mPipSurfaceTransactionHelper, pipBoundsState, pipBoundsAlgorithm, pipTransitionState, pipDisplayLayoutState, pipDesktopState, pipInteractionHandler, splitScreenControllerOptional); pipScheduler, splitScreenControllerOptional, displayController); mContentPipHandler = new ContentPipHandler(mContext, mPipSurfaceTransactionHelper, pipTransitionState); mPipDisplayChangeObserver = new PipDisplayChangeObserver(pipTransitionState, Loading Loading @@ -279,6 +279,14 @@ public class PipTransition extends PipTransitionController implements ); return wct; } final WindowContainerTransaction exitViaExpandWct = mExpandHandler.handleRequest(transition, request); if (exitViaExpandWct != null) { mExitViaExpandTransition = transition; return exitViaExpandWct; } return null; } Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransitionState.java +1 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,7 @@ public class PipTransitionState { ? new SurfaceControl(leash, "PipTransitionState") : null; } @Nullable TaskInfo getPipTaskInfo() { @Nullable public TaskInfo getPipTaskInfo() { return mPipTaskInfo; } Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/transition/PipExpandHandler.java +48 −2 Original line number Diff line number Diff line Loading @@ -33,12 +33,14 @@ import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP_TO_SP import android.animation.ValueAnimator; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.PictureInPictureParams; import android.content.Context; import android.graphics.Rect; import android.os.IBinder; import android.view.Surface; import android.view.SurfaceControl; import android.window.DesktopExperienceFlags; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerToken; Loading @@ -46,6 +48,7 @@ import android.window.WindowContainerTransaction; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLog; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDesktopState; Loading @@ -53,8 +56,10 @@ import com.android.wm.shell.common.pip.PipDisplayLayoutState; import com.android.wm.shell.pip2.PipSurfaceTransactionHelper; import com.android.wm.shell.pip2.animation.PipExpandAnimator; import com.android.wm.shell.pip2.phone.PipInteractionHandler; import com.android.wm.shell.pip2.phone.PipScheduler; import com.android.wm.shell.pip2.phone.PipTransitionState; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.transition.Transitions; Loading @@ -68,13 +73,21 @@ public class PipExpandHandler implements Transitions.TransitionHandler { private final PipDisplayLayoutState mPipDisplayLayoutState; private final PipDesktopState mPipDesktopState; private final PipInteractionHandler mPipInteractionHandler; private final PipScheduler mPipScheduler; private final Optional<SplitScreenController> mSplitScreenControllerOptional; private final DisplayController mDisplayController; @Nullable private Transitions.TransitionFinishCallback mFinishCallback; @Nullable private ValueAnimator mTransitionAnimator; // // Transition caches // @Nullable @VisibleForTesting IBinder mExitViaExpandTransition; private PipExpandAnimatorSupplier mPipExpandAnimatorSupplier; private final @NonNull PipSurfaceTransactionHelper mSurfaceTransactionHelper; Loading @@ -86,7 +99,9 @@ public class PipExpandHandler implements Transitions.TransitionHandler { PipDisplayLayoutState pipDisplayLayoutState, PipDesktopState pipDesktopState, PipInteractionHandler pipInteractionHandler, Optional<SplitScreenController> splitScreenControllerOptional) { PipScheduler pipScheduler, Optional<SplitScreenController> splitScreenControllerOptional, DisplayController displayController) { mContext = context; mPipBoundsState = pipBoundsState; mPipBoundsAlgorithm = pipBoundsAlgorithm; Loading @@ -94,8 +109,10 @@ public class PipExpandHandler implements Transitions.TransitionHandler { mPipDisplayLayoutState = pipDisplayLayoutState; mPipDesktopState = pipDesktopState; mPipInteractionHandler = pipInteractionHandler; mPipScheduler = pipScheduler; mSplitScreenControllerOptional = splitScreenControllerOptional; mSurfaceTransactionHelper = pipSurfaceTransactionHelper; mDisplayController = displayController; mPipExpandAnimatorSupplier = PipExpandAnimator::new; } Loading @@ -108,10 +125,34 @@ public class PipExpandHandler implements Transitions.TransitionHandler { @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { // All Exit-via-Expand from PiP transitions are Shell initiated. ActivityManager.RunningTaskInfo taskInfo = request.getTriggerTask(); if (taskInfo == null) { return null; } // Launching the task while it's in PiP on another display if (isLaunchingPipActivityFromDifferentDisplay(request, taskInfo)) { mExitViaExpandTransition = transition; return mPipScheduler.getExitPipViaExpandIntoDisplayTransaction(taskInfo.displayId); } return null; } /** Whether the task that's currently in PiP is being launched on another display. */ private boolean isLaunchingPipActivityFromDifferentDisplay( @NonNull TransitionRequestInfo request, ActivityManager.RunningTaskInfo taskInfo) { if (mPipTransitionState.getPipTaskInfo() == null) { return false; } return DesktopExperienceFlags.ENABLE_CROSS_DISPLAYS_PIP_TASK_LAUNCH.isTrue() && TransitionUtil.isOpeningType(request.getType()) && mPipTransitionState.getPipTaskInfo().taskId == taskInfo.taskId && mPipTransitionState.getPipTaskInfo().topActivity != null && mPipTransitionState.getPipTaskInfo().topActivity.equals(taskInfo.topActivity) && taskInfo.displayId != mPipDisplayLayoutState.getDisplayId(); } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, Loading @@ -126,6 +167,11 @@ public class PipExpandHandler implements Transitions.TransitionHandler { return startExpandToSplitAnimation(info, startTransaction, finishTransaction, finishCallback); } if (transition == mExitViaExpandTransition) { mExitViaExpandTransition = null; return startExpandAnimation(info, startTransaction, finishTransaction, finishCallback); } return false; } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java +9 −3 Original line number Diff line number Diff line Loading @@ -288,10 +288,16 @@ public class PipController implements ConfigurationChangeListener, public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "onActivityRestartAttempt: topActivity=%s, wasVisible=%b", task.topActivity, wasVisible); "onActivityRestartAttempt: topActivity=%s, wasVisible=%b, displayId=%s, " + "pipDisplayLayoutState#displayId=%s", task.topActivity, wasVisible, task.displayId, mPipDisplayLayoutState.getDisplayId()); boolean keepPipFromLockscreen = !wasVisible && !Flags.dismissPipFromLockscreen(); if (task.getWindowingMode() != WINDOWING_MODE_PINNED || keepPipFromLockscreen) { boolean isPipLaunchingOnDifferentDisplay = DesktopExperienceFlags.ENABLE_CROSS_DISPLAYS_PIP_TASK_LAUNCH.isTrue() && task.displayId != mPipDisplayLayoutState.getDisplayId(); if (task.getWindowingMode() != WINDOWING_MODE_PINNED || keepPipFromLockscreen || isPipLaunchingOnDifferentDisplay) { return; } mPipScheduler.scheduleExitPipViaExpand(wasVisible); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java +20 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,26 @@ public class PipScheduler implements PipTransitionState.PipTransitionStateChange return wct; } /** * Returns a wct for exiting PiP and expanding on a different display. */ @Nullable public WindowContainerTransaction getExitPipViaExpandIntoDisplayTransaction(int displayId) { WindowContainerToken pipToken = mPipTransitionState.getPipTaskToken(); WindowContainerTransaction wct = getExitPipViaExpandTransaction(); DisplayAreaInfo displayAreaInfo = mPipDesktopState.getRootTaskDisplayAreaOrganizer().getDisplayAreaInfo( displayId); if (pipToken == null || wct == null || displayAreaInfo == null) { return null; } wct.reparent(pipToken, displayAreaInfo.token, true); wct.setDensityDpi(pipToken, displayAreaInfo.configuration.densityDpi); return wct; } @Nullable private WindowContainerTransaction getRemovePipTransaction() { WindowContainerToken pipTaskToken = mPipTransitionState.getPipTaskToken(); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +9 −1 Original line number Diff line number Diff line Loading @@ -195,7 +195,7 @@ public class PipTransition extends PipTransitionController implements mExpandHandler = new PipExpandHandler(mContext, mPipSurfaceTransactionHelper, pipBoundsState, pipBoundsAlgorithm, pipTransitionState, pipDisplayLayoutState, pipDesktopState, pipInteractionHandler, splitScreenControllerOptional); pipScheduler, splitScreenControllerOptional, displayController); mContentPipHandler = new ContentPipHandler(mContext, mPipSurfaceTransactionHelper, pipTransitionState); mPipDisplayChangeObserver = new PipDisplayChangeObserver(pipTransitionState, Loading Loading @@ -279,6 +279,14 @@ public class PipTransition extends PipTransitionController implements ); return wct; } final WindowContainerTransaction exitViaExpandWct = mExpandHandler.handleRequest(transition, request); if (exitViaExpandWct != null) { mExitViaExpandTransition = transition; return exitViaExpandWct; } return null; } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransitionState.java +1 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,7 @@ public class PipTransitionState { ? new SurfaceControl(leash, "PipTransitionState") : null; } @Nullable TaskInfo getPipTaskInfo() { @Nullable public TaskInfo getPipTaskInfo() { return mPipTaskInfo; } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/transition/PipExpandHandler.java +48 −2 Original line number Diff line number Diff line Loading @@ -33,12 +33,14 @@ import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP_TO_SP import android.animation.ValueAnimator; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.PictureInPictureParams; import android.content.Context; import android.graphics.Rect; import android.os.IBinder; import android.view.Surface; import android.view.SurfaceControl; import android.window.DesktopExperienceFlags; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerToken; Loading @@ -46,6 +48,7 @@ import android.window.WindowContainerTransaction; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLog; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDesktopState; Loading @@ -53,8 +56,10 @@ import com.android.wm.shell.common.pip.PipDisplayLayoutState; import com.android.wm.shell.pip2.PipSurfaceTransactionHelper; import com.android.wm.shell.pip2.animation.PipExpandAnimator; import com.android.wm.shell.pip2.phone.PipInteractionHandler; import com.android.wm.shell.pip2.phone.PipScheduler; import com.android.wm.shell.pip2.phone.PipTransitionState; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.transition.Transitions; Loading @@ -68,13 +73,21 @@ public class PipExpandHandler implements Transitions.TransitionHandler { private final PipDisplayLayoutState mPipDisplayLayoutState; private final PipDesktopState mPipDesktopState; private final PipInteractionHandler mPipInteractionHandler; private final PipScheduler mPipScheduler; private final Optional<SplitScreenController> mSplitScreenControllerOptional; private final DisplayController mDisplayController; @Nullable private Transitions.TransitionFinishCallback mFinishCallback; @Nullable private ValueAnimator mTransitionAnimator; // // Transition caches // @Nullable @VisibleForTesting IBinder mExitViaExpandTransition; private PipExpandAnimatorSupplier mPipExpandAnimatorSupplier; private final @NonNull PipSurfaceTransactionHelper mSurfaceTransactionHelper; Loading @@ -86,7 +99,9 @@ public class PipExpandHandler implements Transitions.TransitionHandler { PipDisplayLayoutState pipDisplayLayoutState, PipDesktopState pipDesktopState, PipInteractionHandler pipInteractionHandler, Optional<SplitScreenController> splitScreenControllerOptional) { PipScheduler pipScheduler, Optional<SplitScreenController> splitScreenControllerOptional, DisplayController displayController) { mContext = context; mPipBoundsState = pipBoundsState; mPipBoundsAlgorithm = pipBoundsAlgorithm; Loading @@ -94,8 +109,10 @@ public class PipExpandHandler implements Transitions.TransitionHandler { mPipDisplayLayoutState = pipDisplayLayoutState; mPipDesktopState = pipDesktopState; mPipInteractionHandler = pipInteractionHandler; mPipScheduler = pipScheduler; mSplitScreenControllerOptional = splitScreenControllerOptional; mSurfaceTransactionHelper = pipSurfaceTransactionHelper; mDisplayController = displayController; mPipExpandAnimatorSupplier = PipExpandAnimator::new; } Loading @@ -108,10 +125,34 @@ public class PipExpandHandler implements Transitions.TransitionHandler { @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { // All Exit-via-Expand from PiP transitions are Shell initiated. ActivityManager.RunningTaskInfo taskInfo = request.getTriggerTask(); if (taskInfo == null) { return null; } // Launching the task while it's in PiP on another display if (isLaunchingPipActivityFromDifferentDisplay(request, taskInfo)) { mExitViaExpandTransition = transition; return mPipScheduler.getExitPipViaExpandIntoDisplayTransaction(taskInfo.displayId); } return null; } /** Whether the task that's currently in PiP is being launched on another display. */ private boolean isLaunchingPipActivityFromDifferentDisplay( @NonNull TransitionRequestInfo request, ActivityManager.RunningTaskInfo taskInfo) { if (mPipTransitionState.getPipTaskInfo() == null) { return false; } return DesktopExperienceFlags.ENABLE_CROSS_DISPLAYS_PIP_TASK_LAUNCH.isTrue() && TransitionUtil.isOpeningType(request.getType()) && mPipTransitionState.getPipTaskInfo().taskId == taskInfo.taskId && mPipTransitionState.getPipTaskInfo().topActivity != null && mPipTransitionState.getPipTaskInfo().topActivity.equals(taskInfo.topActivity) && taskInfo.displayId != mPipDisplayLayoutState.getDisplayId(); } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, Loading @@ -126,6 +167,11 @@ public class PipExpandHandler implements Transitions.TransitionHandler { return startExpandToSplitAnimation(info, startTransaction, finishTransaction, finishCallback); } if (transition == mExitViaExpandTransition) { mExitViaExpandTransition = null; return startExpandAnimation(info, startTransaction, finishTransaction, finishCallback); } return false; } Loading