blob: 9ab61f5954cc73f0103e4041b8a8deccf50544e1 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
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
17package android.os;
18
19import android.os.Handler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080020
21import java.util.ArrayList;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080022
23/** @hide */
24public class RegistrantList
25{
26 ArrayList registrants = new ArrayList(); // of Registrant
27
28 public synchronized void
29 add(Handler h, int what, Object obj)
30 {
31 add(new Registrant(h, what, obj));
32 }
33
34 public synchronized void
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
43 add(Registrant r)
44 {
45 removeCleared();
46 registrants.add(r);
47 }
48
49 public synchronized void
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
62 size()
63 {
64 return registrants.size();
65 }
66
67 public synchronized Object
68 get(int index)
69 {
70 return registrants.get(index);
71 }
72
73 private synchronized void
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
83 notifyRegistrants()
84 {
85 internalNotifyRegistrants(null, null);
86 }
87
88 public /*synchronized*/ void
89 notifyException(Throwable exception)
90 {
91 internalNotifyRegistrants (null, exception);
92 }
93
94 public /*synchronized*/ void
95 notifyResult(Object result)
96 {
97 internalNotifyRegistrants (result, null);
98 }
99
100
101 public /*synchronized*/ void
102 notifyRegistrants(AsyncResult ar)
103 {
104 internalNotifyRegistrants(ar.result, ar.exception);
105 }
106
107 public synchronized void
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}