Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/ComponentUtils.kt +2 −3 Original line number Diff line number Diff line Loading @@ -36,11 +36,10 @@ object ComponentUtils { /** Retrieves the package name from a [taskId]. */ @JvmStatic fun getPackageName(taskId: Int, taskOrganizer: ShellTaskOrganizer): String? { val taskInfo = taskOrganizer.getRunningTaskInfo(taskId) ?: return null return getPackageName(taskInfo) return getPackageName(taskOrganizer.getRunningTaskInfo(taskId)) } /** Retrieves the package name from a [TaskInfo]. */ @JvmStatic fun getPackageName(taskInfo: TaskInfo): String? = getPackageName(taskInfo.baseIntent) fun getPackageName(taskInfo: TaskInfo?): String? = getPackageName(taskInfo?.baseIntent) } libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +15 −0 Original line number Diff line number Diff line Loading @@ -440,6 +440,15 @@ public class PipTransition extends PipTransitionController { } } @Override public void cleanUpState() { ActivityManager.RunningTaskInfo taskInfo = mPipOrganizer.getTaskInfo(); if (taskInfo != null) { mPipOrganizer.onExitPipFinished(taskInfo); mPipBoundsState.setLastPipComponentName(null); } } @Override public boolean handleRotateDisplay(int startRotation, int endRotation, WindowContainerTransaction wct) { Loading Loading @@ -1363,6 +1372,12 @@ public class PipTransition extends PipTransitionController { && packageName.equals(ComponentUtils.getPackageName(inPipTask.baseIntent)); } @Override public boolean isTaskActiveInPip(int taskId) { final TaskInfo inPipTask = mPipOrganizer.getTaskInfo(); return inPipTask != null && mPipOrganizer.isInPip() && taskId == inPipTask.taskId; } private void updatePipForUnhandledTransition(@NonNull TransitionInfo.Change pipChange, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java +14 −0 Original line number Diff line number Diff line Loading @@ -344,6 +344,12 @@ public abstract class PipTransitionController implements Transitions.TransitionH return false; } /** Whether a particular task id the current pip task id. */ public boolean isTaskActiveInPip(int taskId) { // No-op, to be handled differently in PIP1 and PIP2 return false; } /** Add PiP-related changes to `outWCT` for the given request. */ public void augmentRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request, @NonNull WindowContainerTransaction outWCT) { Loading Loading @@ -412,6 +418,14 @@ public abstract class PipTransitionController implements Transitions.TransitionH public void end(@Nullable Runnable onTransitionEnd) { } /** * Clean up stored PIP state. * <p> * Should only be called after a task has exited due to external reasons. Does not modify the * task itself or move it out of PIP. */ public void cleanUpState() {} /** Starts the {@link android.window.SystemPerformanceHinter.HighPerfSession}. */ public void startHighPerfSession() {} Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +38 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getF import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getLeash; import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getPipChange; import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getPipParams; import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE; import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP; import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP_TO_SPLIT; import static com.android.wm.shell.transition.Transitions.TRANSIT_PIP_BOUNDS_CHANGE; Loading Loading @@ -83,7 +84,6 @@ import com.android.wm.shell.pip2.animation.PipEnterAnimator; import com.android.wm.shell.pip2.phone.transition.PipDisplayChangeObserver; import com.android.wm.shell.pip2.phone.transition.PipExpandHandler; import com.android.wm.shell.pip2.phone.transition.PipTransitionUtils; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.shared.pip.PipFlags; import com.android.wm.shell.splitscreen.SplitScreenController; Loading Loading @@ -367,12 +367,41 @@ public class PipTransition extends PipTransitionController implements mPipTransitionState.setState(PipTransitionState.EXITING_PIP); return startRemoveAnimation(info, startTransaction, finishTransaction, finishCallback); } if (shouldCleanUp(info)) { ProtoLog.d(WM_SHELL_PICTURE_IN_PICTURE, "Cleaning up previously pinned task since in a different windowing mode: %s", mPipTransitionState); cleanUpState(finishCallback); return true; } // For any unhandled transition, make sure the PiP surface is properly updated, // i.e. corner and shadow radius. syncPipSurfaceState(info, startTransaction, finishTransaction); return false; } private boolean shouldCleanUp(TransitionInfo info) { // Clean up state if task no longer in PIP windowing mode. TransitionInfo.Change pipChange = getChangeByToken(info, mPipTransitionState.getPipTaskToken()); return pipChange != null && pipChange.getTaskInfo() != null && pipChange.getTaskInfo().getWindowingMode() != WINDOWING_MODE_PINNED; } @Override public void cleanUpState() { cleanUpState(/* finishCallback= */ null); } private void cleanUpState(@Nullable Transitions.TransitionFinishCallback finishCallback) { mFinishCallback = finishCallback; mPipBoundsState.setLastPipComponentName(null /* lastPipComponentName */); mPipTransitionState.setState(PipTransitionState.EXITING_PIP); finishTransition(); } @Override public boolean isEnteringPip(@NonNull TransitionInfo.Change change, @WindowManager.TransitionType int transitType) { Loading Loading @@ -1004,7 +1033,7 @@ public class PipTransition extends PipTransitionController implements return; } ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, ProtoLog.d(WM_SHELL_PICTURE_IN_PICTURE, "cleanUpPrevPipIfPresent: Previous PiP with taskId=%d found with closing mode, " + "clean up PiP state", previousPipTaskInfo.getTaskId()); Loading Loading @@ -1121,4 +1150,11 @@ public class PipTransition extends PipTransitionController implements return packageName != null && inPipTask != null && mPipTransitionState.isInPip() && packageName.equals(ComponentUtils.getPackageName(inPipTask.baseIntent)); } @Override public boolean isTaskActiveInPip(int taskId) { final TaskInfo inPipTask = mPipTransitionState.getPipTaskInfo(); return inPipTask != null && mPipTransitionState.isInPip() && taskId == inPipTask.getTaskId(); } } libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java +13 −1 Original line number Diff line number Diff line Loading @@ -134,8 +134,11 @@ public class DefaultMixedHandler implements MixedTransitionHandler, /** Transition of a visible app in a split pair into a bubble. */ static final int TYPE_LAUNCH_OR_CONVERT_SPLIT_TASK_TO_BUBBLE = 14; /** Transition of a visible app in Pip into a bubble. */ static final int TYPE_LAUNCH_OR_CONVERT_PIP_TASK_TO_BUBBLE = 15; /** Transition of a visible app into a bubble when launched from another bubble. */ static final int TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE_FROM_EXISTING_BUBBLE = 15; static final int TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE_FROM_EXISTING_BUBBLE = 16; @IntDef(prefix = {"TYPE_"}, value = { TYPE_ENTER_PIP_FROM_SPLIT, Loading @@ -152,6 +155,7 @@ public class DefaultMixedHandler implements MixedTransitionHandler, TYPE_OPEN_IN_DESKTOP, TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE, TYPE_LAUNCH_OR_CONVERT_SPLIT_TASK_TO_BUBBLE, TYPE_LAUNCH_OR_CONVERT_PIP_TASK_TO_BUBBLE, TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE_FROM_EXISTING_BUBBLE, }) @Retention(RetentionPolicy.SOURCE) Loading Loading @@ -334,6 +338,14 @@ public class DefaultMixedHandler implements MixedTransitionHandler, WindowContainerTransaction out = new WindowContainerTransaction(); mSplitHandler.addExitForBubblesIfNeeded(request, out); return out; } else if (request.getTriggerTask() != null && mPipHandler.isTaskActiveInPip(request.getTriggerTask().taskId)) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a Bubble-enter request from a pip task"); mBubbleTransitions.storePendingEnterTransition(transition, request); mActiveTransitions.add(createDefaultMixedTransition( MixedTransition.TYPE_LAUNCH_OR_CONVERT_PIP_TASK_TO_BUBBLE, transition)); return new WindowContainerTransaction(); } else { // This check should happen after we've checked for split + bubble enter ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/ComponentUtils.kt +2 −3 Original line number Diff line number Diff line Loading @@ -36,11 +36,10 @@ object ComponentUtils { /** Retrieves the package name from a [taskId]. */ @JvmStatic fun getPackageName(taskId: Int, taskOrganizer: ShellTaskOrganizer): String? { val taskInfo = taskOrganizer.getRunningTaskInfo(taskId) ?: return null return getPackageName(taskInfo) return getPackageName(taskOrganizer.getRunningTaskInfo(taskId)) } /** Retrieves the package name from a [TaskInfo]. */ @JvmStatic fun getPackageName(taskInfo: TaskInfo): String? = getPackageName(taskInfo.baseIntent) fun getPackageName(taskInfo: TaskInfo?): String? = getPackageName(taskInfo?.baseIntent) }
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +15 −0 Original line number Diff line number Diff line Loading @@ -440,6 +440,15 @@ public class PipTransition extends PipTransitionController { } } @Override public void cleanUpState() { ActivityManager.RunningTaskInfo taskInfo = mPipOrganizer.getTaskInfo(); if (taskInfo != null) { mPipOrganizer.onExitPipFinished(taskInfo); mPipBoundsState.setLastPipComponentName(null); } } @Override public boolean handleRotateDisplay(int startRotation, int endRotation, WindowContainerTransaction wct) { Loading Loading @@ -1363,6 +1372,12 @@ public class PipTransition extends PipTransitionController { && packageName.equals(ComponentUtils.getPackageName(inPipTask.baseIntent)); } @Override public boolean isTaskActiveInPip(int taskId) { final TaskInfo inPipTask = mPipOrganizer.getTaskInfo(); return inPipTask != null && mPipOrganizer.isInPip() && taskId == inPipTask.taskId; } private void updatePipForUnhandledTransition(@NonNull TransitionInfo.Change pipChange, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java +14 −0 Original line number Diff line number Diff line Loading @@ -344,6 +344,12 @@ public abstract class PipTransitionController implements Transitions.TransitionH return false; } /** Whether a particular task id the current pip task id. */ public boolean isTaskActiveInPip(int taskId) { // No-op, to be handled differently in PIP1 and PIP2 return false; } /** Add PiP-related changes to `outWCT` for the given request. */ public void augmentRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request, @NonNull WindowContainerTransaction outWCT) { Loading Loading @@ -412,6 +418,14 @@ public abstract class PipTransitionController implements Transitions.TransitionH public void end(@Nullable Runnable onTransitionEnd) { } /** * Clean up stored PIP state. * <p> * Should only be called after a task has exited due to external reasons. Does not modify the * task itself or move it out of PIP. */ public void cleanUpState() {} /** Starts the {@link android.window.SystemPerformanceHinter.HighPerfSession}. */ public void startHighPerfSession() {} Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +38 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getF import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getLeash; import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getPipChange; import static com.android.wm.shell.pip2.phone.transition.PipTransitionUtils.getPipParams; import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE; import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP; import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP_TO_SPLIT; import static com.android.wm.shell.transition.Transitions.TRANSIT_PIP_BOUNDS_CHANGE; Loading Loading @@ -83,7 +84,6 @@ import com.android.wm.shell.pip2.animation.PipEnterAnimator; import com.android.wm.shell.pip2.phone.transition.PipDisplayChangeObserver; import com.android.wm.shell.pip2.phone.transition.PipExpandHandler; import com.android.wm.shell.pip2.phone.transition.PipTransitionUtils; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.shared.pip.PipFlags; import com.android.wm.shell.splitscreen.SplitScreenController; Loading Loading @@ -367,12 +367,41 @@ public class PipTransition extends PipTransitionController implements mPipTransitionState.setState(PipTransitionState.EXITING_PIP); return startRemoveAnimation(info, startTransaction, finishTransaction, finishCallback); } if (shouldCleanUp(info)) { ProtoLog.d(WM_SHELL_PICTURE_IN_PICTURE, "Cleaning up previously pinned task since in a different windowing mode: %s", mPipTransitionState); cleanUpState(finishCallback); return true; } // For any unhandled transition, make sure the PiP surface is properly updated, // i.e. corner and shadow radius. syncPipSurfaceState(info, startTransaction, finishTransaction); return false; } private boolean shouldCleanUp(TransitionInfo info) { // Clean up state if task no longer in PIP windowing mode. TransitionInfo.Change pipChange = getChangeByToken(info, mPipTransitionState.getPipTaskToken()); return pipChange != null && pipChange.getTaskInfo() != null && pipChange.getTaskInfo().getWindowingMode() != WINDOWING_MODE_PINNED; } @Override public void cleanUpState() { cleanUpState(/* finishCallback= */ null); } private void cleanUpState(@Nullable Transitions.TransitionFinishCallback finishCallback) { mFinishCallback = finishCallback; mPipBoundsState.setLastPipComponentName(null /* lastPipComponentName */); mPipTransitionState.setState(PipTransitionState.EXITING_PIP); finishTransition(); } @Override public boolean isEnteringPip(@NonNull TransitionInfo.Change change, @WindowManager.TransitionType int transitType) { Loading Loading @@ -1004,7 +1033,7 @@ public class PipTransition extends PipTransitionController implements return; } ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, ProtoLog.d(WM_SHELL_PICTURE_IN_PICTURE, "cleanUpPrevPipIfPresent: Previous PiP with taskId=%d found with closing mode, " + "clean up PiP state", previousPipTaskInfo.getTaskId()); Loading Loading @@ -1121,4 +1150,11 @@ public class PipTransition extends PipTransitionController implements return packageName != null && inPipTask != null && mPipTransitionState.isInPip() && packageName.equals(ComponentUtils.getPackageName(inPipTask.baseIntent)); } @Override public boolean isTaskActiveInPip(int taskId) { final TaskInfo inPipTask = mPipTransitionState.getPipTaskInfo(); return inPipTask != null && mPipTransitionState.isInPip() && taskId == inPipTask.getTaskId(); } }
libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java +13 −1 Original line number Diff line number Diff line Loading @@ -134,8 +134,11 @@ public class DefaultMixedHandler implements MixedTransitionHandler, /** Transition of a visible app in a split pair into a bubble. */ static final int TYPE_LAUNCH_OR_CONVERT_SPLIT_TASK_TO_BUBBLE = 14; /** Transition of a visible app in Pip into a bubble. */ static final int TYPE_LAUNCH_OR_CONVERT_PIP_TASK_TO_BUBBLE = 15; /** Transition of a visible app into a bubble when launched from another bubble. */ static final int TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE_FROM_EXISTING_BUBBLE = 15; static final int TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE_FROM_EXISTING_BUBBLE = 16; @IntDef(prefix = {"TYPE_"}, value = { TYPE_ENTER_PIP_FROM_SPLIT, Loading @@ -152,6 +155,7 @@ public class DefaultMixedHandler implements MixedTransitionHandler, TYPE_OPEN_IN_DESKTOP, TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE, TYPE_LAUNCH_OR_CONVERT_SPLIT_TASK_TO_BUBBLE, TYPE_LAUNCH_OR_CONVERT_PIP_TASK_TO_BUBBLE, TYPE_LAUNCH_OR_CONVERT_TO_BUBBLE_FROM_EXISTING_BUBBLE, }) @Retention(RetentionPolicy.SOURCE) Loading Loading @@ -334,6 +338,14 @@ public class DefaultMixedHandler implements MixedTransitionHandler, WindowContainerTransaction out = new WindowContainerTransaction(); mSplitHandler.addExitForBubblesIfNeeded(request, out); return out; } else if (request.getTriggerTask() != null && mPipHandler.isTaskActiveInPip(request.getTriggerTask().taskId)) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a Bubble-enter request from a pip task"); mBubbleTransitions.storePendingEnterTransition(transition, request); mActiveTransitions.add(createDefaultMixedTransition( MixedTransition.TYPE_LAUNCH_OR_CONVERT_PIP_TASK_TO_BUBBLE, transition)); return new WindowContainerTransaction(); } else { // This check should happen after we've checked for split + bubble enter ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, Loading