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

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

Merge "Update task orgs with existing tasks" into rvc-dev

parents 9f5f4d3b 77338abc
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -237,6 +237,12 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio
                mTouchHandler.getMotionHelper());
        displayController.addDisplayChangingController(mRotationController);

        // Ensure that we have the display info in case we get calls to update the bounds before the
        // listener calls back
        final DisplayInfo displayInfo = new DisplayInfo();
        context.getDisplay().getDisplayInfo(displayInfo);
        mPipBoundsHandler.onDisplayInfoChanged(displayInfo);

        try {
            ActivityTaskManager.getTaskOrganizerController().registerTaskOrganizer(
                    mPipTaskOrganizer, WINDOWING_MODE_PINNED);
+0 −29
Original line number Diff line number Diff line
@@ -153,7 +153,6 @@ import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.ITaskOrganizer;
import android.view.SurfaceControl;

import com.android.internal.annotations.GuardedBy;
@@ -307,8 +306,6 @@ class ActivityStack extends Task {
    // TODO(task-hierarchy): remove when tiles can be actual parents
    TaskTile mTile = null;

    private int mLastTaskOrganizerWindowingMode = -1;

    private final Handler mHandler;

    private class ActivityStackHandler extends Handler {
@@ -635,8 +632,6 @@ class ActivityStack extends Task {

        super.onConfigurationChanged(newParentConfig);

        updateTaskOrganizerState();

        // Only need to update surface size here since the super method will handle updating
        // surface position.
        updateSurfaceSize(getPendingTransaction());
@@ -692,30 +687,6 @@ class ActivityStack extends Task {
        }
    }

    void updateTaskOrganizerState() {
        if (!isRootTask()) {
            return;
        }

        final int windowingMode = getWindowingMode();
        if (windowingMode == mLastTaskOrganizerWindowingMode) {
            // If our windowing mode hasn't actually changed, then just stick
            // with our old organizer. This lets us implement the semantic
            // where SysUI can continue to manage it's old tasks
            // while CTS temporarily takes over the registration.
            return;
        }
        /*
         * Different windowing modes may be managed by different task organizers. If
         * getTaskOrganizer returns null, we still call setTaskOrganizer to
         * make sure we clear it.
         */
        final ITaskOrganizer org =
            mWmService.mAtmService.mTaskOrganizerController.getTaskOrganizer(windowingMode);
        setTaskOrganizer(org);
        mLastTaskOrganizerWindowingMode = windowingMode;
    }

    @Override
    public void setWindowingMode(int windowingMode) {
        // Calling Task#setWindowingMode() for leaf task since this is the a specialization of
+35 −0
Original line number Diff line number Diff line
@@ -474,6 +474,7 @@ class Task extends WindowContainer<WindowContainer> {
     * taskAppeared callback, and emit a taskRemoved callback when the Task is vanished.
     */
    ITaskOrganizer mTaskOrganizer;
    private int mLastTaskOrganizerWindowingMode = -1;

    /**
     * Last Picture-in-Picture params applicable to the task. Updated when the app
@@ -1929,6 +1930,7 @@ class Task extends WindowContainer<WindowContainer> {
        // TODO: Should also take care of Pip mode changes here.

        saveLaunchingStateIfNeeded();
        updateTaskOrganizerState(false /* forceUpdate */);
    }

    /**
@@ -4018,6 +4020,39 @@ class Task extends WindowContainer<WindowContainer> {
    // Called on Binder death.
    void taskOrganizerDied() {
        mTaskOrganizer = null;
        mLastTaskOrganizerWindowingMode = -1;
    }

    /**
     * Called when the task state changes (ie. from windowing mode change) an the task organizer
     * state should also be updated.
     *
     * @param forceUpdate Updates the task organizer to the one currently specified in the task
     *                    org controller for the task's windowing mode, ignoring the cached
     *                    windowing mode checks.
     */
    void updateTaskOrganizerState(boolean forceUpdate) {
        if (!isRootTask()) {
            return;
        }

        final int windowingMode = getWindowingMode();
        if (!forceUpdate && windowingMode == mLastTaskOrganizerWindowingMode) {
            // If our windowing mode hasn't actually changed, then just stick
            // with our old organizer. This lets us implement the semantic
            // where SysUI can continue to manage it's old tasks
            // while CTS temporarily takes over the registration.
            return;
        }
        /*
         * Different windowing modes may be managed by different task organizers. If
         * getTaskOrganizer returns null, we still call setTaskOrganizer to
         * make sure we clear it.
         */
        final ITaskOrganizer org =
                mWmService.mAtmService.mTaskOrganizerController.getTaskOrganizer(windowingMode);
        setTaskOrganizer(org);
        mLastTaskOrganizerWindowingMode = windowingMode;
    }

    @Override
+19 −2
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub


        TaskOrganizerState(ITaskOrganizer organizer, int windowingMode,
                TaskOrganizerState replacing) {
                @Nullable TaskOrganizerState replacing) {
            mOrganizer = organizer;
            mDeathRecipient = new DeathRecipient(organizer, windowingMode);
            try {
@@ -203,10 +203,27 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub
        final long origId = Binder.clearCallingIdentity();
        try {
            synchronized (mGlobalLock) {
                if (getTaskOrganizer(windowingMode) != null) {
                    Slog.w(TAG, "Task organizer already exists for windowing mode: "
                            + windowingMode);
                }
                final TaskOrganizerState previousState =
                        mTaskOrganizersForWindowingMode.get(windowingMode);
                final TaskOrganizerState state = new TaskOrganizerState(organizer, windowingMode,
                        mTaskOrganizersForWindowingMode.get(windowingMode));
                        previousState);
                mTaskOrganizersForWindowingMode.put(windowingMode, state);
                mTaskOrganizerStates.put(organizer.asBinder(), state);

                if (previousState == null) {
                    // Only in the case where this is the root task organizer for the given
                    // windowing mode, we add report all existing tasks in that mode to the new
                    // task organizer.
                    mService.mRootWindowContainer.forAllTasks((task) -> {
                        if (task.getWindowingMode() == windowingMode) {
                            task.updateTaskOrganizerState(true /* forceUpdate */);
                        }
                    });
                }
            }
        } finally {
            Binder.restoreCallingIdentity(origId);
+10 −0
Original line number Diff line number Diff line
@@ -212,6 +212,16 @@ public class TaskOrganizerTests extends WindowTestsBase {
        verify(organizer, times(1)).taskVanished(any());
    }

    @Test
    public void testRegisterTaskOrganizerWithExistingTasks() throws RemoteException {
        final ActivityStack stack = createTaskStackOnDisplay(mDisplayContent);
        final Task task = createTaskInStack(stack, 0 /* userId */);
        stack.setWindowingMode(WINDOWING_MODE_PINNED);

        final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED);
        verify(organizer, times(1)).taskAppeared(any());
    }

    @Test
    public void testTaskTransaction() {
        removeGlobalMinSizeRestriction();