From d6e42383eb5a0189557c39e577c8e20f18d61030 Mon Sep 17 00:00:00 2001 From: Preyea Regmi Date: Mon, 27 May 2019 12:01:37 +0545 Subject: [PATCH] Transaction password screen refactored --- .../homeV2/view/HomeActivityV2.java | 1 + .../resend/ReSendMoneyV2Presenter.java | 41 ++- .../ReSendMoneyV2PresenterInterface.java | 6 + .../resendV2/view/ReSendMoneyV2Activity.java | 14 ++ .../model/SendMoneyAPIRequestBody.java | 10 + .../presenter/SendMoneyV2Presenter.java | 39 ++- .../SendMoneyV2PresenterInterface.java | 7 + .../sendmoneyV2/view/SendMoneyV2Activity.java | 14 ++ .../TransactionPasswordPromptV2Presenter.java | 3 +- .../TransactionBiometricPromptDialog.java | 236 ++++++++++++++++++ .../view/TransactionPasswordPromptDialog.java | 45 ---- .../res/layout/dialog_password_prompt_v2.xml | 52 ++-- 12 files changed, 388 insertions(+), 80 deletions(-) create mode 100644 app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionBiometricPromptDialog.java delete mode 100644 app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptDialog.java diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/view/HomeActivityV2.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/view/HomeActivityV2.java index d7d4a89a..af7cca5b 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/view/HomeActivityV2.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/view/HomeActivityV2.java @@ -46,6 +46,7 @@ import com.gmeremit.online.gmeremittance_native.settings.view.SettingsView; import com.gmeremit.online.gmeremittance_native.static_pages.view.AboutGME; import com.gmeremit.online.gmeremittance_native.static_pages.view.SupportActivity; import com.gmeremit.online.gmeremittance_native.transactionhistoryV2.view.TransactionHistoryActivityV2; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; import com.gmeremit.online.gmeremittance_native.user_profile.view.ProfileActivity; import com.gmeremit.online.gmeremittance_native.utils.Utils; import com.gmeremit.online.gmeremittance_native.walletstatementV2.view.WalletStatementV2Activity; diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2Presenter.java index 4f716384..6702bca9 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2Presenter.java @@ -14,12 +14,14 @@ import com.gmeremit.online.gmeremittance_native.resendV2.model.transactionlistin import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.SendMoneyTransactionResponseBody; import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.verification.VerificationViewModel; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.PasswordPromptListener; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; 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.https.GenericApiObserverResponseV2; import com.gmeremit.online.gmeremittance_native.utils.https.GenericResponseDataModel; import com.gmeremit.online.gmeremittance_native.utils.https.HTTPConstants; +import com.gmeremit.online.gmeremittance_native.utils.security.SecurityUtils; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; @@ -117,19 +119,36 @@ public class ReSendMoneyV2Presenter extends BasePresenter implements ReSendMoney } + private boolean checkIfUserHasEnabledBiometricAuth() { + return SecurityUtils.checkFingerPrintUsablity(view.getContext()) && gateway.isFingerPrintAuthEnabled() && gateway.getPersistedUserId() != null && gateway.getPersistedUserPwd() != null; + } + @Override public void promptPinAndPerformTransaction() { - view.promptPassword(new PasswordPromptListener() { - @Override - public void onPasswordSubmit(String password) { - performSendMoneyTransaction(password); - } + if(checkIfUserHasEnabledBiometricAuth()) + { + view.promptBiometricAuthDialog(new TransactionBiometricPromptDialog.BiometricPromptResultListener() { + @Override + public void onBiometricAuthSuccess(String decResult) { + performSendMoneyTransaction(decResult,true); + + } + }); + } + else { + view.promptPassword(new PasswordPromptListener() { + @Override + public void onPasswordSubmit(String password) { + performSendMoneyTransaction(password,false); + } - @Override - public void onCancelled() { + @Override + public void onCancelled() { + + } + }, countDownRemainingValue); + } - } - }, this.countDownRemainingValue); } @@ -175,12 +194,14 @@ public class ReSendMoneyV2Presenter extends BasePresenter implements ReSendMoney } - public void performSendMoneyTransaction(String password) { + public void performSendMoneyTransaction(String password,boolean isBiometricUsed) { resendRelatedData.getRemitDetail().setTxnPassword(password); resendRelatedData.getRemitDetail().setIsAgreed(Constants.TRUE_STRING); resendRelatedData.getRemitDetail().setKftcAccountId(previousTransactionRelatedData.getSelectedAutoDebitAccount().getKftcAccountId()); resendRelatedData.getRemitDetail().setPaymentType(previousTransactionRelatedData.getSelectedAutoDebitAccount().getType()); + resendRelatedData.getRemitDetail().setUseBiometric(isBiometricUsed); + compositeObservable.add( gateway.performSendMoneyTransaction(gateway.getAuth(), resendRelatedData.getRemitDetail()) diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2PresenterInterface.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2PresenterInterface.java index 8e1dcf81..fbc4d247 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2PresenterInterface.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2PresenterInterface.java @@ -1,5 +1,7 @@ package com.gmeremit.online.gmeremittance_native.resendV2.presenter.resend; +import android.content.Context; + import com.gmeremit.online.gmeremittance_native.autodebitV2.model.autodebitaccountlisting.WebRequestModel; import com.gmeremit.online.gmeremittance_native.base.BaseContractInterface; import com.gmeremit.online.gmeremittance_native.base.BasePresenterInterface; @@ -13,6 +15,7 @@ import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.payoutmode.Pay import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.payoutmode.PayoutModeApiResponse; import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.verification.VerificationViewModel; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.PasswordPromptListener; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; import io.reactivex.Observable; @@ -59,5 +62,8 @@ public interface ReSendMoneyV2PresenterInterface extends BasePresenterInterface void showReceiptOnTransactionComplete(String transactionId); + Context getContext(); + + void promptBiometricAuthDialog(TransactionBiometricPromptDialog.BiometricPromptResultListener biometricPromptResultListener); } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/view/ReSendMoneyV2Activity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/view/ReSendMoneyV2Activity.java index e0c087c2..260c9e7a 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/view/ReSendMoneyV2Activity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/view/ReSendMoneyV2Activity.java @@ -1,6 +1,7 @@ package com.gmeremit.online.gmeremittance_native.resendV2.view; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.LayoutRes; @@ -19,6 +20,7 @@ import com.gmeremit.online.gmeremittance_native.resendV2.presenter.resend.ReSend import com.gmeremit.online.gmeremittance_native.resendV2.presenter.resend.ReSendMoneyV2PresenterInterface; import com.gmeremit.online.gmeremittance_native.sendmoneyV2.view.SendMoneyV2TransactionCompleteActivity; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.PasswordPromptListener; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionPasswordPromptActivity; import butterknife.BindView; @@ -212,5 +214,17 @@ public class ReSendMoneyV2Activity extends BaseActivity implements ReSendMoneyV2 startActivity(startReceiptActivity); } + @Override + public Context getContext() { + return this; + } + + @Override + public void promptBiometricAuthDialog(TransactionBiometricPromptDialog.BiometricPromptResultListener listener) { + TransactionBiometricPromptDialog promptDialog= new TransactionBiometricPromptDialog(); + promptDialog.setResultListener(listener); + promptDialog.show(getSupportFragmentManager(),promptDialog.getClass().getSimpleName()); + } + } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/model/SendMoneyAPIRequestBody.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/model/SendMoneyAPIRequestBody.java index 6ef7e67f..d4f32d2e 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/model/SendMoneyAPIRequestBody.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/model/SendMoneyAPIRequestBody.java @@ -101,6 +101,9 @@ public class SendMoneyAPIRequestBody { @SerializedName("KftcLogId") @Expose private String kftcAccountId; + @SerializedName("isUseBiometric") + @Expose + private boolean isUseBiometric; public String getUser() { @@ -351,6 +354,13 @@ public class SendMoneyAPIRequestBody { this.receiverAccountNo = receiverAccountNo; } + public boolean isUseBiometric() { + return isUseBiometric; + } + + public void setUseBiometric(boolean useBiometric) { + isUseBiometric = useBiometric; + } @Override public String toString() { diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2Presenter.java index f89f1384..7eebca8a 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2Presenter.java @@ -22,9 +22,11 @@ import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.payoutmode.Pay import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.payoutmode.PayoutModeApiResponse; import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.verification.VerificationViewModel; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.PasswordPromptListener; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; 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 java.util.ArrayList; import java.util.List; @@ -190,19 +192,35 @@ public class SendMoneyV2Presenter extends BasePresenter implements SendMoneyV2Pr selectedTransferAmount = null; } + private boolean checkIfUserHasEnabledBiometricAuth() { + return SecurityUtils.checkFingerPrintUsablity(view.getContext()) && gateway.isFingerPrintAuthEnabled() && gateway.getPersistedUserId() != null && gateway.getPersistedUserPwd() != null; + } + @Override public void promptPinAndPerformTransaction() { - view.promptPassword(new PasswordPromptListener() { - @Override - public void onPasswordSubmit(String password) { - performSendMoneyTransaction(password); - } + if(checkIfUserHasEnabledBiometricAuth()) + { + view.promptBiometricAuthDialog(new TransactionBiometricPromptDialog.BiometricPromptResultListener() { + @Override + public void onBiometricAuthSuccess(String decResult) { + performSendMoneyTransaction(decResult,true); + + } + }); + } + else { + view.promptPassword(new PasswordPromptListener() { + @Override + public void onPasswordSubmit(String password) { + performSendMoneyTransaction(password,false); + } - @Override - public void onCancelled() { + @Override + public void onCancelled() { - } - }, countDownRemainingValue); + } + }, countDownRemainingValue); + } } @@ -235,7 +253,7 @@ public class SendMoneyV2Presenter extends BasePresenter implements SendMoneyV2Pr } - public void performSendMoneyTransaction(String password) { + private void performSendMoneyTransaction(String password,boolean isBiometricUsed) { SendMoneyAPIRequestBody sendMoneyAPIRequestBody = new SendMoneyAPIRequestBody(); @@ -287,6 +305,7 @@ public class SendMoneyV2Presenter extends BasePresenter implements SendMoneyV2Pr sendMoneyAPIRequestBody.setKftcAccountId(selectedPaymentType.getKftcAccountId()); sendMoneyAPIRequestBody.setTxnPassword(password); + sendMoneyAPIRequestBody.setUseBiometric(isBiometricUsed); compositeObservable.add( gateway.performSendMoneyTransaction(gateway.getAuth(), sendMoneyAPIRequestBody) diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2PresenterInterface.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2PresenterInterface.java index 768ddfdc..3c4756e6 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2PresenterInterface.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2PresenterInterface.java @@ -1,5 +1,7 @@ package com.gmeremit.online.gmeremittance_native.sendmoneyV2.presenter; +import android.content.Context; + import com.gmeremit.online.gmeremittance_native.autodebitV2.model.autodebitaccountlisting.WebRequestModel; import com.gmeremit.online.gmeremittance_native.base.BaseContractInterface; import com.gmeremit.online.gmeremittance_native.base.BasePresenterInterface; @@ -13,6 +15,7 @@ import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.payoutmode.Pay import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.payoutmode.PayoutModeApiResponse; import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.verification.VerificationViewModel; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.PasswordPromptListener; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; import io.reactivex.Observable; @@ -58,8 +61,12 @@ public interface SendMoneyV2PresenterInterface extends BasePresenterInterface { { void promptPassword(PasswordPromptListener listener,long countDownValue); + void promptBiometricAuthDialog(TransactionBiometricPromptDialog.BiometricPromptResultListener listener); + void showReceiptOnTransactionComplete(String transactionId); void updateFinalTransitionToValid(boolean action); + + Context getContext(); } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/view/SendMoneyV2Activity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/view/SendMoneyV2Activity.java index e4dea929..79d67288 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/view/SendMoneyV2Activity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/view/SendMoneyV2Activity.java @@ -1,6 +1,7 @@ package com.gmeremit.online.gmeremittance_native.sendmoneyV2.view; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.LayoutRes; @@ -16,6 +17,7 @@ import com.gmeremit.online.gmeremittance_native.sendmoneyV2.model.SendMoneyRequi import com.gmeremit.online.gmeremittance_native.sendmoneyV2.presenter.SendMoneyV2Presenter; import com.gmeremit.online.gmeremittance_native.sendmoneyV2.presenter.SendMoneyV2PresenterInterface; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.PasswordPromptListener; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionPasswordPromptActivity; import butterknife.BindView; @@ -277,6 +279,13 @@ public class SendMoneyV2Activity extends BaseActivity implements SendMoneyAction startActivityForResult(passwordRequestIntent, PASSWORD_PROMPT_REQUEST); } + @Override + public void promptBiometricAuthDialog(TransactionBiometricPromptDialog.BiometricPromptResultListener listener) { + TransactionBiometricPromptDialog promptDialog= new TransactionBiometricPromptDialog(); + promptDialog.setResultListener(listener); + promptDialog.show(getSupportFragmentManager(),promptDialog.getClass().getSimpleName()); + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -315,6 +324,11 @@ public class SendMoneyV2Activity extends BaseActivity implements SendMoneyAction setRedBg(page3TxtView); } + @Override + public Context getContext() { + return this; + } + @Override public void updateFinalTranstionToDefault() { setDefaultBg(page3TxtView); diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2Presenter.java index cccfa465..6e508f3f 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2Presenter.java @@ -96,7 +96,8 @@ public class TransactionPasswordPromptV2Presenter extends BasePresenter implemen @Override public boolean checkIfUserHasEnabledBiometricAuth() { - return SecurityUtils.checkFingerPrintUsablity(view.getContext()) && gateway.isFingerPrintAuthEnabled() && gateway.getPersistedUserId() != null && gateway.getPersistedUserPwd() != null; + return false; +// return SecurityUtils.checkFingerPrintUsablity(view.getContext()) && gateway.isFingerPrintAuthEnabled() && gateway.getPersistedUserId() != null && gateway.getPersistedUserPwd() != null; } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionBiometricPromptDialog.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionBiometricPromptDialog.java new file mode 100644 index 00000000..12b79c00 --- /dev/null +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionBiometricPromptDialog.java @@ -0,0 +1,236 @@ +package com.gmeremit.online.gmeremittance_native.transactionpasspromt.view; + +import android.app.Dialog; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.security.keystore.KeyPermanentlyInvalidatedException; +import android.support.graphics.drawable.AnimatedVectorDrawableCompat; +import android.support.v7.app.AlertDialog; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.gmeremit.online.gmeremittance_native.GmeApplication; +import com.gmeremit.online.gmeremittance_native.R; +import com.gmeremit.online.gmeremittance_native.base.PrefKeys; +import com.gmeremit.online.gmeremittance_native.customwidgets.CustomAlertDialog; +import com.gmeremit.online.gmeremittance_native.transactionpasspromt.presenter.TransactionPasswordPromptV2Presenter; +import com.gmeremit.online.gmeremittance_native.utils.security.SecurityUtils; +import com.mtramin.rxfingerprint.data.FingerprintAuthenticationException; +import com.mtramin.rxfingerprint.data.FingerprintDecryptionResult; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; + +public class TransactionBiometricPromptDialog extends android.support.v4.app.DialogFragment { + + + private AnimatedVectorDrawableCompat fingerPrintAVDCompat; + private ImageView passwordPromptImageView; + private Disposable fingerPrintScanningSubscription; + private CompositeDisposable compositeDisposable; + private BiometricPromptResultListener listener; + + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_password_prompt_v2, null); + passwordPromptImageView=view.findViewById(R.id.passwordPromptImageView); + builder.setView(view); + Dialog dialog= builder.create(); + try { + dialog.getWindow().setBackgroundDrawableResource(R.drawable.ic_rounded_white); + + } catch (NullPointerException e) { + + } + initialize(); + return dialog; + + } + + private void initialize() { + this.compositeDisposable = new CompositeDisposable(); + fingerPrintAVDCompat = AnimatedVectorDrawableCompat.create(getActivity(), R.drawable.avd_fingerprint_off_to_on); + + } + + public void setResultListener(BiometricPromptResultListener listener) + { + this.listener=listener; + } + + @Override + public void onStart() { + super.onStart(); + startObservingFingerPrintIfRequired(true); + } + + @Override + public void onStop() { + super.onStop(); + startObservingFingerPrintIfRequired(false); + } + + public void animateFingerPrintAppearAnimationIfRequired(boolean action) { + if (action) { + if (fingerPrintAVDCompat != null && !fingerPrintAVDCompat.isRunning()) { + passwordPromptImageView.setImageDrawable(fingerPrintAVDCompat); + fingerPrintAVDCompat.start(); + } + } else { + passwordPromptImageView.setImageDrawable(null); + } + } + + public void startObservingFingerPrintIfRequired(boolean action) { + + if (!action) { + if (fingerPrintScanningSubscription != null && !fingerPrintScanningSubscription.isDisposed()) + fingerPrintScanningSubscription.dispose(); + } else { + animateFingerPrintAppearAnimationIfRequired(true); + fingerPrintScanningSubscription = authenticateFingerprint().subscribeWith(new FingerprintDecResultObserver()); + compositeDisposable.add(fingerPrintScanningSubscription); + } + + + } + + private Observable authenticateFingerprint() { + return Observable.zip(Observable.fromCallable(()-> GmeApplication.getStorage().getString(PrefKeys.APP_USER_ID_SECRET_KEY,null)), + Observable.fromCallable(()->GmeApplication.getStorage().getString(PrefKeys.APP_SECRET_KEY,null)) + .flatMap(storedKey -> decryptFromKeyStore(storedKey).flatMap(decAesKey -> SecurityUtils.decryptSymmetric(GmeApplication.getStorage().getString(PrefKeys.APP_USER_SECRET_KEY,null), decAesKey))) + .subscribeOn(Schedulers.io()), + FingerprintDecResult::new) + .doOnSubscribe(subs -> { + animateFingerPrintAppearAnimationIfRequired(true); + }) + .observeOn(AndroidSchedulers.mainThread()); + } + + private Observable decryptFromKeyStore(String data) { + return SecurityUtils.decryptFromKeyStore(getActivity(), data) + .flatMap(authentication -> { + switch (authentication.getResult()) { + case FAILED: + return io.reactivex.Observable.error(new SecurityUtils.FailedFingerPrintException(getString(R.string.fingerprint_not_recognized))); + case HELP: + return io.reactivex.Observable.error(new SecurityUtils.SensorNotReadyException(authentication.getMessage())); + case AUTHENTICATED: + return Observable.just(authentication); + default: + return io.reactivex.Observable.error(new Throwable(authentication.getMessage())); + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .retryWhen(errors -> errors.flatMap( + error -> { + if (error instanceof SecurityUtils.FailedFingerPrintException || error instanceof SecurityUtils.SensorNotReadyException) { + animateFingerPrintAppearAnimationIfRequired(true); + showToastMessage(error.getMessage()); + return Observable.timer(100, TimeUnit.MILLISECONDS); + } + return Observable.error(error); + } + )) + .map(FingerprintDecryptionResult::getDecrypted); + + + } + + private void showToastMessage(String message) { + Toast toast=Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT); + TextView v = (TextView) toast.getView().findViewById(android.R.id.message); + if( v != null) v.setGravity(Gravity.CENTER); + toast.show(); + } + + public class FingerprintDecResult { + String userId; + String userPwd; + + public FingerprintDecResult(String userId, String userPwd) { + this.userId = userId; + this.userPwd = userPwd; + } + + public String getUserId() { + return userId; + } + + public String getUserPwd() { + return userPwd; + } + + @Override + public String toString() { + return "FingerprintDecResult{" + + "userId='" + userId + '\'' + + ", userPwd='" + userPwd + '\'' + + '}'; + } + } + + public class FingerprintDecResultObserver extends DisposableObserver { + + @Override + public void onNext(FingerprintDecResult fingerprintDecResult) { + dismiss(); + if(listener!=null) + listener.onBiometricAuthSuccess(fingerprintDecResult.getUserPwd()); + + } + + @Override + public void onError(Throwable e) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && e instanceof KeyPermanentlyInvalidatedException) + { + + SharedPreferences.Editor editor = GmeApplication.getStorage().edit(); + editor.putString(PrefKeys.APP_USER_ID_SECRET_KEY,null); + editor.putBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,false); + editor.putString(PrefKeys.APP_USER_SECRET_KEY,null); + editor.putString(PrefKeys.APP_SECRET_KEY,null); + editor.apply(); + + showToastMessage(getString(R.string.fingerprint_changed_externally)); + } + else if(e instanceof FingerprintAuthenticationException) + { + showToastMessage(e.getMessage()); + new Handler().postDelayed(TransactionBiometricPromptDialog.this::dismiss,200); + } + + Log.d(SecurityUtils.TAG, "Failed : " + e.getMessage()); + + } + + @Override + public void onComplete() { + + } + } + + + public interface BiometricPromptResultListener + { + void onBiometricAuthSuccess(String decResult); + } + +} diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptDialog.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptDialog.java deleted file mode 100644 index 0a630b7b..00000000 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptDialog.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gmeremit.online.gmeremittance_native.transactionpasspromt.view; - -import android.app.Dialog; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; - -import com.gmeremit.online.gmeremittance_native.R; - -public class TransactionPasswordPromptDialog extends android.support.v4.app.DialogFragment { - - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_password_prompt_v2, null); - - builder.setView(view); - - - initialize(); - return builder.create(); - - } - - private void initialize() { - - } - - - @Override - public void onStart() { - super.onStart(); - - - Window window = getDialog().getWindow(); - if (window != null) { - window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - window.setBackgroundDrawableResource(R.drawable.ic_rounded_password_prompt); - - } - } -} diff --git a/app/src/main/res/layout/dialog_password_prompt_v2.xml b/app/src/main/res/layout/dialog_password_prompt_v2.xml index 436bfd7a..05a92115 100644 --- a/app/src/main/res/layout/dialog_password_prompt_v2.xml +++ b/app/src/main/res/layout/dialog_password_prompt_v2.xml @@ -1,7 +1,7 @@ + android:layout_height="wrap_content"> - - + android:layout_marginTop="10dp" + android:layout_marginBottom="20dp" + android:layout_marginStart="15dp" + android:layout_marginEnd="15dp" + android:gravity="center" + android:text="@string/touch_fingerprint_text" + android:textColor="@color/darkgray" + android:textSize="14sp" /> + + + \ No newline at end of file