Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import com.xtremelabs.robolectric.internal.Implementation;
      4 import com.xtremelabs.robolectric.internal.Implements;
      5 import com.xtremelabs.robolectric.internal.RealObject;
      6 
      7 import android.os.HandlerThread;
      8 import android.os.Looper;
      9 
     10 import java.lang.reflect.InvocationTargetException;
     11 import java.lang.reflect.Method;
     12 
     13 @Implements(HandlerThread.class)
     14 public class ShadowHandlerThread {
     15     private Looper looper;
     16 
     17     @RealObject
     18     private HandlerThread thread;
     19 
     20     public void __constructor__(String name) {
     21         __constructor__(name, -1);
     22     }
     23 
     24     @SuppressWarnings("UnusedParameters")
     25     public void __constructor__(String name, int priority) {
     26     }
     27 
     28     @Implementation
     29     public void run() {
     30         Looper.prepare();
     31         synchronized (this) {
     32             looper = Looper.myLooper();
     33             onLooperPrepared();
     34             notifyAll();
     35         }
     36         Looper.loop();
     37     }
     38 
     39     @Implementation
     40     public Looper getLooper() {
     41         if (!thread.isAlive()) {
     42             return null;
     43         }
     44 
     45         // If the thread has been started, wait until the looper has been created.
     46         synchronized (this) {
     47             while (thread.isAlive() && looper == null) {
     48                 try {
     49                     wait();
     50                 } catch (InterruptedException ignored) {
     51                 }
     52             }
     53         }
     54         return looper;
     55     }
     56 
     57     @Implementation
     58     public boolean quit() {
     59         Looper looper = getLooper();
     60         if (looper != null) {
     61             looper.quit();
     62             return true;
     63         }
     64         return false;
     65     }
     66 
     67     @Implementation
     68     public void onLooperPrepared() {
     69         Method prepared;
     70         try {
     71             prepared = HandlerThread.class.getDeclaredMethod("onLooperPrepared");
     72             prepared.setAccessible(true);
     73             prepared.invoke(thread);
     74         } catch (NoSuchMethodException ignored) {
     75         } catch (InvocationTargetException ignored) {
     76         } catch (IllegalAccessException ignored) {
     77         }
     78     }
     79 
     80 }
     81