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

Commit 07797135 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Add a shell commd to ignore delivery group policies.

As we are updating broadcasts to make use of the delivery
group policies, this would allow us to quickly turn off
the policy for a broadcast when something breaks to confirm
if it is because of the policy change.

Bug: 249425990
Test: manual
Change-Id: I434c487a44cf9aa895919c6769fbe36a2d757bee
parent a13d8ed4
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -328,6 +328,7 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.EventLog;
import android.util.FeatureFlagUtils;
import android.util.IndentingPrintWriter;
import android.util.IntArray;
import android.util.Log;
import android.util.Pair;
@@ -759,6 +760,9 @@ public class ActivityManagerService extends IActivityManager.Stub
    final AppErrors mAppErrors;
    final PackageWatchdog mPackageWatchdog;
    @GuardedBy("mDeliveryGroupPolicyIgnoredActions")
    private final ArraySet<String> mDeliveryGroupPolicyIgnoredActions = new ArraySet();
    /**
     * Uids of apps with current active camera sessions.  Access synchronized on
     * the IntArray instance itself, and no other locks must be acquired while that
@@ -18332,6 +18336,37 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
    }
    void setIgnoreDeliveryGroupPolicy(@NonNull String broadcastAction) {
        Objects.requireNonNull(broadcastAction);
        enforceCallingPermission(permission.DUMP, "waitForBroadcastBarrier()");
        synchronized (mDeliveryGroupPolicyIgnoredActions) {
            mDeliveryGroupPolicyIgnoredActions.add(broadcastAction);
        }
    }
    void clearIgnoreDeliveryGroupPolicy(@NonNull String broadcastAction) {
        Objects.requireNonNull(broadcastAction);
        enforceCallingPermission(permission.DUMP, "waitForBroadcastBarrier()");
        synchronized (mDeliveryGroupPolicyIgnoredActions) {
            mDeliveryGroupPolicyIgnoredActions.remove(broadcastAction);
        }
    }
    boolean shouldIgnoreDeliveryGroupPolicy(@Nullable String broadcastAction) {
        if (broadcastAction == null) {
            return false;
        }
        synchronized (mDeliveryGroupPolicyIgnoredActions) {
            return mDeliveryGroupPolicyIgnoredActions.contains(broadcastAction);
        }
    }
    void dumpDeliveryGroupPolicyIgnoredActions(IndentingPrintWriter ipw) {
        synchronized (mDeliveryGroupPolicyIgnoredActions) {
            ipw.println(mDeliveryGroupPolicyIgnoredActions);
        }
    }
    @Override
    @ReasonCode
    public int getBackgroundRestrictionExemptionReason(int uid) {
+20 −1
Original line number Diff line number Diff line
@@ -345,6 +345,10 @@ final class ActivityManagerShellCommand extends ShellCommand {
                    return runWaitForBroadcastIdle(pw);
                case "wait-for-broadcast-barrier":
                    return runWaitForBroadcastBarrier(pw);
                case "set-ignore-delivery-group-policy":
                    return runSetIgnoreDeliveryGroupPolicy(pw);
                case "clear-ignore-delivery-group-policy":
                    return runClearIgnoreDeliveryGroupPolicy(pw);
                case "compat":
                    return runCompat(pw);
                case "refresh-settings-cache":
@@ -3145,6 +3149,18 @@ final class ActivityManagerShellCommand extends ShellCommand {
        return 0;
    }

    int runSetIgnoreDeliveryGroupPolicy(PrintWriter pw) throws RemoteException {
        final String broadcastAction = getNextArgRequired();
        mInternal.setIgnoreDeliveryGroupPolicy(broadcastAction);
        return 0;
    }

    int runClearIgnoreDeliveryGroupPolicy(PrintWriter pw) throws RemoteException {
        final String broadcastAction = getNextArgRequired();
        mInternal.clearIgnoreDeliveryGroupPolicy(broadcastAction);
        return 0;
    }

    int runRefreshSettingsCache() throws RemoteException {
        mInternal.refreshSettingsCache();
        return 0;
@@ -4029,7 +4045,10 @@ final class ActivityManagerShellCommand extends ShellCommand {
                    + "background.");
            pw.println("  set-foreground-service-delegate [--user <USER_ID>] <PACKAGE> start|stop");
            pw.println("         Start/stop an app's foreground service delegate.");
            pw.println();
            pw.println("  set-ignore-delivery-group-policy <ACTION>");
            pw.println("         Start ignoring delivery group policy set for a broadcast action");
            pw.println("  clear-ignore-delivery-group-policy <ACTION>");
            pw.println("         Stop ignoring delivery group policy set for a broadcast action");
            Intent.printIntentArgsHelp(pw, "");
        }
    }
+9 −0
Original line number Diff line number Diff line
@@ -648,6 +648,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
    }

    private void applyDeliveryGroupPolicy(@NonNull BroadcastRecord r) {
        if (mService.shouldIgnoreDeliveryGroupPolicy(r.intent.getAction())) {
            return;
        }
        final int policy = (r.options != null)
                ? r.options.getDeliveryGroupPolicy() : BroadcastOptions.DELIVERY_GROUP_POLICY_ALL;
        final BroadcastConsumer broadcastConsumer;
@@ -1685,6 +1688,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
        ipw.decreaseIndent();
        ipw.println();

        ipw.println(" Broadcasts with ignored delivery group policies:");
        ipw.increaseIndent();
        mService.dumpDeliveryGroupPolicyIgnoredActions(ipw);
        ipw.decreaseIndent();
        ipw.println();

        if (dumpConstants) {
            mConstants.dump(ipw);
        }