System API: Context#registerReceiverForAllUsers

Bug: 141193711
Test: make
Change-Id: Ie692d2ac27474b9fe11f5548bc504aa00c5ad53c
This commit is contained in:
Meng Wang
2019-11-05 10:43:45 -08:00
parent ff671494e5
commit 3f9e036f11
6 changed files with 86 additions and 0 deletions

View File

@@ -1373,6 +1373,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);
}
@@ -1389,6 +1393,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);

View File

@@ -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) {
@@ -1530,6 +1537,13 @@ class ContextImpl extends Context {
filter, broadcastPermission, scheduler, getOuterContext(), flags);
}
@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) {

View File

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

View File

@@ -2817,6 +2817,37 @@ public abstract class Context {
IntentFilter filter, @Nullable String broadcastPermission,
@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)

View File

@@ -668,6 +668,17 @@ public class ContextWrapper extends Context {
scheduler, flags);
}
/** @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

View File

@@ -533,6 +533,14 @@ public class MockContext extends Context {
throw new UnsupportedOperationException();
}
/** @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,