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

Commit 2f51bfae authored by Winson Chung's avatar Winson Chung Committed by Android (Google) Code Review
Browse files

Merge "Fix issue with inconsistent stage visibility" into main

parents afa20f3a b5ad495d
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -2155,8 +2155,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        wct.setForceTranslucent(mRootTaskInfo.token, translucent);
    }

    /** Callback when split roots visiblility changed.
     * NOTICE: This only be called on legacy transition. */
    /** Callback when split roots visiblility changed. */
    @Override
    public void onStageVisibilityChanged(StageTaskListener stageListener) {
        // If split didn't active, just ignore this callback because we should already did these
+11 −17
Original line number Diff line number Diff line
@@ -240,12 +240,20 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener {
    @Override
    @CallSuper
    public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) {
        ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onTaskInfoChanged: taskId=%d taskAct=%s "
                        + "stageId=%s",
                taskInfo.taskId, taskInfo.baseActivity, stageTypeToString(mId));
        ProtoLog.d(WM_SHELL_SPLIT_SCREEN,
                "onTaskInfoChanged: taskId=%d vis=%b reqVis=%b baseAct=%s stageId=%s",
                taskInfo.taskId, taskInfo.isVisible, taskInfo.isVisibleRequested,
                taskInfo.baseActivity, stageTypeToString(mId));
        mWindowDecorViewModel.ifPresent(viewModel -> viewModel.onTaskInfoChanged(taskInfo));
        if (mRootTaskInfo.taskId == taskInfo.taskId) {
            mRootTaskInfo = taskInfo;
            boolean isVisible = taskInfo.isVisible && taskInfo.isVisibleRequested;
            if (mVisible != isVisible) {
                ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onTaskInfoChanged: currentVis=%b newVis=%b",
                        mVisible, isVisible);
                mVisible = isVisible;
                mCallbacks.onStageVisibilityChanged(this);
            }
        } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) {
            if (!taskInfo.supportsMultiWindow
                    || !ArrayUtils.contains(CONTROLLED_ACTIVITY_TYPES, taskInfo.getActivityType())
@@ -260,7 +268,6 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener {
                return;
            }
            mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);
            mVisible = isStageVisible();
            mCallbacks.onChildTaskStatusChanged(this, taskInfo.taskId, true /* present */,
                    taskInfo.isVisible && taskInfo.isVisibleRequested);
        } else {
@@ -309,19 +316,6 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener {
        t.reparent(sc, findTaskSurface(taskId));
    }

    /**
     * Checks against all children task info and return true if any are marked as visible.
     */
    private boolean isStageVisible() {
        for (int i = mChildrenTaskInfo.size() - 1; i >= 0; --i) {
            if (mChildrenTaskInfo.valueAt(i).isVisible
                    && mChildrenTaskInfo.valueAt(i).isVisibleRequested) {
                return true;
            }
        }
        return false;
    }

    private SurfaceControl findTaskSurface(int taskId) {
        if (mRootTaskInfo.taskId == taskId) {
            return mRootLeash;
+3 −0
Original line number Diff line number Diff line
@@ -3864,6 +3864,9 @@ class Task extends TaskFragment {
        if (mLaunchAdjacentDisabled) {
            pw.println(prefix + "mLaunchAdjacentDisabled=true");
        }
        if (mReparentLeafTaskIfRelaunch) {
            pw.println(prefix + "mReparentLeafTaskIfRelaunch=true");
        }
    }

    @Override
+5 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.Display.INVALID_DISPLAY;

import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
import static com.android.server.wm.ActivityRecord.State.RESUMED;
import static com.android.server.wm.ActivityTaskManagerService.TAG_ROOT_TASK;
import static com.android.server.wm.DisplayContent.alwaysCreateRootTask;
@@ -918,6 +919,10 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
                if (candidateTask.getParent() == null) {
                    addChild(candidateTask, position);
                } else {
                    if (candidateTask.getRootTask().mReparentLeafTaskIfRelaunch) {
                        ProtoLog.d(WM_DEBUG_TASKS, "Reparenting to display area on relaunch: "
                                + "rootTaskId=%d toTop=%b", candidateTask.mTaskId, onTop);
                    }
                    candidateTask.reparent(this, onTop);
                }
            }