• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 import android.os.Message;
21 
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 
25 /** @hide */
26 public class RegistrantList
27 {
28     ArrayList   registrants = new ArrayList();      // of Registrant
29 
30     public synchronized void
add(Handler h, int what, Object obj)31     add(Handler h, int what, Object obj)
32     {
33         add(new Registrant(h, what, obj));
34     }
35 
36     public synchronized void
addUnique(Handler h, int what, Object obj)37     addUnique(Handler h, int what, Object obj)
38     {
39         // if the handler is already in the registrant list, remove it
40         remove(h);
41         add(new Registrant(h, what, obj));
42     }
43 
44     public synchronized void
add(Registrant r)45     add(Registrant r)
46     {
47         removeCleared();
48         registrants.add(r);
49     }
50 
51     public synchronized void
removeCleared()52     removeCleared()
53     {
54         for (int i = registrants.size() - 1; i >= 0 ; i--) {
55             Registrant  r = (Registrant) registrants.get(i);
56 
57             if (r.refH == null) {
58                 registrants.remove(i);
59             }
60         }
61     }
62 
63     public synchronized int
size()64     size()
65     {
66         return registrants.size();
67     }
68 
69     public synchronized Object
get(int index)70     get(int index)
71     {
72         return registrants.get(index);
73     }
74 
75     private synchronized void
internalNotifyRegistrants(Object result, Throwable exception)76     internalNotifyRegistrants (Object result, Throwable exception)
77     {
78        for (int i = 0, s = registrants.size(); i < s ; i++) {
79             Registrant  r = (Registrant) registrants.get(i);
80             r.internalNotifyRegistrant(result, exception);
81        }
82     }
83 
84     public /*synchronized*/ void
notifyRegistrants()85     notifyRegistrants()
86     {
87         internalNotifyRegistrants(null, null);
88     }
89 
90     public /*synchronized*/ void
notifyException(Throwable exception)91     notifyException(Throwable exception)
92     {
93         internalNotifyRegistrants (null, exception);
94     }
95 
96     public /*synchronized*/ void
notifyResult(Object result)97     notifyResult(Object result)
98     {
99         internalNotifyRegistrants (result, null);
100     }
101 
102 
103     public /*synchronized*/ void
notifyRegistrants(AsyncResult ar)104     notifyRegistrants(AsyncResult ar)
105     {
106         internalNotifyRegistrants(ar.result, ar.exception);
107     }
108 
109     public synchronized void
remove(Handler h)110     remove(Handler h)
111     {
112         for (int i = 0, s = registrants.size() ; i < s ; i++) {
113             Registrant  r = (Registrant) registrants.get(i);
114             Handler     rh;
115 
116             rh = r.getHandler();
117 
118             /* Clean up both the requested registrant and
119              * any now-collected registrants
120              */
121             if (rh == null || rh == h) {
122                 r.clear();
123             }
124         }
125 
126         removeCleared();
127     }
128 }
129