package com.malmstein.yahnac.injection; import com.malmstein.yahnac.analytics.CrashAnalytics; import com.malmstein.yahnac.analytics.UsageAnalytics; import com.malmstein.yahnac.data.ConnectionProvider; import com.malmstein.yahnac.data.DataPersister; import com.malmstein.yahnac.data.Provider; import com.malmstein.yahnac.invite.AppInviter; import com.novoda.notils.exception.DeveloperError; public class Inject { private static Inject INSTANCE; private final Provider provider; private final CrashAnalytics crashAnalytics; private final DataPersister persister; private final ConnectionProvider connectionProvider; private final UsageAnalytics analyticsTracker; private final AppInviter appInviter; private Inject(Provider provider, CrashAnalytics crashAnalytics, DataPersister persister, ConnectionProvider connectionProvider, UsageAnalytics analyticsTracker, AppInviter appInviter) { this.provider = provider; this.crashAnalytics = crashAnalytics; this.persister = persister; this.connectionProvider = connectionProvider; this.analyticsTracker = analyticsTracker; this.appInviter = appInviter; } public static void using(DependenciesFactory factory) { DataPersister dataPersister = factory.createDatabasePersister(); Provider provider = factory.createDataRepository(dataPersister); CrashAnalytics crashAnalytics = factory.createCrashAnalytics(); ConnectionProvider connectionProvider = factory.createConnection(); UsageAnalytics analyticsTracker = factory.createUsageAnalytics(); AppInviter appInviter = factory.createAppInviter(); INSTANCE = new Inject(provider, crashAnalytics, dataPersister, connectionProvider, analyticsTracker, appInviter); } private static Inject instance() { if (INSTANCE == null) { throw new DeveloperError("You need to setup Inject to use a valid DependenciesFactory"); } return INSTANCE; } public static Provider provider() { return instance().provider; } public static CrashAnalytics crashAnalytics() { return instance().crashAnalytics; } public static DataPersister dataPersister() { return instance().persister; } public static ConnectionProvider connectionProvider() { return instance().connectionProvider; } public static UsageAnalytics usageAnalytics() { return instance().analyticsTracker; } public static AppInviter appInviter() { return instance().appInviter; } }