15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2006 The Android Open Source Project 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * See the License for the specific language governing permissions and 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package com.android.server.am; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.IIntentReceiver; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Binder; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.IBinder; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.PrintWriterPrinter; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.Printer; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.io.PrintWriter; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.ArrayList; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A receiver object that has registered for one or more broadcasts. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The ArrayList holds BroadcastFilter objects. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)final class ReceiverList extends ArrayList<BroadcastFilter> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) implements IBinder.DeathRecipient { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final ActivityManagerService owner; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public final IIntentReceiver receiver; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public final ProcessRecord app; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public final int pid; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public final int uid; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public final int userId; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BroadcastRecord curBroadcast = null; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean linkedToDeath = false; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String stringName; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReceiverList(ActivityManagerService _owner, ProcessRecord _app, 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int _pid, int _uid, int _userId, IIntentReceiver _receiver) { 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) owner = _owner; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) receiver = _receiver; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app = _app; 500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) pid = _pid; 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uid = _uid; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) userId = _userId; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Want object identity, not the array identity we are inheriting. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean equals(Object o) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this == o; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int hashCode() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return System.identityHashCode(this); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void binderDied() { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linkedToDeath = false; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owner.unregisterReceiver(receiver); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void dumpLocal(PrintWriter pw, String prefix) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(prefix); pw.print("app="); pw.print(app != null ? app.toShortString() : null); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(" pid="); pw.print(pid); pw.print(" uid="); pw.print(uid); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(" user="); pw.println(userId); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (curBroadcast != null || linkedToDeath) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(prefix); pw.print("curBroadcast="); pw.print(curBroadcast); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(" linkedToDeath="); pw.println(linkedToDeath); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void dump(PrintWriter pw, String prefix) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Printer pr = new PrintWriterPrinter(pw); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dumpLocal(pw, prefix); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String p2 = prefix + " "; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final int N = size(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i=0; i<N; i++) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BroadcastFilter bf = get(i); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(prefix); pw.print("Filter #"); pw.print(i); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(": BroadcastFilter{"); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.print(Integer.toHexString(System.identityHashCode(bf))); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pw.println('}'); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bf.dumpInReceiverList(pw, pr, p2); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String toString() { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (stringName != null) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stringName; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringBuilder sb = new StringBuilder(128); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append("ReceiverList{"); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append(Integer.toHexString(System.identityHashCode(this))); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append(' '); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append(pid); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append(' '); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append((app != null ? app.processName : "(unknown name)")); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append('/'); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append(uid); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append("/u"); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append(userId); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append((receiver.asBinder() instanceof Binder) ? " local:" : " remote:"); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append(Integer.toHexString(System.identityHashCode(receiver.asBinder()))); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb.append('}'); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stringName = sb.toString(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)