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

Commit d285e621 authored by Tony Huang's avatar Tony Huang
Browse files

Fix pip expand issue if parent task under split root

If task have more than one activity and enter pip mode, WMS will
create new task for that activity and reparent it back when it
exit pip mode.

This cause some issues if the origin task under split root such
as UI abnormal or it cannot expand to fullscreen.(We expect it
expand to fullscreen always when click expand button on pip.)

Fix this by record the origin task id in taskInfo and use this
id to check exit split first or not if such task still under split
root when exit pip.

Fix: 264002510
Test: manual
Test: pass existing tests
Change-Id: I673f8c7a677f16897700d2be3853d4b4a36df7dd
parent 6c78bab2
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -187,6 +187,14 @@ public class TaskInfo {
     */
    public int launchIntoPipHostTaskId;

    /**
     * The task id of the parent Task of the launch-into-pip Activity, i.e., if task have more than
     * one activity it will create new task for this activity, this id is the origin task id and
     * the pip activity will be reparent to origin task when it exit pip mode.
     * @hide
     */
    public int lastParentTaskIdBeforePip;

    /**
     * The {@link Rect} copied from {@link DisplayCutout#getSafeInsets()} if the cutout is not of
     * (LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS),
@@ -503,6 +511,7 @@ public class TaskInfo {
        pictureInPictureParams = source.readTypedObject(PictureInPictureParams.CREATOR);
        shouldDockBigOverlays = source.readBoolean();
        launchIntoPipHostTaskId = source.readInt();
        lastParentTaskIdBeforePip = source.readInt();
        displayCutoutInsets = source.readTypedObject(Rect.CREATOR);
        topActivityInfo = source.readTypedObject(ActivityInfo.CREATOR);
        isResizeable = source.readBoolean();
@@ -549,6 +558,7 @@ public class TaskInfo {
        dest.writeTypedObject(pictureInPictureParams, flags);
        dest.writeBoolean(shouldDockBigOverlays);
        dest.writeInt(launchIntoPipHostTaskId);
        dest.writeInt(lastParentTaskIdBeforePip);
        dest.writeTypedObject(displayCutoutInsets, flags);
        dest.writeTypedObject(topActivityInfo, flags);
        dest.writeBoolean(isResizeable);
@@ -589,6 +599,7 @@ public class TaskInfo {
                + " pictureInPictureParams=" + pictureInPictureParams
                + " shouldDockBigOverlays=" + shouldDockBigOverlays
                + " launchIntoPipHostTaskId=" + launchIntoPipHostTaskId
                + " lastParentTaskIdBeforePip=" + lastParentTaskIdBeforePip
                + " displayCutoutSafeInsets=" + displayCutoutInsets
                + " topActivityInfo=" + topActivityInfo
                + " launchCookies=" + launchCookies
+10 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell.pip;

import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
@@ -538,6 +539,15 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            mPipTransitionController.startExitTransition(TRANSIT_EXIT_PIP, wct, destinationBounds);
            return;
        }
        if (mSplitScreenOptional.isPresent()) {
            // If pip activity will reparent to origin task case and if the origin task still under
            // split root, just exit split screen here to ensure it could expand to fullscreen.
            SplitScreenController split = mSplitScreenOptional.get();
            if (split.isTaskInSplitScreen(mTaskInfo.lastParentTaskIdBeforePip)) {
                split.exitSplitScreen(INVALID_TASK_ID,
                        SplitScreenController.EXIT_REASON_APP_FINISHED);
            }
        }
        mSyncTransactionQueue.queue(wct);
        mSyncTransactionQueue.runInSync(t -> {
            // Make sure to grab the latest source hint rect as it could have been
+2 −1
Original line number Diff line number Diff line
@@ -282,7 +282,8 @@ public class PipMenuView extends FrameLayout {

    public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) {
        final boolean isSplitScreen = mSplitScreenControllerOptional.isPresent()
                && mSplitScreenControllerOptional.get().isTaskInSplitScreen(taskInfo.taskId);
                && mSplitScreenControllerOptional.get().isTaskInSplitScreenForeground(
                taskInfo.taskId);
        mFocusedTaskAllowSplitScreen = isSplitScreen
                || (taskInfo.getWindowingMode() == WINDOWING_MODE_FULLSCREEN
                && taskInfo.supportsMultiWindow
+7 −2
Original line number Diff line number Diff line
@@ -329,9 +329,14 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
        return mTaskOrganizer.getRunningTaskInfo(taskId);
    }

    /** Check task is under split or not by taskId. */
    public boolean isTaskInSplitScreen(int taskId) {
        return isSplitScreenVisible()
                && mStageCoordinator.getStageOfTask(taskId) != STAGE_TYPE_UNDEFINED;
        return mStageCoordinator.getStageOfTask(taskId) != STAGE_TYPE_UNDEFINED;
    }

    /** Check split is foreground and task is under split or not by taskId. */
    public boolean isTaskInSplitScreenForeground(int taskId) {
        return isTaskInSplitScreen(taskId) && isSplitScreenVisible();
    }

    public @SplitPosition int getSplitPosition(int taskId) {
+2 −0
Original line number Diff line number Diff line
@@ -3448,6 +3448,8 @@ class Task extends TaskFragment {
                && info.pictureInPictureParams.isLaunchIntoPip()
                && top.getLastParentBeforePip() != null)
                        ? top.getLastParentBeforePip().mTaskId : INVALID_TASK_ID;
        info.lastParentTaskIdBeforePip = top != null && top.getLastParentBeforePip() != null
                ? top.getLastParentBeforePip().mTaskId : INVALID_TASK_ID;
        info.shouldDockBigOverlays = top != null && top.shouldDockBigOverlays;
        info.mTopActivityLocusId = top != null ? top.getLocusId() : null;