diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/gateway/ChangePasswordV2Gateway.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/gateway/ChangePasswordV2Gateway.java index 3650751c..cad779f5 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/gateway/ChangePasswordV2Gateway.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/gateway/ChangePasswordV2Gateway.java @@ -1,5 +1,7 @@ package com.gmeremit.online.gmeremittance_native.changepasswordV2.gateway; +import com.gmeremit.online.gmeremittance_native.GmeApplication; +import com.gmeremit.online.gmeremittance_native.base.PrefKeys; import com.gmeremit.online.gmeremittance_native.base.PrivilegedGateway; import com.gmeremit.online.gmeremittance_native.changepasswordV2.model.ChangePasswordActivityV2APIResponse; import com.gmeremit.online.gmeremittance_native.changepasswordV2.presenter.ChangePasswordV2InteractorInterface; @@ -28,4 +30,14 @@ public class ChangePasswordV2Gateway extends PrivilegedGateway implements Change return HttpClientV2.getInstance().performChangePasswordV2(auth,jsonObject); } + + @Override + public void persistUserPwd(String encrypted) { + GmeApplication.getStorage().edit().putString(PrefKeys.APP_USER_SECRET_KEY,encrypted).apply(); + } + + @Override + public void turnOffFingerprintAuth(boolean action) { + GmeApplication.getStorage().edit().putBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,!action).apply(); + } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2InteractorInterface.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2InteractorInterface.java index edba1cec..16c19112 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2InteractorInterface.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2InteractorInterface.java @@ -12,5 +12,9 @@ public interface ChangePasswordV2InteractorInterface extends BaseInteractorInter interface ChangePasswordV2GatewayInterface extends PrivilegedGatewayInterface { Observable performChangePassRequest(String auth, String userId, String oldPass, String newPass,String confirmPass); + + void persistUserPwd(String encrypted); + + void turnOffFingerprintAuth(boolean b); } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2Presenter.java index b2be2def..5c3d13be 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2Presenter.java @@ -8,11 +8,15 @@ import com.gmeremit.online.gmeremittance_native.customwidgets.CustomAlertDialog; import com.gmeremit.online.gmeremittance_native.utils.Constants; import com.gmeremit.online.gmeremittance_native.utils.Utils; import com.gmeremit.online.gmeremittance_native.utils.https.GenericApiObserverResponse; +import com.gmeremit.online.gmeremittance_native.utils.security.SecurityUtils; +import com.mtramin.rxfingerprint.data.FingerprintEncryptionResult; +import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.observers.DisposableObserver; import io.reactivex.schedulers.Schedulers; -public class ChangePasswordV2Presenter extends BasePresenter implements ChangePasswordV2InteractorInterface,ChangePasswordV2PresenterInterface { +public class ChangePasswordV2Presenter extends BasePresenter implements ChangePasswordV2InteractorInterface, ChangePasswordV2PresenterInterface { private final ChangePasswordV2PresenterInterface.ChangePasswordV2ContractInterface view; private final ChangePasswordV2Gateway gateway; @@ -22,174 +26,229 @@ public class ChangePasswordV2Presenter extends BasePresenter implements ChangePa private String encConfirmPassword; public ChangePasswordV2Presenter(ChangePasswordV2PresenterInterface.ChangePasswordV2ContractInterface view) { - this.view=view; - this.gateway=new ChangePasswordV2Gateway(this); + this.view = view; + this.gateway = new ChangePasswordV2Gateway(this); - this.encCurrentPassword=""; - this.encNewPassword=""; - this.encConfirmPassword=""; + this.encCurrentPassword = ""; + this.encNewPassword = ""; + this.encConfirmPassword = ""; } @Deprecated @Override public boolean validateData(String currentPass, String newPwd, String pwdConfrimString) { - boolean currentPwdValidation=true; - boolean confirmPwdValidation=true; - boolean newPwdValidation=true; + boolean currentPwdValidation = true; + boolean confirmPwdValidation = true; + boolean newPwdValidation = true; - if(currentPass.trim().length()<1) - { + if (currentPass.trim().length() < 1) { this.view.setCurrentPasswordError(getStringfromStringId(R.string.password_empty_error)); - currentPwdValidation= false; + currentPwdValidation = false; } if (!Utils.hasSpecialCharacters(newPwd)) { this.view.setNewPasswordError(getStringfromStringId(R.string.password_symbol_required_error)); - newPwdValidation= false; + newPwdValidation = false; } if (!Utils.hasNumbers(newPwd)) { this.view.setNewPasswordError(getStringfromStringId(R.string.password_number_required_error)); - newPwdValidation= false; + newPwdValidation = false; } - if (newPwd.length()>1&&newPwd.length()<9) { + if (newPwd.length() > 1 && newPwd.length() < 9) { this.view.setNewPasswordError(getStringfromStringId(R.string.password_length_error)); - newPwdValidation= false; + newPwdValidation = false; } if (!Utils.hasAtleastOnCapitalLetter(newPwd)) { this.view.setNewPasswordError(getStringfromStringId(R.string.password_capital_letter_required_error)); - newPwdValidation= false; + newPwdValidation = false; } - if(newPwd.trim().length()<1) - { + if (newPwd.trim().length() < 1) { this.view.setNewPasswordError(getStringfromStringId(R.string.password_empty_error)); - newPwdValidation= false; + newPwdValidation = false; } if (!newPwd.equals(pwdConfrimString)) { this.view.setConfirmPasswordError(getStringfromStringId(R.string.confirm_password_mismatch_error)); - confirmPwdValidation= false; + confirmPwdValidation = false; } - if(pwdConfrimString==null||pwdConfrimString.trim().length()<1) - { + if (pwdConfrimString == null || pwdConfrimString.trim().length() < 1) { this.view.setConfirmPasswordError(getStringfromStringId(R.string.confirm_passowrd_empty_error)); - confirmPwdValidation= false; + confirmPwdValidation = false; } - if(currentPwdValidation) { + if (currentPwdValidation) { view.setCurrentPasswordError(null); } - if(confirmPwdValidation) - { + if (confirmPwdValidation) { view.setConfirmPasswordError(null); } - if(newPwdValidation) - { + if (newPwdValidation) { view.setNewPasswordError(null); } - return currentPwdValidation&&confirmPwdValidation&&newPwdValidation; + return currentPwdValidation && confirmPwdValidation && newPwdValidation; } @Override - public boolean validateAll() - { - boolean currentPwdValidation=true; - boolean confirmPwdValidation=true; - boolean newPwdValidation=true; - - if(encCurrentPassword==null||encCurrentPassword.trim().length()<1) - { + public boolean validateAll() { + boolean currentPwdValidation = true; + boolean confirmPwdValidation = true; + boolean newPwdValidation = true; + + if (encCurrentPassword == null || encCurrentPassword.trim().length() < 1) { this.view.setCurrentPasswordError(getStringfromStringId(R.string.password_empty_error)); - currentPwdValidation= false; + currentPwdValidation = false; } - if(encNewPassword==null||encNewPassword.trim().length()<1) - { + if (encNewPassword == null || encNewPassword.trim().length() < 1) { this.view.setNewPasswordError(getStringfromStringId(R.string.password_empty_error)); - newPwdValidation= false; + newPwdValidation = false; } - if(encConfirmPassword==null||encConfirmPassword.trim().length()<1) - { + if (encConfirmPassword == null || encConfirmPassword.trim().length() < 1) { this.view.setConfirmPasswordError(getStringfromStringId(R.string.confirm_passowrd_empty_error)); - confirmPwdValidation= false; + confirmPwdValidation = false; } - if(currentPwdValidation) { + if (currentPwdValidation) { view.setCurrentPasswordError(null); } - if(confirmPwdValidation) - { + if (confirmPwdValidation) { view.setConfirmPasswordError(null); } - if(newPwdValidation) - { + if (newPwdValidation) { view.setNewPasswordError(null); } - return currentPwdValidation&&confirmPwdValidation&&newPwdValidation; + return currentPwdValidation && confirmPwdValidation && newPwdValidation; } @Override public void changePassword(String currentPass, String newPass) { - this.gateway.performChangePassRequest(this.gateway.getAuth(),this.gateway.getUserID(),this.encCurrentPassword,this.encNewPassword,this.encConfirmPassword) - .doOnSubscribe(d->view.showProgressBar(true,getStringfromStringId(R.string.processing_request_text))) - .doFinally(()->view.showProgressBar(false,"")) + this.gateway.performChangePassRequest(this.gateway.getAuth(), this.gateway.getUserID(), this.encCurrentPassword, this.encNewPassword, this.encConfirmPassword) + .doOnSubscribe(d -> view.showProgressBar(true, getStringfromStringId(R.string.processing_request_text))) + .doFinally(() -> view.showProgressBar(false, "")) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new ChangePasswordObserver()); + .subscribe(new ChangePasswordObserver(this.encNewPassword)); } @Override public void updateCurrentPassword(String encCurrentPassword) { - this.encCurrentPassword=encCurrentPassword; + this.encCurrentPassword = encCurrentPassword; } @Override public void updateNewPassword(String encNewPassword) { - this.encNewPassword=encNewPassword; + this.encNewPassword = encNewPassword; } @Override public void updateConfirmPassword(String encConfirmPassword) { - this.encConfirmPassword=encConfirmPassword; + this.encConfirmPassword = encConfirmPassword; + } + + private void encryptPassword(String newPassword, String pwdChangeMessage) { + Observable.zip(SecurityUtils.encryptSecret(view.getContext(), newPassword).subscribeOn(Schedulers.io()).onErrorReturn(error -> null), Observable.just(pwdChangeMessage), BiometricPwdParams::new) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BiometricEncrypterObserver()); + } - public class ChangePasswordObserver extends GenericApiObserverResponse - { + public class ChangePasswordObserver extends GenericApiObserverResponse { + + String newPassword; + + public ChangePasswordObserver(String encNewPassword) { + this.newPassword = encNewPassword; + } @Override protected void onSuccess(ChangePasswordActivityV2APIResponse changePasswordActivityV2APIResponse) { - if(changePasswordActivityV2APIResponse.getErrorCode().equalsIgnoreCase(Constants.SUCCESS_CODE_V2)) - { - view.showPopUpMessage(changePasswordActivityV2APIResponse.getMsg(), CustomAlertDialog.AlertType.SUCCESS,alertType -> view.exitView()); - } - else - view.showPopUpMessage(changePasswordActivityV2APIResponse.getMsg(), CustomAlertDialog.AlertType.FAILED,null); + if (changePasswordActivityV2APIResponse.getErrorCode().equalsIgnoreCase(Constants.SUCCESS_CODE_V2)) { + if (SecurityUtils.doesAppHasBiometricFeature(view.getContext())) { + encryptPassword(newPassword, changePasswordActivityV2APIResponse.getMsg()); + } else { + view.showPopUpMessage(changePasswordActivityV2APIResponse.getMsg(), CustomAlertDialog.AlertType.SUCCESS, alertType -> view.exitView()); + } + } else + view.showPopUpMessage(changePasswordActivityV2APIResponse.getMsg(), CustomAlertDialog.AlertType.FAILED, null); } @Override public void onFailed(String message) { - view.showPopUpMessage(message, CustomAlertDialog.AlertType.FAILED,null); + view.showPopUpMessage(message, CustomAlertDialog.AlertType.FAILED, null); } @Override protected void onConnectionNotEstablished(String message) { - view.showPopUpMessage(message, CustomAlertDialog.AlertType.NO_INTERNET,null); + view.showPopUpMessage(message, CustomAlertDialog.AlertType.NO_INTERNET, null); } @Override protected void unauthorizedAccess(String message) { gateway.clearAllUserData(); - view.showPopUpMessage(message, CustomAlertDialog.AlertType.ALERT,alertType -> view.logout()); + view.showPopUpMessage(message, CustomAlertDialog.AlertType.ALERT, alertType -> view.logout()); + + } + } + + public class BiometricPwdParams { + FingerprintEncryptionResult encPassword; + String pwdChangeServerMessage; + + public BiometricPwdParams(FingerprintEncryptionResult encPassword, String pwdChangeServerMessage) { + this.encPassword = encPassword; + this.pwdChangeServerMessage = pwdChangeServerMessage; + } + + public FingerprintEncryptionResult getEncPassword() { + return encPassword; + } + + public void setEncPassword(FingerprintEncryptionResult encPassword) { + this.encPassword = encPassword; + } + + public String getPwdChangeServerMessage() { + return pwdChangeServerMessage; + } + + public void setPwdChangeServerMessage(String pwdChangeServerMessage) { + this.pwdChangeServerMessage = pwdChangeServerMessage; + } + } + + public class BiometricEncrypterObserver extends DisposableObserver { + + @Override + public void onNext(BiometricPwdParams data) { + if (data.getEncPassword() == null) { + gateway.persistUserPwd(null); + gateway.turnOffFingerprintAuth(true); + view.showPopUpMessage(data.getPwdChangeServerMessage(), CustomAlertDialog.AlertType.SUCCESS, alertType -> view.exitView()); + } else { + gateway.persistUserPwd(data.getEncPassword().getEncrypted()); + view.showPopUpMessage(data.getPwdChangeServerMessage(), CustomAlertDialog.AlertType.SUCCESS, alertType -> view.exitView()); + } + } + + @Override + public void onError(Throwable e) { + gateway.persistUserPwd(null); + gateway.turnOffFingerprintAuth(true); + } + + @Override + public void onComplete() { } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2PresenterInterface.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2PresenterInterface.java index cbf44f2e..311cba73 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2PresenterInterface.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2PresenterInterface.java @@ -1,5 +1,7 @@ package com.gmeremit.online.gmeremittance_native.changepasswordV2.presenter; +import android.content.Context; + import com.gmeremit.online.gmeremittance_native.base.BaseContractInterface; import com.gmeremit.online.gmeremittance_native.base.BasePresenterInterface; @@ -27,5 +29,7 @@ public interface ChangePasswordV2PresenterInterface extends BasePresenterInterfa void setConfirmPasswordError(String passwords_does_not_match); void setCurrentPasswordError(String s); + + Context getContext(); } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/view/ChangePasswordV2Activity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/view/ChangePasswordV2Activity.java index 8da1d39c..8c0941dd 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/view/ChangePasswordV2Activity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/view/ChangePasswordV2Activity.java @@ -1,5 +1,6 @@ package com.gmeremit.online.gmeremittance_native.changepasswordV2.view; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; @@ -256,6 +257,11 @@ public class ChangePasswordV2Activity extends BaseActivity implements ChangePass currentPasswordErrorTxt.setErrorText(error); } + @Override + public Context getContext() { + return this; + } + class SecurityKeypadCurrentPasswordListener implements SecurityKeyboardManager.SecurityKeyboardActionListenerFacade,SecurityKeyboardView.SecurityKeyboardFocusStateListener { @Override public void done(Intent intent) { diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java index 6b926035..0c172f58 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java @@ -114,7 +114,6 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI if (fingerPrintScanningSubscription != null && !fingerPrintScanningSubscription.isDisposed()) fingerPrintScanningSubscription.dispose(); } else { - view.hideKeyBoard(); if (fingerPrintScanningSubscription == null || fingerPrintScanningSubscription.isDisposed()) fingerPrintScanningSubscription = Observable.zip(Observable.fromCallable(gateway::getPersistedUserId), decryptData(gateway.getPersistedUserPwd()), BiometricDecParams::new) .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java index 7f1d34c2..815f1b61 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java @@ -315,6 +315,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); + hideKeyBoard(); mIsMorphingInProgress = true; isLoadingInProgress = true; loginBtn.setText(""); diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java index a74010a1..10caace1 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java @@ -108,7 +108,7 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, public void onPageSelected(int position) { Log.d("SplashScreenAction", "Page selected: " + position); addBottomDots(position); - ((SplashAnimatedViewPagerFragment) fragmentList.get(position)).playAnimation(position==0?300:0); + ((SplashAnimatedViewPagerFragment) fragmentList.get(position)).playAnimation(position==0?200:0); } diff --git a/app/src/main/res/drawable/ic_send_money_avd.xml b/app/src/main/res/drawable/ic_send_money_avd.xml index d92c6538..30a898fb 100644 --- a/app/src/main/res/drawable/ic_send_money_avd.xml +++ b/app/src/main/res/drawable/ic_send_money_avd.xml @@ -10,14 +10,14 @@