Loading core/java/android/app/BroadcastOptions.java +62 −3 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.app; import android.annotation.SystemApi; import android.os.Build; import android.os.Bundle; /** Loading @@ -28,15 +29,28 @@ import android.os.Bundle; @SystemApi public class BroadcastOptions { private long mTemporaryAppWhitelistDuration; private int mMinManifestReceiverApiLevel = 0; private int mMaxManifestReceiverApiLevel = Build.VERSION_CODES.CUR_DEVELOPMENT; /** * How long to temporarily put an app on the power whitelist when executing this broadcast * to it. * @hide */ public static final String KEY_TEMPORARY_APP_WHITELIST_DURATION static final String KEY_TEMPORARY_APP_WHITELIST_DURATION = "android:broadcast.temporaryAppWhitelistDuration"; /** * Corresponds to {@link #setMinManifestReceiverApiLevel}. */ static final String KEY_MIN_MANIFEST_RECEIVER_API_LEVEL = "android:broadcast.minManifestReceiverApiLevel"; /** * Corresponds to {@link #setMaxManifestReceiverApiLevel}. */ static final String KEY_MAX_MANIFEST_RECEIVER_API_LEVEL = "android:broadcast.maxManifestReceiverApiLevel"; public static BroadcastOptions makeBasic() { BroadcastOptions opts = new BroadcastOptions(); return opts; Loading @@ -48,6 +62,9 @@ public class BroadcastOptions { /** @hide */ public BroadcastOptions(Bundle opts) { mTemporaryAppWhitelistDuration = opts.getLong(KEY_TEMPORARY_APP_WHITELIST_DURATION); mMinManifestReceiverApiLevel = opts.getInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, 0); mMaxManifestReceiverApiLevel = opts.getInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, Build.VERSION_CODES.CUR_DEVELOPMENT); } /** Loading @@ -67,11 +84,47 @@ public class BroadcastOptions { return mTemporaryAppWhitelistDuration; } /** * Set the minimum target API level of receivers of the broadcast. If an application * is targeting an API level less than this, the broadcast will not be delivered to * them. This only applies to receivers declared in the app's AndroidManifest.xml. * @hide */ public void setMinManifestReceiverApiLevel(int apiLevel) { mMinManifestReceiverApiLevel = apiLevel; } /** * Return {@link #setMinManifestReceiverApiLevel}. * @hide */ public int getMinManifestReceiverApiLevel() { return mMinManifestReceiverApiLevel; } /** * Set the maximum target API level of receivers of the broadcast. If an application * is targeting an API level greater than this, the broadcast will not be delivered to * them. This only applies to receivers declared in the app's AndroidManifest.xml. * @hide */ public void setMaxManifestReceiverApiLevel(int apiLevel) { mMaxManifestReceiverApiLevel = apiLevel; } /** * Return {@link #setMaxManifestReceiverApiLevel}. * @hide */ public int getMaxManifestReceiverApiLevel() { return mMaxManifestReceiverApiLevel; } /** * 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. * Note that the returned Bundle is still owned by the ActivityOptions * Note that the returned Bundle is still owned by the BroadcastOptions * object; you must not modify it, but can supply it to the sendBroadcast * methods that take an options Bundle. */ Loading @@ -80,6 +133,12 @@ public class BroadcastOptions { if (mTemporaryAppWhitelistDuration > 0) { b.putLong(KEY_TEMPORARY_APP_WHITELIST_DURATION, mTemporaryAppWhitelistDuration); } if (mMinManifestReceiverApiLevel != 0) { b.putInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, mMinManifestReceiverApiLevel); } if (mMaxManifestReceiverApiLevel != Build.VERSION_CODES.CUR_DEVELOPMENT) { b.putInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, mMaxManifestReceiverApiLevel); } return b.isEmpty() ? null : b; } } core/java/android/app/ContextImpl.java +17 −1 Original line number Diff line number Diff line Loading @@ -1093,7 +1093,23 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true, user.getIdentifier()); Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } } @Override @Deprecated public void sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options) { String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); try { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, options, false, true, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } Loading core/java/android/content/Context.java +8 −0 Original line number Diff line number Diff line Loading @@ -2115,6 +2115,14 @@ public abstract class Context { public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent, UserHandle user); /** * @hide * This is just here for sending CONNECTIVITY_ACTION. */ @Deprecated public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent, UserHandle user, Bundle options); /** * <p>Version of * {@link #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)} Loading core/java/android/content/ContextWrapper.java +7 −0 Original line number Diff line number Diff line Loading @@ -536,6 +536,13 @@ public class ContextWrapper extends Context { mBase.sendStickyBroadcastAsUser(intent, user); } /** @hide */ @Override @Deprecated public void sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options) { mBase.sendStickyBroadcastAsUser(intent, user, options); } @Override @Deprecated public void sendStickyOrderedBroadcastAsUser(Intent intent, Loading services/core/java/com/android/server/ConnectivityService.java +8 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import android.annotation.Nullable; import android.app.AlarmManager; import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; Loading Loading @@ -72,6 +73,7 @@ import android.net.RouteInfo; import android.net.UidRange; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.FileUtils; import android.os.Handler; Loading Loading @@ -1529,6 +1531,7 @@ public class ConnectivityService extends IConnectivityManager.Stub log("sendStickyBroadcast: action=" + intent.getAction()); } Bundle options = null; final long ident = Binder.clearCallingIdentity(); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { final NetworkInfo ni = intent.getParcelableExtra( Loading @@ -1536,6 +1539,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (ni.getType() == ConnectivityManager.TYPE_MOBILE_SUPL) { intent.setAction(ConnectivityManager.CONNECTIVITY_ACTION_SUPL); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); } else { BroadcastOptions opts = BroadcastOptions.makeBasic(); opts.setMaxManifestReceiverApiLevel(Build.VERSION_CODES.M); options = opts.toBundle(); } final IBatteryStats bs = BatteryStatsService.getService(); try { Loading @@ -1546,7 +1553,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } } try { mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL, options); } finally { Binder.restoreCallingIdentity(ident); } Loading Loading
core/java/android/app/BroadcastOptions.java +62 −3 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.app; import android.annotation.SystemApi; import android.os.Build; import android.os.Bundle; /** Loading @@ -28,15 +29,28 @@ import android.os.Bundle; @SystemApi public class BroadcastOptions { private long mTemporaryAppWhitelistDuration; private int mMinManifestReceiverApiLevel = 0; private int mMaxManifestReceiverApiLevel = Build.VERSION_CODES.CUR_DEVELOPMENT; /** * How long to temporarily put an app on the power whitelist when executing this broadcast * to it. * @hide */ public static final String KEY_TEMPORARY_APP_WHITELIST_DURATION static final String KEY_TEMPORARY_APP_WHITELIST_DURATION = "android:broadcast.temporaryAppWhitelistDuration"; /** * Corresponds to {@link #setMinManifestReceiverApiLevel}. */ static final String KEY_MIN_MANIFEST_RECEIVER_API_LEVEL = "android:broadcast.minManifestReceiverApiLevel"; /** * Corresponds to {@link #setMaxManifestReceiverApiLevel}. */ static final String KEY_MAX_MANIFEST_RECEIVER_API_LEVEL = "android:broadcast.maxManifestReceiverApiLevel"; public static BroadcastOptions makeBasic() { BroadcastOptions opts = new BroadcastOptions(); return opts; Loading @@ -48,6 +62,9 @@ public class BroadcastOptions { /** @hide */ public BroadcastOptions(Bundle opts) { mTemporaryAppWhitelistDuration = opts.getLong(KEY_TEMPORARY_APP_WHITELIST_DURATION); mMinManifestReceiverApiLevel = opts.getInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, 0); mMaxManifestReceiverApiLevel = opts.getInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, Build.VERSION_CODES.CUR_DEVELOPMENT); } /** Loading @@ -67,11 +84,47 @@ public class BroadcastOptions { return mTemporaryAppWhitelistDuration; } /** * Set the minimum target API level of receivers of the broadcast. If an application * is targeting an API level less than this, the broadcast will not be delivered to * them. This only applies to receivers declared in the app's AndroidManifest.xml. * @hide */ public void setMinManifestReceiverApiLevel(int apiLevel) { mMinManifestReceiverApiLevel = apiLevel; } /** * Return {@link #setMinManifestReceiverApiLevel}. * @hide */ public int getMinManifestReceiverApiLevel() { return mMinManifestReceiverApiLevel; } /** * Set the maximum target API level of receivers of the broadcast. If an application * is targeting an API level greater than this, the broadcast will not be delivered to * them. This only applies to receivers declared in the app's AndroidManifest.xml. * @hide */ public void setMaxManifestReceiverApiLevel(int apiLevel) { mMaxManifestReceiverApiLevel = apiLevel; } /** * Return {@link #setMaxManifestReceiverApiLevel}. * @hide */ public int getMaxManifestReceiverApiLevel() { return mMaxManifestReceiverApiLevel; } /** * 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. * Note that the returned Bundle is still owned by the ActivityOptions * Note that the returned Bundle is still owned by the BroadcastOptions * object; you must not modify it, but can supply it to the sendBroadcast * methods that take an options Bundle. */ Loading @@ -80,6 +133,12 @@ public class BroadcastOptions { if (mTemporaryAppWhitelistDuration > 0) { b.putLong(KEY_TEMPORARY_APP_WHITELIST_DURATION, mTemporaryAppWhitelistDuration); } if (mMinManifestReceiverApiLevel != 0) { b.putInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, mMinManifestReceiverApiLevel); } if (mMaxManifestReceiverApiLevel != Build.VERSION_CODES.CUR_DEVELOPMENT) { b.putInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, mMaxManifestReceiverApiLevel); } return b.isEmpty() ? null : b; } }
core/java/android/app/ContextImpl.java +17 −1 Original line number Diff line number Diff line Loading @@ -1093,7 +1093,23 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true, user.getIdentifier()); Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, true, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } } @Override @Deprecated public void sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options) { String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); try { intent.prepareToLeaveProcess(); ActivityManagerNative.getDefault().broadcastIntent( mMainThread.getApplicationThread(), intent, resolvedType, null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, options, false, true, user.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } Loading
core/java/android/content/Context.java +8 −0 Original line number Diff line number Diff line Loading @@ -2115,6 +2115,14 @@ public abstract class Context { public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent, UserHandle user); /** * @hide * This is just here for sending CONNECTIVITY_ACTION. */ @Deprecated public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent, UserHandle user, Bundle options); /** * <p>Version of * {@link #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)} Loading
core/java/android/content/ContextWrapper.java +7 −0 Original line number Diff line number Diff line Loading @@ -536,6 +536,13 @@ public class ContextWrapper extends Context { mBase.sendStickyBroadcastAsUser(intent, user); } /** @hide */ @Override @Deprecated public void sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options) { mBase.sendStickyBroadcastAsUser(intent, user, options); } @Override @Deprecated public void sendStickyOrderedBroadcastAsUser(Intent intent, Loading
services/core/java/com/android/server/ConnectivityService.java +8 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import android.annotation.Nullable; import android.app.AlarmManager; import android.app.BroadcastOptions; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; Loading Loading @@ -72,6 +73,7 @@ import android.net.RouteInfo; import android.net.UidRange; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.FileUtils; import android.os.Handler; Loading Loading @@ -1529,6 +1531,7 @@ public class ConnectivityService extends IConnectivityManager.Stub log("sendStickyBroadcast: action=" + intent.getAction()); } Bundle options = null; final long ident = Binder.clearCallingIdentity(); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { final NetworkInfo ni = intent.getParcelableExtra( Loading @@ -1536,6 +1539,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (ni.getType() == ConnectivityManager.TYPE_MOBILE_SUPL) { intent.setAction(ConnectivityManager.CONNECTIVITY_ACTION_SUPL); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); } else { BroadcastOptions opts = BroadcastOptions.makeBasic(); opts.setMaxManifestReceiverApiLevel(Build.VERSION_CODES.M); options = opts.toBundle(); } final IBatteryStats bs = BatteryStatsService.getService(); try { Loading @@ -1546,7 +1553,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } } try { mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL, options); } finally { Binder.restoreCallingIdentity(ident); } Loading