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; 20ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shuklaimport android.content.IntentFilter; 211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.os.Binder; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.Printer; 25129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jinimport android.util.proto.ProtoOutputStream; 26ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla 27ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shuklaimport com.android.server.IntentResolver; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A receiver object that has registered for one or more broadcasts. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ArrayList holds BroadcastFilter objects. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class ReceiverList extends ArrayList<BroadcastFilter> 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements IBinder.DeathRecipient { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ActivityManagerService owner; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final IIntentReceiver receiver; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProcessRecord app; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int pid; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int uid; 4320e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn public final int userId; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastRecord curBroadcast = null; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean linkedToDeath = false; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn String stringName; 48129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverList(ActivityManagerService _owner, ProcessRecord _app, 5020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn int _pid, int _uid, int _userId, IIntentReceiver _receiver) { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver = _receiver; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project app = _app; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid = _pid; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid = _uid; 5620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn userId = _userId; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Want object identity, not the array identity we are inheriting. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object o) { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this == o; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hashCode() { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return System.identityHashCode(this); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linkedToDeath = false; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.unregisterReceiver(receiver); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 72ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla public boolean containsFilter(IntentFilter filter) { 73ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla final int N = size(); 74ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla for (int i = 0; i < N; i++) { 75ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla final BroadcastFilter f = get(i); 76ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla if (IntentResolver.filterEquals(f, filter)) { 77ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla return true; 78ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla } 79ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla } 80ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla return false; 81ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla } 82ff78495653d181b0459d16ae0ca4269bc799b28eSuprabh Shukla 83129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin void writeToProto(ProtoOutputStream proto, long fieldId) { 84129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin long token = proto.start(fieldId); 85129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin app.writeToProto(proto, ReceiverListProto.APP); 86129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(ReceiverListProto.PID, pid); 87129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(ReceiverListProto.UID, uid); 88129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(ReceiverListProto.USER, userId); 89129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin if (curBroadcast != null) { 90129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin curBroadcast.writeToProto(proto, ReceiverListProto.CURRENT); 91129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 92129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(ReceiverListProto.LINKED_TO_DEATH, linkedToDeath); 93129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin final int N = size(); 94129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin for (int i=0; i<N; i++) { 95129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin BroadcastFilter bf = get(i); 96129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin bf.writeToProto(proto, ReceiverListProto.FILTERS); 97129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 98129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.write(ReceiverListProto.HEX_HASH, Integer.toHexString(System.identityHashCode(this))); 99129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin proto.end(token); 100129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin } 101129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpLocal(PrintWriter pw, String prefix) { 103880e5d486ed6f27d83aefa499890694850948282Evans Thomas pw.print(prefix); pw.print("app="); pw.print(app != null ? app.toShortString() : null); 10420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn pw.print(" pid="); pw.print(pid); pw.print(" uid="); pw.print(uid); 10520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn pw.print(" user="); pw.println(userId); 1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (curBroadcast != null || linkedToDeath) { 1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("curBroadcast="); pw.print(curBroadcast); 1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" linkedToDeath="); pw.println(linkedToDeath); 1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 111129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocal(pw, prefix); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String p2 = prefix + " "; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = size(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastFilter bf = get(i); 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("Filter #"); pw.print(i); 1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(": BroadcastFilter{"); 1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(bf))); 1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println('}'); 1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn bf.dumpInReceiverList(pw, pr, p2); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 126129fc6ce194659eed25fc37bb382eed61a14b7a7Yi Jin 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 128f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (stringName != null) { 129f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName; 130f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 131f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn StringBuilder sb = new StringBuilder(128); 132f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append("ReceiverList{"); 133f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 134f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(' '); 135f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(pid); 136f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(' '); 137f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append((app != null ? app.processName : "(unknown name)")); 138f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append('/'); 139f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(uid); 14020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn sb.append("/u"); 14120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn sb.append(userId); 1421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append((receiver.asBinder() instanceof Binder) ? " local:" : " remote:"); 143f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(receiver.asBinder()))); 144f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn sb.append('}'); 145f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName = sb.toString(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 148