Notify on task display change.
This is a targeted fix for not receiving a task stack change callback when a task with a resumed Activity is reparented to another display. Bug: 128932906 Test: manual - launch activity from virtual display onto default display in a new task, verify callback notified. atest WmTests Change-Id: Idabad8379cded664bcf302d5c6fb69564d158eb7 Merged-In: Idabad8379cded664bcf302d5c6fb69564d158eb7
This commit is contained in:
@@ -169,4 +169,12 @@ oneway interface ITaskStackListener {
|
||||
* @param taskInfo info about the task which received the back press
|
||||
*/
|
||||
void onBackPressedOnTaskRoot(in ActivityManager.RunningTaskInfo taskInfo);
|
||||
|
||||
/**
|
||||
* Called when a task is reparented to a stack on a different display.
|
||||
*
|
||||
* @param taskId id of the task which was moved to a different display.
|
||||
* @param newDisplayId id of the new display.
|
||||
*/
|
||||
void onTaskDisplayChanged(int taskId, int newDisplayId);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.os.RemoteException;
|
||||
/**
|
||||
* Classes interested in observing only a subset of changes using ITaskStackListener can extend
|
||||
* this class to avoid having to implement all the methods.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public abstract class TaskStackListener extends ITaskStackListener.Stub {
|
||||
@@ -173,4 +174,8 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub {
|
||||
public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo)
|
||||
throws RemoteException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskDisplayChanged(int taskId, int newDisplayId) throws RemoteException {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,7 +346,7 @@ public class CarStatusBar extends StatusBar implements
|
||||
|
||||
CarSystemUIFactory factory = SystemUIFactory.getInstance();
|
||||
mCarFacetButtonController = factory.getCarDependencyComponent()
|
||||
.getCarFacetButtonController();
|
||||
.getCarFacetButtonController();
|
||||
mNotificationPanelBackground = getDefaultWallpaper();
|
||||
mScrimController.setScrimBehindDrawable(mNotificationPanelBackground);
|
||||
|
||||
@@ -925,6 +925,16 @@ public class CarStatusBar extends StatusBar implements
|
||||
Log.e(TAG, "Getting StackInfo from activity manager failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskDisplayChanged(int taskId, int newDisplayId) {
|
||||
try {
|
||||
mCarFacetButtonController.taskChanged(
|
||||
ActivityTaskManager.getService().getAllStackInfos());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Getting StackInfo from activity manager failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void onDrivingStateChanged(CarDrivingStateEvent notUsed) {
|
||||
|
||||
@@ -78,6 +78,14 @@ public abstract class TaskStackChangeListener {
|
||||
|
||||
public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) { }
|
||||
|
||||
/**
|
||||
* Called when a task is reparented to a stack on a different display.
|
||||
*
|
||||
* @param taskId id of the task which was moved to a different display.
|
||||
* @param newDisplayId id of the new display.
|
||||
*/
|
||||
public void onTaskDisplayChanged(int taskId, int newDisplayId) { }
|
||||
|
||||
/**
|
||||
* Checks that the current user matches the process. Since
|
||||
* {@link android.app.ITaskStackListener} is not multi-user aware, handlers of
|
||||
|
||||
@@ -112,7 +112,7 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
|
||||
@Override
|
||||
public void onPinnedActivityRestartAttempt(boolean clearedTask)
|
||||
throws RemoteException{
|
||||
throws RemoteException {
|
||||
mHandler.removeMessages(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT);
|
||||
mHandler.obtainMessage(H.ON_PINNED_ACTIVITY_RESTART_ATTEMPT, clearedTask ? 1 : 0, 0)
|
||||
.sendToTarget();
|
||||
@@ -154,7 +154,7 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo,
|
||||
int requestedDisplayId) throws RemoteException {
|
||||
mHandler.obtainMessage(H.ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED,
|
||||
requestedDisplayId, 0 /* unused */, taskInfo).sendToTarget();
|
||||
requestedDisplayId, 0 /* unused */, taskInfo).sendToTarget();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -201,6 +201,11 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
activityToken).sendToTarget();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskDisplayChanged(int taskId, int newDisplayId) throws RemoteException {
|
||||
mHandler.obtainMessage(H.ON_TASK_DISPLAY_CHANGED, taskId, newDisplayId).sendToTarget();
|
||||
}
|
||||
|
||||
private final class H extends Handler {
|
||||
private static final int ON_TASK_STACK_CHANGED = 1;
|
||||
private static final int ON_TASK_SNAPSHOT_CHANGED = 2;
|
||||
@@ -220,6 +225,7 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
private static final int ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED = 16;
|
||||
private static final int ON_SIZE_COMPAT_MODE_ACTIVITY_CHANGED = 17;
|
||||
private static final int ON_BACK_PRESSED_ON_TASK_ROOT = 18;
|
||||
private static final int ON_TASK_DISPLAY_CHANGED = 19;
|
||||
|
||||
|
||||
public H(Looper looper) {
|
||||
@@ -305,7 +311,7 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
final RunningTaskInfo info = (RunningTaskInfo) msg.obj;
|
||||
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
|
||||
mTaskStackListeners.get(i)
|
||||
.onActivityLaunchOnSecondaryDisplayRerouted(info);
|
||||
.onActivityLaunchOnSecondaryDisplayRerouted(info);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -356,6 +362,12 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ON_TASK_DISPLAY_CHANGED: {
|
||||
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
|
||||
mTaskStackListeners.get(i).onTaskDisplayChanged(msg.arg1, msg.arg2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -348,6 +348,9 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta
|
||||
void onDisplayChanged(DisplayContent dc) {
|
||||
adjustBoundsForDisplayChangeIfNeeded(dc);
|
||||
super.onDisplayChanged(dc);
|
||||
final int displayId = (dc != null) ? dc.getDisplayId() : Display.INVALID_DISPLAY;
|
||||
mWmService.mAtmService.getTaskChangeNotificationController().notifyTaskDisplayChanged(
|
||||
mTaskId, displayId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -54,6 +54,7 @@ class TaskChangeNotificationController {
|
||||
private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG = 19;
|
||||
private static final int NOTIFY_SIZE_COMPAT_MODE_ACTIVITY_CHANGED_MSG = 20;
|
||||
private static final int NOTIFY_BACK_PRESSED_ON_TASK_ROOT = 21;
|
||||
private static final int NOTIFY_TASK_DISPLAY_CHANGED_LISTENERS_MSG = 22;
|
||||
|
||||
// Delay in notifying task stack change listeners (in millis)
|
||||
private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100;
|
||||
@@ -154,6 +155,10 @@ class TaskChangeNotificationController {
|
||||
l.onSizeCompatModeActivityChanged(m.arg1, (IBinder) m.obj);
|
||||
};
|
||||
|
||||
private final TaskStackConsumer mNotifyTaskDisplayChanged = (l, m) -> {
|
||||
l.onTaskDisplayChanged(m.arg1, m.arg2);
|
||||
};
|
||||
|
||||
@FunctionalInterface
|
||||
public interface TaskStackConsumer {
|
||||
void accept(ITaskStackListener t, Message m) throws RemoteException;
|
||||
@@ -233,6 +238,9 @@ class TaskChangeNotificationController {
|
||||
case NOTIFY_BACK_PRESSED_ON_TASK_ROOT:
|
||||
forAllRemoteListeners(mNotifyBackPressedOnTaskRoot, msg);
|
||||
break;
|
||||
case NOTIFY_TASK_DISPLAY_CHANGED_LISTENERS_MSG:
|
||||
forAllRemoteListeners(mNotifyTaskDisplayChanged, msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -477,4 +485,14 @@ class TaskChangeNotificationController {
|
||||
forAllLocalListeners(mNotifyBackPressedOnTaskRoot, msg);
|
||||
msg.sendToTarget();
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify listeners that a task is reparented to another display.
|
||||
*/
|
||||
void notifyTaskDisplayChanged(int taskId, int newDisplayId) {
|
||||
final Message msg = mHandler.obtainMessage(NOTIFY_TASK_DISPLAY_CHANGED_LISTENERS_MSG,
|
||||
taskId, newDisplayId);
|
||||
forAllLocalListeners(mNotifyTaskStackChanged, msg);
|
||||
msg.sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,6 +162,9 @@ public class SystemServicesTestRule implements TestRule {
|
||||
}
|
||||
|
||||
final ActivityTaskManagerService atms = mock(ActivityTaskManagerService.class);
|
||||
final TaskChangeNotificationController taskChangeNotificationController = mock(
|
||||
TaskChangeNotificationController.class);
|
||||
doReturn(taskChangeNotificationController).when(atms).getTaskChangeNotificationController();
|
||||
final WindowManagerGlobalLock wmLock = new WindowManagerGlobalLock();
|
||||
doReturn(wmLock).when(atms).getGlobalLock();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user