Home | History | Annotate | Download | only in shadows
      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
     18   public void abortBroadcast() {
     19     // TODO probably needs a check to prevent calling this method from ordinary Broadcasts
     20     abort.set(true);
     21   }
     22 
     23   @Implementation
     24   public void onReceive(Context context, Intent intent) {
     25     if (abort == null || !abort.get()) {
     26       receiver.onReceive(context, intent);
     27     }
     28   }
     29 
     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