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

Commit 28faced9 authored by Fyodor Kupolov's avatar Fyodor Kupolov Committed by Android (Google) Code Review
Browse files

Merge "Added dontSendToRestrictedApps broadcast option" into pi-dev

parents bb96c13c da26eb33
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -317,6 +317,7 @@ package android.app {


  public class BroadcastOptions {
  public class BroadcastOptions {
    method public static android.app.BroadcastOptions makeBasic();
    method public static android.app.BroadcastOptions makeBasic();
    method public void setDontSendToRestrictedApps(boolean);
    method public void setTemporaryAppWhitelistDuration(long);
    method public void setTemporaryAppWhitelistDuration(long);
    method public android.os.Bundle toBundle();
    method public android.os.Bundle toBundle();
  }
  }
+28 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ public class BroadcastOptions {
    private long mTemporaryAppWhitelistDuration;
    private long mTemporaryAppWhitelistDuration;
    private int mMinManifestReceiverApiLevel = 0;
    private int mMinManifestReceiverApiLevel = 0;
    private int mMaxManifestReceiverApiLevel = Build.VERSION_CODES.CUR_DEVELOPMENT;
    private int mMaxManifestReceiverApiLevel = Build.VERSION_CODES.CUR_DEVELOPMENT;
    private boolean mDontSendToRestrictedApps = false;


    /**
    /**
     * How long to temporarily put an app on the power whitelist when executing this broadcast
     * How long to temporarily put an app on the power whitelist when executing this broadcast
@@ -52,6 +53,12 @@ public class BroadcastOptions {
    static final String KEY_MAX_MANIFEST_RECEIVER_API_LEVEL
    static final String KEY_MAX_MANIFEST_RECEIVER_API_LEVEL
            = "android:broadcast.maxManifestReceiverApiLevel";
            = "android:broadcast.maxManifestReceiverApiLevel";


    /**
     * Corresponds to {@link #setMaxManifestReceiverApiLevel}.
     */
    static final String KEY_DONT_SEND_TO_RESTRICTED_APPS =
            "android:broadcast.dontSendToRestrictedApps";

    public static BroadcastOptions makeBasic() {
    public static BroadcastOptions makeBasic() {
        BroadcastOptions opts = new BroadcastOptions();
        BroadcastOptions opts = new BroadcastOptions();
        return opts;
        return opts;
@@ -66,6 +73,7 @@ public class BroadcastOptions {
        mMinManifestReceiverApiLevel = opts.getInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, 0);
        mMinManifestReceiverApiLevel = opts.getInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, 0);
        mMaxManifestReceiverApiLevel = opts.getInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL,
        mMaxManifestReceiverApiLevel = opts.getInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL,
                Build.VERSION_CODES.CUR_DEVELOPMENT);
                Build.VERSION_CODES.CUR_DEVELOPMENT);
        mDontSendToRestrictedApps = opts.getBoolean(KEY_DONT_SEND_TO_RESTRICTED_APPS, false);
    }
    }


    /**
    /**
@@ -122,6 +130,23 @@ public class BroadcastOptions {
        return mMaxManifestReceiverApiLevel;
        return mMaxManifestReceiverApiLevel;
    }
    }


    /**
     * Sets whether pending intent can be sent for an application with background restrictions
     * @param dontSendToRestrictedApps if true, pending intent will not be sent for an application
     * with background restrictions. Default value is {@code false}
     */
    public void setDontSendToRestrictedApps(boolean dontSendToRestrictedApps) {
        mDontSendToRestrictedApps = dontSendToRestrictedApps;
    }

    /**
     * @hide
     * @return #setDontSendToRestrictedApps
     */
    public boolean isDontSendToRestrictedApps() {
        return mDontSendToRestrictedApps;
    }

    /**
    /**
     * Returns the created options as a Bundle, which can be passed to
     * Returns the created options as a Bundle, which can be passed to
     * {@link android.content.Context#sendBroadcast(android.content.Intent)
     * {@link android.content.Context#sendBroadcast(android.content.Intent)
@@ -141,6 +166,9 @@ public class BroadcastOptions {
        if (mMaxManifestReceiverApiLevel != Build.VERSION_CODES.CUR_DEVELOPMENT) {
        if (mMaxManifestReceiverApiLevel != Build.VERSION_CODES.CUR_DEVELOPMENT) {
            b.putInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, mMaxManifestReceiverApiLevel);
            b.putInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, mMaxManifestReceiverApiLevel);
        }
        }
        if (mDontSendToRestrictedApps) {
            b.putBoolean(KEY_DONT_SEND_TO_RESTRICTED_APPS, true);
        }
        return b.isEmpty() ? null : b;
        return b.isEmpty() ? null : b;
    }
    }
}
}
+13 −3
Original line number Original line Diff line number Diff line
@@ -12959,9 +12959,13 @@ public class ActivityManagerService extends IActivityManager.Stub
        } catch (RemoteException exc) {
        } catch (RemoteException exc) {
            // Ignore.
            // Ignore.
        }
        }
        return isBackgroundRestrictedNoCheck(callingUid, packageName);
    }
    boolean isBackgroundRestrictedNoCheck(final int uid, final String packageName) {
        final int mode = mAppOpsService.checkOperation(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
        final int mode = mAppOpsService.checkOperation(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
                callingUid, packageName);
                uid, packageName);
        return (mode != AppOpsManager.MODE_ALLOWED);
        return mode != AppOpsManager.MODE_ALLOWED;
    }
    }
    @Override
    @Override
@@ -21056,6 +21060,7 @@ public class ActivityManagerService extends IActivityManager.Stub
            }
            }
        }
        }
        final String action = intent.getAction();
        BroadcastOptions brOptions = null;
        BroadcastOptions brOptions = null;
        if (bOptions != null) {
        if (bOptions != null) {
            brOptions = new BroadcastOptions(bOptions);
            brOptions = new BroadcastOptions(bOptions);
@@ -21076,11 +21081,16 @@ public class ActivityManagerService extends IActivityManager.Stub
                    throw new SecurityException(msg);
                    throw new SecurityException(msg);
                }
                }
            }
            }
            if (brOptions.isDontSendToRestrictedApps()
                    && isBackgroundRestrictedNoCheck(callingUid, callerPackage)) {
                Slog.i(TAG, "Not sending broadcast " + action + " - app " + callerPackage
                        + " has background restrictions");
                return ActivityManager.START_CANCELED;
            }
        }
        }
        // Verify that protected broadcasts are only being sent by system code,
        // Verify that protected broadcasts are only being sent by system code,
        // and that system code is only sending protected broadcasts.
        // and that system code is only sending protected broadcasts.
        final String action = intent.getAction();
        final boolean isProtectedBroadcast;
        final boolean isProtectedBroadcast;
        try {
        try {
            isProtectedBroadcast = AppGlobals.getPackageManager().isProtectedBroadcast(action);
            isProtectedBroadcast = AppGlobals.getPackageManager().isProtectedBroadcast(action);