Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e82d421e authored by Ats Jenk's avatar Ats Jenk
Browse files

Clean up pip state if task is opening in bubbles

When convering a task to a bubble and it is running in PIP, clean up the
PIP state.
Bubble transition handler will take care of the animation.
Pip handler will clean up the state.

Bug: 418307708
Test: manual, open Youtube and enter PIP, long press on Youtube icon on
  home screen to enter bubble, collapse Youtube bubble and start split
  screen from Calculator, choose Youtube as the second split pair. Check
  that Youtube shows up in split (if pip state is not cleared up, it
  would skip split screen).
Flag: com.android.wm.shell.enable_create_any_bubble
Change-Id: I5e3ad182c5d8482c2ebed004b8ddef4f07dcf25a
parent cf04bb71
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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)
}
+15 −0
Original line number Diff line number Diff line
@@ -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) {
@@ -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) {
+14 −0
Original line number Diff line number Diff line
@@ -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) {
@@ -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() {}

+38 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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) {
@@ -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());
@@ -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();
    }
}
+13 −1
Original line number Diff line number Diff line
@@ -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,
@@ -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)
@@ -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