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