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
26    public final Context mContext;
27
28    final Looper mMainLooper;
29    final Handler mH;
30
31    final Callback mCallback;
32
33    class MyHandler extends Handler {
34        MyHandler(Looper looper) {
35            super(looper);
36        }
37
38        @Override
39        public void handleMessage(Message msg) {
40            mCallback.executeMessage(msg);
41        }
42    }
43
44    public interface Callback {
45        public void executeMessage(Message msg);
46    }
47
48    public HandlerCaller(Context context, Callback callback) {
49        mContext = context;
50        mMainLooper = context.getMainLooper();
51        mH = new MyHandler(mMainLooper);
52        mCallback = callback;
53    }
54
55    public HandlerCaller(Context context, Looper looper, Callback callback) {
56        mContext = context;
57        mMainLooper = looper;
58        mH = new MyHandler(mMainLooper);
59        mCallback = callback;
60    }
61
62    public void executeOrSendMessage(Message msg) {
63        // If we are calling this from the main thread, then we can call
64        // right through.  Otherwise, we need to send the message to the
65        // main thread.
66        if (Looper.myLooper() == mMainLooper) {
67            mCallback.executeMessage(msg);
68            msg.recycle();
69            return;
70        }
71
72        mH.sendMessage(msg);
73    }
74
75    public boolean hasMessages(int what) {
76        return mH.hasMessages(what);
77    }
78
79    public void removeMessages(int what) {
80        mH.removeMessages(what);
81    }
82
83    public void removeMessages(int what, Object obj) {
84        mH.removeMessages(what, obj);
85    }
86
87    public void sendMessage(Message msg) {
88        mH.sendMessage(msg);
89    }
90
91    public Message obtainMessage(int what) {
92        return mH.obtainMessage(what);
93    }
94
95    public Message obtainMessageBO(int what, boolean arg1, Object arg2) {
96        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, arg2);
97    }
98
99    public Message obtainMessageBOO(int what, boolean arg1, Object arg2, Object arg3) {
100        SomeArgs args = SomeArgs.obtain();
101        args.arg1 = arg2;
102        args.arg2 = arg3;
103        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, args);
104    }
105
106    public Message obtainMessageO(int what, Object arg1) {
107        return mH.obtainMessage(what, 0, 0, arg1);
108    }
109
110    public Message obtainMessageI(int what, int arg1) {
111        return mH.obtainMessage(what, arg1, 0);
112    }
113
114    public Message obtainMessageII(int what, int arg1, int arg2) {
115        return mH.obtainMessage(what, arg1, arg2);
116    }
117
118    public Message obtainMessageIO(int what, int arg1, Object arg2) {
119        return mH.obtainMessage(what, arg1, 0, arg2);
120    }
121
122    public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) {
123        return mH.obtainMessage(what, arg1, arg2, arg3);
124    }
125
126    public Message obtainMessageIIOO(int what, int arg1, int arg2,
127            Object arg3, Object arg4) {
128        SomeArgs args = SomeArgs.obtain();
129        args.arg1 = arg3;
130        args.arg2 = arg4;
131        return mH.obtainMessage(what, arg1, arg2, args);
132    }
133
134    public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
135        SomeArgs args = SomeArgs.obtain();
136        args.arg1 = arg2;
137        args.arg2 = arg3;
138        return mH.obtainMessage(what, arg1, 0, args);
139    }
140
141    public Message obtainMessageOO(int what, Object arg1, Object arg2) {
142        SomeArgs args = SomeArgs.obtain();
143        args.arg1 = arg1;
144        args.arg2 = arg2;
145        return mH.obtainMessage(what, 0, 0, args);
146    }
147
148    public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
149        SomeArgs args = SomeArgs.obtain();
150        args.arg1 = arg1;
151        args.arg2 = arg2;
152        args.arg3 = arg3;
153        return mH.obtainMessage(what, 0, 0, args);
154    }
155
156    public Message obtainMessageOOOO(int what, Object arg1, Object arg2,
157            Object arg3, Object arg4) {
158        SomeArgs args = SomeArgs.obtain();
159        args.arg1 = arg1;
160        args.arg2 = arg2;
161        args.arg3 = arg3;
162        args.arg4 = arg4;
163        return mH.obtainMessage(what, 0, 0, args);
164    }
165
166    public Message obtainMessageIIII(int what, int arg1, int arg2,
167            int arg3, int arg4) {
168        SomeArgs args = SomeArgs.obtain();
169        args.argi1 = arg1;
170        args.argi2 = arg2;
171        args.argi3 = arg3;
172        args.argi4 = arg4;
173        return mH.obtainMessage(what, 0, 0, args);
174    }
175
176    public Message obtainMessageIIIIII(int what, int arg1, int arg2,
177            int arg3, int arg4, int arg5, int arg6) {
178        SomeArgs args = SomeArgs.obtain();
179        args.argi1 = arg1;
180        args.argi2 = arg2;
181        args.argi3 = arg3;
182        args.argi4 = arg4;
183        args.argi5 = arg5;
184        args.argi6 = arg6;
185        return mH.obtainMessage(what, 0, 0, args);
186    }
187
188    public Message obtainMessageIIIIO(int what, int arg1, int arg2,
189            int arg3, int arg4, Object arg5) {
190        SomeArgs args = SomeArgs.obtain();
191        args.arg1 = arg5;
192        args.argi1 = arg1;
193        args.argi2 = arg2;
194        args.argi3 = arg3;
195        args.argi4 = arg4;
196        return mH.obtainMessage(what, 0, 0, args);
197    }
198}
199