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 Original line Diff line number Diff line
@@ -16,6 +16,8 @@


package com.android.server.am;
package com.android.server.am;


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


import com.android.internal.annotations.GuardedBy;

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


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


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


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


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


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


    public abstract boolean isDelayBehindServices();
    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.
     * 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
     * When {@link Intent#FLAG_RECEIVER_REPLACE_PENDING} is set, this method
     * internally handles replacement of any matching broadcasts.
     * 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
     * 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
     * @param receiver the value to match against
     *            {@link BroadcastRecord#receiver} to identify the caller.
     *            {@link BroadcastRecord#receiver} to identify the caller.
     */
     */
    public abstract boolean finishReceiverLocked(IBinder receiver, int resultCode,
    @GuardedBy("mService")
            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices);
    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);
    public abstract void backgroundServicesFinishedLocked(int userId);


    /**
    /**
     * Signal from OS internals that the given process has just been actively
     * Signal from OS internals that the given process has just been actively
     * attached, and is ready to begin receiving broadcasts.
     * 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
     * Signal from OS internals that the given process has timed out during
     * an attempted start and attachment.
     * 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
     * Signal from OS internals that the given process, which had already been
     * previously attached, has now encountered a problem such as crashing or
     * previously attached, has now encountered a problem such as crashing or
     * not responding.
     * 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
     * Signal from OS internals that the given process has been killed, and is
     * no longer actively running.
     * 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
     * Signal from OS internals that the given package (or some subset of that
     * package) has been disabled or uninstalled, and that any pending
     * package) has been disabled or uninstalled, and that any pending
     * broadcasts should be cleaned up.
     * broadcasts should be cleaned up.
     */
     */
    public abstract boolean cleanupDisabledPackageReceiversLocked(
    @GuardedBy("mService")
            String packageName, Set<String> filterByClasses, int userId, boolean doit);
    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
     * 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.
     * 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
     * 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 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,
    @GuardedBy("mService")
            int opti, boolean dumpAll, String dumpPackage, boolean needSep);
    public abstract boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw,
            @NonNull String[] args, int opti, boolean dumpAll, @Nullable String dumpPackage,
            boolean needSep);
}
}