diff --git a/core/api/current.txt b/core/api/current.txt index 8f63dea516117..d2e4da2726712 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -411,6 +411,7 @@ package android { field public static final int calendarViewShown = 16843596; // 0x101034c field public static final int calendarViewStyle = 16843613; // 0x101035d field public static final int canControlMagnification = 16844039; // 0x1010507 + field public static final int canDisplayOnRemoteDevices; field public static final int canPauseRecording = 16844314; // 0x101061a field public static final int canPerformGestures = 16844045; // 0x101050d field public static final int canRecord = 16844060; // 0x101051c diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index e7ca76e233681..05478a30275bc 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -448,6 +448,12 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { * @see android.app.Activity#setVrModeEnabled(boolean, ComponentName) */ public static final int FLAG_ENABLE_VR_MODE = 0x8000; + /** + * Bit in {@link #flags} indicating if the activity can be displayed on a remote device. + * Corresponds to {@link android.R.attr#canDisplayOnRemoteDevices} + * @hide + */ + public static final int FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES = 0x10000; /** * Bit in {@link #flags} indicating if the activity is always focusable regardless of if it is diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 0a10aaaa20606..e3a5de514b220 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -194,6 +194,8 @@ public class ParsingPackageUtils { public static final String METADATA_MAX_ASPECT_RATIO = "android.max_aspect"; public static final String METADATA_SUPPORTS_SIZE_CHANGES = "android.supports_size_changes"; + public static final String METADATA_CAN_DISPLAY_ON_REMOTE_DEVICES = + "android.can_display_on_remote_devices"; public static final String METADATA_ACTIVITY_WINDOW_LAYOUT_AFFINITY = "android.activity_window_layout_affinity"; public static final String METADATA_ACTIVITY_LAUNCH_MODE = "android.activity.launch_mode"; diff --git a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java index 45241b0cb280b..2ddf923d7dd97 100644 --- a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java +++ b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java @@ -420,6 +420,21 @@ public class ParsedActivityUtils { } } + if (!isAlias) { + // Default allow the activity to be displayed on a remote device unless it explicitly + // set to false. + boolean canDisplayOnRemoteDevices = array.getBoolean( + R.styleable.AndroidManifestActivity_canDisplayOnRemoteDevices, true); + if (activity.getMetaData() != null && !activity.getMetaData().getBoolean( + ParsingPackageUtils.METADATA_CAN_DISPLAY_ON_REMOTE_DEVICES, true)) { + canDisplayOnRemoteDevices = false; + } + if (canDisplayOnRemoteDevices) { + activity.setFlags(activity.getFlags() + | ActivityInfo.FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES); + } + } + ParseResult layoutResult = resolveActivityWindowLayout(activity, input); if (layoutResult.isError()) { diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 755938eefdbd8..7805d46188e9a 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -2953,6 +2953,9 @@ usually TVs.

Requires permission {@code android.permission.DISABLE_SYSTEM_SOUND_EFFECTS}. --> + +