1 package org.robolectric.shadows; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import java.util.concurrent.atomic.AtomicBoolean; 7 import org.robolectric.annotation.Implementation; 8 import org.robolectric.annotation.Implements; 9 import org.robolectric.annotation.RealObject; 10 11 @Implements(BroadcastReceiver.class) 12 public class ShadowBroadcastReceiver { 13 @RealObject BroadcastReceiver receiver; 14 15 private AtomicBoolean abort; // The abort state of the currently processed broadcast 16 17 @Implementation abortBroadcast()18 protected void abortBroadcast() { 19 // TODO probably needs a check to prevent calling this method from ordinary Broadcasts 20 abort.set(true); 21 } 22 23 @Implementation onReceive(Context context, Intent intent)24 protected void onReceive(Context context, Intent intent) { 25 if (abort == null || !abort.get()) { 26 receiver.onReceive(context, intent); 27 } 28 } 29 onReceive(Context context, Intent intent, AtomicBoolean abort)30 public void onReceive(Context context, Intent intent, AtomicBoolean abort) { 31 this.abort = abort; 32 onReceive(context, intent); 33 // If the underlying receiver has called goAsync(), we should not finish the pending result yet - they'll do that 34 // for us. 35 if (receiver.getPendingResult() != null) { 36 receiver.getPendingResult().finish(); 37 } 38 } 39 } 40