19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackbornimport android.app.AppOpsManager;
20a750a63d639f6936af456df904fa6b9ba941885eDianne Hackbornimport android.app.BroadcastOptions;
211ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
30ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwaleimport android.os.UserHandle;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.PrintWriterPrinter;
3239792d2262352ae775091876d5488d2412a2ff92Dianne Hackbornimport android.util.TimeUtils;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
35865907db099eed08cac7ab177161361f5c82e656Dianne Hackbornimport java.text.SimpleDateFormat;
36d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolovimport java.util.Arrays;
37d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackbornimport java.util.Date;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
39ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwaleimport java.util.Set;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An active intent broadcast.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
44be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class BroadcastRecord extends Binder {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Intent intent;    // the original intent that generated us
46a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn    final ComponentName targetComp; // original component name set on the intent
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ProcessRecord callerApp; // process that sent this
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final String callerPackage; // who sent this
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final int callingPid;   // the pid of who sent this
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final int callingUid;   // the uid of who sent this
51816c83bf037e2284a61ac8e918ff882d162d9321Chad Brubaker    final boolean callerInstantApp; // caller is an Instant App?
5268d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn    final boolean ordered;  // serialize the send to receivers?
5368d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn    final boolean sticky;   // originated from existing sticky data?
5412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn    final boolean initialSticky; // initial broadcast from register to sticky?
55786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn    final int userId;       // user id this broadcast was for
5649660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver    final String resolvedType; // the resolved data type
57d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov    final String[] requiredPermissions; // permissions the caller has required
58f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    final int appOp;        // an app op that is associated with this broadcast
59a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn    final BroadcastOptions options; // BroadcastOptions supplied by caller
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final List receivers;   // contains BroadcastFilter and ResolveInfo
61e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    final int[] delivery;   // delivery state of each receiver
62b5a8654dea9ea8443b41f8ff3668ae4074e13a07Johannes Carlsson    IIntentReceiver resultTo; // who receives final result if non-null
639fb3fd1d666aac3e8d889bead4109690b1484aacJeff Brown    long enqueueClockTime;  // the clock time the broadcast was enqueued
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long dispatchTime;      // when dispatch started on this set of receivers
65d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn    long dispatchClockTime; // the clock time the dispatch started
6612527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn    long receiverTime;      // when current receiver started for timeouts.
6712527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn    long finishTime;        // when we finished the broadcast.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int resultCode;         // current result code value.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String resultData;      // current result data value.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Bundle resultExtras;    // current result extra data values.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean resultAbort;    // current result abortBroadcast value.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int nextReceiver;       // next receiver to be executed.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IBinder receiver;       // who is currently running, null if none.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int state;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int anrCount;           // has this broadcast record hit any ANRs?
76bc02a3901dea52d236dd855722191155156cb856Dianne Hackborn    int manifestCount;      // number of manifest receivers dispatched.
77bc02a3901dea52d236dd855722191155156cb856Dianne Hackborn    int manifestSkipCount;  // number of manifest receivers skipped.
7840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    BroadcastQueue queue;   // the outbound queue handling this broadcast
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int IDLE = 0;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int APP_RECEIVE = 1;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int CALL_IN_RECEIVE = 2;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int CALL_DONE_RECEIVE = 3;
846285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    static final int WAITING_SERVICES = 4;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    static final int DELIVERY_PENDING = 0;
87e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    static final int DELIVERY_DELIVERED = 1;
88e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    static final int DELIVERY_SKIPPED = 2;
89e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    static final int DELIVERY_TIMEOUT = 3;
90e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // The following are set when we are calling a receiver (one that
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // was found in our list of registered receivers).
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BroadcastFilter curFilter;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // The following are set only when we are launching a receiver (one
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // that was found by querying the package manager).
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProcessRecord curApp;       // hosting application of current receiver.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ComponentName curComponent; // the receiver class that is currently running.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ActivityInfo curReceiver;   // info about the receiver that is currently running.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
101865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn    void dump(PrintWriter pw, String prefix, SimpleDateFormat sdf) {
10239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        final long now = SystemClock.uptimeMillis();
10339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
104786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        pw.print(prefix); pw.print(this); pw.print(" to user "); pw.println(userId);
105c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        pw.print(prefix); pw.println(intent.toInsecureString());
106a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn        if (targetComp != null && targetComp != intent.getComponent()) {
107a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn            pw.print(prefix); pw.print("  targetComp: "); pw.println(targetComp.toShortString());
108a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn        }
109c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        Bundle bundle = intent.getExtras();
110c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        if (bundle != null) {
111a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn            pw.print(prefix); pw.print("  extras: "); pw.println(bundle.toString());
11212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
113043fcd9847a804bc6394728e5785aecc495e6347Dianne Hackborn        pw.print(prefix); pw.print("caller="); pw.print(callerPackage); pw.print(" ");
114043fcd9847a804bc6394728e5785aecc495e6347Dianne Hackborn                pw.print(callerApp != null ? callerApp.toShortString() : "null");
11539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                pw.print(" pid="); pw.print(callingPid);
11639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                pw.print(" uid="); pw.println(callingUid);
117d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov        if ((requiredPermissions != null && requiredPermissions.length > 0)
118d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov                || appOp != AppOpsManager.OP_NONE) {
119d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov            pw.print(prefix); pw.print("requiredPermissions=");
120d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov            pw.print(Arrays.toString(requiredPermissions));
121d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov            pw.print("  appOp="); pw.println(appOp);
12212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
123a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn        if (options != null) {
124a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn            pw.print(prefix); pw.print("options="); pw.println(options.toBundle());
125a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn        }
1269fb3fd1d666aac3e8d889bead4109690b1484aacJeff Brown        pw.print(prefix); pw.print("enqueueClockTime=");
127865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn                pw.print(sdf.format(new Date(enqueueClockTime)));
1289fb3fd1d666aac3e8d889bead4109690b1484aacJeff Brown                pw.print(" dispatchClockTime=");
129865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn                pw.println(sdf.format(new Date(dispatchClockTime)));
13039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        pw.print(prefix); pw.print("dispatchTime=");
13139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                TimeUtils.formatDuration(dispatchTime, now, pw);
132865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn                pw.print(" (");
133865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn                TimeUtils.formatDuration(dispatchClockTime-enqueueClockTime, pw);
134865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn                pw.print(" since enq)");
13512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (finishTime != 0) {
13639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(" finishTime="); TimeUtils.formatDuration(finishTime, now, pw);
137865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn            pw.print(" (");
138865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn            TimeUtils.formatDuration(finishTime-dispatchTime, pw);
139865907db099eed08cac7ab177161361f5c82e656Dianne Hackborn            pw.print(" since disp)");
14012527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        } else {
14139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(" receiverTime="); TimeUtils.formatDuration(receiverTime, now, pw);
14212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
14339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        pw.println("");
14412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (anrCount != 0) {
14539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("anrCount="); pw.println(anrCount);
14612527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
14712527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (resultTo != null || resultCode != -1 || resultData != null) {
14839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("resultTo="); pw.print(resultTo);
14939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    pw.print(" resultCode="); pw.print(resultCode);
15039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    pw.print(" resultData="); pw.println(resultData);
15112527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
15212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (resultExtras != null) {
15339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("resultExtras="); pw.println(resultExtras);
15412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
15512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (resultAbort || ordered || sticky || initialSticky) {
15639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("resultAbort="); pw.print(resultAbort);
15739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    pw.print(" ordered="); pw.print(ordered);
15839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    pw.print(" sticky="); pw.print(sticky);
15939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    pw.print(" initialSticky="); pw.println(initialSticky);
16012527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
16112527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (nextReceiver != 0 || receiver != null) {
16239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("nextReceiver="); pw.print(nextReceiver);
16339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    pw.print(" receiver="); pw.println(receiver);
16412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
16512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (curFilter != null) {
16639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("curFilter="); pw.println(curFilter);
16712527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
16812527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (curReceiver != null) {
16939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("curReceiver="); pw.println(curReceiver);
17012527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (curApp != null) {
17239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("curApp="); pw.println(curApp);
17339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            pw.print(prefix); pw.print("curComponent=");
17439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    pw.println((curComponent != null ? curComponent.toShortString() : "--"));
175399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn            if (curReceiver != null && curReceiver.applicationInfo != null) {
17639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                pw.print(prefix); pw.print("curSourceDir=");
17739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                        pw.println(curReceiver.applicationInfo.sourceDir);
178399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn            }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
180786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        if (state != IDLE) {
181786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn            String stateStr = " (?)";
182786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn            switch (state) {
183786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn                case APP_RECEIVE:       stateStr=" (APP_RECEIVE)"; break;
184786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn                case CALL_IN_RECEIVE:   stateStr=" (CALL_IN_RECEIVE)"; break;
185786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn                case CALL_DONE_RECEIVE: stateStr=" (CALL_DONE_RECEIVE)"; break;
1866285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                case WAITING_SERVICES:  stateStr=" (WAITING_SERVICES)"; break;
187786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn            }
188786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn            pw.print(prefix); pw.print("state="); pw.print(state); pw.println(stateStr);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = receivers != null ? receivers.size() : 0;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String p2 = prefix + "  ";
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PrintWriterPrinter printer = new PrintWriterPrinter(pw);
193ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        for (int i = 0; i < N; i++) {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Object o = receivers.get(i);
195e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            pw.print(prefix);
196e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            switch (delivery[i]) {
197e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                case DELIVERY_PENDING:   pw.print("Pending"); break;
198e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                case DELIVERY_DELIVERED: pw.print("Deliver"); break;
199e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                case DELIVERY_SKIPPED:   pw.print("Skipped"); break;
200e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                case DELIVERY_TIMEOUT:   pw.print("Timeout"); break;
201e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                default:                 pw.print("???????"); break;
202e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            }
203e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            pw.print(" #"); pw.print(i); pw.print(": ");
204e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            if (o instanceof BroadcastFilter) {
205e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                pw.println(o);
206e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                ((BroadcastFilter) o).dumpBrief(pw, p2);
207e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            } else if (o instanceof ResolveInfo) {
208e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                pw.println("(manifest)");
209e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                ((ResolveInfo) o).dump(printer, p2, 0);
210e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            } else {
211e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn                pw.println(o);
212e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn            }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    BroadcastRecord(BroadcastQueue _queue,
217f46723b41f723ebfc9ed18c7c409b319f4b5e539Christopher Tate            Intent _intent, ProcessRecord _callerApp, String _callerPackage,
218816c83bf037e2284a61ac8e918ff882d162d9321Chad Brubaker            int _callingPid, int _callingUid, boolean _callerInstantApp, String _resolvedType,
219816c83bf037e2284a61ac8e918ff882d162d9321Chad Brubaker            String[] _requiredPermissions, int _appOp, BroadcastOptions _options, List _receivers,
220816c83bf037e2284a61ac8e918ff882d162d9321Chad Brubaker            IIntentReceiver _resultTo, int _resultCode, String _resultData, Bundle _resultExtras,
221816c83bf037e2284a61ac8e918ff882d162d9321Chad Brubaker            boolean _serialized, boolean _sticky, boolean _initialSticky, int _userId) {
222448489a991773b58f4be4ef06553a8a0b235f78bDianne Hackborn        if (_intent == null) {
223448489a991773b58f4be4ef06553a8a0b235f78bDianne Hackborn            throw new NullPointerException("Can't construct with a null intent");
224448489a991773b58f4be4ef06553a8a0b235f78bDianne Hackborn        }
225f46723b41f723ebfc9ed18c7c409b319f4b5e539Christopher Tate        queue = _queue;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        intent = _intent;
227a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn        targetComp = _intent.getComponent();
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callerApp = _callerApp;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callerPackage = _callerPackage;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callingPid = _callingPid;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callingUid = _callingUid;
232816c83bf037e2284a61ac8e918ff882d162d9321Chad Brubaker        callerInstantApp = _callerInstantApp;
23349660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        resolvedType = _resolvedType;
234d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov        requiredPermissions = _requiredPermissions;
235f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        appOp = _appOp;
236a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn        options = _options;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        receivers = _receivers;
238e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn        delivery = new int[_receivers != null ? _receivers.size() : 0];
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resultTo = _resultTo;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resultCode = _resultCode;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resultData = _resultData;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resultExtras = _resultExtras;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ordered = _serialized;
24468d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn        sticky = _sticky;
24512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        initialSticky = _initialSticky;
246786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        userId = _userId;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nextReceiver = 0;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        state = IDLE;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
251ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale    boolean cleanupDisabledPackageReceiversLocked(
252ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            String packageName, Set<String> filterByClasses, int userId, boolean doit) {
253ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        if ((userId != UserHandle.USER_ALL && this.userId != userId) || receivers == null) {
254ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            return false;
255ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        }
256ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale
257ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        boolean didSomething = false;
258ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        Object o;
259ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        for (int i = receivers.size() - 1; i >= 0; i--) {
260ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            o = receivers.get(i);
261ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            if (!(o instanceof ResolveInfo)) {
262ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                continue;
263ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            }
264ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            ActivityInfo info = ((ResolveInfo)o).activityInfo;
265ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale
266ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            final boolean sameComponent = packageName == null
267ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                    || (info.applicationInfo.packageName.equals(packageName)
268ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                    && (filterByClasses == null || filterByClasses.contains(info.name)));
269ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            if (sameComponent) {
270ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                if (!doit) {
271ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                    return true;
272ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                }
273ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                didSomething = true;
274ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale                receivers.remove(i);
2759a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale                if (i < nextReceiver) {
2769a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale                    nextReceiver--;
2779a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale                }
278ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale            }
279ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        }
2809a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale        nextReceiver = Math.min(nextReceiver, receivers.size());
281ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale
282ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale        return didSomething;
283ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale    }
284ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "BroadcastRecord{"
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + Integer.toHexString(System.identityHashCode(this))
288b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn            + " u" + userId + " " + intent.getAction() + "}";
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
291