diff options
6 files changed, 67 insertions, 0 deletions
diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 8615f00facd9..8c85ad134e53 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -81,6 +81,16 @@ oneway interface ITaskStackListener { int requestedDisplayId); /** + * Called when an activity was requested to be launched on a secondary display but was rerouted + * to default display. + * + * @param taskInfo info about the Activity's task + * @param requestedDisplayId the id of the requested launch display + */ + void onActivityLaunchOnSecondaryDisplayRerouted(in ActivityManager.RunningTaskInfo taskInfo, + int requestedDisplayId); + + /** * Called when a task is added. * * @param taskId id of the task. diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index fcc76ac8bc40..47ad6d737430 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -85,6 +85,12 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { } @Override + @UnsupportedAppUsage + public void onActivityLaunchOnSecondaryDisplayRerouted(ActivityManager.RunningTaskInfo taskInfo, + int requestedDisplayId) throws RemoteException { + } + + @Override public void onTaskCreated(int taskId, ComponentName componentName) throws RemoteException { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 3d2f61ea027f..c54a4699964d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -48,6 +48,21 @@ public abstract class TaskStackChangeListener { onActivityLaunchOnSecondaryDisplayFailed(); } + /** + * @see #onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) + */ + public void onActivityLaunchOnSecondaryDisplayRerouted() { } + + /** + * Called when an activity was requested to be launched on a secondary display but was rerouted + * to default display. + * + * @param taskInfo info about the Activity's task + */ + public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) { + onActivityLaunchOnSecondaryDisplayRerouted(); + } + public void onTaskProfileLocked(int taskId, int userId) { } public void onTaskCreated(int taskId, ComponentName componentName) { } public void onTaskRemoved(int taskId) { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index a9ac42f5be1e..7e4ab854adcf 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -141,6 +141,13 @@ public class TaskStackChangeListeners extends TaskStackListener { } @Override + public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo, + int requestedDisplayId) throws RemoteException { + mHandler.obtainMessage(H.ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED, + requestedDisplayId, 0 /* unused */, taskInfo).sendToTarget(); + } + + @Override public void onTaskProfileLocked(int taskId, int userId) throws RemoteException { mHandler.obtainMessage(H.ON_TASK_PROFILE_LOCKED, taskId, userId).sendToTarget(); } @@ -189,6 +196,7 @@ public class TaskStackChangeListeners extends TaskStackListener { private static final int ON_TASK_REMOVED = 13; private static final int ON_TASK_MOVED_TO_FRONT = 14; private static final int ON_ACTIVITY_REQUESTED_ORIENTATION_CHANGE = 15; + private static final int ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED = 16; public H(Looper looper) { @@ -270,6 +278,14 @@ public class TaskStackChangeListeners extends TaskStackListener { } break; } + case ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED: { + final RunningTaskInfo info = (RunningTaskInfo) msg.obj; + for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { + mTaskStackListeners.get(i) + .onActivityLaunchOnSecondaryDisplayRerouted(info); + } + break; + } case ON_TASK_PROFILE_LOCKED: { for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { mTaskStackListeners.get(i).onTaskProfileLocked(msg.arg1, msg.arg2); diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index df760306f12a..7ae48a52c7fd 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -2351,6 +2351,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // Suppress the warning toast if the preferredDisplay was set to singleTask. // The singleTaskInstance displays will only contain one task and any attempt to // launch new task will re-route to the default display. + mService.getTaskChangeNotificationController() + .notifyActivityLaunchOnSecondaryDisplayRerouted(task.getTaskInfo(), + preferredDisplayId); return; } diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 789f987e3d46..42d25833000d 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -50,6 +50,7 @@ class TaskChangeNotificationController { private static final int NOTIFY_PINNED_STACK_ANIMATION_STARTED_LISTENERS_MSG = 16; private static final int NOTIFY_ACTIVITY_UNPINNED_LISTENERS_MSG = 17; private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG = 18; + private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG = 19; // Delay in notifying task stack change listeners (in millis) private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100; @@ -130,6 +131,10 @@ class TaskChangeNotificationController { l.onActivityLaunchOnSecondaryDisplayFailed((RunningTaskInfo) m.obj, m.arg1); }; + private final TaskStackConsumer mNotifyActivityLaunchOnSecondaryDisplayRerouted = (l, m) -> { + l.onActivityLaunchOnSecondaryDisplayRerouted((RunningTaskInfo) m.obj, m.arg1); + }; + private final TaskStackConsumer mNotifyTaskProfileLocked = (l, m) -> { l.onTaskProfileLocked(m.arg1, m.arg2); }; @@ -202,6 +207,9 @@ class TaskChangeNotificationController { case NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG: forAllRemoteListeners(mNotifyActivityLaunchOnSecondaryDisplayFailed, msg); break; + case NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG: + forAllRemoteListeners(mNotifyActivityLaunchOnSecondaryDisplayRerouted, msg); + break; case NOTIFY_TASK_PROFILE_LOCKED_LISTENERS_MSG: forAllRemoteListeners(mNotifyTaskProfileLocked, msg); break; @@ -355,6 +363,15 @@ class TaskChangeNotificationController { msg.sendToTarget(); } + void notifyActivityLaunchOnSecondaryDisplayRerouted(TaskInfo ti, int requestedDisplayId) { + mHandler.removeMessages(NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG); + final Message msg = mHandler.obtainMessage( + NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG, requestedDisplayId, + 0 /* unused */, ti); + forAllLocalListeners(mNotifyActivityLaunchOnSecondaryDisplayRerouted, msg); + msg.sendToTarget(); + } + void notifyTaskCreated(int taskId, ComponentName componentName) { final Message msg = mHandler.obtainMessage(NOTIFY_TASK_ADDED_LISTENERS_MSG, taskId, 0 /* unused */, componentName); |