package fr.pagesjaunes.mdm;
import android.accounts.AccountManager;
import android.content.Context;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.squareup.otto.Bus;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import fr.pagesjaunes.mdm.authenticator.ApiKeyProvider;
import fr.pagesjaunes.mdm.authenticator.BootstrapAuthenticatorActivity;
import fr.pagesjaunes.mdm.authenticator.LogoutService;
import fr.pagesjaunes.mdm.core.BootstrapService;
import fr.pagesjaunes.mdm.core.Constants;
import fr.pagesjaunes.mdm.core.PostFromAnyThreadBus;
import fr.pagesjaunes.mdm.core.RestAdapterRequestInterceptor;
import fr.pagesjaunes.mdm.core.RestErrorHandler;
import fr.pagesjaunes.mdm.core.UserAgentProvider;
import fr.pagesjaunes.mdm.ui.DevicesListFragment;
import fr.pagesjaunes.mdm.ui.MainActivity;
import fr.pagesjaunes.mdm.ui.NavigationDrawerFragment;
import fr.pagesjaunes.mdm.ui.UserActivity;
import retrofit.RestAdapter;
import retrofit.converter.GsonConverter;
/**
* Dagger module for setting up provides statements.
* Register all of your entry points below.
*/
@Module(
complete = false,
injects = {
BootstrapApplication.class,
BootstrapAuthenticatorActivity.class,
MainActivity.class,
DevicesListFragment.class,
NavigationDrawerFragment.class,
UserActivity.class
}
)
public class BootstrapModule {
@Singleton
@Provides
Bus provideOttoBus() {
return new PostFromAnyThreadBus();
}
@Provides
@Singleton
LogoutService provideLogoutService(final Context context, final AccountManager accountManager) {
return new LogoutService(context, accountManager);
}
@Provides
BootstrapService provideBootstrapService(RestAdapter restAdapter) {
return new BootstrapService(restAdapter);
}
@Provides
BootstrapServiceProvider provideBootstrapServiceProvider(RestAdapter restAdapter, ApiKeyProvider apiKeyProvider) {
return new BootstrapServiceProvider(restAdapter, apiKeyProvider);
}
@Provides
ApiKeyProvider provideApiKeyProvider(AccountManager accountManager) {
return new ApiKeyProvider(accountManager);
}
@Provides
Gson provideGson() {
/**
* GSON instance to use for all request with date format set up for proper parsing.
* <p/>
* You can also configure GSON with different naming policies for your API.
* Maybe your API is Rails API and all json values are lower case with an underscore,
* like this "first_name" instead of "firstName".
* You can configure GSON as such below.
* <p/>
*
* public static final Gson GSON = new GsonBuilder().setDateFormat("yyyy-MM-dd")
* .setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
*/
return new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
}
@Provides
RestErrorHandler provideRestErrorHandler(Bus bus) {
return new RestErrorHandler(bus);
}
@Provides
RestAdapterRequestInterceptor provideRestAdapterRequestInterceptor(UserAgentProvider userAgentProvider) {
return new RestAdapterRequestInterceptor(userAgentProvider);
}
@Provides
RestAdapter provideRestAdapter(RestErrorHandler restErrorHandler, RestAdapterRequestInterceptor restRequestInterceptor, Gson gson) {
return new RestAdapter.Builder()
.setEndpoint(Constants.Http.URL_BASE)
.setErrorHandler(restErrorHandler)
.setRequestInterceptor(restRequestInterceptor)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setConverter(new GsonConverter(gson))
.build();
}
}