summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java81
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java12
2 files changed, 44 insertions, 49 deletions
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 f6edc073ac4f..4f610efd5523 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java
@@ -54,8 +54,7 @@ public class ShellTaskOrganizer extends TaskOrganizer {
default void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {}
}
- private final SparseArray<ArrayList<TaskListener>> mListenersByWindowingMode =
- new SparseArray<>();
+ private final SparseArray<TaskListener> mListenerByWindowingMode = new SparseArray<>();
// 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)
@@ -86,16 +85,11 @@ public class ShellTaskOrganizer extends TaskOrganizer {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Add listener for modes=%s listener=%s",
Arrays.toString(windowingModes), listener);
for (int winMode : windowingModes) {
- ArrayList<TaskListener> listeners = mListenersByWindowingMode.get(winMode);
- if (listeners == null) {
- listeners = new ArrayList<>();
- mListenersByWindowingMode.put(winMode, listeners);
+ if (mListenerByWindowingMode.get(winMode) != null) {
+ throw new IllegalArgumentException("Listener for winMode=" + winMode
+ + " already exists");
}
- if (listeners.contains(listener)) {
- Log.w(TAG, "Listener already exists");
- return;
- }
- listeners.add(listener);
+ mListenerByWindowingMode.put(winMode, listener);
// Notify the listener of all existing tasks in that windowing mode
for (int i = mTasks.size() - 1; i >= 0; i--) {
@@ -113,9 +107,12 @@ public class ShellTaskOrganizer extends TaskOrganizer {
*/
public void removeListener(TaskListener listener) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Remove listener=%s", listener);
- for (int i = 0; i < mListenersByWindowingMode.size(); i++) {
- mListenersByWindowingMode.valueAt(i).remove(listener);
+ final int index = mListenerByWindowingMode.indexOfValue(listener);
+ if (index == -1) {
+ Log.w(TAG, "No registered listener found");
+ return;
}
+ mListenerByWindowingMode.removeAt(index);
}
@Override
@@ -123,12 +120,9 @@ public class ShellTaskOrganizer extends TaskOrganizer {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Task appeared taskId=%d",
taskInfo.taskId);
mTasks.put(taskInfo.taskId, new Pair<>(taskInfo, leash));
- ArrayList<TaskListener> listeners = mListenersByWindowingMode.get(
- getWindowingMode(taskInfo));
- if (listeners != null) {
- for (int i = listeners.size() - 1; i >= 0; i--) {
- listeners.get(i).onTaskAppeared(taskInfo, leash);
- }
+ final TaskListener listener = mListenerByWindowingMode.get(getWindowingMode(taskInfo));
+ if (listener != null) {
+ listener.onTaskAppeared(taskInfo, leash);
}
}
@@ -136,32 +130,26 @@ public class ShellTaskOrganizer extends TaskOrganizer {
public void onTaskInfoChanged(RunningTaskInfo taskInfo) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Task info changed taskId=%d",
taskInfo.taskId);
- Pair<RunningTaskInfo, SurfaceControl> data = mTasks.get(taskInfo.taskId);
- int winMode = getWindowingMode(taskInfo);
- int prevWinMode = getWindowingMode(data.first);
+ final Pair<RunningTaskInfo, SurfaceControl> data = mTasks.get(taskInfo.taskId);
+ final int winMode = getWindowingMode(taskInfo);
+ final int prevWinMode = getWindowingMode(data.first);
mTasks.put(taskInfo.taskId, new Pair<>(taskInfo, data.second));
if (prevWinMode != -1 && prevWinMode != winMode) {
// TODO: We currently send vanished/appeared as the task moves between win modes, but
// we should consider adding a different mode-changed callback
- ArrayList<TaskListener> listeners = mListenersByWindowingMode.get(prevWinMode);
- if (listeners != null) {
- for (int i = listeners.size() - 1; i >= 0; i--) {
- listeners.get(i).onTaskVanished(taskInfo);
- }
+ TaskListener listener = mListenerByWindowingMode.get(prevWinMode);
+ if (listener != null) {
+ listener.onTaskVanished(taskInfo);
}
- listeners = mListenersByWindowingMode.get(winMode);
- if (listeners != null) {
+ listener = mListenerByWindowingMode.get(winMode);
+ if (listener != null) {
SurfaceControl leash = data.second;
- for (int i = listeners.size() - 1; i >= 0; i--) {
- listeners.get(i).onTaskAppeared(taskInfo, leash);
- }
+ listener.onTaskAppeared(taskInfo, leash);
}
} else {
- ArrayList<TaskListener> listeners = mListenersByWindowingMode.get(winMode);
- if (listeners != null) {
- for (int i = listeners.size() - 1; i >= 0; i--) {
- listeners.get(i).onTaskInfoChanged(taskInfo);
- }
+ final TaskListener listener = mListenerByWindowingMode.get(winMode);
+ if (listener != null) {
+ listener.onTaskInfoChanged(taskInfo);
}
}
}
@@ -170,12 +158,9 @@ public class ShellTaskOrganizer extends TaskOrganizer {
public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Task root back pressed taskId=%d",
taskInfo.taskId);
- ArrayList<TaskListener> listeners = mListenersByWindowingMode.get(
- getWindowingMode(taskInfo));
- if (listeners != null) {
- for (int i = listeners.size() - 1; i >= 0; i--) {
- listeners.get(i).onBackPressedOnTaskRoot(taskInfo);
- }
+ final TaskListener listener = mListenerByWindowingMode.get(getWindowingMode(taskInfo));
+ if (listener != null) {
+ listener.onBackPressedOnTaskRoot(taskInfo);
}
}
@@ -183,13 +168,11 @@ public class ShellTaskOrganizer extends TaskOrganizer {
public void onTaskVanished(RunningTaskInfo taskInfo) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Task vanished taskId=%d",
taskInfo.taskId);
- int prevWinMode = getWindowingMode(mTasks.get(taskInfo.taskId).first);
+ final int prevWinMode = getWindowingMode(mTasks.get(taskInfo.taskId).first);
mTasks.remove(taskInfo.taskId);
- ArrayList<TaskListener> listeners = mListenersByWindowingMode.get(prevWinMode);
- if (listeners != null) {
- for (int i = listeners.size() - 1; i >= 0; i--) {
- listeners.get(i).onTaskVanished(taskInfo);
- }
+ final TaskListener listener = mListenerByWindowingMode.get(prevWinMode);
+ if (listener != null) {
+ listener.onTaskVanished(taskInfo);
}
}
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 1bc5cea40a8b..6ce4d3795f85 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
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -101,6 +102,17 @@ public class ShellTaskOrganizerTests {
}
@Test
+ public void testOneListenerPerMode() {
+ mOrganizer.addListener(new TrackingTaskListener(), WINDOWING_MODE_MULTI_WINDOW);
+ try {
+ mOrganizer.addListener(new TrackingTaskListener(), WINDOWING_MODE_MULTI_WINDOW);
+ fail("Expected exception due to already registered listener");
+ } catch (Exception e) {
+ // Expected failure
+ }
+ }
+
+ @Test
public void testAppearedVanished() {
RunningTaskInfo taskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW);
TrackingTaskListener listener = new TrackingTaskListener();