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

Commit f288912c authored by Ats Jenk's avatar Ats Jenk Committed by Android (Google) Code Review
Browse files

Merge "Clean up pip state if task is opening in bubbles" into main

parents 081c6821 e82d421e
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