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 191ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.os.Binder; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.Printer; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A receiver object that has registered for one or more broadcasts. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ArrayList holds BroadcastFilter objects. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverList extends ArrayList<BroadcastFilter> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements IBinder.DeathRecipient { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ActivityManagerService owner; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final IIntentReceiver receiver; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProcessRecord app; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int pid; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int uid; 4220e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn public final int userId; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastRecord curBroadcast = null; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean linkedToDeath = false; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn String stringName; 47f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverList(ActivityManagerService _owner, ProcessRecord _app, 4920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn int _pid, int _uid, int _userId, IIntentReceiver _receiver) { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver = _receiver; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project app = _app; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid = _pid; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid = _uid; 5520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn userId = _userId; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Want object identity, not the array identity we are inheriting. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object o) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this == o; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hashCode() { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return System.identityHashCode(this); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linkedToDeath = false; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.unregisterReceiver(receiver); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpLocal(PrintWriter pw, String prefix) { 7220e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn pw.print(prefix); pw.print("app="); pw.print(app.toShortString()); 7320e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn pw.print(" pid="); pw.print(pid); pw.print(" uid="); pw.print(uid); 7420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn pw.print(" user="); pw.println(userId); 751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (curBroadcast != null || linkedToDeath) { 761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("curBroadcast="); pw.print(curBroadcast); 771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" linkedToDeath="); pw.println(linkedToDeath); 781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocal(pw, prefix); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String p2 = prefix + " "; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = size(); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastFilter bf = get(i); 881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("Filter #"); pw.print(i); 891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(": BroadcastFilter{"); 901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(bf))); 911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println('}'); 921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn bf.dumpInReceiverList(pw, pr, p2); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 97f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (stringName != null) { 98f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName; 99f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 100f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn StringBuilder sb = new StringBuilder(128); 101f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append("ReceiverList{"); 102f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 103f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(' '); 104f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(pid); 105f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(' '); 106f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append((app != null ? app.processName : "(unknown name)")); 107f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append('/'); 108f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(uid); 10920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn sb.append("/u"); 11020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn sb.append(userId); 1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append((receiver.asBinder() instanceof Binder) ? " local:" : " remote:"); 112f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(receiver.asBinder()))); 113f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append('}'); 114f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName = sb.toString(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 117