Home | History | Annotate | Download | only in os
      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 obtainMessageIIOOO(int what, int arg1, int arg2, Object arg3, Object arg4,
    168             Object arg5) {
    169         SomeArgs args = SomeArgs.obtain();
    170         args.arg1 = arg3;
    171         args.arg2 = arg4;
    172         args.arg3 = arg5;
    173         return mH.obtainMessage(what, arg1, arg2, args);
    174     }
    175 
    176     public Message obtainMessageIIOOOO(int what, int arg1, int arg2, Object arg3, Object arg4,
    177             Object arg5, Object arg6) {
    178         SomeArgs args = SomeArgs.obtain();
    179         args.arg1 = arg3;
    180         args.arg2 = arg4;
    181         args.arg3 = arg5;
    182         args.arg4 = arg6;
    183         return mH.obtainMessage(what, arg1, arg2, args);
    184     }
    185 
    186     public Message obtainMessageOO(int what, Object arg1, Object arg2) {
    187         SomeArgs args = SomeArgs.obtain();
    188         args.arg1 = arg1;
    189         args.arg2 = arg2;
    190         return mH.obtainMessage(what, 0, 0, args);
    191     }
    192 
    193     public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
    194         SomeArgs args = SomeArgs.obtain();
    195         args.arg1 = arg1;
    196         args.arg2 = arg2;
    197         args.arg3 = arg3;
    198         return mH.obtainMessage(what, 0, 0, args);
    199     }
    200 
    201     public Message obtainMessageOOOO(int what, Object arg1, Object arg2,
    202             Object arg3, Object arg4) {
    203         SomeArgs args = SomeArgs.obtain();
    204         args.arg1 = arg1;
    205         args.arg2 = arg2;
    206         args.arg3 = arg3;
    207         args.arg4 = arg4;
    208         return mH.obtainMessage(what, 0, 0, args);
    209     }
    210 
    211     public Message obtainMessageOOOOO(int what, Object arg1, Object arg2,
    212             Object arg3, Object arg4, Object arg5) {
    213         SomeArgs args = SomeArgs.obtain();
    214         args.arg1 = arg1;
    215         args.arg2 = arg2;
    216         args.arg3 = arg3;
    217         args.arg4 = arg4;
    218         args.arg5 = arg5;
    219         return mH.obtainMessage(what, 0, 0, args);
    220     }
    221 
    222     public Message obtainMessageOOOOII(int what, Object arg1, Object arg2,
    223             Object arg3, Object arg4, int arg5, int arg6) {
    224         SomeArgs args = SomeArgs.obtain();
    225         args.arg1 = arg1;
    226         args.arg2 = arg2;
    227         args.arg3 = arg3;
    228         args.arg4 = arg4;
    229         args.argi5 = arg5;
    230         args.argi6 = arg6;
    231         return mH.obtainMessage(what, 0, 0, args);
    232     }
    233 
    234     public Message obtainMessageIIII(int what, int arg1, int arg2,
    235             int arg3, int arg4) {
    236         SomeArgs args = SomeArgs.obtain();
    237         args.argi1 = arg1;
    238         args.argi2 = arg2;
    239         args.argi3 = arg3;
    240         args.argi4 = arg4;
    241         return mH.obtainMessage(what, 0, 0, args);
    242     }
    243 
    244     public Message obtainMessageIIIIII(int what, int arg1, int arg2,
    245             int arg3, int arg4, int arg5, int arg6) {
    246         SomeArgs args = SomeArgs.obtain();
    247         args.argi1 = arg1;
    248         args.argi2 = arg2;
    249         args.argi3 = arg3;
    250         args.argi4 = arg4;
    251         args.argi5 = arg5;
    252         args.argi6 = arg6;
    253         return mH.obtainMessage(what, 0, 0, args);
    254     }
    255 
    256     public Message obtainMessageIIIIO(int what, int arg1, int arg2,
    257             int arg3, int arg4, Object arg5) {
    258         SomeArgs args = SomeArgs.obtain();
    259         args.arg1 = arg5;
    260         args.argi1 = arg1;
    261         args.argi2 = arg2;
    262         args.argi3 = arg3;
    263         args.argi4 = arg4;
    264         return mH.obtainMessage(what, 0, 0, args);
    265     }
    266 }
    267