/* * Copyright (C) 2017 MINDORKS NEXTGEN PRIVATE LIMITED * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://mindorks.com/license/apache-v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.mindorks.framework.mvp.data; import android.content.Context; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.internal.$Gson$Types; import com.google.gson.reflect.TypeToken; import com.mindorks.framework.mvp.data.db.DbHelper; import com.mindorks.framework.mvp.data.db.model.Option; import com.mindorks.framework.mvp.data.db.model.Question; import com.mindorks.framework.mvp.data.db.model.User; import com.mindorks.framework.mvp.data.network.ApiHeader; import com.mindorks.framework.mvp.data.network.ApiHelper; import com.mindorks.framework.mvp.data.network.model.LoginRequest; import com.mindorks.framework.mvp.data.network.model.LoginResponse; import com.mindorks.framework.mvp.data.network.model.LogoutResponse; import com.mindorks.framework.mvp.data.prefs.PreferencesHelper; import com.mindorks.framework.mvp.di.ApplicationContext; import com.mindorks.framework.mvp.utils.AppConstants; import com.mindorks.framework.mvp.utils.CommonUtils; import java.lang.reflect.Type; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.functions.Function; /** * Created by janisharali on 27/01/17. */ @Singleton public class AppDataManager implements DataManager { private static final String TAG = "AppDataManager"; private final Context mContext; private final DbHelper mDbHelper; private final PreferencesHelper mPreferencesHelper; private final ApiHelper mApiHelper; @Inject public AppDataManager(@ApplicationContext Context context, DbHelper dbHelper, PreferencesHelper preferencesHelper, ApiHelper apiHelper) { mContext = context; mDbHelper = dbHelper; mPreferencesHelper = preferencesHelper; mApiHelper = apiHelper; } @Override public ApiHeader getApiHeader() { return mApiHelper.getApiHeader(); } @Override public String getAccessToken() { return mPreferencesHelper.getAccessToken(); } @Override public void setAccessToken(String accessToken) { mPreferencesHelper.setAccessToken(accessToken); mApiHelper.getApiHeader().getProtectedApiHeader().setAccessToken(accessToken); } @Override public Observable<Long> insertUser(User user) { return mDbHelper.insertUser(user); } @Override public Observable<List<User>> getAllUsers() { return mDbHelper.getAllUsers(); } @Override public Observable<LoginResponse> doGoogleLoginApiCall(LoginRequest.GoogleLoginRequest request) { return mApiHelper.doGoogleLoginApiCall(request); } @Override public Observable<LoginResponse> doFacebookLoginApiCall(LoginRequest.FacebookLoginRequest request) { return mApiHelper.doFacebookLoginApiCall(request); } @Override public Observable<LoginResponse> doServerLoginApiCall(LoginRequest.ServerLoginRequest request) { return mApiHelper.doServerLoginApiCall(request); } @Override public Observable<LogoutResponse> doLogoutApiCall() { return mApiHelper.doLogoutApiCall(); } @Override public int getCurrentUserLoggedInMode() { return mPreferencesHelper.getCurrentUserLoggedInMode(); } @Override public void setCurrentUserLoggedInMode(LoggedInMode mode) { mPreferencesHelper.setCurrentUserLoggedInMode(mode); } @Override public Long getCurrentUserId() { return mPreferencesHelper.getCurrentUserId(); } @Override public void setCurrentUserId(Long userId) { mPreferencesHelper.setCurrentUserId(userId); } @Override public String getCurrentUserName() { return mPreferencesHelper.getCurrentUserName(); } @Override public void setCurrentUserName(String userName) { mPreferencesHelper.setCurrentUserName(userName); } @Override public String getCurrentUserEmail() { return mPreferencesHelper.getCurrentUserEmail(); } @Override public void setCurrentUserEmail(String email) { mPreferencesHelper.setCurrentUserEmail(email); } @Override public String getCurrentUserProfilePicUrl() { return mPreferencesHelper.getCurrentUserProfilePicUrl(); } @Override public void setCurrentUserProfilePicUrl(String profilePicUrl) { mPreferencesHelper.setCurrentUserProfilePicUrl(profilePicUrl); } @Override public void updateApiHeader(Long userId, String accessToken) { mApiHelper.getApiHeader().getProtectedApiHeader().setUserId(userId); mApiHelper.getApiHeader().getProtectedApiHeader().setAccessToken(accessToken); } @Override public void updateUserInfo( String accessToken, Long userId, LoggedInMode loggedInMode, String userName, String email, String profilePicPath) { setAccessToken(accessToken); setCurrentUserId(userId); setCurrentUserLoggedInMode(loggedInMode); setCurrentUserName(userName); setCurrentUserEmail(email); setCurrentUserProfilePicUrl(profilePicPath); updateApiHeader(userId, accessToken); } @Override public void setUserAsLoggedOut() { updateUserInfo( null, null, DataManager.LoggedInMode.LOGGED_IN_MODE_LOGGED_OUT, null, null, null); } @Override public Observable<Boolean> isQuestionEmpty() { return mDbHelper.isQuestionEmpty(); } @Override public Observable<Boolean> isOptionEmpty() { return mDbHelper.isOptionEmpty(); } @Override public Observable<Boolean> saveQuestion(Question question) { return mDbHelper.saveQuestion(question); } @Override public Observable<Boolean> saveOption(Option option) { return mDbHelper.saveOption(option); } @Override public Observable<Boolean> saveQuestionList(List<Question> questionList) { return mDbHelper.saveQuestionList(questionList); } @Override public Observable<Boolean> saveOptionList(List<Option> optionList) { return mDbHelper.saveOptionList(optionList); } @Override public Observable<List<Question>> getAllQuestions() { return mDbHelper.getAllQuestions(); } @Override public Observable<Boolean> seedDatabaseQuestions() { GsonBuilder builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation(); final Gson gson = builder.create(); return mDbHelper.isQuestionEmpty() .concatMap(new Function<Boolean, ObservableSource<? extends Boolean>>() { @Override public ObservableSource<? extends Boolean> apply(Boolean isEmpty) throws Exception { if (isEmpty) { Type type = $Gson$Types .newParameterizedTypeWithOwner(null, List.class, Question.class); List<Question> questionList = gson.fromJson( CommonUtils.loadJSONFromAsset(mContext, AppConstants.SEED_DATABASE_QUESTIONS), type); return saveQuestionList(questionList); } return Observable.just(false); } }); } @Override public Observable<Boolean> seedDatabaseOptions() { GsonBuilder builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation(); final Gson gson = builder.create(); return mDbHelper.isOptionEmpty() .concatMap(new Function<Boolean, ObservableSource<? extends Boolean>>() { @Override public ObservableSource<? extends Boolean> apply(Boolean isEmpty) throws Exception { if (isEmpty) { Type type = new TypeToken<List<Option>>() { } .getType(); List<Option> optionList = gson.fromJson( CommonUtils.loadJSONFromAsset(mContext, AppConstants.SEED_DATABASE_OPTIONS), type); return saveOptionList(optionList); } return Observable.just(false); } }); } }