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