package com.artemzin.qualitymatters; import android.app.Application; import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; import com.artemzin.qualitymatters.models.PicassoImageLoader; import com.artemzin.qualitymatters.models.QualityMattersImageLoader; import com.artemzin.qualitymatters.other.EntityTypeAdapterFactory; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapterFactory; import com.jakewharton.picasso.OkHttp3Downloader; import com.squareup.picasso.Picasso; import javax.inject.Named; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import okhttp3.OkHttpClient; @Module public class ApplicationModule { public static final String MAIN_THREAD_HANDLER = "main_thread_handler"; @NonNull private final Application application; public ApplicationModule(@NonNull Application application) { this.application = application; } @Provides @NonNull @Singleton public Application provideQualityMattersApp() { return application; } @Provides @NonNull @Singleton public TypeAdapterFactory provideTypeAdapterFactory() { return EntityTypeAdapterFactory.create(); } @Provides @NonNull @Singleton public Gson provideGson(TypeAdapterFactory typeAdapterFactory) { return new GsonBuilder() .registerTypeAdapterFactory(typeAdapterFactory) .create(); } @Provides @NonNull @Named(MAIN_THREAD_HANDLER) @Singleton public Handler provideMainThreadHandler() { return new Handler(Looper.getMainLooper()); } @Provides @NonNull @Singleton public Picasso providePicasso(@NonNull Application qualityMattersApp, @NonNull OkHttpClient okHttpClient) { return new Picasso.Builder(qualityMattersApp) .downloader(new OkHttp3Downloader(okHttpClient)) .build(); } @Provides @NonNull @Singleton public QualityMattersImageLoader provideImageLoader(@NonNull Picasso picasso) { return new PicassoImageLoader(picasso); } }