diff options
Diffstat (limited to 'libs')
4 files changed, 80 insertions, 19 deletions
diff --git a/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json b/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json index bcef154beeb3..44744bc227a9 100644 --- a/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json +++ b/libs/WindowManager/Shell/res/raw/wm_shell_protolog.json @@ -7,6 +7,12 @@ "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java" }, + "-1683614271": { + "message": "Existing task: id=%d component=%s", + "level": "VERBOSE", + "group": "WM_SHELL_TASK_ORG", + "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java" + }, "-1534364071": { "message": "onTransitionReady %s: %s", "level": "VERBOSE", @@ -61,6 +67,12 @@ "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/FullscreenTaskListener.java" }, + "580605218": { + "message": "Registering organizer", + "level": "VERBOSE", + "group": "WM_SHELL_TASK_ORG", + "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java" + }, "980952660": { "message": "Task root back pressed taskId=%d", "level": "VERBOSE", diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java index 7ce65fd63334..d87de5a06c55 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -28,12 +28,14 @@ import android.annotation.IntDef; import android.app.ActivityManager.RunningTaskInfo; import android.app.WindowConfiguration.WindowingMode; import android.util.Log; -import android.util.Pair; import android.util.SparseArray; import android.view.SurfaceControl; import android.window.ITaskOrganizerController; +import android.window.TaskAppearedInfo; import android.window.TaskOrganizer; +import androidx.annotation.NonNull; + import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.ShellExecutor; @@ -42,6 +44,7 @@ import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.Arrays; +import java.util.List; /** * Unified task organizer for all components in the shell. @@ -82,7 +85,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { // Keeps track of all the tasks reported to this organizer (changes in windowing mode will // require us to report to both old and new listeners) - private final SparseArray<Pair<RunningTaskInfo, SurfaceControl>> mTasks = new SparseArray<>(); + private final SparseArray<TaskAppearedInfo> mTasks = new SparseArray<>(); // TODO(shell-transitions): move to a more "global" Shell location as this isn't only for Tasks private final Transitions mTransitions; @@ -102,6 +105,19 @@ public class ShellTaskOrganizer extends TaskOrganizer { if (Transitions.ENABLE_SHELL_TRANSITIONS) registerTransitionPlayer(mTransitions); } + @Override + public List<TaskAppearedInfo> registerOrganizer() { + ProtoLog.v(ShellProtoLogGroup.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", + info.getTaskInfo().taskId, info.getTaskInfo().baseIntent); + onTaskAppeared(info.getTaskInfo(), info.getLeash()); + } + return taskInfos; + } + /** * Adds a listener for tasks with given types. */ @@ -117,10 +133,11 @@ public class ShellTaskOrganizer extends TaskOrganizer { // Notify the listener of all existing tasks with the given type. for (int i = mTasks.size() - 1; i >= 0; i--) { - Pair<RunningTaskInfo, SurfaceControl> data = mTasks.valueAt(i); - final @TaskListenerType int taskListenerType = getTaskListenerType(data.first); + TaskAppearedInfo data = mTasks.valueAt(i); + final @TaskListenerType int taskListenerType = getTaskListenerType( + data.getTaskInfo()); if (taskListenerType == listenerType) { - listener.onTaskAppeared(data.first, data.second); + listener.onTaskAppeared(data.getTaskInfo(), data.getLeash()); } } } @@ -143,7 +160,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Task appeared taskId=%d", taskInfo.taskId); - mTasks.put(taskInfo.taskId, new Pair<>(taskInfo, leash)); + mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, leash)); final TaskListener listener = mTaskListenersByType.get(getTaskListenerType(taskInfo)); if (listener != null) { listener.onTaskAppeared(taskInfo, leash); @@ -154,10 +171,10 @@ public class ShellTaskOrganizer extends TaskOrganizer { public void onTaskInfoChanged(RunningTaskInfo taskInfo) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId); - final Pair<RunningTaskInfo, SurfaceControl> data = mTasks.get(taskInfo.taskId); + final TaskAppearedInfo data = mTasks.get(taskInfo.taskId); final @TaskListenerType int listenerType = getTaskListenerType(taskInfo); - final @TaskListenerType int prevListenerType = getTaskListenerType(data.first); - mTasks.put(taskInfo.taskId, new Pair<>(taskInfo, data.second)); + final @TaskListenerType int prevListenerType = getTaskListenerType(data.getTaskInfo()); + mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash())); if (prevListenerType != listenerType) { // TODO: We currently send vanished/appeared as the task moves between types, but // we should consider adding a different mode-changed callback @@ -167,7 +184,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { } listener = mTaskListenersByType.get(listenerType); if (listener != null) { - SurfaceControl leash = data.second; + SurfaceControl leash = data.getLeash(); listener.onTaskAppeared(taskInfo, leash); } } else { @@ -193,7 +210,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Task vanished taskId=%d", taskInfo.taskId); final @TaskListenerType int prevListenerType = - getTaskListenerType(mTasks.get(taskInfo.taskId).first); + getTaskListenerType(mTasks.get(taskInfo.taskId).getTaskInfo()); mTasks.remove(taskInfo.taskId); final TaskListener listener = mTaskListenersByType.get(prevListenerType); if (listener != null) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java index a0ce9dabffe6..f3dadfcb933a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java @@ -26,7 +26,7 @@ import com.android.internal.protolog.common.IProtoLogGroup; public enum ShellProtoLogGroup implements IProtoLogGroup { // NOTE: Since we enable these from the same WM ShellCommand, these names should not conflict // with those in the framework ProtoLogGroup - WM_SHELL_TASK_ORG(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, + WM_SHELL_TASK_ORG(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true, Consts.TAG_WM_SHELL), WM_SHELL_TRANSITIONS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true, Consts.TAG_WM_SHELL), diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java index f01fc517d5ba..5418a5b21680 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java @@ -22,6 +22,10 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static com.android.wm.shell.ShellTaskOrganizer.TASK_LISTENER_TYPE_MULTI_WINDOW; import static com.android.wm.shell.ShellTaskOrganizer.TASK_LISTENER_TYPE_PIP; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; + import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; @@ -29,10 +33,12 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import android.app.ActivityManager.RunningTaskInfo; +import android.content.pm.ParceledListSlice; import android.os.RemoteException; import android.view.SurfaceControl; import android.window.ITaskOrganizer; import android.window.ITaskOrganizerController; +import android.window.TaskAppearedInfo; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; @@ -93,8 +99,12 @@ public class ShellTaskOrganizerTests { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController, mSyncTransactionQueue, - mTransactionPool, mTestExecutor, mTestExecutor); + try { + doReturn(ParceledListSlice.<TaskAppearedInfo>emptyList()) + .when(mTaskOrganizerController).registerTaskOrganizer(any()); + } catch (RemoteException e) {} + mOrganizer = spy(new ShellTaskOrganizer(mTaskOrganizerController, mSyncTransactionQueue, + mTransactionPool, mTestExecutor, mTestExecutor)); } @Test @@ -116,8 +126,29 @@ public class ShellTaskOrganizerTests { } @Test + public void testRegisterWithExistingTasks() throws RemoteException { + // Setup some tasks + RunningTaskInfo task1 = createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW); + RunningTaskInfo task2 = createTaskInfo(2, WINDOWING_MODE_MULTI_WINDOW); + ArrayList<TaskAppearedInfo> taskInfos = new ArrayList<>(); + taskInfos.add(new TaskAppearedInfo(task1, new SurfaceControl())); + taskInfos.add(new TaskAppearedInfo(task2, new SurfaceControl())); + doReturn(new ParceledListSlice(taskInfos)) + .when(mTaskOrganizerController).registerTaskOrganizer(any()); + + // Register and expect the tasks to be stored + mOrganizer.registerOrganizer(); + + // Check that the tasks are next reported when the listener is added + TrackingTaskListener listener = new TrackingTaskListener(); + mOrganizer.addListener(listener, TASK_LISTENER_TYPE_MULTI_WINDOW); + assertTrue(listener.appeared.contains(task1)); + assertTrue(listener.appeared.contains(task2)); + } + + @Test public void testAppearedVanished() { - RunningTaskInfo taskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW); + RunningTaskInfo taskInfo = createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW); TrackingTaskListener listener = new TrackingTaskListener(); mOrganizer.addListener(listener, TASK_LISTENER_TYPE_MULTI_WINDOW); mOrganizer.onTaskAppeared(taskInfo, null); @@ -129,7 +160,7 @@ public class ShellTaskOrganizerTests { @Test public void testAddListenerExistingTasks() { - RunningTaskInfo taskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW); + RunningTaskInfo taskInfo = createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW); mOrganizer.onTaskAppeared(taskInfo, null); TrackingTaskListener listener = new TrackingTaskListener(); @@ -139,7 +170,7 @@ public class ShellTaskOrganizerTests { @Test public void testWindowingModeChange() { - RunningTaskInfo taskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW); + RunningTaskInfo taskInfo = createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW); TrackingTaskListener mwListener = new TrackingTaskListener(); TrackingTaskListener pipListener = new TrackingTaskListener(); mOrganizer.addListener(mwListener, TASK_LISTENER_TYPE_MULTI_WINDOW); @@ -148,14 +179,15 @@ public class ShellTaskOrganizerTests { assertTrue(mwListener.appeared.contains(taskInfo)); assertTrue(pipListener.appeared.isEmpty()); - taskInfo = createTaskInfo(WINDOWING_MODE_PINNED); + taskInfo = createTaskInfo(1, WINDOWING_MODE_PINNED); mOrganizer.onTaskInfoChanged(taskInfo); assertTrue(mwListener.vanished.contains(taskInfo)); assertTrue(pipListener.appeared.contains(taskInfo)); } - private RunningTaskInfo createTaskInfo(int windowingMode) { + private RunningTaskInfo createTaskInfo(int taskId, int windowingMode) { RunningTaskInfo taskInfo = new RunningTaskInfo(); + taskInfo.taskId = taskId; taskInfo.configuration.windowConfiguration.setWindowingMode(windowingMode); return taskInfo; } |