1package org.robolectric.shadows.support.v4;
2
3import android.content.Intent;
4import android.os.Bundle;
5import android.support.v4.app.Fragment;
6import android.support.v4.app.FragmentActivity;
7import android.widget.LinearLayout;
8import org.robolectric.Robolectric;
9import org.robolectric.android.controller.ActivityController;
10import 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 */
17public 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