package org.edx.mobile.core;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.inject.AbstractModule;
import org.edx.mobile.authentication.LoginService;
import org.edx.mobile.base.MainApplication;
import org.edx.mobile.course.CourseService;
import org.edx.mobile.discussion.DiscussionService;
import org.edx.mobile.discussion.DiscussionTextUtils;
import org.edx.mobile.http.Api;
import org.edx.mobile.http.IApi;
import org.edx.mobile.http.OkHttpUtil;
import org.edx.mobile.http.RestApiManager;
import org.edx.mobile.http.serialization.ISO8601DateTypeAdapter;
import org.edx.mobile.http.serialization.JsonPageDeserializer;
import org.edx.mobile.model.Page;
import org.edx.mobile.module.analytics.ISegment;
import org.edx.mobile.module.analytics.ISegmentEmptyImpl;
import org.edx.mobile.module.analytics.ISegmentImpl;
import org.edx.mobile.module.analytics.ISegmentTracker;
import org.edx.mobile.module.analytics.ISegmentTrackerImpl;
import org.edx.mobile.module.db.IDatabase;
import org.edx.mobile.module.db.impl.IDatabaseImpl;
import org.edx.mobile.module.download.IDownloadManager;
import org.edx.mobile.module.download.IDownloadManagerImpl;
import org.edx.mobile.module.notification.DummyNotificationDelegate;
import org.edx.mobile.module.notification.NotificationDelegate;
import org.edx.mobile.module.storage.IStorage;
import org.edx.mobile.module.storage.Storage;
import org.edx.mobile.util.AppUpdateUtils;
import org.edx.mobile.user.UserService;
import org.edx.mobile.util.BrowserUtil;
import org.edx.mobile.util.Config;
import org.edx.mobile.util.MediaConsentUtils;
import de.greenrobot.event.EventBus;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class EdxDefaultModule extends AbstractModule {
//if your module requires a context, add a constructor that will be passed a context.
private Context context;
//with RoboGuice 3.0, the constructor for AbstractModule will use an `Application`, not a `Context`
public EdxDefaultModule(Context context) {
this.context = context;
}
@Override
public void configure() {
Config config = new Config(context);
bind(IDatabase.class).to(IDatabaseImpl.class);
bind(IStorage.class).to(Storage.class);
bind(ISegmentTracker.class).to(ISegmentTrackerImpl.class);
if (config.getSegmentConfig().isEnabled()) {
bind(ISegment.class).to(ISegmentImpl.class);
} else {
bind(ISegment.class).to(ISegmentEmptyImpl.class);
}
bind(IDownloadManager.class).to(IDownloadManagerImpl.class);
bind(OkHttpClient.class).toInstance(OkHttpUtil.getOAuthBasedClient(context));
if (MainApplication.RETROFIT_ENABLED) {
bind(IApi.class).to(RestApiManager.class);
} else {
bind(IApi.class).to(Api.class);
}
bind(NotificationDelegate.class).to(DummyNotificationDelegate.class);
bind(IEdxEnvironment.class).to(EdxEnvironment.class);
bind(LinearLayoutManager.class).toProvider(LinearLayoutManagerProvider.class);
bind(EventBus.class).toInstance(EventBus.getDefault());
bind(Gson.class).toInstance(new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.registerTypeAdapterFactory(ISO8601DateTypeAdapter.FACTORY)
.registerTypeAdapter(Page.class, new JsonPageDeserializer())
.serializeNulls()
.create());
bind(Retrofit.class).toProvider(RetrofitProvider.class);
bind(LoginService.class).toProvider(LoginService.Provider.class);
bind(CourseService.class).toProvider(CourseService.Provider.class);
bind(DiscussionService.class).toProvider(DiscussionService.Provider.class);
bind(UserService.class).toProvider(UserService.Provider.class);
requestStaticInjection(BrowserUtil.class, MediaConsentUtils.class,
DiscussionTextUtils.class, AppUpdateUtils.class);
}
}