1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os; 18 19 import android.os.Handler; 20 21 import java.util.ArrayList; 22 23 /** @hide */ 24 public class RegistrantList 25 { 26 ArrayList registrants = new ArrayList(); // of Registrant 27 28 public synchronized void add(Handler h, int what, Object obj)29 add(Handler h, int what, Object obj) 30 { 31 add(new Registrant(h, what, obj)); 32 } 33 34 public synchronized void addUnique(Handler h, int what, Object obj)35 addUnique(Handler h, int what, Object obj) 36 { 37 // if the handler is already in the registrant list, remove it 38 remove(h); 39 add(new Registrant(h, what, obj)); 40 } 41 42 public synchronized void add(Registrant r)43 add(Registrant r) 44 { 45 removeCleared(); 46 registrants.add(r); 47 } 48 49 public synchronized void removeCleared()50 removeCleared() 51 { 52 for (int i = registrants.size() - 1; i >= 0 ; i--) { 53 Registrant r = (Registrant) registrants.get(i); 54 55 if (r.refH == null) { 56 registrants.remove(i); 57 } 58 } 59 } 60 61 public synchronized int size()62 size() 63 { 64 return registrants.size(); 65 } 66 67 public synchronized Object get(int index)68 get(int index) 69 { 70 return registrants.get(index); 71 } 72 73 private synchronized void internalNotifyRegistrants(Object result, Throwable exception)74 internalNotifyRegistrants (Object result, Throwable exception) 75 { 76 for (int i = 0, s = registrants.size(); i < s ; i++) { 77 Registrant r = (Registrant) registrants.get(i); 78 r.internalNotifyRegistrant(result, exception); 79 } 80 } 81 82 public /*synchronized*/ void notifyRegistrants()83 notifyRegistrants() 84 { 85 internalNotifyRegistrants(null, null); 86 } 87 88 public /*synchronized*/ void notifyException(Throwable exception)89 notifyException(Throwable exception) 90 { 91 internalNotifyRegistrants (null, exception); 92 } 93 94 public /*synchronized*/ void notifyResult(Object result)95 notifyResult(Object result) 96 { 97 internalNotifyRegistrants (result, null); 98 } 99 100 101 public /*synchronized*/ void notifyRegistrants(AsyncResult ar)102 notifyRegistrants(AsyncResult ar) 103 { 104 internalNotifyRegistrants(ar.result, ar.exception); 105 } 106 107 public synchronized void remove(Handler h)108 remove(Handler h) 109 { 110 for (int i = 0, s = registrants.size() ; i < s ; i++) { 111 Registrant r = (Registrant) registrants.get(i); 112 Handler rh; 113 114 rh = r.getHandler(); 115 116 /* Clean up both the requested registrant and 117 * any now-collected registrants 118 */ 119 if (rh == null || rh == h) { 120 r.clear(); 121 } 122 } 123 124 removeCleared(); 125 } 126 } 127