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

Commit d52baf86 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents f995ce3c d3bdc63c
Loading
Loading
Loading
Loading
+6 −19
Original line number Diff line number Diff line
@@ -4982,12 +4982,13 @@ class Task extends WindowContainer<WindowContainer> {

    @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
@@ -5003,22 +5004,8 @@ class Task extends WindowContainer<WindowContainer> {
    }

    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(),