1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.JELLY_BEAN; 4 import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1; 5 import static org.robolectric.RuntimeEnvironment.getApiLevel; 6 7 import android.content.BroadcastReceiver; 8 import android.content.Intent; 9 import android.os.Bundle; 10 import android.os.IBinder; 11 import com.google.common.base.Preconditions; 12 import com.google.common.util.concurrent.ListenableFuture; 13 import com.google.common.util.concurrent.SettableFuture; 14 import org.robolectric.annotation.Implementation; 15 import org.robolectric.annotation.Implements; 16 import org.robolectric.annotation.RealObject; 17 18 @Implements(BroadcastReceiver.PendingResult.class) 19 public final class ShadowBroadcastPendingResult { 20 @RealObject BroadcastReceiver.PendingResult pendingResult; 21 create(int resultCode, String resultData, Bundle resultExtras, boolean ordered)22 static BroadcastReceiver.PendingResult create(int resultCode, String resultData, Bundle resultExtras, boolean ordered) { 23 try { 24 if (getApiLevel() <= JELLY_BEAN) { 25 return BroadcastReceiver.PendingResult.class 26 .getConstructor(int.class, String.class, Bundle.class, int.class, boolean.class, boolean.class, IBinder.class) 27 .newInstance( 28 resultCode, 29 resultData, 30 resultExtras, 31 0 /* type */, 32 ordered, 33 false /*sticky*/, 34 null /* ibinder token */); 35 } else if (getApiLevel() <= LOLLIPOP_MR1) { 36 return BroadcastReceiver.PendingResult.class 37 .getConstructor(int.class, String.class, Bundle.class, int.class, boolean.class, boolean.class, IBinder.class, int.class) 38 .newInstance( 39 resultCode, 40 resultData, 41 resultExtras, 42 0 /* type */, 43 ordered, 44 false /*sticky*/, 45 null /* ibinder token */, 46 0 /* userid */); 47 48 } else { 49 return new BroadcastReceiver.PendingResult( 50 resultCode, 51 resultData, 52 resultExtras, 53 0 /* type */, 54 ordered, 55 false /*sticky*/, 56 null /* ibinder token */, 57 0 /* userid */, 58 0 /* flags */); 59 } 60 } catch (Exception e) { 61 throw new RuntimeException(e); 62 } 63 } 64 createSticky(Intent intent)65 static BroadcastReceiver.PendingResult createSticky(Intent intent) { 66 try { 67 if (getApiLevel() <= JELLY_BEAN) { 68 return BroadcastReceiver.PendingResult.class 69 .getConstructor( 70 int.class, 71 String.class, 72 Bundle.class, 73 int.class, 74 boolean.class, 75 boolean.class, 76 IBinder.class) 77 .newInstance( 78 0 /*resultCode*/, 79 intent.getDataString(), 80 intent.getExtras(), 81 0 /* type */, 82 false /*ordered*/, 83 true /*sticky*/, 84 null /* ibinder token */); 85 } else if (getApiLevel() <= LOLLIPOP_MR1) { 86 return BroadcastReceiver.PendingResult.class 87 .getConstructor( 88 int.class, 89 String.class, 90 Bundle.class, 91 int.class, 92 boolean.class, 93 boolean.class, 94 IBinder.class, 95 int.class) 96 .newInstance( 97 0 /*resultCode*/, 98 intent.getDataString(), 99 intent.getExtras(), 100 0 /* type */, 101 false /*ordered*/, 102 true /*sticky*/, 103 null /* ibinder token */, 104 0 /* userid */); 105 106 } else { 107 return new BroadcastReceiver.PendingResult( 108 0 /*resultCode*/, 109 intent.getDataString(), 110 intent.getExtras(), 111 0 /* type */, 112 false /*ordered*/, 113 true /*sticky*/, 114 null /* ibinder token */, 115 0 /* userid */, 116 0 /* flags */); 117 } 118 } catch (Exception e) { 119 throw new RuntimeException(e); 120 } 121 } 122 123 private final SettableFuture<BroadcastReceiver.PendingResult> finished = SettableFuture.create(); 124 125 @Implementation finish()126 protected final void finish() { 127 Preconditions.checkState(finished.set(pendingResult), "Broadcast already finished"); 128 } 129 getFuture()130 public ListenableFuture<BroadcastReceiver.PendingResult> getFuture() { 131 return finished; 132 } 133 } 134