diff --git a/core/res/res/values-watch/config.xml b/core/res/res/values-watch/config.xml
index ac7b236ba981c..98dc4cfeaa898 100644
--- a/core/res/res/values-watch/config.xml
+++ b/core/res/res/values-watch/config.xml
@@ -66,4 +66,8 @@
false
false
+
+
+ false
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 221e308743674..3dd7ad415bafe 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2651,6 +2651,9 @@
true
+
+ true
+
false
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index d0057d45f4539..379c376bf2ffd 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -313,6 +313,7 @@
+
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 3f2fdb09e75df..be5ff803ed564 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1490,6 +1490,7 @@ public class ActivityManagerService extends IActivityManager.Stub
boolean mSupportsSplitScreenMultiWindow;
boolean mSupportsFreeformWindowManagement;
boolean mSupportsPictureInPicture;
+ boolean mSupportsMultiDisplay;
boolean mSupportsLeanbackOnly;
IActivityController mController = null;
boolean mControllerIsAMonkey = false;
@@ -13827,6 +13828,8 @@ public class ActivityManagerService extends IActivityManager.Stub
com.android.internal.R.fraction.thumbnail_fullscreen_scale, 1, 1);
}
mWaitForNetworkTimeoutMs = waitForNetworkTimeoutMs;
+ mSupportsMultiDisplay = res.getBoolean(
+ com.android.internal.R.bool.config_supportsMultiDisplay);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 748aa6ff256ad..601141827f3c1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -247,6 +247,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
return runSupportsMultiwindow(pw);
case "supports-split-screen-multi-window":
return runSupportsSplitScreenMultiwindow(pw);
+ case "supports-multi-display":
+ return runSupportsMultiDisplay(pw);
case "update-appinfo":
return runUpdateApplicationInfo(pw);
case "no-home-screen":
@@ -2398,6 +2400,15 @@ final class ActivityManagerShellCommand extends ShellCommand {
return 0;
}
+ int runSupportsMultiDisplay(PrintWriter pw) throws RemoteException {
+ final Resources res = getResources(pw);
+ if (res == null) {
+ return -1;
+ }
+ pw.println(res.getBoolean(com.android.internal.R.bool.config_supportsMultiDisplay));
+ return 0;
+ }
+
int runUpdateApplicationInfo(PrintWriter pw) throws RemoteException {
int userid = UserHandle.parseUserArg(getNextArgRequired());
ArrayList packages = new ArrayList<>();
@@ -2627,6 +2638,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
pw.println(" Returns true if the device supports multiwindow.");
pw.println(" supports-split-screen-multi-window");
pw.println(" Returns true if the device supports split screen multiwindow.");
+ pw.println(" supports-multi-display");
+ pw.println(" Returns true if the device supports multi-display.");
pw.println(" suppress-resize-config-changes ");
pw.println(" Suppresses configuration changes due to user resizing an activity/task.");
pw.println(" set-inactive [--user ] true|false");
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 3e3fee54bdd07..30e33c83e7be5 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2782,6 +2782,15 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
+ " reparent task=" + task + " to stackId=" + stackId);
}
+ // Ensure that we're not moving a task to a dynamic stack if device doesn't support
+ // multi-display.
+ // TODO(multi-display): Support non-dynamic stacks on secondary displays.
+ // TODO: Check ActivityView after fixing b/35349678.
+ if (StackId.isDynamicStack(stackId) && !mService.mSupportsMultiDisplay) {
+ throw new IllegalArgumentException("Device doesn't support multi-display, can not"
+ + " reparent task=" + task + " to stackId=" + stackId);
+ }
+
// Ensure that we aren't trying to move into a freeform stack without freeform
// support
if (stackId == FREEFORM_WORKSPACE_STACK_ID && !mService.mSupportsFreeformWindowManagement) {
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index b4085697f2dac..bb5f5884773e1 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -2178,7 +2178,8 @@ class ActivityStarter {
case ASSISTANT_STACK_ID:
return r.isAssistantActivity();
default:
- if (StackId.isDynamicStack(stackId)) {
+ // TODO: Check ActivityView after fixing b/35349678.
+ if (StackId.isDynamicStack(stackId) && mService.mSupportsMultiDisplay) {
return true;
}
Slog.e(TAG, "isValidLaunchStackId: Unexpected stackId=" + stackId);