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
This commit is contained in:
Chilun
2021-11-02 12:01:59 +08:00
parent df8f244801
commit 79dcbeea1e
6 changed files with 28 additions and 1 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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";

View File

@@ -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<ActivityInfo.WindowLayout> layoutResult =
resolveActivityWindowLayout(activity, input);
if (layoutResult.isError()) {

View File

@@ -2953,6 +2953,9 @@
usually TVs.
<p>Requires permission {@code android.permission.DISABLE_SYSTEM_SOUND_EFFECTS}. -->
<attr name="playHomeTransitionSound" format="boolean"/>
<!-- Indicates whether the activity can be displayed on a remote device which may or
may not be running Android. -->
<attr name="canDisplayOnRemoteDevices" format="boolean"/>
</declare-styleable>
<!-- The <code>activity-alias</code> tag declares a new

View File

@@ -3303,6 +3303,7 @@
<public name="sharedUserMaxSdkVersion" />
<public name="requiredSplitTypes" />
<public name="splitTypes" />
<public name="canDisplayOnRemoteDevices" />
</staging-public-group>
<staging-public-group type="id" first-id="0x01de0000">