1 package org.robolectric.shadows; 2 3 import static org.robolectric.util.reflector.Reflector.reflector; 4 5 import android.app.QueuedWork; 6 import android.os.Build; 7 import android.os.Handler; 8 import java.util.LinkedList; 9 import java.util.concurrent.ExecutorService; 10 import org.robolectric.RuntimeEnvironment; 11 import org.robolectric.annotation.Implements; 12 import org.robolectric.annotation.Resetter; 13 import org.robolectric.util.ReflectionHelpers; 14 import org.robolectric.util.reflector.Accessor; 15 import org.robolectric.util.reflector.ForType; 16 import org.robolectric.util.reflector.Static; 17 18 @Implements(value = QueuedWork.class, isInAndroidSdk = false) 19 public class ShadowQueuedWork { 20 21 @Resetter reset()22 public static void reset() { 23 24 if (RuntimeEnvironment.getApiLevel() >= Build.VERSION_CODES.O) { 25 resetStateApi26(); 26 } else { 27 QueuedWork.waitToFinish(); 28 reflector(QueuedWorkReflector.class).setSingleThreadExecutor(null); 29 } 30 } 31 resetStateApi26()32 private static void resetStateApi26() { 33 Handler queuedWorkHandler = ReflectionHelpers.getStaticField(QueuedWork.class, "sHandler"); 34 if (queuedWorkHandler != null) { 35 queuedWorkHandler.removeCallbacksAndMessages(null); 36 } 37 QueuedWorkReflector queuedWorkReflector = reflector(QueuedWorkReflector.class); 38 queuedWorkReflector.getFinishers().clear(); 39 queuedWorkReflector.getWork().clear(); 40 queuedWorkReflector.setNumWaits(0); 41 } 42 43 /** Accessor interface for {@link QueuedWork}'s internals. */ 44 @ForType(QueuedWork.class) 45 interface QueuedWorkReflector { 46 47 @Static 48 @Accessor("sFinishers") getFinishers()49 LinkedList<Runnable> getFinishers(); 50 51 @Static 52 @Accessor("sSingleThreadExecutor") setSingleThreadExecutor(ExecutorService o)53 void setSingleThreadExecutor(ExecutorService o); 54 55 @Static 56 @Accessor("sWork") getWork()57 LinkedList<Runnable> getWork(); 58 59 // yep, it starts with 'm' but it's static 60 @Static 61 @Accessor("mNumWaits") setNumWaits(int i)62 void setNumWaits(int i); 63 64 @Static 65 @Accessor("sHandler") setHandler(Handler handler)66 void setHandler(Handler handler); 67 68 @Static add(Runnable runnable)69 void add(Runnable runnable); 70 } 71 } 72