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; 35d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolovimport java.util.Arrays; 36d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackbornimport java.util.Date; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 38ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwaleimport java.util.Set; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An active intent broadcast. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 43be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class BroadcastRecord extends Binder { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Intent intent; // the original intent that generated us 45a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn final ComponentName targetComp; // original component name set on the intent 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ProcessRecord callerApp; // process that sent this 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String callerPackage; // who sent this 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int callingPid; // the pid of who sent this 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int callingUid; // the uid of who sent this 5068d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn final boolean ordered; // serialize the send to receivers? 5168d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn final boolean sticky; // originated from existing sticky data? 5212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn final boolean initialSticky; // initial broadcast from register to sticky? 53786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn final int userId; // user id this broadcast was for 5449660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver final String resolvedType; // the resolved data type 55d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov final String[] requiredPermissions; // permissions the caller has required 56f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn final int appOp; // an app op that is associated with this broadcast 57a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn final BroadcastOptions options; // BroadcastOptions supplied by caller 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final List receivers; // contains BroadcastFilter and ResolveInfo 59b5a8654dea9ea8443b41f8ff3668ae4074e13a07Johannes Carlsson IIntentReceiver resultTo; // who receives final result if non-null 609fb3fd1d666aac3e8d889bead4109690b1484aacJeff Brown long enqueueClockTime; // the clock time the broadcast was enqueued 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long dispatchTime; // when dispatch started on this set of receivers 62d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn long dispatchClockTime; // the clock time the dispatch started 6312527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn long receiverTime; // when current receiver started for timeouts. 6412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn long finishTime; // when we finished the broadcast. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resultCode; // current result code value. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resultData; // current result data value. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle resultExtras; // current result extra data values. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean resultAbort; // current result abortBroadcast value. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextReceiver; // next receiver to be executed. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder receiver; // who is currently running, null if none. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int state; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int anrCount; // has this broadcast record hit any ANRs? 7340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastQueue queue; // the outbound queue handling this broadcast 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int IDLE = 0; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int APP_RECEIVE = 1; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CALL_IN_RECEIVE = 2; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CALL_DONE_RECEIVE = 3; 796285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn static final int WAITING_SERVICES = 4; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The following are set when we are calling a receiver (one that 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was found in our list of registered receivers). 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastFilter curFilter; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The following are set only when we are launching a receiver (one 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that was found by querying the package manager). 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProcessRecord curApp; // hosting application of current receiver. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName curComponent; // the receiver class that is currently running. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo curReceiver; // info about the receiver that is currently running. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 9239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final long now = SystemClock.uptimeMillis(); 9339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 94786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn pw.print(prefix); pw.print(this); pw.print(" to user "); pw.println(userId); 95c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn pw.print(prefix); pw.println(intent.toInsecureString()); 96a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn if (targetComp != null && targetComp != intent.getComponent()) { 97a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn pw.print(prefix); pw.print(" targetComp: "); pw.println(targetComp.toShortString()); 98a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn } 99c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn Bundle bundle = intent.getExtras(); 100c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (bundle != null) { 101a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn pw.print(prefix); pw.print(" extras: "); pw.println(bundle.toString()); 10212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 103043fcd9847a804bc6394728e5785aecc495e6347Dianne Hackborn pw.print(prefix); pw.print("caller="); pw.print(callerPackage); pw.print(" "); 104043fcd9847a804bc6394728e5785aecc495e6347Dianne Hackborn pw.print(callerApp != null ? callerApp.toShortString() : "null"); 10539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" pid="); pw.print(callingPid); 10639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" uid="); pw.println(callingUid); 107d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov if ((requiredPermissions != null && requiredPermissions.length > 0) 108d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov || appOp != AppOpsManager.OP_NONE) { 109d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov pw.print(prefix); pw.print("requiredPermissions="); 110d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov pw.print(Arrays.toString(requiredPermissions)); 111d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov pw.print(" appOp="); pw.println(appOp); 11212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 113a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn if (options != null) { 114a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn pw.print(prefix); pw.print("options="); pw.println(options.toBundle()); 115a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn } 1169fb3fd1d666aac3e8d889bead4109690b1484aacJeff Brown pw.print(prefix); pw.print("enqueueClockTime="); 1179fb3fd1d666aac3e8d889bead4109690b1484aacJeff Brown pw.print(new Date(enqueueClockTime)); 1189fb3fd1d666aac3e8d889bead4109690b1484aacJeff Brown pw.print(" dispatchClockTime="); 119d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn pw.println(new Date(dispatchClockTime)); 12039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("dispatchTime="); 12139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn TimeUtils.formatDuration(dispatchTime, now, pw); 12212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (finishTime != 0) { 12339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" finishTime="); TimeUtils.formatDuration(finishTime, now, pw); 12412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } else { 12539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" receiverTime="); TimeUtils.formatDuration(receiverTime, now, pw); 12612527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 12739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println(""); 12812527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (anrCount != 0) { 12939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("anrCount="); pw.println(anrCount); 13012527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 13112527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (resultTo != null || resultCode != -1 || resultData != null) { 13239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("resultTo="); pw.print(resultTo); 13339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" resultCode="); pw.print(resultCode); 13439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" resultData="); pw.println(resultData); 13512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 13612527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (resultExtras != null) { 13739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("resultExtras="); pw.println(resultExtras); 13812527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 13912527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (resultAbort || ordered || sticky || initialSticky) { 14039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("resultAbort="); pw.print(resultAbort); 14139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" ordered="); pw.print(ordered); 14239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" sticky="); pw.print(sticky); 14339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" initialSticky="); pw.println(initialSticky); 14412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 14512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (nextReceiver != 0 || receiver != null) { 14639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("nextReceiver="); pw.print(nextReceiver); 14739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(" receiver="); pw.println(receiver); 14812527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 14912527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (curFilter != null) { 15039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("curFilter="); pw.println(curFilter); 15112527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 15212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (curReceiver != null) { 15339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("curReceiver="); pw.println(curReceiver); 15412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curApp != null) { 15639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("curApp="); pw.println(curApp); 15739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("curComponent="); 15839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println((curComponent != null ? curComponent.toShortString() : "--")); 159399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn if (curReceiver != null && curReceiver.applicationInfo != null) { 16039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("curSourceDir="); 16139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println(curReceiver.applicationInfo.sourceDir); 162399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 164786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn if (state != IDLE) { 165786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn String stateStr = " (?)"; 166786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn switch (state) { 167786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn case APP_RECEIVE: stateStr=" (APP_RECEIVE)"; break; 168786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn case CALL_IN_RECEIVE: stateStr=" (CALL_IN_RECEIVE)"; break; 169786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn case CALL_DONE_RECEIVE: stateStr=" (CALL_DONE_RECEIVE)"; break; 1706285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn case WAITING_SERVICES: stateStr=" (WAITING_SERVICES)"; break; 171786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn } 172786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn pw.print(prefix); pw.print("state="); pw.print(state); pw.println(stateStr); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = receivers != null ? receivers.size() : 0; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String p2 = prefix + " "; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriterPrinter printer = new PrintWriterPrinter(pw); 177ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale for (int i = 0; i < N; i++) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object o = receivers.get(i); 17939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print("Receiver #"); pw.print(i); 18039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(": "); pw.println(o); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o instanceof BroadcastFilter) 18212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn ((BroadcastFilter)o).dumpBrief(pw, p2); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (o instanceof ResolveInfo) 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((ResolveInfo)o).dump(printer, p2); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn BroadcastRecord(BroadcastQueue _queue, 189f46723b41f723ebfc9ed18c7c409b319f4b5e539Christopher Tate Intent _intent, ProcessRecord _callerApp, String _callerPackage, 190d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov int _callingPid, int _callingUid, String _resolvedType, String[] _requiredPermissions, 191a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn int _appOp, BroadcastOptions _options, List _receivers, IIntentReceiver _resultTo, 192a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn int _resultCode, String _resultData, Bundle _resultExtras, boolean _serialized, 1938bf06edac2088ad100e67dcb00a46d3f0f95c126Amith Yamasani boolean _sticky, boolean _initialSticky, 194786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn int _userId) { 195f46723b41f723ebfc9ed18c7c409b319f4b5e539Christopher Tate queue = _queue; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = _intent; 197a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn targetComp = _intent.getComponent(); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callerApp = _callerApp; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callerPackage = _callerPackage; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callingPid = _callingPid; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callingUid = _callingUid; 20249660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver resolvedType = _resolvedType; 203d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov requiredPermissions = _requiredPermissions; 204f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn appOp = _appOp; 205a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn options = _options; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receivers = _receivers; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultTo = _resultTo; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultCode = _resultCode; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultData = _resultData; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultExtras = _resultExtras; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ordered = _serialized; 21268d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn sticky = _sticky; 21312527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn initialSticky = _initialSticky; 214786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn userId = _userId; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextReceiver = 0; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = IDLE; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale boolean cleanupDisabledPackageReceiversLocked( 220ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale String packageName, Set<String> filterByClasses, int userId, boolean doit) { 221ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale if ((userId != UserHandle.USER_ALL && this.userId != userId) || receivers == null) { 222ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale return false; 223ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale } 224ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale 225ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale boolean didSomething = false; 226ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale Object o; 227ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale for (int i = receivers.size() - 1; i >= 0; i--) { 228ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale o = receivers.get(i); 229ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale if (!(o instanceof ResolveInfo)) { 230ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale continue; 231ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale } 232ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale ActivityInfo info = ((ResolveInfo)o).activityInfo; 233ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale 234ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale final boolean sameComponent = packageName == null 235ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale || (info.applicationInfo.packageName.equals(packageName) 236ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale && (filterByClasses == null || filterByClasses.contains(info.name))); 237ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale if (sameComponent) { 238ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale if (!doit) { 239ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale return true; 240ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale } 241ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale didSomething = true; 242ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale receivers.remove(i); 2439a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale if (i < nextReceiver) { 2449a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale nextReceiver--; 2459a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale } 246ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale } 247ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale } 2489a6e13c347df85348db8c0af67eeaa558fd61ee9Wale Ogunwale nextReceiver = Math.min(nextReceiver, receivers.size()); 249ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale 250ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale return didSomething; 251ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale } 252ca1c12581a794db7569c7408b3547bf04f9bb3c9Wale Ogunwale 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "BroadcastRecord{" 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 256b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn + " u" + userId + " " + intent.getAction() + "}"; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 259