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.lang.ref.WeakReference;
23 
24 /** @hide */
25 public class Registrant
26 {
27     public
Registrant(Handler h, int what, Object obj)28     Registrant(Handler h, int what, Object obj)
29     {
30         refH = new WeakReference(h);
31         this.what = what;
32         userObj = obj;
33     }
34 
35     public void
clear()36     clear()
37     {
38         refH = null;
39         userObj = null;
40     }
41 
42     public void
notifyRegistrant()43     notifyRegistrant()
44     {
45         internalNotifyRegistrant (null, null);
46     }
47 
48     public void
notifyResult(Object result)49     notifyResult(Object result)
50     {
51         internalNotifyRegistrant (result, null);
52     }
53 
54     public void
notifyException(Throwable exception)55     notifyException(Throwable exception)
56     {
57         internalNotifyRegistrant (null, exception);
58     }
59 
60     /**
61      * This makes a copy of @param ar
62      */
63     public void
notifyRegistrant(AsyncResult ar)64     notifyRegistrant(AsyncResult ar)
65     {
66         internalNotifyRegistrant (ar.result, ar.exception);
67     }
68 
69     /*package*/ void
internalNotifyRegistrant(Object result, Throwable exception)70     internalNotifyRegistrant (Object result, Throwable exception)
71     {
72         Handler h = getHandler();
73 
74         if (h == null) {
75             clear();
76         } else {
77             Message msg = Message.obtain();
78 
79             msg.what = what;
80 
81             msg.obj = new AsyncResult(userObj, result, exception);
82 
83             h.sendMessage(msg);
84         }
85     }
86 
87     /**
88      * NOTE: May return null if weak reference has been collected
89      */
90 
91     public Message
messageForRegistrant()92     messageForRegistrant()
93     {
94         Handler h = getHandler();
95 
96         if (h == null) {
97             clear();
98 
99             return null;
100         } else {
101             Message msg = h.obtainMessage();
102 
103             msg.what = what;
104             msg.obj = userObj;
105 
106             return msg;
107         }
108     }
109 
110     public Handler
getHandler()111     getHandler()
112     {
113         if (refH == null)
114             return null;
115 
116         return (Handler) refH.get();
117     }
118 
119     WeakReference   refH;
120     int             what;
121     Object          userObj;
122 }
123 
124