Loading core/java/android/window/TaskOrganizer.java +12 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.SurfaceControl; import com.android.internal.annotations.VisibleForTesting; import java.util.List; import java.util.concurrent.Executor; /** * Interface for ActivityTaskManager/WindowManager to delegate control of tasks. Loading @@ -37,15 +38,19 @@ import java.util.List; @TestApi public class TaskOrganizer extends WindowOrganizer { private ITaskOrganizerController mTaskOrganizerController; 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. private final Executor mExecutor; public TaskOrganizer() { this(null); this(null /*taskOrganizerController*/, null /*executor*/); } /** @hide */ @VisibleForTesting public TaskOrganizer(ITaskOrganizerController taskOrganizerController) { public TaskOrganizer(ITaskOrganizerController taskOrganizerController, Executor executor) { mExecutor = executor != null ? executor : command -> command.run(); mTaskOrganizerController = taskOrganizerController != null ? taskOrganizerController : getController(); } Loading Loading @@ -183,22 +188,22 @@ public class TaskOrganizer extends WindowOrganizer { @Override public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { TaskOrganizer.this.onTaskAppeared(taskInfo, leash); mExecutor.execute(() -> TaskOrganizer.this.onTaskAppeared(taskInfo, leash)); } @Override public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) { TaskOrganizer.this.onTaskVanished(taskInfo); mExecutor.execute(() -> TaskOrganizer.this.onTaskVanished(taskInfo)); } @Override public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) { TaskOrganizer.this.onTaskInfoChanged(info); mExecutor.execute(() -> TaskOrganizer.this.onTaskInfoChanged(info)); } @Override public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo info) { TaskOrganizer.this.onBackPressedOnTaskRoot(info); mExecutor.execute(() -> TaskOrganizer.this.onBackPressedOnTaskRoot(info)); } }; Loading libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +134 −110 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ public class ShellTaskOrganizer extends TaskOrganizer { // TODO(shell-transitions): move to a more "global" Shell location as this isn't only for Tasks private final Transitions mTransitions; private final Object mLock = new Object(); public ShellTaskOrganizer(SyncTransactionQueue syncQueue, TransactionPool transactionPool, ShellExecutor mainExecutor, ShellExecutor animExecutor) { this(null, syncQueue, transactionPool, mainExecutor, animExecutor); Loading @@ -114,7 +116,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController, SyncTransactionQueue syncQueue, TransactionPool transactionPool, ShellExecutor mainExecutor, ShellExecutor animExecutor) { super(taskOrganizerController); super(taskOrganizerController, mainExecutor); addListenerForType(new FullscreenTaskListener(syncQueue), TASK_LISTENER_TYPE_FULLSCREEN); mTransitions = new Transitions(this, transactionPool, mainExecutor, animExecutor); if (Transitions.ENABLE_SHELL_TRANSITIONS) registerTransitionPlayer(mTransitions); Loading @@ -122,21 +124,23 @@ public class ShellTaskOrganizer extends TaskOrganizer { @Override public List<TaskAppearedInfo> registerOrganizer() { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Registering organizer"); synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Registering organizer"); final List<TaskAppearedInfo> taskInfos = super.registerOrganizer(); for (int i = 0; i < taskInfos.size(); i++) { final TaskAppearedInfo info = taskInfos.get(i); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Existing task: id=%d component=%s", ProtoLog.v(WM_SHELL_TASK_ORG, "Existing task: id=%d component=%s", info.getTaskInfo().taskId, info.getTaskInfo().baseIntent); onTaskAppeared(info); } return taskInfos; } } public TaskAppearedInfo createRootTask( int displayId, int windowingMode, TaskListener listener) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "createRootTask() displayId=%d winMode=%d listener=%s", synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "createRootTask() displayId=%d winMode=%d listener=%s", displayId, windowingMode, listener.toString()); final TaskAppearedInfo info = super.createRootTask(displayId, windowingMode); Loading @@ -145,14 +149,17 @@ public class ShellTaskOrganizer extends TaskOrganizer { onTaskAppeared(info); return info; } } /** * Adds a listener for a specific task id. */ public void addListenerForTaskId(TaskListener listener, int taskId) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "addListenerForTaskId taskId=%s", taskId); if (mTaskListeners.get(taskId) != null) { throw new IllegalArgumentException("Listener for taskId=" + taskId + " already exists"); throw new IllegalArgumentException( "Listener for taskId=" + taskId + " already exists"); } final TaskAppearedInfo info = mTasks.get(taskId); Loading @@ -164,11 +171,13 @@ public class ShellTaskOrganizer extends TaskOrganizer { mTaskListeners.put(taskId, listener); updateTaskListenerIfNeeded(info.getTaskInfo(), info.getLeash(), oldListener, listener); } } /** * Adds a listener for tasks with given types. */ public void addListenerForType(TaskListener listener, @TaskListenerType int... listenerTypes) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "addListenerForType types=%s listener=%s", Arrays.toString(listenerTypes), listener); for (int listenerType : listenerTypes) { Loading @@ -187,11 +196,13 @@ public class ShellTaskOrganizer extends TaskOrganizer { } } } } /** * Removes a registered listener. */ public void removeListener(TaskListener listener) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Remove listener=%s", listener); final int index = mTaskListeners.indexOfValue(listener); if (index == -1) { Loading @@ -218,19 +229,24 @@ public class ShellTaskOrganizer extends TaskOrganizer { null /* oldListener already removed*/, getTaskListener(data.getTaskInfo())); } } } /** * Associated a listener to a pending launch cookie so we can route the task later once it * appears. */ public void setPendingLaunchCookieListener(IBinder cookie, TaskListener listener) { synchronized (mLock) { mLaunchCookieToListener.put(cookie, listener); } } @Override public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { synchronized (mLock) { onTaskAppeared(new TaskAppearedInfo(taskInfo, leash)); } } private void onTaskAppeared(TaskAppearedInfo info) { final int taskId = info.getTaskInfo().taskId; Loading @@ -245,6 +261,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { @Override public void onTaskInfoChanged(RunningTaskInfo taskInfo) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId); final TaskAppearedInfo data = mTasks.get(taskInfo.taskId); final TaskListener oldListener = getTaskListener(data.getTaskInfo()); Loading @@ -256,18 +273,22 @@ public class ShellTaskOrganizer extends TaskOrganizer { newListener.onTaskInfoChanged(taskInfo); } } } @Override public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Task root back pressed taskId=%d", taskInfo.taskId); final TaskListener listener = getTaskListener(taskInfo); if (listener != null) { listener.onBackPressedOnTaskRoot(taskInfo); } } } @Override public void onTaskVanished(RunningTaskInfo taskInfo) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Task vanished taskId=%d", taskInfo.taskId); final int taskId = taskInfo.taskId; final TaskListener listener = getTaskListener(mTasks.get(taskId).getTaskInfo()); Loading @@ -276,6 +297,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { listener.onTaskVanished(taskInfo); } } } private boolean updateTaskListenerIfNeeded(RunningTaskInfo taskInfo, SurfaceControl leash, TaskListener oldListener, TaskListener newListener) { Loading Loading @@ -368,6 +390,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { } public void dump(@NonNull PrintWriter pw, String prefix) { synchronized (mLock) { final String innerPrefix = prefix + " "; final String childPrefix = innerPrefix + " "; pw.println(prefix + TAG); Loading Loading @@ -397,3 +420,4 @@ public class ShellTaskOrganizer extends TaskOrganizer { } } } } Loading
core/java/android/window/TaskOrganizer.java +12 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.SurfaceControl; import com.android.internal.annotations.VisibleForTesting; import java.util.List; import java.util.concurrent.Executor; /** * Interface for ActivityTaskManager/WindowManager to delegate control of tasks. Loading @@ -37,15 +38,19 @@ import java.util.List; @TestApi public class TaskOrganizer extends WindowOrganizer { private ITaskOrganizerController mTaskOrganizerController; 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. private final Executor mExecutor; public TaskOrganizer() { this(null); this(null /*taskOrganizerController*/, null /*executor*/); } /** @hide */ @VisibleForTesting public TaskOrganizer(ITaskOrganizerController taskOrganizerController) { public TaskOrganizer(ITaskOrganizerController taskOrganizerController, Executor executor) { mExecutor = executor != null ? executor : command -> command.run(); mTaskOrganizerController = taskOrganizerController != null ? taskOrganizerController : getController(); } Loading Loading @@ -183,22 +188,22 @@ public class TaskOrganizer extends WindowOrganizer { @Override public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { TaskOrganizer.this.onTaskAppeared(taskInfo, leash); mExecutor.execute(() -> TaskOrganizer.this.onTaskAppeared(taskInfo, leash)); } @Override public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) { TaskOrganizer.this.onTaskVanished(taskInfo); mExecutor.execute(() -> TaskOrganizer.this.onTaskVanished(taskInfo)); } @Override public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) { TaskOrganizer.this.onTaskInfoChanged(info); mExecutor.execute(() -> TaskOrganizer.this.onTaskInfoChanged(info)); } @Override public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo info) { TaskOrganizer.this.onBackPressedOnTaskRoot(info); mExecutor.execute(() -> TaskOrganizer.this.onBackPressedOnTaskRoot(info)); } }; Loading
libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +134 −110 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ public class ShellTaskOrganizer extends TaskOrganizer { // TODO(shell-transitions): move to a more "global" Shell location as this isn't only for Tasks private final Transitions mTransitions; private final Object mLock = new Object(); public ShellTaskOrganizer(SyncTransactionQueue syncQueue, TransactionPool transactionPool, ShellExecutor mainExecutor, ShellExecutor animExecutor) { this(null, syncQueue, transactionPool, mainExecutor, animExecutor); Loading @@ -114,7 +116,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController, SyncTransactionQueue syncQueue, TransactionPool transactionPool, ShellExecutor mainExecutor, ShellExecutor animExecutor) { super(taskOrganizerController); super(taskOrganizerController, mainExecutor); addListenerForType(new FullscreenTaskListener(syncQueue), TASK_LISTENER_TYPE_FULLSCREEN); mTransitions = new Transitions(this, transactionPool, mainExecutor, animExecutor); if (Transitions.ENABLE_SHELL_TRANSITIONS) registerTransitionPlayer(mTransitions); Loading @@ -122,21 +124,23 @@ public class ShellTaskOrganizer extends TaskOrganizer { @Override public List<TaskAppearedInfo> registerOrganizer() { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Registering organizer"); synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Registering organizer"); final List<TaskAppearedInfo> taskInfos = super.registerOrganizer(); for (int i = 0; i < taskInfos.size(); i++) { final TaskAppearedInfo info = taskInfos.get(i); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Existing task: id=%d component=%s", ProtoLog.v(WM_SHELL_TASK_ORG, "Existing task: id=%d component=%s", info.getTaskInfo().taskId, info.getTaskInfo().baseIntent); onTaskAppeared(info); } return taskInfos; } } public TaskAppearedInfo createRootTask( int displayId, int windowingMode, TaskListener listener) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "createRootTask() displayId=%d winMode=%d listener=%s", synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "createRootTask() displayId=%d winMode=%d listener=%s", displayId, windowingMode, listener.toString()); final TaskAppearedInfo info = super.createRootTask(displayId, windowingMode); Loading @@ -145,14 +149,17 @@ public class ShellTaskOrganizer extends TaskOrganizer { onTaskAppeared(info); return info; } } /** * Adds a listener for a specific task id. */ public void addListenerForTaskId(TaskListener listener, int taskId) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "addListenerForTaskId taskId=%s", taskId); if (mTaskListeners.get(taskId) != null) { throw new IllegalArgumentException("Listener for taskId=" + taskId + " already exists"); throw new IllegalArgumentException( "Listener for taskId=" + taskId + " already exists"); } final TaskAppearedInfo info = mTasks.get(taskId); Loading @@ -164,11 +171,13 @@ public class ShellTaskOrganizer extends TaskOrganizer { mTaskListeners.put(taskId, listener); updateTaskListenerIfNeeded(info.getTaskInfo(), info.getLeash(), oldListener, listener); } } /** * Adds a listener for tasks with given types. */ public void addListenerForType(TaskListener listener, @TaskListenerType int... listenerTypes) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "addListenerForType types=%s listener=%s", Arrays.toString(listenerTypes), listener); for (int listenerType : listenerTypes) { Loading @@ -187,11 +196,13 @@ public class ShellTaskOrganizer extends TaskOrganizer { } } } } /** * Removes a registered listener. */ public void removeListener(TaskListener listener) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Remove listener=%s", listener); final int index = mTaskListeners.indexOfValue(listener); if (index == -1) { Loading @@ -218,19 +229,24 @@ public class ShellTaskOrganizer extends TaskOrganizer { null /* oldListener already removed*/, getTaskListener(data.getTaskInfo())); } } } /** * Associated a listener to a pending launch cookie so we can route the task later once it * appears. */ public void setPendingLaunchCookieListener(IBinder cookie, TaskListener listener) { synchronized (mLock) { mLaunchCookieToListener.put(cookie, listener); } } @Override public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { synchronized (mLock) { onTaskAppeared(new TaskAppearedInfo(taskInfo, leash)); } } private void onTaskAppeared(TaskAppearedInfo info) { final int taskId = info.getTaskInfo().taskId; Loading @@ -245,6 +261,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { @Override public void onTaskInfoChanged(RunningTaskInfo taskInfo) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId); final TaskAppearedInfo data = mTasks.get(taskInfo.taskId); final TaskListener oldListener = getTaskListener(data.getTaskInfo()); Loading @@ -256,18 +273,22 @@ public class ShellTaskOrganizer extends TaskOrganizer { newListener.onTaskInfoChanged(taskInfo); } } } @Override public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Task root back pressed taskId=%d", taskInfo.taskId); final TaskListener listener = getTaskListener(taskInfo); if (listener != null) { listener.onBackPressedOnTaskRoot(taskInfo); } } } @Override public void onTaskVanished(RunningTaskInfo taskInfo) { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Task vanished taskId=%d", taskInfo.taskId); final int taskId = taskInfo.taskId; final TaskListener listener = getTaskListener(mTasks.get(taskId).getTaskInfo()); Loading @@ -276,6 +297,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { listener.onTaskVanished(taskInfo); } } } private boolean updateTaskListenerIfNeeded(RunningTaskInfo taskInfo, SurfaceControl leash, TaskListener oldListener, TaskListener newListener) { Loading Loading @@ -368,6 +390,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { } public void dump(@NonNull PrintWriter pw, String prefix) { synchronized (mLock) { final String innerPrefix = prefix + " "; final String childPrefix = innerPrefix + " "; pw.println(prefix + TAG); Loading Loading @@ -397,3 +420,4 @@ public class ShellTaskOrganizer extends TaskOrganizer { } } } }