Home | History | Annotate | Download | only in v4
      1 package org.robolectric.shadows.support.v4;
      2 
      3 import android.content.Intent;
      4 import android.os.Bundle;
      5 import android.support.v4.app.Fragment;
      6 import android.support.v4.app.FragmentActivity;
      7 import android.widget.LinearLayout;
      8 import org.robolectric.Robolectric;
      9 import org.robolectric.android.controller.ActivityController;
     10 import org.robolectric.android.controller.ComponentController;
     11 
     12 /**
     13  * Version of FragmentController that can be used for android.support.v4.Fragment. Only
     14  * necessary if more complex lifecycle management is needed, otherwise SupportFragmentTestUtil
     15  * should be sufficient.
     16  */
     17 public class SupportFragmentController<F extends Fragment> extends ComponentController<SupportFragmentController<F>, F> {
     18   private final F fragment;
     19   private final ActivityController<? extends FragmentActivity> activityController;
     20 
     21   protected SupportFragmentController(F fragment, Class<? extends FragmentActivity> activityClass) {
     22     this(fragment, activityClass, null);
     23   }
     24 
     25   protected SupportFragmentController(F fragment, Class<? extends FragmentActivity> activityClass, Intent intent) {
     26     super(fragment, intent);
     27     this.fragment = fragment;
     28     this.activityController = Robolectric.buildActivity(activityClass, intent);
     29   }
     30 
     31   public static <F extends Fragment> SupportFragmentController<F> of(F fragment) {
     32     return new SupportFragmentController<>(fragment, FragmentControllerActivity.class);
     33   }
     34 
     35   public static <F extends Fragment> SupportFragmentController<F> of(F fragment, Class<? extends FragmentActivity> activityClass) {
     36     return new SupportFragmentController<>(fragment, activityClass);
     37   }
     38 
     39   public static <F extends Fragment> SupportFragmentController<F> of(F fragment, Class<? extends FragmentActivity> activityClass, Intent intent) {
     40     return new SupportFragmentController<>(fragment, activityClass, intent);
     41   }
     42 
     43   /**
     44    * Creates the activity with {@link Bundle} and adds the fragment to the view with ID {@code contentViewId}.
     45    */
     46   public SupportFragmentController<F> create(final int contentViewId, final Bundle bundle) {
     47     shadowMainLooper.runPaused(new Runnable() {
     48       @Override
     49       public void run() {
     50         activityController.create(bundle).get().getSupportFragmentManager().beginTransaction().add(contentViewId, fragment).commit();
     51       }
     52     });
     53     return this;
     54   }
     55 
     56   /**
     57    * Creates the activity with {@link Bundle} and adds the fragment to it. Note that the fragment will be added to the view with ID 1.
     58    */
     59   public SupportFragmentController<F> create(final Bundle bundle) {
     60     return create(1, bundle);
     61   }
     62 
     63   @Override
     64   public SupportFragmentController<F> create() {
     65     return create(null);
     66   }
     67 
     68   @Override
     69   public SupportFragmentController<F> destroy() {
     70     shadowMainLooper.runPaused(new Runnable() {
     71       @Override
     72       public void run() {
     73         activityController.destroy();
     74       }
     75     });
     76     return this;
     77   }
     78 
     79   public SupportFragmentController<F> start() {
     80     shadowMainLooper.runPaused(new Runnable() {
     81       @Override
     82       public void run() {
     83         activityController.start();
     84       }
     85     });
     86     return this;
     87   }
     88 
     89   public SupportFragmentController<F> resume() {
     90     shadowMainLooper.runPaused(new Runnable() {
     91       @Override
     92       public void run() {
     93         activityController.resume();
     94       }
     95     });
     96     return this;
     97   }
     98 
     99   public SupportFragmentController<F> pause() {
    100     shadowMainLooper.runPaused(new Runnable() {
    101       @Override
    102       public void run() {
    103         activityController.pause();
    104       }
    105     });
    106     return this;
    107   }
    108 
    109   public SupportFragmentController<F> stop() {
    110     shadowMainLooper.runPaused(new Runnable() {
    111       @Override
    112       public void run() {
    113         activityController.stop();
    114       }
    115     });
    116     return this;
    117   }
    118 
    119   public SupportFragmentController<F> visible() {
    120     shadowMainLooper.runPaused(new Runnable() {
    121       @Override
    122       public void run() {
    123         activityController.visible();
    124       }
    125     });
    126     return this;
    127   }
    128 
    129   private static class FragmentControllerActivity extends FragmentActivity {
    130     @Override
    131     protected void onCreate(Bundle savedInstanceState) {
    132       super.onCreate(savedInstanceState);
    133       LinearLayout view = new LinearLayout(this);
    134       view.setId(1);
    135 
    136       setContentView(view);
    137     }
    138   }
    139 }
    140