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

Commit eee6a6bb authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Useful annotations for BroadcastQueue.

Get ourselves some nullability and locking related annotations.

Bug: 243656033
Test: atest CtsContentTestCases:BroadcastReceiverTest
Test: atest FrameworksMockingServicesTests:BroadcastQueueTest
Change-Id: I937beb3853c1f0ce7ecadcb93e7c84a7a333660b
parent d4a3ef02
Loading
Loading
Loading
Loading
+48 −29
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.am;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Intent;
@@ -24,8 +26,11 @@ import android.os.Handler;
import android.os.IBinder;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.GuardedBy;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Objects;
import java.util.Set;

/**
@@ -34,22 +39,23 @@ import java.util.Set;
public abstract class BroadcastQueue {
    public static final String TAG = "BroadcastQueue";

    final ActivityManagerService mService;
    final Handler mHandler;
    final BroadcastConstants mConstants;
    final BroadcastSkipPolicy mSkipPolicy;
    final String mQueueName;

    BroadcastQueue(ActivityManagerService service, Handler handler,
            String name, BroadcastConstants constants, BroadcastSkipPolicy skipPolicy) {
        mService = service;
        mHandler = handler;
        mQueueName = name;
        mConstants = constants;
        mSkipPolicy = skipPolicy;
    final @NonNull ActivityManagerService mService;
    final @NonNull Handler mHandler;
    final @NonNull BroadcastConstants mConstants;
    final @NonNull BroadcastSkipPolicy mSkipPolicy;
    final @NonNull String mQueueName;

    BroadcastQueue(@NonNull ActivityManagerService service, @NonNull Handler handler,
            @NonNull String name, @NonNull BroadcastConstants constants,
            @NonNull BroadcastSkipPolicy skipPolicy) {
        mService = Objects.requireNonNull(service);
        mHandler = Objects.requireNonNull(handler);
        mQueueName = Objects.requireNonNull(name);
        mConstants = Objects.requireNonNull(constants);
        mSkipPolicy = Objects.requireNonNull(skipPolicy);
    }

    void start(ContentResolver resolver) {
    void start(@NonNull ContentResolver resolver) {
        mConstants.startObserving(mHandler, resolver);
    }

@@ -60,9 +66,11 @@ public abstract class BroadcastQueue {

    public abstract boolean isDelayBehindServices();

    public abstract BroadcastRecord getPendingBroadcastLocked();
    @GuardedBy("mService")
    public abstract @Nullable BroadcastRecord getPendingBroadcastLocked();

    public abstract BroadcastRecord getActiveBroadcastLocked();
    @GuardedBy("mService")
    public abstract @Nullable BroadcastRecord getActiveBroadcastLocked();

    /**
     * Enqueue the given broadcast to be eventually dispatched.
@@ -73,7 +81,8 @@ public abstract class BroadcastQueue {
     * When {@link Intent#FLAG_RECEIVER_REPLACE_PENDING} is set, this method
     * internally handles replacement of any matching broadcasts.
     */
    public abstract void enqueueBroadcastLocked(BroadcastRecord r);
    @GuardedBy("mService")
    public abstract void enqueueBroadcastLocked(@NonNull BroadcastRecord r);

    /**
     * Signal delivered back from a {@link BroadcastReceiver} to indicate that
@@ -85,43 +94,51 @@ public abstract class BroadcastQueue {
     * @param receiver the value to match against
     *            {@link BroadcastRecord#receiver} to identify the caller.
     */
    public abstract boolean finishReceiverLocked(IBinder receiver, int resultCode,
            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices);
    @GuardedBy("mService")
    public abstract boolean finishReceiverLocked(@NonNull IBinder receiver, int resultCode,
            @Nullable String resultData, @Nullable Bundle resultExtras, boolean resultAbort,
            boolean waitForServices);

    @GuardedBy("mService")
    public abstract void backgroundServicesFinishedLocked(int userId);

    /**
     * Signal from OS internals that the given process has just been actively
     * attached, and is ready to begin receiving broadcasts.
     */
    public abstract boolean onApplicationAttachedLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationAttachedLocked(@NonNull ProcessRecord app);

    /**
     * Signal from OS internals that the given process has timed out during
     * an attempted start and attachment.
     */
    public abstract boolean onApplicationTimeoutLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationTimeoutLocked(@NonNull ProcessRecord app);

    /**
     * Signal from OS internals that the given process, which had already been
     * previously attached, has now encountered a problem such as crashing or
     * not responding.
     */
    public abstract boolean onApplicationProblemLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationProblemLocked(@NonNull ProcessRecord app);

    /**
     * Signal from OS internals that the given process has been killed, and is
     * no longer actively running.
     */
    public abstract boolean onApplicationCleanupLocked(ProcessRecord app);
    @GuardedBy("mService")
    public abstract boolean onApplicationCleanupLocked(@NonNull ProcessRecord app);

    /**
     * Signal from OS internals that the given package (or some subset of that
     * package) has been disabled or uninstalled, and that any pending
     * broadcasts should be cleaned up.
     */
    public abstract boolean cleanupDisabledPackageReceiversLocked(
            String packageName, Set<String> filterByClasses, int userId, boolean doit);
    @GuardedBy("mService")
    public abstract boolean cleanupDisabledPackageReceiversLocked(@Nullable String packageName,
            @Nullable Set<String> filterByClasses, int userId, boolean doit);

    /**
     * Quickly determine if this queue has broadcasts that are still waiting to
@@ -134,7 +151,7 @@ public abstract class BroadcastQueue {
    /**
     * Brief summary of internal state, useful for debugging purposes.
     */
    public abstract String describeState();
    public abstract @NonNull String describeState();

    /**
     * Flush any broadcasts still waiting to be delivered, causing them to be
@@ -144,8 +161,10 @@ public abstract class BroadcastQueue {
     */
    public abstract void flush();

    public abstract void dumpDebug(ProtoOutputStream proto, long fieldId);
    public abstract void dumpDebug(@NonNull ProtoOutputStream proto, long fieldId);

    public abstract boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
            int opti, boolean dumpAll, String dumpPackage, boolean needSep);
    @GuardedBy("mService")
    public abstract boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw,
            @NonNull String[] args, int opti, boolean dumpAll, @Nullable String dumpPackage,
            boolean needSep);
}