Merge "Update system APIs based on feedback." into udc-dev

This commit is contained in:
Jeff Sharkey
2023-03-08 18:11:02 +00:00
committed by Android (Google) Code Review
10 changed files with 169 additions and 142 deletions

View File

@@ -5279,10 +5279,28 @@ package android.app {
}
public class BroadcastOptions {
ctor public BroadcastOptions();
method public void clearDeferralPolicy();
method public void clearDeliveryGroupMatchingFilter();
method public void clearDeliveryGroupMatchingKey();
method public void clearDeliveryGroupPolicy();
method @NonNull public static android.app.BroadcastOptions fromBundle(@NonNull android.os.Bundle);
method public int getDeferralPolicy();
method @Nullable public android.content.IntentFilter getDeliveryGroupMatchingFilter();
method @Nullable public String getDeliveryGroupMatchingKey();
method public int getDeliveryGroupPolicy();
method public boolean isShareIdentityEnabled();
method @NonNull public static android.app.BroadcastOptions makeBasic();
method @NonNull public android.app.BroadcastOptions setDeferralPolicy(int);
method @NonNull public android.app.BroadcastOptions setDeliveryGroupMatchingFilter(@NonNull android.content.IntentFilter);
method @NonNull public android.app.BroadcastOptions setDeliveryGroupMatchingKey(@NonNull String, @NonNull String);
method @NonNull public android.app.BroadcastOptions setDeliveryGroupPolicy(int);
method @NonNull public android.app.BroadcastOptions setShareIdentityEnabled(boolean);
method @NonNull public android.os.Bundle toBundle();
field public static final int DEFERRAL_POLICY_DEFAULT = 0; // 0x0
field public static final int DEFERRAL_POLICY_NONE = 1; // 0x1
field public static final int DEFERRAL_POLICY_UNTIL_ACTIVE = 2; // 0x2
field public static final int DELIVERY_GROUP_POLICY_ALL = 0; // 0x0
field public static final int DELIVERY_GROUP_POLICY_MOST_RECENT = 1; // 0x1
}
public class DatePickerDialog extends android.app.AlertDialog implements android.widget.DatePicker.OnDateChangedListener android.content.DialogInterface.OnClickListener {

View File

@@ -834,23 +834,13 @@ package android.app {
}
public class BroadcastOptions {
method public void clearDeliveryGroupMatchingFilter();
method public void clearDeliveryGroupMatchingKey();
method public void clearDeliveryGroupPolicy();
method public void clearRequireCompatChange();
method @Nullable public android.content.IntentFilter getDeliveryGroupMatchingFilter();
method @Nullable public String getDeliveryGroupMatchingKey();
method public int getDeliveryGroupPolicy();
method public int getPendingIntentBackgroundActivityStartMode();
method public boolean isDeferUntilActive();
method @Deprecated public boolean isDeferUntilActive();
method @Deprecated public boolean isPendingIntentBackgroundActivityLaunchAllowed();
method @Deprecated @NonNull public static android.app.BroadcastOptions makeBasic();
method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RESPONSE_STATS) public void recordResponseEventWhileInBackground(@IntRange(from=0) long);
method @RequiresPermission(android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND) public void setBackgroundActivityStartsAllowed(boolean);
method @NonNull public android.app.BroadcastOptions setDeferUntilActive(boolean);
method @NonNull public android.app.BroadcastOptions setDeliveryGroupMatchingFilter(@NonNull android.content.IntentFilter);
method @NonNull public android.app.BroadcastOptions setDeliveryGroupMatchingKey(@NonNull String, @NonNull String);
method @NonNull public android.app.BroadcastOptions setDeliveryGroupPolicy(int);
method @Deprecated @NonNull public android.app.BroadcastOptions setDeferUntilActive(boolean);
method public void setDontSendToRestrictedApps(boolean);
method @Deprecated public void setPendingIntentBackgroundActivityLaunchAllowed(boolean);
method @NonNull public android.app.BroadcastOptions setPendingIntentBackgroundActivityStartMode(int);
@@ -859,8 +849,6 @@ package android.app {
method public void setRequireNoneOfPermissions(@Nullable String[]);
method @RequiresPermission(anyOf={android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST, android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND, android.Manifest.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND}) public void setTemporaryAppAllowlist(long, int, int, @Nullable String);
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST, android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND, android.Manifest.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND}) public void setTemporaryAppWhitelistDuration(long);
field public static final int DELIVERY_GROUP_POLICY_ALL = 0; // 0x0
field public static final int DELIVERY_GROUP_POLICY_MOST_RECENT = 1; // 0x1
}
public class DownloadManager {

View File

@@ -269,6 +269,7 @@ package android.app {
}
public class BroadcastOptions extends android.app.ComponentOptions {
ctor public BroadcastOptions();
ctor public BroadcastOptions(@NonNull android.os.Bundle);
method @Deprecated public int getMaxManifestReceiverApiLevel();
method public long getTemporaryAppAllowlistDuration();

View File

@@ -64,6 +64,7 @@ public class BroadcastOptions extends ComponentOptions {
private @Nullable String mDeliveryGroupMatchingKey;
private @Nullable BundleMerger mDeliveryGroupExtrasMerger;
private @Nullable IntentFilter mDeliveryGroupMatchingFilter;
private @DeferralPolicy int mDeferralPolicy;
/** @hide */
@IntDef(flag = true, prefix = { "FLAG_" }, value = {
@@ -71,8 +72,8 @@ public class BroadcastOptions extends ComponentOptions {
FLAG_ALLOW_BACKGROUND_ACTIVITY_STARTS,
FLAG_REQUIRE_COMPAT_CHANGE_ENABLED,
FLAG_IS_ALARM_BROADCAST,
FLAG_IS_DEFER_UNTIL_ACTIVE,
FLAG_SHARE_IDENTITY,
FLAG_INTERACTIVE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface Flags {}
@@ -81,8 +82,8 @@ public class BroadcastOptions extends ComponentOptions {
private static final int FLAG_ALLOW_BACKGROUND_ACTIVITY_STARTS = 1 << 1;
private static final int FLAG_REQUIRE_COMPAT_CHANGE_ENABLED = 1 << 2;
private static final int FLAG_IS_ALARM_BROADCAST = 1 << 3;
private static final int FLAG_IS_DEFER_UNTIL_ACTIVE = 1 << 4;
private static final int FLAG_SHARE_IDENTITY = 1 << 5;
private static final int FLAG_SHARE_IDENTITY = 1 << 4;
private static final int FLAG_INTERACTIVE = 1 << 5;
/**
* Change ID which is invalid.
@@ -212,12 +213,18 @@ public class BroadcastOptions extends ComponentOptions {
private static final String KEY_DELIVERY_GROUP_MATCHING_FILTER =
"android:broadcast.deliveryGroupMatchingFilter";
/**
* Corresponds to {@link #setDeferralPolicy(int)}
*/
private static final String KEY_DEFERRAL_POLICY =
"android:broadcast.deferralPolicy";
/**
* The list of delivery group policies which specify how multiple broadcasts belonging to
* the same delivery group has to be handled.
* @hide
*/
@IntDef(flag = true, prefix = { "DELIVERY_GROUP_POLICY_" }, value = {
@IntDef(prefix = { "DELIVERY_GROUP_POLICY_" }, value = {
DELIVERY_GROUP_POLICY_ALL,
DELIVERY_GROUP_POLICY_MOST_RECENT,
DELIVERY_GROUP_POLICY_MERGED,
@@ -228,19 +235,13 @@ public class BroadcastOptions extends ComponentOptions {
/**
* Delivery group policy that indicates that all the broadcasts in the delivery group
* need to be delivered as is.
*
* @hide
*/
@SystemApi
public static final int DELIVERY_GROUP_POLICY_ALL = 0;
/**
* Delivery group policy that indicates that only the most recent broadcast in the delivery
* group need to be delivered and the rest can be dropped.
*
* @hide
*/
@SystemApi
public static final int DELIVERY_GROUP_POLICY_MOST_RECENT = 1;
/**
@@ -251,24 +252,62 @@ public class BroadcastOptions extends ComponentOptions {
*/
public static final int DELIVERY_GROUP_POLICY_MERGED = 2;
/** {@hide} */
@IntDef(prefix = { "DEFERRAL_POLICY_" }, value = {
DEFERRAL_POLICY_DEFAULT,
DEFERRAL_POLICY_NONE,
DEFERRAL_POLICY_UNTIL_ACTIVE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface DeferralPolicy {}
/**
* Deferral policy that indicates no desire has been expressed, and that the
* system should use a reasonable default behavior.
*/
public static final int DEFERRAL_POLICY_DEFAULT = 0;
/**
* Deferral policy that indicates a strong desire that no receiver of this
* broadcast should be deferred.
*/
public static final int DEFERRAL_POLICY_NONE = 1;
/**
* Deferral policy that indicates a strong desire that each receiver of this
* broadcast should be deferred until that receiver's process is in an
* active (non-cached) state. Whether an app's process state is considered
* active is independent of its standby bucket.
* <p>
* This policy only applies to runtime registered receivers of a broadcast,
* and does not apply to ordered broadcasts, alarm broadcasts, interactive
* broadcasts, or manifest broadcasts.
* <p>
* This policy means that a runtime registered receiver will not typically
* execute until that receiver's process is brought to an active state by
* some other action, such as a job, alarm, or service binding. As a result,
* the receiver may be delayed indefinitely.
* <p>
* When this policy is set on an unordered broadcast with a completion
* callback, the completion callback will run once all eligible processes
* have finished receiving the broadcast. Processes in inactive process
* state are not considered eligible and may not receive the broadcast prior
* to the completion callback.
*/
public static final int DEFERRAL_POLICY_UNTIL_ACTIVE = 2;
/**
* Creates a basic {@link BroadcastOptions} with no options initially set.
*
* @return an instance of {@code BroadcastOptions} against which options can be set
*
* @deprecated Use {@link BroadcastOptions#BroadcastOptions()} instead.
* @hide
*/
@Deprecated
@SystemApi
public static @NonNull BroadcastOptions makeBasic() {
BroadcastOptions opts = new BroadcastOptions();
return opts;
}
/**
* Creates a new {@code BroadcastOptions} with no options initially set.
*/
/** @hide */
@TestApi
public BroadcastOptions() {
super();
resetTemporaryAppAllowlist();
@@ -303,6 +342,7 @@ public class BroadcastOptions extends ComponentOptions {
BundleMerger.class);
mDeliveryGroupMatchingFilter = opts.getParcelable(KEY_DELIVERY_GROUP_MATCHING_FILTER,
IntentFilter.class);
mDeferralPolicy = opts.getInt(KEY_DEFERRAL_POLICY, DEFERRAL_POLICY_DEFAULT);
}
/**
@@ -728,60 +768,56 @@ public class BroadcastOptions extends ComponentOptions {
return mIdForResponseEvent;
}
/**
* Sets whether the broadcast should not run until the process is in an active process state
* (ie, a process exists for the app and the app is not in a cached process state).
*
* Whether an app's process state is considered active is independent of its standby bucket.
*
* A broadcast that is deferred until the process is active will not execute until the process
* is brought to an active state by some other action, like a job, alarm, or service binding. As
* a result, the broadcast may be delayed indefinitely. This deferral only applies to runtime
* registered receivers of a broadcast. Any manifest receivers will run immediately, similar to
* how a manifest receiver would start a new process in order to run a broadcast receiver.
*
* Ordered broadcasts, alarm broadcasts, interactive broadcasts, and manifest broadcasts are
* never deferred.
*
* Unordered broadcasts and unordered broadcasts with completion callbacks may be
* deferred. Completion callbacks for broadcasts deferred until active are
* best-effort. Completion callbacks will run when all eligible processes have finished
* executing the broadcast. Processes in inactive process states that defer the broadcast are
* not considered eligible and may not execute the broadcast prior to the completion callback.
*
* @hide
*/
/** {@hide} */
@SystemApi
@Deprecated
// STOPSHIP: remove entirely after this API change lands in AOSP
public @NonNull BroadcastOptions setDeferUntilActive(boolean shouldDefer) {
if (shouldDefer) {
mFlags |= FLAG_IS_DEFER_UNTIL_ACTIVE;
setDeferralPolicy(DEFERRAL_POLICY_UNTIL_ACTIVE);
} else {
mFlags &= ~FLAG_IS_DEFER_UNTIL_ACTIVE;
setDeferralPolicy(DEFERRAL_POLICY_NONE);
}
return this;
}
/**
* Returns if this broadcast should not run until the process is in an active process state.
*
* @return {@code true} if this broadcast should not run until the process is in an active
* process state. Otherwise, {@code false}.
* @see #setDeferUntilActive(boolean)
*
* @hide
*/
/** {@hide} */
@SystemApi
@Deprecated
// STOPSHIP: remove entirely after this API change lands in AOSP
public boolean isDeferUntilActive() {
return (mFlags & FLAG_IS_DEFER_UNTIL_ACTIVE) != 0;
return (mDeferralPolicy == DEFERRAL_POLICY_UNTIL_ACTIVE);
}
/**
* Sets deferral policy for this broadcast that specifies how this broadcast
* can be deferred for delivery at some future point.
*/
public @NonNull BroadcastOptions setDeferralPolicy(@DeferralPolicy int deferralPolicy) {
mDeferralPolicy = deferralPolicy;
return this;
}
/**
* Gets deferral policy for this broadcast that specifies how this broadcast
* can be deferred for delivery at some future point.
*/
public @DeferralPolicy int getDeferralPolicy() {
return mDeferralPolicy;
}
/**
* Clears any deferral policy for this broadcast that specifies how this
* broadcast can be deferred for delivery at some future point.
*/
public void clearDeferralPolicy() {
mDeferralPolicy = DEFERRAL_POLICY_DEFAULT;
}
/**
* Set delivery group policy for this broadcast to specify how multiple broadcasts belonging to
* the same delivery group has to be handled.
*
* @hide
*/
@SystemApi
@NonNull
public BroadcastOptions setDeliveryGroupPolicy(@DeliveryGroupPolicy int policy) {
mDeliveryGroupPolicy = policy;
@@ -791,10 +827,7 @@ public class BroadcastOptions extends ComponentOptions {
/**
* Get the delivery group policy for this broadcast that specifies how multiple broadcasts
* belonging to the same delivery group has to be handled.
*
* @hide
*/
@SystemApi
public @DeliveryGroupPolicy int getDeliveryGroupPolicy() {
return mDeliveryGroupPolicy;
}
@@ -803,10 +836,7 @@ public class BroadcastOptions extends ComponentOptions {
* Clears any previously set delivery group policies using
* {@link #setDeliveryGroupMatchingKey(String, String)} and resets the delivery group policy to
* the default value ({@link #DELIVERY_GROUP_POLICY_ALL}).
*
* @hide
*/
@SystemApi
public void clearDeliveryGroupPolicy() {
mDeliveryGroupPolicy = DELIVERY_GROUP_POLICY_ALL;
}
@@ -821,10 +851,7 @@ public class BroadcastOptions extends ComponentOptions {
* <p> If neither matching key using this API nor matching filter using
* {@link #setDeliveryGroupMatchingFilter(IntentFilter)} is specified, then by default
* {@link Intent#filterEquals(Intent)} will be used to identify the delivery group.
*
* @hide
*/
@SystemApi
@NonNull
public BroadcastOptions setDeliveryGroupMatchingKey(@NonNull String namespace,
@NonNull String key) {
@@ -842,9 +869,7 @@ public class BroadcastOptions extends ComponentOptions {
*
* @return the delivery group namespace and key that was previously set using
* {@link #setDeliveryGroupMatchingKey(String, String)}, concatenated with a {@code :}.
* @hide
*/
@SystemApi
@Nullable
public String getDeliveryGroupMatchingKey() {
return mDeliveryGroupMatchingKey;
@@ -853,10 +878,7 @@ public class BroadcastOptions extends ComponentOptions {
/**
* Clears the namespace and key that was previously set using
* {@link #setDeliveryGroupMatchingKey(String, String)}.
*
* @hide
*/
@SystemApi
public void clearDeliveryGroupMatchingKey() {
mDeliveryGroupMatchingKey = null;
}
@@ -871,10 +893,7 @@ public class BroadcastOptions extends ComponentOptions {
* <p> If neither matching key using {@link #setDeliveryGroupMatchingKey(String, String)} nor
* matching filter using this API is specified, then by default
* {@link Intent#filterEquals(Intent)} will be used to identify the delivery group.
*
* @hide
*/
@SystemApi
@NonNull
public BroadcastOptions setDeliveryGroupMatchingFilter(@NonNull IntentFilter matchingFilter) {
mDeliveryGroupMatchingFilter = Objects.requireNonNull(matchingFilter);
@@ -887,9 +906,7 @@ public class BroadcastOptions extends ComponentOptions {
*
* @return the {@link IntentFilter} object that was previously set using
* {@link #setDeliveryGroupMatchingFilter(IntentFilter)}.
* @hide
*/
@SystemApi
@Nullable
public IntentFilter getDeliveryGroupMatchingFilter() {
return mDeliveryGroupMatchingFilter;
@@ -898,10 +915,7 @@ public class BroadcastOptions extends ComponentOptions {
/**
* Clears the {@link IntentFilter} object that was previously set using
* {@link #setDeliveryGroupMatchingFilter(IntentFilter)}.
*
* @hide
*/
@SystemApi
public void clearDeliveryGroupMatchingFilter() {
mDeliveryGroupMatchingFilter = null;
}
@@ -943,6 +957,36 @@ public class BroadcastOptions extends ComponentOptions {
mDeliveryGroupExtrasMerger = null;
}
/**
* Sets whether the broadcast should be considered as having originated from
* some direct interaction by the user such as a notification tap or button
* press. This signal is used internally to ensure the broadcast is
* delivered quickly with low latency.
*
* @hide
*/
@RequiresPermission(android.Manifest.permission.BROADCAST_OPTION_INTERACTIVE)
public @NonNull BroadcastOptions setInteractive(boolean interactive) {
if (interactive) {
mFlags |= FLAG_INTERACTIVE;
} else {
mFlags &= ~FLAG_INTERACTIVE;
}
return this;
}
/**
* Returns whether the broadcast should be considered as having originated
* from some direct interaction by the user such as a notification tap or
* button press.
*
* @hide
*/
@RequiresPermission(android.Manifest.permission.BROADCAST_OPTION_INTERACTIVE)
public boolean isInteractive() {
return (mFlags & FLAG_INTERACTIVE) != 0;
}
/**
* Set PendingIntent activity is allowed to be started in the background if the caller
* can start background activities.
@@ -1064,11 +1108,22 @@ public class BroadcastOptions extends ComponentOptions {
if (mDeliveryGroupMatchingFilter != null) {
b.putParcelable(KEY_DELIVERY_GROUP_MATCHING_FILTER, mDeliveryGroupMatchingFilter);
}
return b.isEmpty() ? null : b;
if (mDeferralPolicy != DEFERRAL_POLICY_DEFAULT) {
b.putInt(KEY_DEFERRAL_POLICY, mDeferralPolicy);
}
return b;
}
/** @hide */
public static @Nullable BroadcastOptions fromBundle(@Nullable Bundle options) {
/**
* Returns a {@link BroadcastOptions} parsed from the given {@link Bundle},
* typically generated from {@link #toBundle()}.
*/
public static @NonNull BroadcastOptions fromBundle(@NonNull Bundle options) {
return new BroadcastOptions(options);
}
/** {@hide} */
public static @Nullable BroadcastOptions fromBundleNullable(@Nullable Bundle options) {
return (options != null) ? new BroadcastOptions(options) : null;
}
}

View File

@@ -19,7 +19,6 @@ package android.app;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.os.Bundle;
@@ -53,15 +52,8 @@ public class ComponentOptions {
public static final String KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION =
"android.pendingIntent.backgroundActivityAllowedByPermission";
/**
* Corresponds to {@link #setInteractive(boolean)}
* @hide
*/
private static final String KEY_INTERACTIVE = "android:component.isInteractive";
private @Nullable Boolean mPendingIntentBalAllowed = null;
private boolean mPendingIntentBalAllowedByPermission = false;
private boolean mIsInteractive = false;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@@ -106,29 +98,6 @@ public class ComponentOptions {
setPendingIntentBackgroundActivityLaunchAllowedByPermission(
opts.getBoolean(
KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION, false));
mIsInteractive = opts.getBoolean(KEY_INTERACTIVE, false);
}
/**
* When set, a broadcast will be understood as having originated from
* some direct interaction by the user such as a notification tap or button
* press. Only the OS itself may use this option.
* @hide
* @param interactive
* @see #isInteractive()
*/
@RequiresPermission(android.Manifest.permission.COMPONENT_OPTION_INTERACTIVE)
public void setInteractive(boolean interactive) {
mIsInteractive = interactive;
}
/**
* Did this PendingIntent send originate with a direct user interaction?
* @return true if this is the result of an interaction, false otherwise
* @hide
*/
public boolean isInteractive() {
return mIsInteractive;
}
/**
@@ -232,9 +201,6 @@ public class ComponentOptions {
b.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION,
mPendingIntentBalAllowedByPermission);
}
if (mIsInteractive) {
b.putBoolean(KEY_INTERACTIVE, true);
}
return b;
}

View File

@@ -3772,10 +3772,9 @@
<permission android:name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"
android:protectionLevel="signature|privileged|vendorPrivileged|oem|verifier|role"/>
<!-- Allows an application to hint that a component lifecycle operation such as sending
a broadcast is associated with an "interactive" usage scenario.
<!-- Allows an application to request interactive options when sending a broadcast.
@hide -->
<permission android:name="android.permission.COMPONENT_OPTION_INTERACTIVE"
<permission android:name="android.permission.BROADCAST_OPTION_INTERACTIVE"
android:protectionLevel="signature|privileged" />
<!-- @SystemApi Must be required by activities that handle the intent action

View File

@@ -24,7 +24,7 @@
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<permission name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"/>
<permission name="android.permission.CHANGE_OVERLAY_PACKAGES"/>
<permission name="android.permission.COMPONENT_OPTION_INTERACTIVE"/>
<permission name="android.permission.BROADCAST_OPTION_INTERACTIVE"/>
<permission name="android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS"/>
<permission name="android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS"/>
<permission name="android.permission.CONTROL_VPN"/>

View File

@@ -181,8 +181,8 @@
<!-- Doze mode temp whitelisting for notification dispatching. -->
<uses-permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST" />
<!-- Tag user-initiated PendingIntent invocations as "interactive" when appropriate -->
<uses-permission android:name="android.permission.COMPONENT_OPTION_INTERACTIVE" />
<!-- Adjust delivery policies for broadcast intents -->
<uses-permission android:name="android.permission.BROADCAST_OPTION_INTERACTIVE" />
<!-- Listen for keyboard attachment / detachment -->
<uses-permission android:name="android.permission.TABLET_MODE" />

View File

@@ -122,7 +122,6 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn
options.setLaunchDisplayId(displayId);
options.setCallerDisplayId(displayId);
options.setPendingIntentBackgroundActivityLaunchAllowed(true);
options.setInteractive(true);
return options.toBundle();
}

View File

@@ -14281,7 +14281,8 @@ public class ActivityManagerService extends IActivityManager.Stub
// Apply permission policy around the use of specific broadcast options
void enforceBroadcastOptionPermissionsInternal(
@Nullable Bundle options, int callingUid) {
enforceBroadcastOptionPermissionsInternal(BroadcastOptions.fromBundle(options), callingUid);
enforceBroadcastOptionPermissionsInternal(BroadcastOptions.fromBundleNullable(options),
callingUid);
}
void enforceBroadcastOptionPermissionsInternal(
@@ -14297,7 +14298,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (options.isInteractive()) {
enforceCallingPermission(
android.Manifest.permission.COMPONENT_OPTION_INTERACTIVE,
android.Manifest.permission.BROADCAST_OPTION_INTERACTIVE,
"setInteractive");
}
}
@@ -14334,9 +14335,9 @@ public class ActivityManagerService extends IActivityManager.Stub
final int res = broadcastIntentLockedTraced(callerApp, callerPackage, callerFeatureId,
intent, resolvedType, resultToApp, resultTo, resultCode, resultData, resultExtras,
requiredPermissions, excludedPermissions, excludedPackages, appOp,
BroadcastOptions.fromBundle(bOptions), ordered, sticky, callingPid, callingUid,
realCallingUid, realCallingPid, userId, backgroundStartPrivileges,
broadcastAllowList, filterExtrasForReceiver);
BroadcastOptions.fromBundleNullable(bOptions), ordered, sticky,
callingPid, callingUid, realCallingUid, realCallingPid, userId,
backgroundStartPrivileges, broadcastAllowList, filterExtrasForReceiver);
BroadcastQueue.traceEnd(cookie);
return res;
}