blob: bab1e21812ae28c16ca384e02048dae53d97b094 [file] [log] [blame]
package com.android.internal.os;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
public class HandlerCaller {
private static final String TAG = "HandlerCaller";
private static final boolean DEBUG = false;
public final Context mContext;
final Looper mMainLooper;
final Handler mH;
final Callback mCallback;
public static class SomeArgs {
SomeArgs next;
public Object arg1;
public Object arg2;
public Object arg3;
public Object arg4;
public int argi1;
public int argi2;
public int argi3;
public int argi4;
public int argi5;
public int argi6;
}
static final int ARGS_POOL_MAX_SIZE = 10;
int mArgsPoolSize;
SomeArgs mArgsPool;
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
mCallback.executeMessage(msg);
}
}
public interface Callback {
public void executeMessage(Message msg);
}
public HandlerCaller(Context context, Callback callback) {
mContext = context;
mMainLooper = context.getMainLooper();
mH = new MyHandler(mMainLooper);
mCallback = callback;
}
public SomeArgs obtainArgs() {
synchronized (mH) {
SomeArgs args = mArgsPool;
if (args != null) {
mArgsPool = args.next;
args.next = null;
mArgsPoolSize--;
return args;
}
}
return new SomeArgs();
}
public void recycleArgs(SomeArgs args) {
synchronized (mH) {
if (mArgsPoolSize < ARGS_POOL_MAX_SIZE) {
args.next = mArgsPool;
mArgsPool = args;
mArgsPoolSize++;
}
}
}
public void executeOrSendMessage(Message msg) {
// If we are calling this from the main thread, then we can call
// right through. Otherwise, we need to send the message to the
// main thread.
if (Looper.myLooper() == mMainLooper) {
mCallback.executeMessage(msg);
msg.recycle();
return;
}
mH.sendMessage(msg);
}
public void sendMessage(Message msg) {
mH.sendMessage(msg);
}
public Message obtainMessage(int what) {
return mH.obtainMessage(what);
}
public Message obtainMessageBO(int what, boolean arg1, Object arg2) {
return mH.obtainMessage(what, arg1 ? 1 : 0, 0, arg2);
}
public Message obtainMessageBOO(int what, boolean arg1, Object arg2, Object arg3) {
SomeArgs args = obtainArgs();
args.arg1 = arg2;
args.arg2 = arg3;
return mH.obtainMessage(what, arg1 ? 1 : 0, 0, args);
}
public Message obtainMessageO(int what, Object arg1) {
return mH.obtainMessage(what, 0, 0, arg1);
}
public Message obtainMessageI(int what, int arg1) {
return mH.obtainMessage(what, arg1, 0);
}
public Message obtainMessageIO(int what, int arg1, Object arg2) {
return mH.obtainMessage(what, arg1, 0, arg2);
}
public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) {
return mH.obtainMessage(what, arg1, arg2, arg3);
}
public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
SomeArgs args = obtainArgs();
args.arg1 = arg2;
args.arg2 = arg3;
return mH.obtainMessage(what, arg1, 0, args);
}
public Message obtainMessageOO(int what, Object arg1, Object arg2) {
SomeArgs args = obtainArgs();
args.arg1 = arg1;
args.arg2 = arg2;
return mH.obtainMessage(what, 0, 0, args);
}
public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
SomeArgs args = obtainArgs();
args.arg1 = arg1;
args.arg2 = arg2;
args.arg3 = arg3;
return mH.obtainMessage(what, 0, 0, args);
}
public Message obtainMessageOOOO(int what, Object arg1, Object arg2,
Object arg3, Object arg4) {
SomeArgs args = obtainArgs();
args.arg1 = arg1;
args.arg2 = arg2;
args.arg3 = arg3;
args.arg4 = arg4;
return mH.obtainMessage(what, 0, 0, args);
}
public Message obtainMessageIIII(int what, int arg1, int arg2,
int arg3, int arg4) {
SomeArgs args = obtainArgs();
args.argi1 = arg1;
args.argi2 = arg2;
args.argi3 = arg3;
args.argi4 = arg4;
return mH.obtainMessage(what, 0, 0, args);
}
public Message obtainMessageIIIIII(int what, int arg1, int arg2,
int arg3, int arg4, int arg5, int arg6) {
SomeArgs args = obtainArgs();
args.argi1 = arg1;
args.argi2 = arg2;
args.argi3 = arg3;
args.argi4 = arg4;
args.argi5 = arg5;
args.argi6 = arg6;
return mH.obtainMessage(what, 0, 0, args);
}
public Message obtainMessageIIIIO(int what, int arg1, int arg2,
int arg3, int arg4, Object arg5) {
SomeArgs args = obtainArgs();
args.arg1 = arg5;
args.argi1 = arg1;
args.argi2 = arg2;
args.argi3 = arg3;
args.argi4 = arg4;
return mH.obtainMessage(what, 0, 0, args);
}
}