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

Commit 69a8c70f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Attempt to fix race of task surface visibility" into sc-dev am: d52baf86

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14353683

Change-Id: I226adcd7d346116afb6db8c436eab2c7495b530d
parents c4588dc2 d52baf86
Loading
Loading
Loading
Loading
+6 −19
Original line number Diff line number Diff line
@@ -4729,12 +4729,13 @@ class Task extends TaskFragment {

    @Override
    boolean showSurfaceOnCreation() {
        if (mCreatedByOrganizer) {
            // Tasks created by the organizer are default visible because they can synchronously
            // update the leash before new children are added to the task.
            return true;
        }
        // Organized tasks handle their own surface visibility
        final boolean willBeOrganized =
                mAtmService.mTaskOrganizerController.isSupportedWindowingMode(getWindowingMode())
                && isRootTask();
        return !mAtmService.getTransitionController().isShellTransitionsEnabled()
                || !willBeOrganized;
        return !canBeOrganized();
    }

    @Override
@@ -4750,22 +4751,8 @@ class Task extends TaskFragment {
    }

    void setHasBeenVisible(boolean hasBeenVisible) {
        final boolean prevHasBeenVisible = mHasBeenVisible;
        mHasBeenVisible = hasBeenVisible;
        if (hasBeenVisible) {
            // If the task is not yet visible when it is added to the task organizer, then we should
            // hide it to allow the task organizer to show it when it is properly reparented. We
            // skip this for tasks created by the organizer because they can synchronously update
            // the leash before new children are added to the task.  Also skip this if the task
            // has already been sent to the organizer which can happen before the first draw if
            // an existing task is reported to the organizer when it first registers.
            if (!mAtmService.getTransitionController().isShellTransitionsEnabled()
                    && !mCreatedByOrganizer && !mTaskAppearedSent
                    && mTaskOrganizer != null && !prevHasBeenVisible) {
                getSyncTransaction().hide(getSurfaceControl());
                commitPendingTransaction();
            }

            if (!mDeferTaskAppear) sendTaskAppeared();
            if (!isRootTask()) {
                getRootTask().setHasBeenVisible(true);
+4 −20
Original line number Diff line number Diff line
@@ -215,23 +215,15 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
            }
        }

        SurfaceControl prepareLeash(Task task, boolean visible, String reason) {
            SurfaceControl outSurfaceControl = new SurfaceControl(task.getSurfaceControl(), reason);
            if (!task.mCreatedByOrganizer && !visible) {
                // To prevent flashes, we hide the task prior to sending the leash to the
                // task org if the task has previously hidden (ie. when entering PIP)
                mTransaction.hide(outSurfaceControl);
                mTransaction.apply();
            }
            return outSurfaceControl;
        SurfaceControl prepareLeash(Task task, String reason) {
            return new SurfaceControl(task.getSurfaceControl(), reason);
        }

        void onTaskAppeared(Task task) {
            ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Task appeared taskId=%d", task.mTaskId);
            final boolean visible = task.isVisible();
            final RunningTaskInfo taskInfo = task.getTaskInfo();
            try {
                mTaskOrganizer.onTaskAppeared(taskInfo, prepareLeash(task, visible,
                mTaskOrganizer.onTaskAppeared(taskInfo, prepareLeash(task,
                        "TaskOrganizerController.onTaskAppeared"));
            } catch (RemoteException e) {
                Slog.e(TAG, "Exception sending onTaskAppeared callback", e);
@@ -331,7 +323,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
            if (!mOrganizedTasks.contains(t)) {
                mOrganizedTasks.add(t);
            }
            return mOrganizer.prepareLeash(t, t.isVisible(), reason);
            return mOrganizer.prepareLeash(t, reason);
        }

        private boolean addTask(Task t) {
@@ -434,7 +426,6 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
    // Set of organized tasks (by taskId) that dispatch back pressed to their organizers
    private final HashSet<Integer> mInterceptBackPressedOnRootTasks = new HashSet();

    private SurfaceControl.Transaction mTransaction;
    private RunningTaskInfo mTmpTaskInfo;
    private Consumer<Runnable> mDeferTaskOrgCallbacksConsumer;

@@ -479,13 +470,6 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
            synchronized (mGlobalLock) {
                ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Register task organizer=%s uid=%d",
                        organizer.asBinder(), uid);

                // Defer initializing the transaction since the transaction factory can be set up
                // by the tests after construction of the controller
                if (mTransaction == null) {
                    mTransaction = mService.mWindowManager.mTransactionFactory.get();
                }

                if (!mTaskOrganizerStates.containsKey(organizer.asBinder())) {
                    mTaskOrganizers.add(organizer);
                    mTaskOrganizerStates.put(organizer.asBinder(),