// Path: app/src/main/java/fr/guddy/androidstarter/ApplicationAndroidStarter.java
// @AutoComponent(
//         modules = {
//                 ModuleAsync.class,
//                 ModuleBus.class,
//                 ModuleContext.class,
//                 ModuleDatabase.class,
//                 ModuleEnvironment.class,
//                 ModuleRest.class,
//                 ModuleTransformer.class
//         },
//         subcomponents = {
//                 MvpRepoDetail.class
//         }
// )
// @Singleton
// @AutoInjector(ApplicationAndroidStarter.class)
// public class ApplicationAndroidStarter extends Application {
//     private static final String TAG = ApplicationAndroidStarter.class.getSimpleName();
// 
//     //region Singleton
//     protected static ApplicationAndroidStarter sSharedApplication;
// 
//     public static ApplicationAndroidStarter sharedApplication() {
//         return sSharedApplication;
//     }
//     //endregion
// 
//     //region Fields (components)
//     protected ApplicationAndroidStarterComponent mComponentApplication;
//     //endregion
// 
//     //region Injected fields
//     @Inject
//     Merlin merlin;
//     //endregion
// 
//     //region Overridden methods
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         sSharedApplication = this;
// 
//         Logger.init(TAG)
//                 .logLevel(LogLevel.FULL);
// 
//         buildComponent();
// 
//         mComponentApplication.inject(this);
//         merlin.bind();
// 
//         final StrictMode.ThreadPolicy loStrictModeThreadPolicy = new StrictMode.ThreadPolicy.Builder()
//                 .detectAll()
//                 .penaltyDeath()
//                 .build();
//         StrictMode.setThreadPolicy(loStrictModeThreadPolicy);
//     }
// 
//     @Override
//     public void onTerminate() {
//         super.onTerminate();
//         sSharedApplication = null;
//         OpenHelperManager.releaseHelper();
//         merlin.unbind();
//     }
//     //endregion
// 
//     //region Getters
//     public ApplicationAndroidStarterComponent componentApplication() {
//         return mComponentApplication;
//     }
//     //endregion
// 
//     //region Protected methods
//     protected void buildComponent() {
//         mComponentApplication = DaggerApplicationAndroidStarterComponent.builder()
//                 .moduleAsync(new ModuleAsync())
//                 .moduleBus(new ModuleBus())
//                 .moduleContext(new ModuleContext(getApplicationContext()))
//                 .moduleDatabase(new ModuleDatabase())
//                 .moduleEnvironment(new ModuleEnvironment())
//                 .moduleRest(new ModuleRest())
//                 .moduleTransformer(new ModuleTransformer())
//                 .build();
//     }
//     //endregion
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleAsync.java
// @Module
// public class ModuleAsync {
// 
//     @Provides
//     @Singleton
//     public JobManager provideJobManager(@NonNull final Context poContext) {
//         final Configuration loConfiguration = new Configuration.Builder(poContext)
//                 .minConsumerCount(1) //always keep at least one consumer alive
//                 .maxConsumerCount(3) //up to 3 consumers at a time
//                 .loadFactor(3) //3 jobs per consumer
//                 .consumerKeepAlive(120) //wait 2 minutes
//                 .build();
//         return new JobManager(loConfiguration);
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleBus.java
// @Module
// public class ModuleBus {
// 
//     @Provides
//     @Singleton
//     public BusManager provideBusManager() {
//         return new BusManager();
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleContext.java
// @Module
// public class ModuleContext {
//     private final Context mContext;
// 
//     public ModuleContext(@NonNull final Context poContext) {
//         mContext = poContext;
//     }
// 
//     @Provides
//     public Context provideContext() {
//         return mContext;
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleEnvironment.java
// @Module
// public class ModuleEnvironment {
// 
//     @Provides
//     @Singleton
//     public IEnvironment provideEnvironment() {
//         return BuildConfig.ENVIRONMENT;
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleTransformer.java
// @Module
// public class ModuleTransformer {
//     public static final String TRANSFORMER_REPO = "TRANSFORMER_REPO";
// 
//     @Provides
//     @Singleton
//     @Named(TRANSFORMER_REPO)
//     public Transformer provideTransformerRepo() {
//         return new Transformer.Builder()
//                 .build(RepoEntity.class);
//     }
// }


