Merge "Fix addListenerForType/removeListener in ShellTaskOranizer." into sc-v2-dev

This commit is contained in:
Yuncheol Heo
2021-10-01 22:10:39 +00:00
committed by Android (Google) Code Review
2 changed files with 50 additions and 9 deletions

View File

@@ -233,14 +233,14 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
+ " already exists");
}
mTaskListeners.put(listenerType, listener);
}
// Notify the listener of all existing tasks with the given type.
for (int i = mTasks.size() - 1; i >= 0; --i) {
final TaskAppearedInfo data = mTasks.valueAt(i);
final TaskListener taskListener = getTaskListener(data.getTaskInfo());
if (taskListener != listener) continue;
listener.onTaskAppeared(data.getTaskInfo(), data.getLeash());
}
// Notify the listener of all existing tasks with the given type.
for (int i = mTasks.size() - 1; i >= 0; --i) {
final TaskAppearedInfo data = mTasks.valueAt(i);
final TaskListener taskListener = getTaskListener(data.getTaskInfo());
if (taskListener != listener) continue;
listener.onTaskAppeared(data.getTaskInfo(), data.getLeash());
}
}
}
@@ -266,8 +266,12 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
tasks.add(data);
}
// Remove listener
mTaskListeners.removeAt(index);
// Remove listener, there can be the multiple occurrences, so search the whole list.
for (int i = mTaskListeners.size() - 1; i >= 0; --i) {
if (mTaskListeners.valueAt(i) == listener) {
mTaskListeners.removeAt(i);
}
}
// Associate tasks with new listeners if needed.
for (int i = tasks.size() - 1; i >= 0; --i) {

View File

@@ -196,6 +196,43 @@ public class ShellTaskOrganizerTests {
assertTrue(listener.appeared.contains(taskInfo));
}
@Test
public void testAddListenerForMultipleTypes() {
RunningTaskInfo taskInfo1 = createTaskInfo(1, WINDOWING_MODE_FULLSCREEN);
mOrganizer.onTaskAppeared(taskInfo1, null);
RunningTaskInfo taskInfo2 = createTaskInfo(2, WINDOWING_MODE_MULTI_WINDOW);
mOrganizer.onTaskAppeared(taskInfo2, null);
TrackingTaskListener listener = new TrackingTaskListener();
mOrganizer.addListenerForType(listener,
TASK_LISTENER_TYPE_MULTI_WINDOW, TASK_LISTENER_TYPE_FULLSCREEN);
// onTaskAppeared event should be delivered once for each taskInfo.
assertTrue(listener.appeared.contains(taskInfo1));
assertTrue(listener.appeared.contains(taskInfo2));
assertEquals(2, listener.appeared.size());
}
@Test
public void testRemoveListenerForMultipleTypes() {
RunningTaskInfo taskInfo1 = createTaskInfo(1, WINDOWING_MODE_FULLSCREEN);
mOrganizer.onTaskAppeared(taskInfo1, null);
RunningTaskInfo taskInfo2 = createTaskInfo(2, WINDOWING_MODE_MULTI_WINDOW);
mOrganizer.onTaskAppeared(taskInfo2, null);
TrackingTaskListener listener = new TrackingTaskListener();
mOrganizer.addListenerForType(listener,
TASK_LISTENER_TYPE_MULTI_WINDOW, TASK_LISTENER_TYPE_FULLSCREEN);
mOrganizer.removeListener(listener);
// If listener is removed properly, onTaskInfoChanged event shouldn't be delivered.
mOrganizer.onTaskInfoChanged(taskInfo1);
assertTrue(listener.infoChanged.isEmpty());
mOrganizer.onTaskInfoChanged(taskInfo2);
assertTrue(listener.infoChanged.isEmpty());
}
@Test
public void testWindowingModeChange() {
RunningTaskInfo taskInfo = createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW);