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; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastRecord curBroadcast = null; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean linkedToDeath = false; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn String stringName; 46f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverList(ActivityManagerService _owner, ProcessRecord _app, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int _pid, int _uid, IIntentReceiver _receiver) { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver = _receiver; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project app = _app; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid = _pid; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid = _uid; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Want object identity, not the array identity we are inheriting. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object o) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this == o; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hashCode() { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return System.identityHashCode(this); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linkedToDeath = false; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.unregisterReceiver(receiver); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpLocal(PrintWriter pw, String prefix) { 701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("app="); pw.print(app); 711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" pid="); pw.print(pid); pw.print(" uid="); pw.println(uid); 721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (curBroadcast != null || linkedToDeath) { 731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("curBroadcast="); pw.print(curBroadcast); 741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" linkedToDeath="); pw.println(linkedToDeath); 751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocal(pw, prefix); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String p2 = prefix + " "; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = size(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastFilter bf = get(i); 851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("Filter #"); pw.print(i); 861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(": BroadcastFilter{"); 871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(bf))); 881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println('}'); 891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn bf.dumpInReceiverList(pw, pr, p2); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 94f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (stringName != null) { 95f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName; 96f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 97f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn StringBuilder sb = new StringBuilder(128); 98f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append("ReceiverList{"); 99f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 100f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(' '); 101f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(pid); 102f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(' '); 103f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append((app != null ? app.processName : "(unknown name)")); 104f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append('/'); 105f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(uid); 1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append((receiver.asBinder() instanceof Binder) ? " local:" : " remote:"); 107f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(receiver.asBinder()))); 108f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append('}'); 109f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName = sb.toString(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 112