import fr.guddy.androidstarter.ApplicationAndroidStarter;
import fr.guddy.androidstarter.DaggerApplicationAndroidStarterComponent;
import fr.guddy.androidstarter.di.modules.ModuleAsync;
import fr.guddy.androidstarter.di.modules.ModuleBus;
import fr.guddy.androidstarter.di.modules.ModuleContext;
import fr.guddy.androidstarter.di.modules.ModuleEnvironment;
import fr.guddy.androidstarter.di.modules.ModuleTransformer;


    //region Lifecycle
    @Override
    public void onCreate() {
        super.onCreate();
        sSharedMockApplication = this;
    }
    //endregion

    //region Overridden method
    @Override
    protected void buildComponent() {
        mModuleAsync = new ModuleAsync();
        mModuleBus = new ModuleBus();
        mModuleRest = new MockModuleRest();
        mModuleEnvironment = new MockModuleEnvironment();

        mComponentApplication = DaggerApplicationAndroidStarterComponent.builder()
                .moduleAsync(mModuleAsync)
                .moduleBus(mModuleBus)
                .moduleContext(new ModuleContext(getApplicationContext()))
                .moduleDatabase(new MockModuleDatabase())
                .moduleEnvironment(mModuleEnvironment)
                .moduleRest(mModuleRest)
                .moduleTransformer(new ModuleTransformer())
                .build();
    }
    //endregion

    //region Getters

