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