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