// Path: app/src/main/java/fr/guddy/androidstarter/ApplicationAndroidStarter.java
// @AutoComponent(
//         modules = {
//                 ModuleAsync.class,
//                 ModuleBus.class,
//                 ModuleContext.class,
//                 ModuleDatabase.class,
//                 ModuleEnvironment.class,
//                 ModuleRest.class,
//                 ModuleTransformer.class
//         },
//         subcomponents = {
//                 MvpRepoDetail.class
//         }
// )
// @Singleton
// @AutoInjector(ApplicationAndroidStarter.class)
// public class ApplicationAndroidStarter extends Application {
//     private static final String TAG = ApplicationAndroidStarter.class.getSimpleName();
// 
//     //region Singleton
//     protected static ApplicationAndroidStarter sSharedApplication;
// 
//     public static ApplicationAndroidStarter sharedApplication() {
//         return sSharedApplication;
//     }
//     //endregion
// 
//     //region Fields (components)
//     protected ApplicationAndroidStarterComponent mComponentApplication;
//     //endregion
// 
//     //region Injected fields
//     @Inject
//     Merlin merlin;
//     //endregion
// 
//     //region Overridden methods
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         sSharedApplication = this;
// 
//         Logger.init(TAG)
//                 .logLevel(LogLevel.FULL);
// 
//         buildComponent();
// 
//         mComponentApplication.inject(this);
//         merlin.bind();
// 
//         final StrictMode.ThreadPolicy loStrictModeThreadPolicy = new StrictMode.ThreadPolicy.Builder()
//                 .detectAll()
//                 .penaltyDeath()
//                 .build();
//         StrictMode.setThreadPolicy(loStrictModeThreadPolicy);
//     }
// 
//     @Override
//     public void onTerminate() {
//         super.onTerminate();
//         sSharedApplication = null;
//         OpenHelperManager.releaseHelper();
//         merlin.unbind();
//     }
//     //endregion
// 
//     //region Getters
//     public ApplicationAndroidStarterComponent componentApplication() {
//         return mComponentApplication;
//     }
//     //endregion
// 
//     //region Protected methods
//     protected void buildComponent() {
//         mComponentApplication = DaggerApplicationAndroidStarterComponent.builder()
//                 .moduleAsync(new ModuleAsync())
//                 .moduleBus(new ModuleBus())
//                 .moduleContext(new ModuleContext(getApplicationContext()))
//                 .moduleDatabase(new ModuleDatabase())
//                 .moduleEnvironment(new ModuleEnvironment())
//                 .moduleRest(new ModuleRest())
//                 .moduleTransformer(new ModuleTransformer())
//                 .build();
//     }
//     //endregion
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleAsync.java
// @Module
// public class ModuleAsync {
// 
//     @Provides
//     @Singleton
//     public JobManager provideJobManager(@NonNull final Context poContext) {
//         final Configuration loConfiguration = new Configuration.Builder(poContext)
//                 .minConsumerCount(1) //always keep at least one consumer alive
//                 .maxConsumerCount(3) //up to 3 consumers at a time
//                 .loadFactor(3) //3 jobs per consumer
//                 .consumerKeepAlive(120) //wait 2 minutes
//                 .build();
//         return new JobManager(loConfiguration);
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleBus.java
// @Module
// public class ModuleBus {
// 
//     @Provides
//     @Singleton
//     public BusManager provideBusManager() {
//         return new BusManager();
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleContext.java
// @Module
// public class ModuleContext {
//     private final Context mContext;
// 
//     public ModuleContext(@NonNull final Context poContext) {
//         mContext = poContext;
//     }
// 
//     @Provides
//     public Context provideContext() {
//         return mContext;
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleEnvironment.java
// @Module
// public class ModuleEnvironment {
// 
//     @Provides
//     @Singleton
//     public IEnvironment provideEnvironment() {
//         return BuildConfig.ENVIRONMENT;
//     }
// }
// 
// Path: app/src/main/java/fr/guddy/androidstarter/di/modules/ModuleTransformer.java
// @Module
// public class ModuleTransformer {
//     public static final String TRANSFORMER_REPO = "TRANSFORMER_REPO";
// 
//     @Provides
//     @Singleton
//     @Named(TRANSFORMER_REPO)
//     public Transformer provideTransformerRepo() {
//         return new Transformer.Builder()
//                 .build(RepoEntity.class);
//     }
// }


// Path: app/src/androidTest/java/fr/guddy/androidstarter/tests/mock/MockApplication.java
import fr.guddy.androidstarter.ApplicationAndroidStarter;
import fr.guddy.androidstarter.DaggerApplicationAndroidStarterComponent;
import fr.guddy.androidstarter.di.modules.ModuleAsync;
import fr.guddy.androidstarter.di.modules.ModuleBus;
import fr.guddy.androidstarter.di.modules.ModuleContext;
import fr.guddy.androidstarter.di.modules.ModuleEnvironment;
import fr.guddy.androidstarter.di.modules.ModuleTransformer;


    //region Lifecycle
    @Override
    public void onCreate() {
        super.onCreate();
        sSharedMockApplication = this;
    }
    //endregion

    //region Overridden method
    @Override
    protected void buildComponent() {
        mModuleAsync = new ModuleAsync();
        mModuleBus = new ModuleBus();
        mModuleRest = new MockModuleRest();
        mModuleEnvironment = new MockModuleEnvironment();

        mComponentApplication = DaggerApplicationAndroidStarterComponent.builder()
                .moduleAsync(mModuleAsync)
                .moduleBus(mModuleBus)
                .moduleContext(new ModuleContext(getApplicationContext()))
                .moduleDatabase(new MockModuleDatabase())
                .moduleEnvironment(mModuleEnvironment)
                .moduleRest(mModuleRest)
                .moduleTransformer(new ModuleTransformer())
                .build();
    }
    //endregion

    //region Getters

    public ModuleAsync getModuleAsync() {
