package com.tevinjeffrey.rutgersct.modules; import com.google.gson.Gson; import com.squareup.okhttp.Interceptor; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Response; import com.tevinjeffrey.rutgersct.rutgersapi.RetroRutgers; import com.tevinjeffrey.rutgersct.rutgersapi.RetroRutgersService; import com.tevinjeffrey.rutgersct.ui.chooser.ChooserPresenterImpl; import com.tevinjeffrey.rutgersct.ui.course.CoursePresenterImpl; import com.tevinjeffrey.rutgersct.ui.sectioninfo.SectionInfoPresenterImpl; import com.tevinjeffrey.rutgersct.ui.subject.SubjectPresenterImpl; import com.tevinjeffrey.rutgersct.ui.trackedsections.TrackedSectionsPresenterImpl; import com.tevinjeffrey.rutgersct.rutgersapi.exceptions.RutgersServerIOException; import com.tevinjeffrey.rutgersct.utils.BackgroundThread; import java.io.IOException; import java.net.UnknownHostException; import java.util.concurrent.TimeUnit; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import retrofit.ErrorHandler; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.client.OkClient; import retrofit.converter.ConversionException; import retrofit.converter.GsonConverter; import rx.Scheduler; @Module(injects = { TrackedSectionsPresenterImpl.class, SectionInfoPresenterImpl.class, ChooserPresenterImpl.class, SubjectPresenterImpl.class, CoursePresenterImpl.class, }, complete = false, library = true ) public class RetroRutgersModule { @Provides @Singleton public RetroRutgers providesRetroRutgers(RetroRutgersService retroRutgersService, @BackgroundThread Scheduler backgroundThread) { return new RetroRutgers(retroRutgersService, backgroundThread); } @Provides @Singleton public RetroRutgersService providesRutgersRestAdapter(OkHttpClient client, Gson gson) { OkHttpClient okClient = client.clone(); okClient.networkInterceptors().add(getCacheControlInterceptor(TimeUnit.SECONDS.toMillis(5))); return new RestAdapter.Builder() .setEndpoint("http://sis.rutgers.edu/soc/") .setLogLevel(RestAdapter.LogLevel.HEADERS_AND_ARGS) .setErrorHandler(new MyErrorHandler()) .setClient(new OkClient(okClient)) .setConverter(new GsonConverter(gson)) .build().create(RetroRutgersService.class); } public Interceptor getCacheControlInterceptor(final long age) { return new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); return originalResponse.newBuilder() .header("Cache-Control", "max-age=" + age) .build(); } }; } class MyErrorHandler implements ErrorHandler { @Override public Throwable handleError(RetrofitError cause) { if (cause.getCause() instanceof ConversionException) return new RutgersServerIOException(); if (cause.getCause() instanceof UnknownHostException) return cause.getCause(); return cause; } } }