/**
* Copyright (C) 2013 - 2015 the enviroCar community
*
* This file is part of the enviroCar app.
*
* The enviroCar app is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The enviroCar app is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with the enviroCar app. If not, see http://www.gnu.org/licenses/.
*/
package org.envirocar.remote;
import android.content.Context;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.squareup.okhttp.HttpUrl;
import com.squareup.okhttp.OkHttpClient;
import org.envirocar.core.ContextInternetAccessProvider;
import org.envirocar.core.InternetAccessProvider;
import org.envirocar.core.entity.Announcement;
import org.envirocar.core.entity.Car;
import org.envirocar.core.entity.Fueling;
import org.envirocar.core.entity.Measurement;
import org.envirocar.core.entity.TermsOfUse;
import org.envirocar.core.entity.Track;
import org.envirocar.core.entity.User;
import org.envirocar.core.entity.UserStatistics;
import org.envirocar.core.injection.InjectApplicationScope;
import org.envirocar.remote.dao.CacheAnnouncementsDAO;
import org.envirocar.remote.dao.CacheCarDAO;
import org.envirocar.remote.dao.CacheFuelingDAO;
import org.envirocar.remote.dao.CacheTermsOfUseDAO;
import org.envirocar.remote.dao.CacheTrackDAO;
import org.envirocar.remote.dao.CacheUserDAO;
import org.envirocar.remote.dao.RemoteAnnouncementsDAO;
import org.envirocar.remote.dao.RemoteCarDAO;
import org.envirocar.remote.dao.RemoteFuelingDAO;
import org.envirocar.remote.dao.RemoteTermsOfUseDAO;
import org.envirocar.remote.dao.RemoteTrackDAO;
import org.envirocar.remote.dao.RemoteUserDAO;
import org.envirocar.remote.dao.RemoteUserStatisticsDAO;
import org.envirocar.remote.serializer.AnnouncementSerializer;
import org.envirocar.remote.serializer.CarListDeserializer;
import org.envirocar.remote.serializer.CarSerializer;
import org.envirocar.remote.serializer.FuelingListSerializer;
import org.envirocar.remote.serializer.FuelingSerializer;
import org.envirocar.remote.serializer.MeasurementSerializer;
import org.envirocar.remote.serializer.RemoteTrackListDeserializer;
import org.envirocar.remote.serializer.TermsOfUseListSerializer;
import org.envirocar.remote.serializer.TermsOfUseSerializer;
import org.envirocar.remote.serializer.TrackSerializer;
import org.envirocar.remote.serializer.UserSerializer;
import org.envirocar.remote.serializer.UserStatisticDeserializer;
import org.envirocar.remote.service.AnnouncementsService;
import org.envirocar.remote.service.CarService;
import org.envirocar.remote.service.EnviroCarService;
import org.envirocar.remote.service.FuelingService;
import org.envirocar.remote.service.TermsOfUseService;
import org.envirocar.remote.service.TrackService;
import org.envirocar.remote.service.UserService;
import org.envirocar.remote.util.AuthenticationInterceptor;
import org.envirocar.remote.util.JsonContentTypeInterceptor;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import retrofit.GsonConverterFactory;
import retrofit.Retrofit;
import retrofit.RxJavaCallAdapterFactory;
/**
* TODO JavaDoc
*
* @author dewall
*/
@Module(
complete = false,
library = true,
injects = {
DAOProvider.class,
CacheUserDAO.class,
CacheCarDAO.class,
CacheFuelingDAO.class,
CacheTermsOfUseDAO.class,
CacheTrackDAO.class,
CacheAnnouncementsDAO.class,
RemoteAnnouncementsDAO.class,
RemoteFuelingDAO.class,
RemoteCarDAO.class,
RemoteTermsOfUseDAO.class,
RemoteTrackDAO.class,
RemoteUserDAO.class,
RemoteUserStatisticsDAO.class,
DAOProvider.class
},
staticInjections = EnviroCarService.class
)
public class RemoteModule {
public static HttpUrl URL_ENVIROCAR_BASE = HttpUrl.parse(EnviroCarService.BASE_URL);
/**
* Provides the InternetAccessProivder.
*
* @return the provider for internet access.
*/
@Provides
@Singleton
public InternetAccessProvider provideInternetAccessProvider(
@InjectApplicationScope Context context) {
return new ContextInternetAccessProvider(context);
}
@Provides
@Singleton
protected HttpUrl provideBaseUrl() {
return URL_ENVIROCAR_BASE;
}
@Provides
@Singleton
protected OkHttpClient provideOkHttpClient(AuthenticationInterceptor authInterceptor,
JsonContentTypeInterceptor jsonInterceptor) {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(authInterceptor);
client.interceptors().add(new JsonContentTypeInterceptor());
client.setConnectTimeout(300, TimeUnit.SECONDS); // connect timeout
client.setReadTimeout(300, TimeUnit.SECONDS); // socket timeout
client.setWriteTimeout(300, TimeUnit.SECONDS); // write timeout
return client;
}
@Provides
@Singleton
protected Gson provideGson() {
return new GsonBuilder()
.registerTypeAdapter(User.class, new UserSerializer())
.registerTypeAdapter(UserStatistics.class, new UserStatisticDeserializer())
.registerTypeAdapter(Car.class, new CarSerializer())
.registerTypeAdapter(new TypeToken<List<Car>>() {
}.getType(), new CarListDeserializer())
.registerTypeAdapter(Track.class, new TrackSerializer())
.registerTypeAdapter(Measurement.class, new MeasurementSerializer())
.registerTypeAdapter(new TypeToken<List<Track>>() {
}.getType(), new RemoteTrackListDeserializer())
.registerTypeAdapter(TermsOfUse.class, new TermsOfUseSerializer())
.registerTypeAdapter(new TypeToken<List<TermsOfUse>>() {
}.getType(), new TermsOfUseListSerializer())
.registerTypeAdapter(Announcement.class, new AnnouncementSerializer())
.registerTypeAdapter(Fueling.class, new FuelingSerializer())
.registerTypeAdapter(new TypeToken<List<Fueling>>() {
}.getType(), new FuelingListSerializer())
.create();
}
@Provides
@Singleton
protected Retrofit provideRetrofit(HttpUrl baseUrl, OkHttpClient client, Gson gson) {
return new Retrofit.Builder()
.client(client)
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
@Provides
@Singleton
protected UserService provideUserService(Retrofit retrofit) {
return retrofit.create(UserService.class);
}
@Provides
@Singleton
protected CarService provideCarService(Retrofit retrofit) {
return retrofit.create(CarService.class);
}
@Provides
@Singleton
protected TrackService provideTrackService(Retrofit retrofit) {
return retrofit.create(TrackService.class);
}
@Provides
@Singleton
protected TermsOfUseService provideTermsOfUseService(Retrofit retrofit) {
return retrofit.create(TermsOfUseService.class);
}
@Provides
@Singleton
protected FuelingService provideFuelingService(Retrofit retrofit) {
return retrofit.create(FuelingService.class);
}
@Provides
@Singleton
protected AnnouncementsService provideAnnouncementService(Retrofit retrofit) {
return retrofit.create(AnnouncementsService.class);
}
}