From 2ccfd03a05e4657c37b77b85edee48635ded3510 Mon Sep 17 00:00:00 2001 From: preyearegmi Date: Fri, 2 Nov 2018 15:38:58 +0900 Subject: [PATCH] Cache moved to gateway layer --- .idea/caches/build_file_checksums.ser | Bin 535 -> 535 bytes .../base/PrivilegedGateway.java | 1 - .../base/PrivilegedGatewayInterface.java | 2 +- .../homeV2/gateway/HomeV2Gateway.java | 144 ++++++++++++------ .../homeV2/model/UserCachedState.java | 57 +++++++ .../presenter/HomeV2InteractorInterface.java | 3 + .../homeV2/presenter/HomeV2Presenter.java | 96 +++--------- 7 files changed, 180 insertions(+), 123 deletions(-) create mode 100644 app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/model/UserCachedState.java diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index c9e618cf2a23c8b1dc1afc6e4aa21d9fb3253aed..3251ba380b7625808dcfc25bf68a726b4d92e8c1 100644 GIT binary patch delta 15 XcmbQvGM#0@43^8XQ;%$%Q_TnfF@pwm delta 15 XcmbQvGM#0@43 getUserRelatedData(String auth,String userId,String fcmId, String appVersion, String phoneBrand, String phoneOs, String deviceId, String osVersion) { - JsonObject jsonObject=new JsonObject(); - jsonObject.addProperty("userId",userId); - jsonObject.addProperty("uuid",deviceId); - jsonObject.addProperty("appVersion",appVersion); - jsonObject.addProperty("phoneBrand",phoneBrand); - jsonObject.addProperty("phoneOS",phoneOs); - jsonObject.addProperty("fcmId",fcmId); - jsonObject.addProperty("osVersion",osVersion); + public Observable getUserRelatedData(String auth, String userId, String fcmId, String appVersion, String phoneBrand, String phoneOs, String deviceId, String osVersion) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("userId", userId); + jsonObject.addProperty("uuid", deviceId); + jsonObject.addProperty("appVersion", appVersion); + jsonObject.addProperty("phoneBrand", phoneBrand); + jsonObject.addProperty("phoneOS", phoneOs); + jsonObject.addProperty("fcmId", fcmId); + jsonObject.addProperty("osVersion", osVersion); // return HttpClientV2.getInstance().getUserRelatedInfoV2(auth,jsonObject); // Mock slow server response - return Observable.timer(3, TimeUnit.SECONDS).flatMap(tick->HttpClientV2.getInstance().getUserRelatedInfoV2(auth,jsonObject)); + return Observable.timer(3, TimeUnit.SECONDS).flatMap(tick -> HttpClientV2.getInstance().getUserRelatedInfoV2(auth, jsonObject)); } @Override public Observable saveUserInfo(UserInfoModelV2 loginApiResponseModelV2) { - return Observable.create(observable->{ + return Observable.create(observable -> { try { SharedPreferences.Editor sharedPreferenceEditor = GmeApplication.getStorage().edit(); @@ -76,17 +77,15 @@ public class HomeV2Gateway extends PrivilegedGateway implements HomeV2Interactor sharedPreferenceEditor.putString(PrefKeys.USER_DOB, loginApiResponseModelV2.getUserDob()); sharedPreferenceEditor.commit(); + userStateCache = new UserCachedState(loginApiResponseModelV2.getKyc(), loginApiResponseModelV2.getVerified(), loginApiResponseModelV2.getEmail(), loginApiResponseModelV2.getUserDob()); - - } - catch (Exception e ) - { - if(!observable.isDisposed()) + } catch (Exception e) { + if (!observable.isDisposed()) observable.onError(new Throwable("Failed to write to disk")); } - if(!observable.isDisposed()) { + if (!observable.isDisposed()) { observable.onNext(loginApiResponseModelV2); observable.onComplete(); } @@ -98,40 +97,87 @@ public class HomeV2Gateway extends PrivilegedGateway implements HomeV2Interactor GmeApplication.getStorage().edit().clear().apply(); } + @Override + public void updateSubmittedKycInCache(boolean action) { + if (userStateCache == null) + userStateCache = new UserCachedState(); + userStateCache.setHasSubmittedKyc(action); + + } + + @Override + public void updateVerifiedUser(boolean action) { + if (userStateCache == null) + userStateCache = new UserCachedState(); + userStateCache.setVerifiedUser(action); + } + + + + @Override + public boolean hasUserSubmittedKYC() { + if (userStateCache != null) + return userStateCache.hasSubmittedKyc(); + return super.hasUserSubmittedKYC(); + } + + + @Override + public boolean isUserKYCVerified() { + if (userStateCache != null) + return userStateCache.isVerifiedUser(); + return super.isUserKYCVerified(); + } + + @Override + public String getUserEmailID() { + if(userStateCache!=null&&userStateCache.getEmail()!=null) + return userStateCache.getEmail(); + return super.getUserEmailID(); + } + + @Override + public String getUserDob() { + if(userStateCache!=null&&userStateCache.getDob()!=null) + return userStateCache.getEmail(); + return super.getUserDob(); + } + @Override public Observable getCachedUserInfo() { - UserInfoModelV2 userInfoModelV2=new UserInfoModelV2(); + UserInfoModelV2 userInfoModelV2 = new UserInfoModelV2(); SharedPreferences sharedPreferenceEditor = GmeApplication.getStorage(); - userInfoModelV2.setAccessCode(sharedPreferenceEditor.getString(PrefKeys.USER_ACCESS_CODE,"")); - userInfoModelV2.setActive(sharedPreferenceEditor.getBoolean(PrefKeys.USER_ACTIVE,false)); - userInfoModelV2.setAvailableBalance(sharedPreferenceEditor.getString(PrefKeys.USER_AVAILABLE_BALANCE,"")); - userInfoModelV2.setCmRegistrationId(sharedPreferenceEditor.getString(PrefKeys.USER_CM_REGISTRATION_ID,"")); - userInfoModelV2.setCountryCode(sharedPreferenceEditor.getString(PrefKeys.USER_COOUNTRY_CODE,"")); - userInfoModelV2.setCountry(sharedPreferenceEditor.getString(PrefKeys.USER_COUNTRY,"")); - userInfoModelV2.setDpUrl(sharedPreferenceEditor.getString(PrefKeys.USER_DP_URL,"")); - userInfoModelV2.setIdNumber(sharedPreferenceEditor.getString(PrefKeys.USER_DOCUMENT_ID_NUMBER,"")); - userInfoModelV2.setEmail(sharedPreferenceEditor.getString(PrefKeys.USER_EMAIL,"")); - userInfoModelV2.setFirstName(sharedPreferenceEditor.getString(PrefKeys.USER_FIRST_NAME,"")); - userInfoModelV2.setUserId(sharedPreferenceEditor.getString(PrefKeys.USER_ID,"")); - userInfoModelV2.setSenderId(sharedPreferenceEditor.getString(PrefKeys.USER_ID_NUMBER,"")); - userInfoModelV2.setIdType(sharedPreferenceEditor.getString(PrefKeys.USER_ID_TYPE,"")); - userInfoModelV2.setReferred(sharedPreferenceEditor.getBoolean(PrefKeys.USER_IS_REFERRED,false)); - userInfoModelV2.setKyc(sharedPreferenceEditor.getBoolean(PrefKeys.USER_KYC_SUBMITTED,false)); - userInfoModelV2.setLastName(sharedPreferenceEditor.getString(PrefKeys.USER_LAST_NAME,"")); - userInfoModelV2.setMiddleName(sharedPreferenceEditor.getString(PrefKeys.USER_MIDDLE_NAME,"")); - userInfoModelV2.setMobileNumber(sharedPreferenceEditor.getString(PrefKeys.USER_MSISDN,"")); - userInfoModelV2.setNickName(sharedPreferenceEditor.getString(PrefKeys.USER_NICK_NAME,"")); - userInfoModelV2.setPrimaryBankName(sharedPreferenceEditor.getString(PrefKeys.USER_PRIMARY_BANK_NAME,"")); - userInfoModelV2.setProvince(sharedPreferenceEditor.getString(PrefKeys.USER_PROVINCE,"")); - userInfoModelV2.setProvinceId(sharedPreferenceEditor.getString(PrefKeys.USER_PROVINCE_ID,"")); - userInfoModelV2.setRewardPoint(sharedPreferenceEditor.getString(PrefKeys.USER_REWAD_POINT,"")); - userInfoModelV2.setSourceId(sharedPreferenceEditor.getString(PrefKeys.USER_SOURCE_ID,"")); - userInfoModelV2.setVerified(sharedPreferenceEditor.getBoolean(PrefKeys.USER_KYC_VERIFIED,false)); - userInfoModelV2.setWalletNumber(sharedPreferenceEditor.getString(PrefKeys.USER_WALLET_NUMBER,"")); - userInfoModelV2.setYearlyLimit(sharedPreferenceEditor.getString(PrefKeys.USER_YEARLY_REMAINING_LIMIT,"")); - - Log.d("DashBoardError","Cached Data is prepared"); + userInfoModelV2.setAccessCode(sharedPreferenceEditor.getString(PrefKeys.USER_ACCESS_CODE, "")); + userInfoModelV2.setActive(sharedPreferenceEditor.getBoolean(PrefKeys.USER_ACTIVE, false)); + userInfoModelV2.setAvailableBalance(sharedPreferenceEditor.getString(PrefKeys.USER_AVAILABLE_BALANCE, "")); + userInfoModelV2.setCmRegistrationId(sharedPreferenceEditor.getString(PrefKeys.USER_CM_REGISTRATION_ID, "")); + userInfoModelV2.setCountryCode(sharedPreferenceEditor.getString(PrefKeys.USER_COOUNTRY_CODE, "")); + userInfoModelV2.setCountry(sharedPreferenceEditor.getString(PrefKeys.USER_COUNTRY, "")); + userInfoModelV2.setDpUrl(sharedPreferenceEditor.getString(PrefKeys.USER_DP_URL, "")); + userInfoModelV2.setIdNumber(sharedPreferenceEditor.getString(PrefKeys.USER_DOCUMENT_ID_NUMBER, "")); + userInfoModelV2.setEmail(sharedPreferenceEditor.getString(PrefKeys.USER_EMAIL, "")); + userInfoModelV2.setFirstName(sharedPreferenceEditor.getString(PrefKeys.USER_FIRST_NAME, "")); + userInfoModelV2.setUserId(sharedPreferenceEditor.getString(PrefKeys.USER_ID, "")); + userInfoModelV2.setSenderId(sharedPreferenceEditor.getString(PrefKeys.USER_ID_NUMBER, "")); + userInfoModelV2.setIdType(sharedPreferenceEditor.getString(PrefKeys.USER_ID_TYPE, "")); + userInfoModelV2.setReferred(sharedPreferenceEditor.getBoolean(PrefKeys.USER_IS_REFERRED, false)); + userInfoModelV2.setKyc(sharedPreferenceEditor.getBoolean(PrefKeys.USER_KYC_SUBMITTED, false)); + userInfoModelV2.setLastName(sharedPreferenceEditor.getString(PrefKeys.USER_LAST_NAME, "")); + userInfoModelV2.setMiddleName(sharedPreferenceEditor.getString(PrefKeys.USER_MIDDLE_NAME, "")); + userInfoModelV2.setMobileNumber(sharedPreferenceEditor.getString(PrefKeys.USER_MSISDN, "")); + userInfoModelV2.setNickName(sharedPreferenceEditor.getString(PrefKeys.USER_NICK_NAME, "")); + userInfoModelV2.setPrimaryBankName(sharedPreferenceEditor.getString(PrefKeys.USER_PRIMARY_BANK_NAME, "")); + userInfoModelV2.setProvince(sharedPreferenceEditor.getString(PrefKeys.USER_PROVINCE, "")); + userInfoModelV2.setProvinceId(sharedPreferenceEditor.getString(PrefKeys.USER_PROVINCE_ID, "")); + userInfoModelV2.setRewardPoint(sharedPreferenceEditor.getString(PrefKeys.USER_REWAD_POINT, "")); + userInfoModelV2.setSourceId(sharedPreferenceEditor.getString(PrefKeys.USER_SOURCE_ID, "")); + userInfoModelV2.setVerified(sharedPreferenceEditor.getBoolean(PrefKeys.USER_KYC_VERIFIED, false)); + userInfoModelV2.setWalletNumber(sharedPreferenceEditor.getString(PrefKeys.USER_WALLET_NUMBER, "")); + userInfoModelV2.setYearlyLimit(sharedPreferenceEditor.getString(PrefKeys.USER_YEARLY_REMAINING_LIMIT, "")); + + userStateCache = new UserCachedState(userInfoModelV2.getKyc(), userInfoModelV2.getVerified(), userInfoModelV2.getEmail(), userInfoModelV2.getUserDob()); + return Observable.just(userInfoModelV2); } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/model/UserCachedState.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/model/UserCachedState.java new file mode 100644 index 00000000..38747109 --- /dev/null +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/model/UserCachedState.java @@ -0,0 +1,57 @@ +package com.gmeremit.online.gmeremittance_native.homeV2.model; + +/** + * In Memory Cache for user related data + * Cache only the vital state that is required during the UI navigation/transition + * For eg: + * User privilege is checked i.e "KYC submitted", "KYC verified" before navigating to send money or other privileged required operation. + * And checking privilege from non-volatile storage is costly operation during "OnClick" listener and may cause some delay in UI navigation/transition. + * So we prefer in-memory cache, for these type of operation. + * It is also important to update the cache to latest state manually where it is used. + * + */ +public class UserCachedState { + + private boolean hasSubmittedKyc; + private boolean isVerifiedUser; + private String email; + private String dob; + + public UserCachedState(boolean hasSubmittedKyc, boolean isVerifiedUser, String email, String dob) { + this.hasSubmittedKyc = hasSubmittedKyc; + this.isVerifiedUser = isVerifiedUser; + this.email = email; + this.dob = dob; + } + + public UserCachedState() { + this.hasSubmittedKyc=false; + this.isVerifiedUser=false; + this.email=null; + this.dob=null; + } + + public boolean hasSubmittedKyc() { + return hasSubmittedKyc; + } + + public boolean isVerifiedUser() { + return isVerifiedUser; + } + + public String getEmail() { + return email; + } + + public String getDob() { + return dob; + } + + public void setHasSubmittedKyc(boolean hasSubmittedKyc) { + this.hasSubmittedKyc = hasSubmittedKyc; + } + + public void setVerifiedUser(boolean verifiedUser) { + isVerifiedUser = verifiedUser; + } +} diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2InteractorInterface.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2InteractorInterface.java index 9f8ebb8f..8f4461a5 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2InteractorInterface.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2InteractorInterface.java @@ -26,6 +26,9 @@ public interface HomeV2InteractorInterface extends BaseInteractorInterface { void clearAllUserData(); + void updateSubmittedKycInCache(boolean action); + + void updateVerifiedUser(boolean action); } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java index e9136546..335affd2 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java @@ -29,7 +29,6 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt private final HomeV2GatewayInterface gateway; private final CompositeDisposable compositeDisposable; private final BehaviorSubject homeFragmentRelatedSubject; - private UserState userState = null; public HomeV2Presenter(HomeV2PresenterInterface.HomeV2ContractInterface view) { this.view = view; @@ -41,12 +40,11 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt /** - * Try to fetch real data, otherwise show stale data to user if cannot be fetched. + * Try to fetch real data, otherwise show previously fetched data to user if cannot be fetched. */ @Override public void getRequiredData() { compositeDisposable.add( -// Observable.concat(getDataFromServerAndCacheIt().timeout(5, TimeUnit.SECONDS).onErrorResumeNext((Function>) Observable::error).subscribeOn(Schedulers.io()), Observable.concat(getDataFromServerAndCacheIt().timeout(5, TimeUnit.SECONDS).onErrorResumeNext(new Function>() { @Override public ObservableSource apply(Throwable throwable) throws Exception { @@ -64,7 +62,6 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt .take(1) .subscribeWith(new UserInfoObserver())); - } @Override @@ -76,45 +73,30 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt public void manuallyUpdateKYCForStatusToSubmitted() { String message = "Your registration request is in approval process. You will soon be able to use GME services."; String title = "Verification in Process"; -// String title = "Thank you for registering with us!"; view.showKYCVerifiedIfRequired(true, message, title, true); - if (userState != null) { - userState.hasSubmittedKyc = true; - userState.isVerifiedUser = false; - } + gateway.updateSubmittedKycInCache(true); + gateway.updateVerifiedUser(false); + } @Override public String checkIfUserVerified() { String resultMessage = null; - if (userState == null) { - if (!gateway.hasUserSubmittedKYC()) - resultMessage = "Kindly complete your kyc registration process with us to start using GME services"; - else if (!gateway.isUserKYCVerified()) - resultMessage = "Your registration request is in approval process. You will soon be able to use GME services"; - } else { - if (!userState.hasSubmittedKyc()) - resultMessage = "Kindly complete your kyc registration process with us to start using GME services"; - else if (!userState.isVerifiedUser()) - resultMessage = "Your registration request is in approval process. You will soon be able to use GME services"; - } + if (!gateway.hasUserSubmittedKYC()) + resultMessage = "Kindly complete your kyc registration process with us to start using GME services"; + else if (!gateway.isUserKYCVerified()) + resultMessage = "Your registration request is in approval process. You will soon be able to use GME services"; return resultMessage; } @Override public String getUserEmailID() { - if (userState == null) - return this.gateway.getUserEmailID(); - else - return userState.getEmail(); + return this.gateway.getUserEmailID(); } @Override public String getUserDob() { - if (userState == null) - return this.gateway.getUserDob(); - else - return userState.getDob(); + return this.gateway.getUserDob(); } @Override @@ -123,7 +105,13 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt } private Observable getDataFromServerAndCacheIt() { - String fcmID = FirebaseInstanceId.getInstance().getToken(); + String fcmID; + try { + fcmID = FirebaseInstanceId.getInstance().getToken(); + } catch (Exception e) { + fcmID = null; + } + if (fcmID == null || fcmID.length() < 1) fcmID = this.gateway.getLastKnownFcmId(); @@ -164,7 +152,6 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt String message = ""; String title = ""; - userState = new UserState(userInfoModelV2.getKyc(), userInfoModelV2.getVerified(), userInfoModelV2.getEmail(), userInfoModelV2.getUserDob()); boolean disableKYCViewClick = userInfoModelV2.getKyc() && !userInfoModelV2.getVerified(); @@ -180,8 +167,8 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt message = "Your registration request is in approval process. You will soon be able to use GME services."; } - if(homeFragmentRelatedSubject !=null) - homeFragmentRelatedSubject.onNext(new HomeFragmentRelatedData(shouldShowKYCView,message,title,disableKYCViewClick,fullName, userInfoModelV2.getYearlyLimit(), userInfoModelV2.getRewardPoint())); + if (homeFragmentRelatedSubject != null) + homeFragmentRelatedSubject.onNext(new HomeFragmentRelatedData(shouldShowKYCView, message, title, disableKYCViewClick, fullName, userInfoModelV2.getYearlyLimit(), userInfoModelV2.getRewardPoint())); } @@ -203,43 +190,8 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt } } - /** - * In Memory Cache, the cache is always updated for meta information of user - */ - private class UserState { - - private boolean hasSubmittedKyc; - private boolean isVerifiedUser; - private String email; - private String dob; - - public UserState(boolean hasSubmittedKyc, boolean isVerifiedUser, String email, String dob) { - this.hasSubmittedKyc = hasSubmittedKyc; - this.isVerifiedUser = isVerifiedUser; - this.email = email; - this.dob = dob; - } - - boolean hasSubmittedKyc() { - return hasSubmittedKyc; - } - - boolean isVerifiedUser() { - return isVerifiedUser; - } - - public String getEmail() { - return email; - } - - public String getDob() { - return dob; - } - } - - public class HomeFragmentRelatedData - { + public class HomeFragmentRelatedData { private boolean shouldShowKycView; private String message; private String title; @@ -249,14 +201,14 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt private String yearlyLimit; private String rewardPoint; - public HomeFragmentRelatedData(boolean shouldShowKycView, String message, String title, boolean disableKYCViewClick, String userName,String yearlyLimit, String rewardPoint) { + public HomeFragmentRelatedData(boolean shouldShowKycView, String message, String title, boolean disableKYCViewClick, String userName, String yearlyLimit, String rewardPoint) { this.shouldShowKycView = shouldShowKycView; this.message = message; this.title = title; this.disableKYCViewClick = disableKYCViewClick; - this.userName=userName; - this.yearlyLimit=yearlyLimit; - this.rewardPoint=rewardPoint; + this.userName = userName; + this.yearlyLimit = yearlyLimit; + this.rewardPoint = rewardPoint; } public boolean isShouldShowKycView() {