• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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