Merge "Disallow multiple listeners in the shell task org for the same win mode"

This commit is contained in:
TreeHugger Robot
2020-10-06 19:01:30 +00:00
committed by Android (Google) Code Review
2 changed files with 44 additions and 49 deletions

View File

@@ -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);
}
}

View File

@@ -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;
@@ -100,6 +101,17 @@ public class ShellTaskOrganizerTests {
verify(mTaskOrganizerController).registerTaskOrganizer(any(ITaskOrganizer.class));
}
@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);