Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b4163a6e authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Add APIs for interacting across users.

- Expose the existing Context.sendBroadcast() as
  Context.sendBroadcastAsUser().
- Add new android:singleUser attribute for services.
- Add new INTERACT_ACROSS_USERS_FULL permission for full
  system-level access to cross-user interface (allows
  sendBroadcastAsUser() to send to any receiver).
- Add new INTERACT_ACROSS_USERS_FULL permission for
  more restricted cross-user interaction: this is required
  for android:singleUser, and allows you to use
  sendBroadcastAsUser() but only to send to your own
  receivers.

Change-Id: I0de88f6718e9505f4de72e3f45d29c0f503b76e9
parent b1758cf8
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ package android {
    field public static final java.lang.String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
    field public static final java.lang.String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER";
    field public static final java.lang.String INSTALL_PACKAGES = "android.permission.INSTALL_PACKAGES";
    field public static final java.lang.String INTERACT_ACROSS_USERS = "android.permission.INTERACT_ACROSS_USERS";
    field public static final java.lang.String INTERNAL_SYSTEM_WINDOW = "android.permission.INTERNAL_SYSTEM_WINDOW";
    field public static final java.lang.String INTERNET = "android.permission.INTERNET";
    field public static final java.lang.String KILL_BACKGROUND_PROCESSES = "android.permission.KILL_BACKGROUND_PROCESSES";
@@ -893,6 +894,7 @@ package android {
    field public static final int shownWeekCount = 16843585; // 0x1010341
    field public static final int shrinkColumns = 16843082; // 0x101014a
    field public static final deprecated int singleLine = 16843101; // 0x101015d
    field public static final int singleUser = 16843711; // 0x10103bf
    field public static final int smallIcon = 16843422; // 0x101029e
    field public static final int smallScreens = 16843396; // 0x1010284
    field public static final int smoothScrollbar = 16843313; // 0x1010231
@@ -5317,6 +5319,7 @@ package android.content {
    method public abstract void revokeUriPermission(android.net.Uri, int);
    method public abstract void sendBroadcast(android.content.Intent);
    method public abstract void sendBroadcast(android.content.Intent, java.lang.String);
    method public void sendBroadcastToUser(android.content.Intent, int);
    method public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String);
    method public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    method public abstract void sendStickyBroadcast(android.content.Intent);
@@ -6700,6 +6703,7 @@ package android.content.pm {
    method public void dump(android.util.Printer, java.lang.String);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final int FLAG_ISOLATED_PROCESS = 2; // 0x2
    field public static final int FLAG_SINGLE_USER = 4; // 0x4
    field public static final int FLAG_STOP_WITH_TASK = 1; // 0x1
    field public int flags;
    field public java.lang.String permission;
+1 −1
Original line number Diff line number Diff line
@@ -896,7 +896,7 @@ public class AccountManagerService
    private void sendAccountsChangedBroadcast(int userId) {
        Log.i(TAG, "the accounts changed, sending broadcast of "
                + ACCOUNTS_CHANGED_INTENT.getAction());
        mContext.sendBroadcast(ACCOUNTS_CHANGED_INTENT, userId);
        mContext.sendBroadcastToUser(ACCOUNTS_CHANGED_INTENT, userId);
    }

    public void clearPassword(Account account) {
+1 −2
Original line number Diff line number Diff line
@@ -966,9 +966,8 @@ class ContextImpl extends Context {
        }
    }

    /** @hide */
    @Override
    public void sendBroadcast(Intent intent, int userId) {
    public void sendBroadcastToUser(Intent intent, int userId) {
        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
        try {
            intent.setAllowFds(false);
+5 −3
Original line number Diff line number Diff line
@@ -988,12 +988,14 @@ public abstract class Context {
    public abstract void sendBroadcast(Intent intent);

    /**
     * Same as #sendBroadcast(Intent intent), but for a specific user. Used by the system only.
     * Same as #sendBroadcast(Intent intent), but for a specific user.  This broadcast
     * can only be sent to receivers that are part of the calling application.  It
     * requires holding the {@link android.Manifest.permission#INTERACT_ACROSS_USERS}
     * permission.
     * @param intent the intent to broadcast
     * @param userId user to send the intent to
     * @hide
     */
    public void sendBroadcast(Intent intent, int userId) {
    public void sendBroadcastToUser(Intent intent, int userId) {
        throw new RuntimeException("Not implemented. Must override in a subclass.");
    }

+2 −3
Original line number Diff line number Diff line
@@ -312,10 +312,9 @@ public class ContextWrapper extends Context {
        mBase.sendBroadcast(intent);
    }

    /** @hide */
    @Override
    public void sendBroadcast(Intent intent, int userId) {
        mBase.sendBroadcast(intent, userId);
    public void sendBroadcastToUser(Intent intent, int userId) {
        mBase.sendBroadcastToUser(intent, userId);
    }

    @Override
Loading