Fix addListenerForType/removeListener in ShellTaskOranizer.
This CL fixes the following issues: - addListenerForType for multi-types can invoke onTaskAppeared more than once. - removeListener for mulit-types listener removes the first type only. Bug: 200322591 Test: atest ShellTaskOrganizerTests Change-Id: If53085ab229e3a1525b36aa3d964def0f228200c
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user