1704d59a9e57b28939ba5c709cf4b50d72aa072e6Christian Williamspackage org.robolectric.android.controller;
2d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
3851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
4851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williams
52d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrishimport android.app.ActivityThread;
6d77cda99f1fc52c208a304d8d351890c2f86b3acOr Barimport android.app.Application;
7d77cda99f1fc52c208a304d8d351890c2f86b3acOr Barimport android.app.IntentService;
8851f2a9519be23c73a9e2929128179b405e2e7a6Christian Williamsimport android.app.Service;
9d77cda99f1fc52c208a304d8d351890c2f86b3acOr Barimport android.content.Context;
10d77cda99f1fc52c208a304d8d351890c2f86b3acOr Barimport android.content.Intent;
11d77cda99f1fc52c208a304d8d351890c2f86b3acOr Barimport android.os.IBinder;
12d77cda99f1fc52c208a304d8d351890c2f86b3acOr Barimport org.robolectric.RuntimeEnvironment;
13704d59a9e57b28939ba5c709cf4b50d72aa072e6Christian Williamsimport org.robolectric.util.ReflectionHelpers;
14d7a9f4498c0efc28746d4d7bdf480f67f1058cb2Jonathan Gerrish
155ccd46d95e489a6216889d52ef94e4cf5a72ace4Jonathan Gerrishpublic class IntentServiceController<T extends IntentService> extends ComponentController<IntentServiceController<T>, T> {
16d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
172d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  public static <T extends IntentService> IntentServiceController<T> of(final T service, final Intent intent) {
182d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    final IntentServiceController<T> controller = new IntentServiceController<>(service, intent);
192d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    controller.attach();
202d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return controller;
212d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
222d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish
232d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  private IntentServiceController(final T service, final Intent intent) {
242d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    super(service, intent);
252d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
26d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
27ec931896007fd3c459ed0d48d6861366872c8296Brett Chabot  private IntentServiceController<T> attach() {
282d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    if (attached) {
298c2a42227e584a7d9c519e453ce715d4ce5172baOr Bar      return this;
30d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar    }
31d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
322d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    ReflectionHelpers.callInstanceMethod(Service.class, component, "attach",
332d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish       from(Context.class, RuntimeEnvironment.application.getBaseContext()),
342d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish       from(ActivityThread.class, null),
352d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish       from(String.class, component.getClass().getSimpleName()),
362d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish       from(IBinder.class, null),
372d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish       from(Application.class, RuntimeEnvironment.application),
382d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish       from(Object.class, null));
39d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
402d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    attached = true;
412d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return this;
422d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
43d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
442d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  public IntentServiceController<T> bind() {
452d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    invokeWhilePaused("onBind", from(Intent.class, getIntent()));
462d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return this;
472d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
48d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
492d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  @Override public IntentServiceController<T> create() {
502d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    invokeWhilePaused("onCreate");
512d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return this;
522d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
53d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
542d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  @Override public IntentServiceController<T> destroy() {
552d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    invokeWhilePaused("onDestroy");
562d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return this;
572d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
58d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
592d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  public IntentServiceController<T> rebind() {
602d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    invokeWhilePaused("onRebind", from(Intent.class, getIntent()));
612d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return this;
622d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
63d77cda99f1fc52c208a304d8d351890c2f86b3acOr Bar
642d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  public IntentServiceController<T> startCommand(final int flags, final int startId) {
652d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    final IntentServiceController<T> intentServiceController = handleIntent();
662d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    get().stopSelf(startId);
672d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return intentServiceController;
682d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
692d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish
702d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  public IntentServiceController<T> unbind() {
712d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    invokeWhilePaused("onUnbind", from(Intent.class, getIntent()));
722d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return this;
732d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
742d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish
752d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  public IntentServiceController<T> handleIntent() {
762d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    invokeWhilePaused("onHandleIntent", from(Intent.class, getIntent()));
772d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish    return this;
782d32b2d19d998e333132721bd35796214a4877c8Jonathan Gerrish  }
79582530917f13cef209225ce455ba5e4684d7b32dbrettchabot
80582530917f13cef209225ce455ba5e4684d7b32dbrettchabot  /**
81582530917f13cef209225ce455ba5e4684d7b32dbrettchabot   * @deprecated Use the appropriate builder in {@link org.robolectric.Robolectric} instead.
82582530917f13cef209225ce455ba5e4684d7b32dbrettchabot   *
83582530917f13cef209225ce455ba5e4684d7b32dbrettchabot   * This method will be removed in Robolectric 3.6.
84582530917f13cef209225ce455ba5e4684d7b32dbrettchabot   */
85582530917f13cef209225ce455ba5e4684d7b32dbrettchabot  @Deprecated
86582530917f13cef209225ce455ba5e4684d7b32dbrettchabot  public IntentServiceController<T> withIntent(Intent intent) {
87582530917f13cef209225ce455ba5e4684d7b32dbrettchabot    this.intent = intent;
88582530917f13cef209225ce455ba5e4684d7b32dbrettchabot    return this;
89582530917f13cef209225ce455ba5e4684d7b32dbrettchabot  }
907530851293fa9b96b602509a9c20a6978a1eb2cbBrett Chabot}
91