From 1981f5fd17de4627201363ca57e90927a8a243fd Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Fri, 7 Apr 2017 16:23:12 -0700 Subject: [PATCH] Use feature instead of hidden config for multi-display Using a feature will allow app developers to find out if a particular device supports running activities on secondary screens before using the APIs. Bug: 36776777 Test: android.server.cts.ActivityManagerDisplayTests Change-Id: I7121bdb782cac9df70121e9df5cbf3fcb76f4a93 --- api/current.txt | 1 + api/system-current.txt | 1 + api/test-current.txt | 1 + core/java/android/app/ActivityManager.java | 10 ---------- core/java/android/app/ActivityOptions.java | 8 ++++++++ core/java/android/content/pm/PackageManager.java | 8 ++++++++ .../java/com/android/server/am/ActivityManagerService.java | 4 +++- .../com/android/server/am/ActivityManagerShellCommand.java | 13 ------------- 8 files changed, 22 insertions(+), 24 deletions(-) diff --git a/api/current.txt b/api/current.txt index 2723f4dfd106..c7b1e2729ff0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -10616,6 +10616,7 @@ package android.content.pm { field public static final int DONT_KILL_APP = 1; // 0x1 field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID"; field public static final java.lang.String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT"; + field public static final java.lang.String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS = "android.software.activities_on_secondary_displays"; field public static final java.lang.String FEATURE_APP_WIDGETS = "android.software.app_widgets"; field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency"; field public static final java.lang.String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output"; diff --git a/api/system-current.txt b/api/system-current.txt index 895a5d4daccf..334d024a76fa 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -11300,6 +11300,7 @@ package android.content.pm { field public static final java.lang.String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS"; field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID"; field public static final java.lang.String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT"; + field public static final java.lang.String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS = "android.software.activities_on_secondary_displays"; field public static final java.lang.String FEATURE_APP_WIDGETS = "android.software.app_widgets"; field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency"; field public static final java.lang.String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output"; diff --git a/api/test-current.txt b/api/test-current.txt index 67416fba10cf..8ecb50a942a6 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -10655,6 +10655,7 @@ package android.content.pm { field public static final int DONT_KILL_APP = 1; // 0x1 field public static final java.lang.String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID"; field public static final java.lang.String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT"; + field public static final java.lang.String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS = "android.software.activities_on_secondary_displays"; field public static final java.lang.String FEATURE_APP_WIDGETS = "android.software.app_widgets"; field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency"; field public static final java.lang.String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output"; diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index e2883873752c..4004bd6686b1 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1118,16 +1118,6 @@ public class ActivityManager { } /** - * Returns true if the system supports running activities on secondary displays. - * @hide - */ - static public boolean supportsMultiDisplay() { - return !isLowRamDeviceStatic() - && Resources.getSystem().getBoolean( - com.android.internal.R.bool.config_supportsMultiDisplay); - } - - /** * Return the maximum number of actions that will be displayed in the picture-in-picture UI when * the user interacts with the activity currently in picture-in-picture mode. */ diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index aa7cdf7b475e..02d18841f489 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -155,6 +155,7 @@ public class ActivityOptions { /** * The display id the activity should be launched into. + * @see #setLaunchDisplayId(int) * @hide */ private static final String KEY_LAUNCH_DISPLAY_ID = "android.activity.launchDisplayId"; @@ -1038,6 +1039,7 @@ public class ActivityOptions { * Gets the id of the display where activity should be launched. * @return The id of the display where activity should be launched, * {@link android.view.Display#INVALID_DISPLAY} if not set. + * @see #setLaunchDisplayId(int) */ public int getLaunchDisplayId() { return mLaunchDisplayId; @@ -1045,6 +1047,12 @@ public class ActivityOptions { /** * Sets the id of the display where activity should be launched. + * An app can launch activities on public displays or private displays that are owned by the app + * or where an app already has activities. Otherwise, trying to launch on a private display + * or providing an invalid display id will result in an exception. + *

+ * Setting launch display id will be ignored on devices that don't have + * {@link android.content.pm.PackageManager#FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS}. * @param launchDisplayId The id of the display where the activity should be launched. * @return {@code this} {@link ActivityOptions} instance. */ diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 50e3e6863d4f..fa3e4e98b551 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2285,6 +2285,14 @@ public abstract class PackageManager { /** * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: + * The device supports running activities on secondary displays. + */ + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS + = "android.software.activities_on_secondary_displays"; + + /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: * The device supports creating secondary users and managed profiles via * {@link DevicePolicyManager}. */ diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 4830b4bcca55..cc6ca2d219cc 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -30,6 +30,7 @@ import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import static android.app.ActivityManager.StackId.PINNED_STACK_ID; +import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS; import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT; import static android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY; import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; @@ -13763,7 +13764,8 @@ public class ActivityManagerService extends IActivityManager.Stub final boolean supportsMultiWindow = ActivityManager.supportsMultiWindow(); final boolean supportsSplitScreenMultiWindow = ActivityManager.supportsSplitScreenMultiWindow(); - final boolean supportsMultiDisplay = ActivityManager.supportsMultiDisplay(); + final boolean supportsMultiDisplay = mContext.getPackageManager() + .hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS); final String debugApp = Settings.Global.getString(resolver, DEBUG_APP); final boolean waitForDebugger = Settings.Global.getInt(resolver, WAIT_FOR_DEBUGGER, 0) != 0; final boolean alwaysFinishActivities = diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 2b3a19a83e55..04c2af5af339 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -247,8 +247,6 @@ 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": @@ -2399,15 +2397,6 @@ 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(ActivityManager.supportsMultiDisplay()); - return 0; - } - int runUpdateApplicationInfo(PrintWriter pw) throws RemoteException { int userid = UserHandle.parseUserArg(getNextArgRequired()); ArrayList packages = new ArrayList<>(); @@ -2637,8 +2626,6 @@ 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"); -- 2.11.0