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

Commit c218705c authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Update task orgs with existing tasks" into rvc-dev am: 5cb5fed8 am: 5b0316b9

Change-Id: I089861ff7c00d1261d8d8e2950f3c2ce443b5ab2
parents 47a4486a 5b0316b9
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();