package com.byoutline.kickmaterial.espressohelpers; import android.app.Activity; import android.os.Handler; import android.os.Looper; import android.support.test.rule.ActivityTestRule; import com.byoutline.kickmaterial.KickMaterialApp; import com.byoutline.kickmaterial.activities.MainActivity; import com.byoutline.kickmaterial.dagger.AppComponent; import com.byoutline.kickmaterial.dagger.DaggerGlobalComponent; import com.byoutline.kickmaterial.dagger.GlobalComponent; import com.byoutline.kickmaterial.dagger.GlobalModule; /** * Methods returning custom {@link ActivityTestRule}s that set test {@link AppComponent}. * * @author Sebastian Kacprzak <sebastian.kacprzak at byoutline.com> */ public final class DaggerRules { private DaggerRules() { } public static ActivityTestRule<MainActivity> userFirstLaunchRule() { return getActivityRule(TestComponents::getFirstRunAppComponent, MainActivity.class); } public static ActivityTestRule<MainActivity> userNextLaunchRule() { return getActivityRule(TestComponents::getNextRunAppComponent, MainActivity.class); } public static <ACTIVITY extends Activity> ActivityTestRule<ACTIVITY> getActivityRule(final AppComponentProvider mainComponentProv, Class<ACTIVITY> clazz) { final Handler mainHandler = new Handler(Looper.getMainLooper()); return new DaggerActivityTestRule<>(clazz, (application, activity) -> { final KickMaterialApp app = (KickMaterialApp) application; final AppComponent appComponent = mainComponentProv.getComponent(app); final GlobalComponent globalComponent = DaggerGlobalComponent.builder() .globalModule(new GlobalModule(app, appComponent.getBus(), appComponent.getAccessTokenProvider())) .build(); mainHandler.post(() -> app.setComponents(globalComponent, appComponent)); }); } public interface AppComponentProvider { AppComponent getComponent(KickMaterialApp app); } }