diff options
| -rw-r--r-- | core/api/system-current.txt | 5 | ||||
| -rw-r--r-- | core/java/android/app/BroadcastOptions.java | 92 |
2 files changed, 97 insertions, 0 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 8af0d01de848..86e9610325de 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -764,6 +764,9 @@ package android.app { method 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 public void setDeliveryGroupMatchingFilter(@NonNull android.content.IntentFilter); + method public void setDeliveryGroupMatchingKey(@NonNull String, @NonNull String); + method public void setDeliveryGroupPolicy(int); method public void setDontSendToRestrictedApps(boolean); method public void setPendingIntentBackgroundActivityLaunchAllowed(boolean); method public void setRequireAllOfPermissions(@Nullable String[]); @@ -772,6 +775,8 @@ package android.app { 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); method public android.os.Bundle toBundle(); + 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 { diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java index 56f8760f6059..a50403462a03 100644 --- a/core/java/android/app/BroadcastOptions.java +++ b/core/java/android/app/BroadcastOptions.java @@ -16,6 +16,7 @@ package android.app; +import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -27,12 +28,19 @@ import android.compat.annotation.ChangeId; import android.compat.annotation.Disabled; import android.compat.annotation.EnabledSince; import android.content.Intent; +import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.os.PowerExemptionManager; import android.os.PowerExemptionManager.ReasonCode; import android.os.PowerExemptionManager.TempAllowListType; +import com.android.internal.util.Preconditions; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Objects; + /** * Helper class for building an options Bundle that can be used with * {@link android.content.Context#sendBroadcast(android.content.Intent) @@ -54,6 +62,9 @@ public class BroadcastOptions extends ComponentOptions { private long mRequireCompatChangeId = CHANGE_INVALID; private boolean mRequireCompatChangeEnabled = true; private long mIdForResponseEvent; + private @DeliveryGroupPolicy int mDeliveryGroupPolicy; + private @Nullable String mDeliveryGroupMatchingKey; + private @Nullable IntentFilter mDeliveryGroupMatchingFilter; /** * Change ID which is invalid. @@ -172,6 +183,36 @@ public class BroadcastOptions extends ComponentOptions { private static final String KEY_ID_FOR_RESPONSE_EVENT = "android:broadcast.idForResponseEvent"; + /** + * 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 = { + DELIVERY_GROUP_POLICY_ALL, + DELIVERY_GROUP_POLICY_MOST_RECENT, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DeliveryGroupPolicy {} + + /** + * 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; + public static BroadcastOptions makeBasic() { BroadcastOptions opts = new BroadcastOptions(); return opts; @@ -544,6 +585,57 @@ public class BroadcastOptions extends ComponentOptions { } /** + * Set delivery group policy for this broadcast to specify how multiple broadcasts belonging to + * the same delivery group has to be handled. + * + * @hide + */ + @SystemApi + public void setDeliveryGroupPolicy(@DeliveryGroupPolicy int policy) { + mDeliveryGroupPolicy = policy; + } + + /** + * Set namespace and key to identify the delivery group that this broadcast belongs to. + * + * <p> If {@code namespace} and {@code key} are specified, then another broadcast will be + * considered to be in the same delivery group as this iff it has the same {@code namespace} + * and {@code key}. + * + * <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 + public void setDeliveryGroupMatchingKey(@NonNull String namespace, @NonNull String key) { + Preconditions.checkArgument(!namespace.contains("/"), + "namespace should not contain '/'"); + Preconditions.checkArgument(!key.contains("/"), + "key should not contain '/'"); + mDeliveryGroupMatchingKey = namespace + "/" + key; + } + + /** + * Set the {@link IntentFilter} object to identify the delivery group that this broadcast + * belongs to. + * + * <p> If a {@code matchingFilter} is specified, then another broadcast will be considered + * to be in the same delivery group as this iff the {@code matchingFilter} matches it's intent. + * + * <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 + public void setDeliveryGroupMatchingFilter(@NonNull IntentFilter matchingFilter) { + mDeliveryGroupMatchingFilter = Objects.requireNonNull(matchingFilter); + } + + /** * Returns the created options as a Bundle, which can be passed to * {@link android.content.Context#sendBroadcast(android.content.Intent) * Context.sendBroadcast(Intent)} and related methods. |