Loading core/java/android/window/ITaskOrganizerController.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/android/window/TaskOrganizer.java +74 −20 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 */ Loading libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +34 −6 Original line number Diff line number Diff line Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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); } /** Loading libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +6 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/multidesks/RootTaskDesksOrganizer.kt +19 −14 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, ) } Loading Loading @@ -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 Loading
core/java/android/window/ITaskOrganizerController.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/android/window/TaskOrganizer.java +74 −20 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 */ Loading
libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +34 −6 Original line number Diff line number Diff line Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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); } /** Loading
libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +6 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/multidesks/RootTaskDesksOrganizer.kt +19 −14 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, ) } Loading Loading @@ -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