From 79dcbeea1ed6834b60c89a2870cbaa008ea522a0 Mon Sep 17 00:00:00 2001 From: Chilun Date: Tue, 2 Nov 2021 12:01:59 +0800 Subject: [PATCH] Add manifest attribute for display across devices Allow an activity to opt in or out from being streamed to a remote device by the application manifest. Also add meta-data support of apps that targeting on previous SDK. Bug: 201712607 Test: Manual Change-Id: If39442d19316653cacae4c060f9f374958eb92a5 --- core/api/current.txt | 1 + core/java/android/content/pm/ActivityInfo.java | 6 ++++++ .../content/pm/parsing/ParsingPackageUtils.java | 3 ++- .../pm/parsing/component/ParsedActivityUtils.java | 15 +++++++++++++++ core/res/res/values/attrs_manifest.xml | 3 +++ core/res/res/values/public.xml | 1 + 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/api/current.txt b/core/api/current.txt index 8e3faaa4e6026..ba4c4d3a53688 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 cbb5c2b082e2e..78852b4061917 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -447,6 +447,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 d19186e9a70dc..1204d7488ecc3 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -52,7 +52,6 @@ import android.content.pm.SigningDetails; import android.content.pm.parsing.component.ComponentMutateUtils; import android.content.pm.parsing.component.ComponentParseUtils; import android.content.pm.parsing.component.ParsedActivity; -import android.content.pm.parsing.component.ParsedActivityImpl; import android.content.pm.parsing.component.ParsedActivityUtils; import android.content.pm.parsing.component.ParsedAttribution; import android.content.pm.parsing.component.ParsedAttributionUtils; @@ -194,6 +193,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}. --> + +