package com.rapidftr.utils; import android.content.Context; import android.content.SharedPreferences; import com.google.inject.AbstractModule; import com.google.inject.Provider; import com.google.inject.Provides; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; import com.rapidftr.RapidFtrApplication; import com.rapidftr.database.DatabaseHelper; import com.rapidftr.database.DatabaseSession; import com.rapidftr.database.SQLCipherHelper; import com.rapidftr.features.FeatureToggle; import com.rapidftr.model.Child; import com.rapidftr.model.Enquiry; import com.rapidftr.model.PotentialMatch; import com.rapidftr.model.User; import com.rapidftr.repository.ChildRepository; import com.rapidftr.repository.EnquiryRepository; import com.rapidftr.repository.PotentialMatchRepository; import com.rapidftr.repository.Repository; import com.rapidftr.service.*; import com.rapidftr.task.RegisterUnverifiedUserAsyncTask; import com.rapidftr.task.SyncAllDataAsyncTask; import com.rapidftr.task.SyncUnverifiedDataAsyncTask; import com.rapidftr.task.SynchronisationAsyncTask; import com.rapidftr.utils.http.FluentRequest; import org.json.JSONException; public class ApplicationInjector extends AbstractModule { @Override protected void configure() { bind(Context.class).to(RapidFtrApplication.class); bind(DatabaseHelper.class).to(SQLCipherHelper.class); bind(new TypeLiteral<Repository<Child>>() { }).to(ChildRepository.class); bind(new TypeLiteral<Repository<Enquiry>>() { }).to(EnquiryRepository.class); bind(new TypeLiteral<Repository<PotentialMatch>>() { }).to(PotentialMatchRepository.class); bind(FormService.class); bind(RegisterUserService.class); bind(RegisterUnverifiedUserAsyncTask.class); bind(FluentRequest.class); bind(new TypeLiteral<SyncService<Child>>() { }).to(ChildSyncService.class); bind(new TypeLiteral<SyncService<Enquiry>>() { }).to(EnquirySyncService.class); bind(new TypeLiteral<SyncService<PotentialMatch>>() { }).to(PotentialMatchSyncService.class); bind(LogOutService.class); bind(LoginService.class); bind(DeviceService.class); bind(FeatureToggle.class); } @Provides @Named("USER_NAME") public String getUserName(User user) { return user.getUserName(); } @Provides public RapidFtrApplication getRapidFTRApplication() { return RapidFtrApplication.getApplicationInstance(); } @Provides public DatabaseSession getDatabaseSession(DatabaseHelper helper) { return helper.getSession(); } @Provides public User getUser(RapidFtrApplication application) throws JSONException { return application.isLoggedIn() ? application.getCurrentUser() : null; } @Provides public SynchronisationAsyncTask<Child> getChildSynchronisationAsyncTask(User user, Provider<SyncAllDataAsyncTask<Child>> provider1, Provider<SyncUnverifiedDataAsyncTask<Child>> provider2) { return user.isVerified() ? provider1.get() : provider2.get(); } @Provides public SynchronisationAsyncTask<Enquiry> getEnquirySynchronisationAsyncTask(User user, Provider<SyncAllDataAsyncTask<Enquiry>> provider1, Provider<SyncUnverifiedDataAsyncTask<Enquiry>> provider2) { return user.isVerified() ? provider1.get() : provider2.get(); } @Provides public SynchronisationAsyncTask<PotentialMatch> getPotentialMatchSynchronisationAsyncTask(User user, Provider<SyncAllDataAsyncTask<PotentialMatch>> provider1, Provider<SyncUnverifiedDataAsyncTask<PotentialMatch>> provider2) { return user.isVerified() ? provider1.get() : provider2.get(); } @Provides public SharedPreferences getSharedPreferences() { return RapidFtrApplication.getApplicationInstance().getSharedPreferences(); } @Provides public EntityHttpDao<Enquiry> getEnquiryHttpDao(RapidFtrApplication rapidFtrApplication) { return EntityHttpDaoFactory.createEnquiryHttpDao(rapidFtrApplication, rapidFtrApplication.getCurrentUser().getServerUrl(), EnquirySyncService.ENQUIRIES_API_PATH, EnquirySyncService.ENQUIRIES_API_PARAMETER); } @Provides public EntityHttpDao<Child> getChildHttpDao(RapidFtrApplication rapidFtrApplication) { return EntityHttpDaoFactory.createChildHttpDao(rapidFtrApplication, rapidFtrApplication.getCurrentUser().getServerUrl(), ChildSyncService.CHILDREN_API_PATH, ChildSyncService.CHILDREN_API_PARAMETER); } @Provides public EntityHttpDao<PotentialMatch> getPotentialMatchesHttpDao(RapidFtrApplication rapidFtrApplication) { return EntityHttpDaoFactory.createPotentialMatchHttpDao(rapidFtrApplication, rapidFtrApplication.getCurrentUser().getServerUrl(), PotentialMatchSyncService.POTENTIAL_MATCH_API_PATH, PotentialMatchSyncService.POTENTIAL_MATCH_API_PARAMETER); } }