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

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

Merge "Add support for naming shell-created root tasks" into main

parents b2f78088 367971b6
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -46,7 +46,8 @@ interface ITaskOrganizerController {
    * {@link WindowContainerTransaction#removeRootTask}.
    */
    void createRootTask(int displayId, int windowingMode, IBinder launchCookie,
            boolean removeWithTaskOrganizer, boolean reparentOnDisplayRemoval);
            boolean removeWithTaskOrganizer, boolean reparentOnDisplayRemoval,
            in @nullable String name);

    /** Deletes a persistent root task in WM */
    boolean deleteRootTask(in WindowContainerToken task);
+74 −20
Original line number Diff line number Diff line
@@ -40,6 +40,49 @@ import java.util.concurrent.Executor;
@TestApi
public class TaskOrganizer extends WindowOrganizer {

    /**
     * Data associated with a request to create a new root task.
     * @hide
     */
    public static class CreateRootTaskRequest {
        public int displayId;
        public int windowingMode;
        public boolean removeWithTaskOrganizer;
        public boolean reparentOnDisplayRemoval;
        public @Nullable IBinder launchCookie;
        public @Nullable String name;

        public CreateRootTaskRequest setDisplayId(int displayId) {
            this.displayId = displayId;
            return this;
        }

        public CreateRootTaskRequest setWindowingMode(int windowingMode) {
            this.windowingMode = windowingMode;
            return this;
        }

        public CreateRootTaskRequest setRemoveWithTaskOrganizer(boolean removeWithTaskOrganizer) {
            this.removeWithTaskOrganizer = removeWithTaskOrganizer;
            return this;
        }

        public CreateRootTaskRequest setReparentOnDisplayRemoval(boolean reparentOnDisplayRemoval) {
            this.reparentOnDisplayRemoval = reparentOnDisplayRemoval;
            return this;
        }

        public CreateRootTaskRequest setLaunchCookie(@NonNull IBinder launchCookie) {
            this.launchCookie = launchCookie;
            return this;
        }

        public CreateRootTaskRequest setName(@NonNull String name) {
            this.name = name;
            return this;
        }
    }

    private final ITaskOrganizerController mTaskOrganizerController;
    // Callbacks WM Core are posted on this executor if it isn't null, otherwise direct calls are
    // made on the incoming binder call.
@@ -143,39 +186,50 @@ public class TaskOrganizer extends WindowOrganizer {
    public void onImeDrawnOnTask(int taskId) {}

    /**
     * Creates a persistent root task in WM for a particular windowing-mode.
     * @param displayId The display to create the root task on.
     * @param windowingMode Windowing mode to put the root task in.
     * @param launchCookie Launch cookie to associate with the task so that is can be identified
     *                     when the {@link ITaskOrganizer#onTaskAppeared} callback is called.
     * @param removeWithTaskOrganizer True if this task should be removed when organizer destroyed.
     * @param reparentOnDisplayRemoval True if this task should be reparented when its display
     *                                is removed.
     * @deprecated Use {@link #createRootTask(CreateRootTaskRequest)}
     * @hide
     */
    @Deprecated
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    public void createRootTask(int displayId, int windowingMode, @Nullable IBinder launchCookie,
            boolean removeWithTaskOrganizer, boolean reparentOnDisplayRemoval) {
        try {
            mTaskOrganizerController.createRootTask(displayId, windowingMode, launchCookie,
                    removeWithTaskOrganizer, reparentOnDisplayRemoval);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        createRootTask(new CreateRootTaskRequest()
                        .setDisplayId(displayId)
                        .setWindowingMode(windowingMode)
                        .setLaunchCookie(launchCookie)
                        .setRemoveWithTaskOrganizer(removeWithTaskOrganizer)
                        .setReparentOnDisplayRemoval(reparentOnDisplayRemoval));
    }

    /**
     * Creates a persistent root task in WM for a particular windowing-mode.
     * @param displayId The display to create the root task on.
     * @param windowingMode Windowing mode to put the root task in.
     * @param launchCookie Launch cookie to associate with the task so that is can be identified
     *                     when the {@link ITaskOrganizer#onTaskAppeared} callback is called.
     * This call is deprecated, use {@link #createRootTask(CreateRootTaskRequest)}.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    @Nullable
    public void createRootTask(int displayId, int windowingMode, @Nullable IBinder launchCookie) {
        createRootTask(displayId, windowingMode, launchCookie, false /* removeWithTaskOrganizer */,
                false /* reparentOnDisplayRemoval */);
        // TODO(b/378565144): Deprecate this method and expose CreateRootTaskRequest as TestApi
        createRootTask(new CreateRootTaskRequest()
                .setDisplayId(displayId)
                .setWindowingMode(windowingMode)
                .setLaunchCookie(launchCookie));
    }

    /**
     * Creates a persistent root task in WM for a particular windowing-mode.
     * @param request The data for this request
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
    public void createRootTask(@NonNull CreateRootTaskRequest request) {
        try {
            mTaskOrganizerController.createRootTask(request.displayId, request.windowingMode,
                    request.launchCookie, request.removeWithTaskOrganizer,
                    request.reparentOnDisplayRemoval, request.name);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /** Deletes a persistent root task in WM */
+34 −6
Original line number Diff line number Diff line
@@ -366,9 +366,14 @@ public class ShellTaskOrganizer extends TaskOrganizer {
     * @param displayId The display to create the root task on.
     * @param windowingMode Windowing mode to put the root task in.
     * @param listener The listener to get the created task callback.
     *
     * @deprecated Use {@link #createRootTask(CreateRootTaskRequest, TaskListener)}
     */
    public void createRootTask(int displayId, int windowingMode, TaskListener listener) {
        createRootTask(displayId, windowingMode, listener, false /* removeWithTaskOrganizer */);
        createRootTask(new CreateRootTaskRequest()
                        .setDisplayId(displayId)
                        .setWindowingMode(windowingMode),
                listener);
    }

    /**
@@ -377,11 +382,16 @@ public class ShellTaskOrganizer extends TaskOrganizer {
     * @param windowingMode Windowing mode to put the root task in.
     * @param listener The listener to get the created task callback.
     * @param removeWithTaskOrganizer True if this task should be removed when organizer destroyed.
     *
     * @deprecated Use {@link #createRootTask(CreateRootTaskRequest, TaskListener)}
     */
    public void createRootTask(int displayId, int windowingMode, TaskListener listener,
            boolean removeWithTaskOrganizer) {
        createRootTask(displayId, windowingMode, listener, removeWithTaskOrganizer,
                false /* reparentOnDisplayRemoval */);
        createRootTask(new CreateRootTaskRequest()
                        .setDisplayId(displayId)
                        .setWindowingMode(windowingMode)
                        .setRemoveWithTaskOrganizer(removeWithTaskOrganizer),
                listener);
    }

    /**
@@ -391,15 +401,33 @@ public class ShellTaskOrganizer extends TaskOrganizer {
     * @param listener The listener to get the created task callback.
     * @param removeWithTaskOrganizer True if this task should be removed when organizer destroyed.
     * @param reparentOnDisplayRemoval True if this task should be reparented on display removal.
     *
     * @deprecated Use {@link #createRootTask(CreateRootTaskRequest, TaskListener)}
     */
    public void createRootTask(int displayId, int windowingMode, TaskListener listener,
            boolean removeWithTaskOrganizer, boolean reparentOnDisplayRemoval) {
        createRootTask(new CreateRootTaskRequest()
                        .setDisplayId(displayId)
                        .setWindowingMode(windowingMode)
                        .setRemoveWithTaskOrganizer(removeWithTaskOrganizer)
                        .setReparentOnDisplayRemoval(reparentOnDisplayRemoval),
                listener);
    }

    /**
     * Creates a persistent root task in WM for a particular windowing-mode.
     * @param request The data for this request
     * @param listener The listener to get the created task callback.
     *
     * @hide
     */
    public void createRootTask(@NonNull CreateRootTaskRequest request, TaskListener listener) {
        ProtoLog.v(WM_SHELL_TASK_ORG, "createRootTask() displayId=%d winMode=%d listener=%s" ,
                displayId, windowingMode, listener.toString());
                request.displayId, request.windowingMode, listener.toString());
        final IBinder cookie = new Binder();
        request.setLaunchCookie(cookie);
        setPendingLaunchCookieListener(cookie, listener);
        super.createRootTask(displayId, windowingMode, cookie, removeWithTaskOrganizer,
                reparentOnDisplayRemoval);
        super.createRootTask(request);
    }

    /**
+6 −1
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ import android.window.IMultitaskingController;
import android.window.IMultitaskingControllerCallback;
import android.window.ScreenCapture;
import android.window.ScreenCapture.SynchronousScreenCaptureListener;
import android.window.TaskOrganizer;
import android.window.TransitionInfo;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
@@ -582,7 +583,11 @@ public class BubbleController implements ConfigurationChangeListener,
            // The app bubble should be dismissed with proper transition (such as need to convert
            // it to fullscreen) if the bubble task is no longer be a leaf task under this leaf
            // task.
            mTaskOrganizer.createRootTask(mContext.getDisplayId(), WINDOWING_MODE_MULTI_WINDOW,
            mTaskOrganizer.createRootTask(
                    new TaskOrganizer.CreateRootTaskRequest()
                            .setName("Bubbles")
                            .setDisplayId(mContext.getDisplayId())
                            .setWindowingMode(WINDOWING_MODE_MULTI_WINDOW),
                    new ShellTaskOrganizer.TaskListener() {
                        @Override
                        public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo,
+19 −14
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.util.SparseArray
import android.view.SurfaceControl
import android.view.WindowManager.TRANSIT_TO_FRONT
import android.window.DesktopExperienceFlags
import android.window.TaskOrganizer
import android.window.TransitionInfo
import android.window.WindowContainerToken
import android.window.WindowContainerTransaction
@@ -150,13 +151,15 @@ class RootTaskDesksOrganizer(
        logV("createDeskRoot in display: %d for user: %d", displayId, userId)
        createDeskRootRequests += CreateDeskRequest(displayId, userId, callback)
        shellTaskOrganizer.createRootTask(
            displayId,
            WINDOWING_MODE_FREEFORM,
            /* listener = */ this,
            /* removeWithTaskOrganizer = */ true,
            /* reparentOnDisplayRemoval = */ DesktopExperienceFlags
            TaskOrganizer.CreateRootTaskRequest()
                .setName("Desk")
                .setDisplayId(displayId)
                .setWindowingMode(WINDOWING_MODE_FREEFORM)
                .setRemoveWithTaskOrganizer(true)
                .setReparentOnDisplayRemoval(DesktopExperienceFlags
                    .ENABLE_DISPLAY_DISCONNECT_INTERACTION
                .isTrue,
                    .isTrue),
            this,
        )
    }

@@ -603,13 +606,15 @@ class RootTaskDesksOrganizer(
        createDeskMinimizationRootRequests +=
            CreateDeskMinimizationRootRequest(displayId = displayId, deskId = deskId)
        shellTaskOrganizer.createRootTask(
            displayId,
            WINDOWING_MODE_FREEFORM,
            /* listener = */ this,
            /* removeWithTaskOrganizer = */ true,
            /* reparentOnDisplayRemoval = */ DesktopExperienceFlags
            TaskOrganizer.CreateRootTaskRequest()
                .setName("MinimizedDesk_$deskId")
                .setDisplayId(displayId)
                .setWindowingMode(WINDOWING_MODE_FREEFORM)
                .setRemoveWithTaskOrganizer(true)
                .setReparentOnDisplayRemoval(DesktopExperienceFlags
                    .ENABLE_DISPLAY_DISCONNECT_INTERACTION
                .isTrue,
                    .isTrue),
            this,
        )
    }

Loading