1/*
2 * Copyright (C) 2008 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 com.android.internal.os;
18
19import android.content.Context;
20import android.os.Handler;
21import android.os.Looper;
22import android.os.Message;
23
24public class HandlerCaller {
25    final Looper mMainLooper;
26    final Handler mH;
27
28    final Callback mCallback;
29
30    class MyHandler extends Handler {
31        MyHandler(Looper looper, boolean async) {
32            super(looper, null, async);
33        }
34
35        @Override
36        public void handleMessage(Message msg) {
37            mCallback.executeMessage(msg);
38        }
39    }
40
41    public interface Callback {
42        public void executeMessage(Message msg);
43    }
44
45    public HandlerCaller(Context context, Looper looper, Callback callback,
46            boolean asyncHandler) {
47        mMainLooper = looper != null ? looper : context.getMainLooper();
48        mH = new MyHandler(mMainLooper, asyncHandler);
49        mCallback = callback;
50    }
51
52    public void executeOrSendMessage(Message msg) {
53        // If we are calling this from the main thread, then we can call
54        // right through.  Otherwise, we need to send the message to the
55        // main thread.
56        if (Looper.myLooper() == mMainLooper) {
57            mCallback.executeMessage(msg);
58            msg.recycle();
59            return;
60        }
61
62        mH.sendMessage(msg);
63    }
64
65    public void sendMessageDelayed(Message msg, long delayMillis) {
66        mH.sendMessageDelayed(msg, delayMillis);
67    }
68
69    public boolean hasMessages(int what) {
70        return mH.hasMessages(what);
71    }
72
73    public void removeMessages(int what) {
74        mH.removeMessages(what);
75    }
76
77    public void removeMessages(int what, Object obj) {
78        mH.removeMessages(what, obj);
79    }
80
81    public void sendMessage(Message msg) {
82        mH.sendMessage(msg);
83    }
84
85    public SomeArgs sendMessageAndWait(Message msg) {
86        if (Looper.myLooper() == mH.getLooper()) {
87            throw new IllegalStateException("Can't wait on same thread as looper");
88        }
89        SomeArgs args = (SomeArgs)msg.obj;
90        args.mWaitState = SomeArgs.WAIT_WAITING;
91        mH.sendMessage(msg);
92        synchronized (args) {
93            while (args.mWaitState == SomeArgs.WAIT_WAITING) {
94                try {
95                    args.wait();
96                } catch (InterruptedException e) {
97                    return null;
98                }
99            }
100        }
101        args.mWaitState = SomeArgs.WAIT_NONE;
102        return args;
103    }
104
105    public Message obtainMessage(int what) {
106        return mH.obtainMessage(what);
107    }
108
109    public Message obtainMessageBO(int what, boolean arg1, Object arg2) {
110        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, arg2);
111    }
112
113    public Message obtainMessageBOO(int what, boolean arg1, Object arg2, Object arg3) {
114        SomeArgs args = SomeArgs.obtain();
115        args.arg1 = arg2;
116        args.arg2 = arg3;
117        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, args);
118    }
119
120    public Message obtainMessageO(int what, Object arg1) {
121        return mH.obtainMessage(what, 0, 0, arg1);
122    }
123
124    public Message obtainMessageI(int what, int arg1) {
125        return mH.obtainMessage(what, arg1, 0);
126    }
127
128    public Message obtainMessageII(int what, int arg1, int arg2) {
129        return mH.obtainMessage(what, arg1, arg2);
130    }
131
132    public Message obtainMessageIO(int what, int arg1, Object arg2) {
133        return mH.obtainMessage(what, arg1, 0, arg2);
134    }
135
136    public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) {
137        return mH.obtainMessage(what, arg1, arg2, arg3);
138    }
139
140    public Message obtainMessageIIOO(int what, int arg1, int arg2,
141            Object arg3, Object arg4) {
142        SomeArgs args = SomeArgs.obtain();
143        args.arg1 = arg3;
144        args.arg2 = arg4;
145        return mH.obtainMessage(what, arg1, arg2, args);
146    }
147
148    public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
149        SomeArgs args = SomeArgs.obtain();
150        args.arg1 = arg2;
151        args.arg2 = arg3;
152        return mH.obtainMessage(what, arg1, 0, args);
153    }
154
155    public Message obtainMessageIOOO(int what, int arg1, Object arg2, Object arg3, Object arg4) {
156        SomeArgs args = SomeArgs.obtain();
157        args.arg1 = arg2;
158        args.arg2 = arg3;
159        args.arg3 = arg4;
160        return mH.obtainMessage(what, arg1, 0, args);
161    }
162
163    public Message obtainMessageOO(int what, Object arg1, Object arg2) {
164        SomeArgs args = SomeArgs.obtain();
165        args.arg1 = arg1;
166        args.arg2 = arg2;
167        return mH.obtainMessage(what, 0, 0, args);
168    }
169
170    public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
171        SomeArgs args = SomeArgs.obtain();
172        args.arg1 = arg1;
173        args.arg2 = arg2;
174        args.arg3 = arg3;
175        return mH.obtainMessage(what, 0, 0, args);
176    }
177
178    public Message obtainMessageOOOO(int what, Object arg1, Object arg2,
179            Object arg3, Object arg4) {
180        SomeArgs args = SomeArgs.obtain();
181        args.arg1 = arg1;
182        args.arg2 = arg2;
183        args.arg3 = arg3;
184        args.arg4 = arg4;
185        return mH.obtainMessage(what, 0, 0, args);
186    }
187
188    public Message obtainMessageOOOOO(int what, Object arg1, Object arg2,
189            Object arg3, Object arg4, Object arg5) {
190        SomeArgs args = SomeArgs.obtain();
191        args.arg1 = arg1;
192        args.arg2 = arg2;
193        args.arg3 = arg3;
194        args.arg4 = arg4;
195        args.arg5 = arg5;
196        return mH.obtainMessage(what, 0, 0, args);
197    }
198
199    public Message obtainMessageIIII(int what, int arg1, int arg2,
200            int arg3, int arg4) {
201        SomeArgs args = SomeArgs.obtain();
202        args.argi1 = arg1;
203        args.argi2 = arg2;
204        args.argi3 = arg3;
205        args.argi4 = arg4;
206        return mH.obtainMessage(what, 0, 0, args);
207    }
208
209    public Message obtainMessageIIIIII(int what, int arg1, int arg2,
210            int arg3, int arg4, int arg5, int arg6) {
211        SomeArgs args = SomeArgs.obtain();
212        args.argi1 = arg1;
213        args.argi2 = arg2;
214        args.argi3 = arg3;
215        args.argi4 = arg4;
216        args.argi5 = arg5;
217        args.argi6 = arg6;
218        return mH.obtainMessage(what, 0, 0, args);
219    }
220
221    public Message obtainMessageIIIIO(int what, int arg1, int arg2,
222            int arg3, int arg4, Object arg5) {
223        SomeArgs args = SomeArgs.obtain();
224        args.arg1 = arg5;
225        args.argi1 = arg1;
226        args.argi2 = arg2;
227        args.argi3 = arg3;
228        args.argi4 = arg4;
229        return mH.obtainMessage(what, 0, 0, args);
230    }
231}
232