diff options
| -rw-r--r-- | api/system-current.txt | 5 | ||||
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 14 | ||||
| -rw-r--r-- | core/java/android/content/BroadcastReceiver.java | 17 | ||||
| -rw-r--r-- | core/java/android/content/Context.java | 31 | ||||
| -rw-r--r-- | core/java/android/content/ContextWrapper.java | 11 | ||||
| -rw-r--r-- | test-mock/src/android/test/mock/MockContext.java | 8 |
6 files changed, 86 insertions, 0 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index b46090abc2e4..995d0c001098 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1355,6 +1355,10 @@ package android.bluetooth.le { package android.content { + public abstract class BroadcastReceiver { + method @NonNull public final android.os.UserHandle getSendingUser(); + } + public class ContentProviderClient implements java.lang.AutoCloseable { method @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(long); } @@ -1371,6 +1375,7 @@ package android.content { method @NonNull public android.content.Context createPackageContextAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method @Nullable public abstract java.io.File getPreloadsFileCache(); method public abstract boolean isCredentialProtectedStorage(); + method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public android.content.Intent registerReceiverForAllUsers(@Nullable android.content.BroadcastReceiver, @NonNull android.content.IntentFilter, @Nullable String, @Nullable android.os.Handler); method public abstract void sendBroadcast(android.content.Intent, @Nullable String, @Nullable android.os.Bundle); method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String, @Nullable android.os.Bundle); method public abstract void sendOrderedBroadcast(@NonNull android.content.Intent, @Nullable String, @Nullable android.os.Bundle, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle); diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 794ffcb83078..0e0e7f769651 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -127,6 +127,13 @@ class ReceiverRestrictedContext extends ContextWrapper { } @Override + public Intent registerReceiverForAllUsers(BroadcastReceiver receiver, IntentFilter filter, + String broadcastPermission, Handler scheduler) { + return registerReceiverAsUser( + receiver, UserHandle.ALL, filter, broadcastPermission, scheduler); + } + + @Override public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler) { if (receiver == null) { @@ -1520,6 +1527,13 @@ class ContextImpl extends Context { } @Override + public Intent registerReceiverForAllUsers(BroadcastReceiver receiver, + IntentFilter filter, String broadcastPermission, Handler scheduler) { + return registerReceiverAsUser(receiver, UserHandle.ALL, + filter, broadcastPermission, scheduler); + } + + @Override public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler) { return registerReceiverInternal(receiver, user.getIdentifier(), diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java index 8691ed43ac81..f73a376dfc69 100644 --- a/core/java/android/content/BroadcastReceiver.java +++ b/core/java/android/content/BroadcastReceiver.java @@ -16,6 +16,8 @@ package android.content; +import android.annotation.NonNull; +import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; import android.app.ActivityManager; import android.app.ActivityThread; @@ -25,6 +27,7 @@ import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; +import android.os.UserHandle; import android.util.Log; import android.util.Slog; @@ -623,6 +626,20 @@ public abstract class BroadcastReceiver { return mPendingResult; } + /** + * Returns the user that the broadcast was sent to. + * + * <p>It can be used in a receiver registered by + * {@link Context#registerReceiverForAllUsers Context.registerReceiverForAllUsers()} + * to determine on which user the broadcast was sent. + * + * @hide + */ + @SystemApi + public final @NonNull UserHandle getSendingUser() { + return UserHandle.of(getSendingUserId()); + } + /** @hide */ public int getSendingUserId() { return mPendingResult.mSendingUser; diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 4b22166a9688..507d1d82330c 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2795,6 +2795,37 @@ public abstract class Context { @Nullable Handler scheduler, @RegisterReceiverFlags int flags); /** + * Same as {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)} + * but this receiver will receive broadcasts that are sent to all users. The receiver can + * use {@link BroadcastReceiver#getSendingUser} to determine on which user the broadcast + * was sent. + * + * @param receiver The BroadcastReceiver to handle the broadcast. + * @param filter Selects the Intent broadcasts to be received. + * @param broadcastPermission String naming a permissions that a + * broadcaster must hold in order to send an Intent to you. If {@code null}, + * no permission is required. + * @param scheduler Handler identifying the thread that will receive + * the Intent. If {@code null}, the main thread of the process will be used. + * + * @return The first sticky intent found that matches <var>filter</var>, + * or {@code null} if there are none. + * + * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler) + * @see #sendBroadcast + * @see #unregisterReceiver + * @hide + */ + @Nullable + @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) + @SystemApi + public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver, + @NonNull IntentFilter filter, @Nullable String broadcastPermission, + @Nullable Handler scheduler) { + throw new RuntimeException("Not implemented. Must override in a subclass."); + } + + /** * @hide * Same as {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler) * but for a specific user. This receiver will receiver broadcasts that diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 428aadb5c3f6..497e2fd60447 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -664,6 +664,17 @@ public class ContextWrapper extends Context { /** @hide */ @Override + @Nullable + @SystemApi + public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver, + @NonNull IntentFilter filter, @Nullable String broadcastPermission, + @Nullable Handler scheduler) { + return mBase.registerReceiverForAllUsers(receiver, filter, broadcastPermission, + scheduler); + } + + /** @hide */ + @Override @UnsupportedAppUsage public Intent registerReceiverAsUser( BroadcastReceiver receiver, UserHandle user, IntentFilter filter, diff --git a/test-mock/src/android/test/mock/MockContext.java b/test-mock/src/android/test/mock/MockContext.java index 1de6260f3719..45b236c307c3 100644 --- a/test-mock/src/android/test/mock/MockContext.java +++ b/test-mock/src/android/test/mock/MockContext.java @@ -535,6 +535,14 @@ public class MockContext extends Context { /** @hide */ @Override + @SystemApi + public Intent registerReceiverForAllUsers(BroadcastReceiver receiver, + IntentFilter filter, String broadcastPermission, Handler scheduler) { + throw new UnsupportedOperationException(); + } + + /** @hide */ + @Override public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler) { throw new UnsupportedOperationException(); |