Browse Source

Before removing userId enc

master
Preyea Regmi 5 years ago
parent
commit
748497ca29
  1. 7
      app/src/main/java/com/gmeremit/online/gmeremittance_native/base/BaseActivity.java
  2. 8
      app/src/main/java/com/gmeremit/online/gmeremittance_native/base/PrivilegedGateway.java
  3. 17
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/gateway/LoginV2Gateway.java
  4. 6
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2InteractorInterface.java
  5. 166
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java
  6. 4
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2PresenterInterface.java
  7. 28
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java
  8. 86
      app/src/main/java/com/gmeremit/online/gmeremittance_native/settings/view/SettingsView.java
  9. 16
      app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/gateway/TransactionPasswordPromptV2Gateway.java
  10. 6
      app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2InteractorInterface.java
  11. 3
      app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2Presenter.java
  12. 17
      app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptActivity.java
  13. 2
      app/src/main/res/layout/activity_transaction_password_prompt.xml
  14. 2
      app/src/main/res/values/strings.xml

7
app/src/main/java/com/gmeremit/online/gmeremittance_native/base/BaseActivity.java

@ -17,9 +17,11 @@ import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import android.widget.Toast;
import com.gmeremit.online.gmeremittance_native.GmeApplication;
@ -108,7 +110,10 @@ public class BaseActivity extends AppCompatActivity implements BaseContractInter
@Override
public void showToastMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
Toast toast=Toast.makeText(this, message, Toast.LENGTH_SHORT);
TextView v = (TextView) toast.getView().findViewById(android.R.id.message);
if( v != null) v.setGravity(Gravity.CENTER);
toast.show();
}
@Override

8
app/src/main/java/com/gmeremit/online/gmeremittance_native/base/PrivilegedGateway.java

@ -135,7 +135,15 @@ public abstract class PrivilegedGateway implements PrivilegedGatewayInterface {
@SuppressLint("ApplySharedPref")
@Override
public void clearAllUserData() {
String persistedPwd=GmeApplication.getStorage().getString(PrefKeys.APP_USER_SECRET_KEY,null);
String persistedUserId=GmeApplication.getStorage().getString(PrefKeys.APP_USER_ID_SECRET_KEY,null);
boolean persistedFingerAuthEnabled=GmeApplication.getStorage().getBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,false);
GmeApplication.getStorage().edit().clear().commit();
GmeApplication.getStorage().edit().putString(PrefKeys.APP_USER_ID_SECRET_KEY,persistedPwd).apply();
GmeApplication.getStorage().edit().putString(PrefKeys.APP_USER_SECRET_KEY,persistedUserId).apply();
GmeApplication.getStorage().edit().putBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,persistedFingerAuthEnabled).apply();
}
/**

17
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/gateway/LoginV2Gateway.java

@ -84,14 +84,27 @@ public class LoginV2Gateway extends PrivilegedGateway implements LoginV2Interact
@Override
public void persistUserId(String encrypted) {
Log.d("LOGIN",encrypted);
GmeApplication.getStorage().edit().putString(PrefKeys.APP_USER_ID_SECRET_KEY,encrypted).apply();
}
@Override
public void persistUserPwd(String encrypted) {
Log.d("LOGIN",encrypted);
GmeApplication.getStorage().edit().putString(PrefKeys.APP_USER_SECRET_KEY,encrypted).apply();
}
@Override
public boolean isFingerPrintAuthEnabled() {
return GmeApplication.getStorage().getBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,false);
}
@Override
public String getPersistedUserId() {
return GmeApplication.getStorage().getString(PrefKeys.APP_USER_ID_SECRET_KEY,null);
}
@Override
public String getPersistedUserPwd() {
return GmeApplication.getStorage().getString(PrefKeys.APP_USER_SECRET_KEY,null);
}
}

6
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2InteractorInterface.java

@ -18,5 +18,11 @@ public interface LoginV2InteractorInterface extends BaseInteractorInterface {
void persistUserId(String encrypted);
void persistUserPwd(String encrypted);
boolean isFingerPrintAuthEnabled();
String getPersistedUserId();
String getPersistedUserPwd();
}
}

166
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java

@ -1,12 +1,10 @@
package com.gmeremit.online.gmeremittance_native.loginV2.presenter;
import android.graphics.Paint;
import android.util.Log;
import com.gmeremit.online.gmeremittance_native.GmeApplication;
import com.gmeremit.online.gmeremittance_native.R;
import com.gmeremit.online.gmeremittance_native.base.BasePresenter;
import com.gmeremit.online.gmeremittance_native.base.PrefKeys;
import com.gmeremit.online.gmeremittance_native.customwidgets.CustomAlertDialog;
import com.gmeremit.online.gmeremittance_native.loginV2.gateway.LoginV2Gateway;
import com.gmeremit.online.gmeremittance_native.loginV2.model.LoginModelV2;
@ -14,10 +12,16 @@ 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.FingerprintDecryptionResult;
import com.mtramin.rxfingerprint.data.FingerprintEncryptionResult;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableObserver;
@ -29,6 +33,7 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
private final LoginV2ContractInterface view;
private final LoginV2Gateway gateway;
private String encUserPassword;
private Disposable fingerPrintScanningSubscription;
public LoginV2Presenter(LoginV2ContractInterface view) {
@ -43,32 +48,49 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
if (userId.length() < 1) {
view.showInvalidUserId(getStringfromStringId(R.string.user_id_empty_error));
return false;
}
else {
} else {
view.showInvalidUserId(null);
return true;
}
}
private void persistUserCredentialForBiometricAuth(String userId,String pwd)
{
Observable.zip(encryptData(userId),encryptData(pwd), BiometricEncrypterParams::new)
private void persistUserCredentialForBiometricAuth(String userId, String pwd) {
Observable.zip(encryptData(userId), encryptData(pwd), BiometricEncParams::new)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BiometricEncrypterObserver());
}
private Observable<FingerprintEncryptionResult> encryptData(String data)
{
private Observable<FingerprintEncryptionResult> encryptData(String data) {
return SecurityUtils.encryptSecret(view.getContext(), data)
.subscribeOn(Schedulers.io());
}
private Observable<FingerprintDecryptionResult> decryptData(String data) {
return SecurityUtils.decryptSecret(view.getContext(), data)
.subscribeOn(Schedulers.io())
.flatMap(authentication -> {
switch (authentication.getResult()) {
case FAILED:
return io.reactivex.Observable.error(new SecurityUtils.FailedFingerPrintException(getStringfromStringId(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()));
}
});
}
private boolean validatePassword() {
if (encUserPassword.length() < 1) {
view.showInvalidPassword(getStringfromStringId(R.string.password_empty_error));
return false;
}
else {
} else {
view.showInvalidPassword(null);
return true;
}
@ -81,7 +103,31 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
@Override
public boolean checkIfBiometricIsAvailable() {
return true;
return SecurityUtils.doesAppHasBiometricFeature(view.getContext()) && gateway.isFingerPrintAuthEnabled() && gateway.getPersistedUserId() != null && gateway.getPersistedUserPwd() != null;
}
@Override
public void startObservingFingerPrintIfRequired(boolean action) {
if (!checkIfBiometricIsAvailable())
return;
if (!action) {
if (fingerPrintScanningSubscription != null && !fingerPrintScanningSubscription.isDisposed())
fingerPrintScanningSubscription.dispose();
} else {
fingerPrintScanningSubscription= Observable.zip(decryptData(gateway.getPersistedUserId()), decryptData(gateway.getPersistedUserPwd()),BiometricDecParams::new)
.doOnSubscribe(sub -> Log.d("FingerPrintScanner", "Subbed to finger print scanning event"))
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(errors -> errors.flatMap(
error -> {
if (error instanceof SecurityUtils.FailedFingerPrintException || error instanceof SecurityUtils.SensorNotReadyException) {
view.showToastMessage(error.getMessage());
return Observable.timer(100, TimeUnit.MILLISECONDS);
}
return Observable.error(error);
}
))
.subscribeWith(new BiometricDecrypterObserver());
}
}
@Override
@ -95,9 +141,7 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
if (loginResponse.getErrorCode().equalsIgnoreCase(Constants.SUCCESS_CODE_V2)) {
LoginModelV2 data = loginResponse.getData();
return gateway.saveUserInfo(data);
}
else
{
} else {
return Observable.error(new Exception(loginResponse.getMsg()));
}
})
@ -113,8 +157,7 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
return result1 && result2;
}
public class LoginObserver extends GenericApiObserverResponse<Boolean>
{
public class LoginObserver extends GenericApiObserverResponse<Boolean> {
String userId;
String encUserPassword;
@ -147,12 +190,11 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
}
}
public class BiometricEncrypterParams
{
FingerprintEncryptionResult userId;
FingerprintEncryptionResult pwd;
public class BiometricEncParams {
private FingerprintEncryptionResult userId;
private FingerprintEncryptionResult pwd;
BiometricEncrypterParams(FingerprintEncryptionResult userId, FingerprintEncryptionResult pwd) {
BiometricEncParams(FingerprintEncryptionResult userId, FingerprintEncryptionResult pwd) {
this.userId = userId;
this.pwd = pwd;
}
@ -174,13 +216,38 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
}
}
public class BiometricEncrypterObserver extends DisposableObserver<BiometricEncrypterParams>
{
public class BiometricDecParams {
private FingerprintDecryptionResult userId;
private FingerprintDecryptionResult pwd;
BiometricDecParams(FingerprintDecryptionResult userId, FingerprintDecryptionResult pwd) {
this.userId = userId;
this.pwd = pwd;
}
public FingerprintDecryptionResult getUserId() {
return userId;
}
public void setUserId(FingerprintDecryptionResult userId) {
this.userId = userId;
}
public FingerprintDecryptionResult getPwd() {
return pwd;
}
public void setPwd(FingerprintDecryptionResult pwd) {
this.pwd = pwd;
}
}
public class BiometricEncrypterObserver extends DisposableObserver<BiometricEncParams> {
@Override
public void onNext(BiometricEncrypterParams biometricEncrypterParams) {
gateway.persistUserId(biometricEncrypterParams.getUserId().getEncrypted());
gateway.persistUserPwd(biometricEncrypterParams.getPwd().getEncrypted());
public void onNext(BiometricEncParams biometricParams) {
gateway.persistUserId(biometricParams.getUserId().getEncrypted());
gateway.persistUserPwd(biometricParams.getPwd().getEncrypted());
view.showInvalidPassword(null);
view.showInvalidUserId(null);
view.redirectToDashboard();
@ -197,4 +264,47 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
}
}
public class BiometricDecrypterObserver extends DisposableObserver<BiometricDecParams> {
@Override
public void onNext(BiometricDecParams biometricParams) {
Log.d("FingerPrintScanner", "Dec result");
encUserPassword = biometricParams.getPwd().getDecrypted();
view.onLoginPerformTask(() -> loginUser(biometricParams.getUserId().getDecrypted(), ""));
}
@Override
public void onError(Throwable e) {
Log.d("FingerPrintScanner", e.getMessage());
}
@Override
public void onComplete() {
}
}
public class BiometricDecrypterObserver implements SingleObserver<List<FingerprintDecryptionResult>> {
@Override
public void onSubscribe(Disposable d) {
fingerPrintScanningSubscription=d;
}
@Override
public void onSuccess(List<FingerprintDecryptionResult> biometricParams) {
Log.d("FingerPrintScanner", "Dec result");
encUserPassword = biometricParams.get(1).getDecrypted();
view.onLoginPerformTask(() -> loginUser(biometricParams.get(0).getDecrypted(), ""));
}
@Override
public void onError(Throwable e) {
}
}
}

4
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2PresenterInterface.java

@ -24,6 +24,8 @@ public interface LoginV2PresenterInterface extends BasePresenterInterface {
boolean checkIfBiometricIsAvailable();
void startObservingFingerPrintIfRequired(boolean action);
interface LoginV2ContractInterface extends BaseContractInterface {
void showInvalidUserId(String message);
@ -32,5 +34,7 @@ public interface LoginV2PresenterInterface extends BasePresenterInterface {
void redirectToDashboard();
Context getContext();
void onLoginPerformTask(Runnable task);
}
}

28
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java

@ -40,13 +40,19 @@ import com.gmeremit.online.gmeremittance_native.loginV2.presenter.LoginV2Present
import com.gmeremit.online.gmeremittance_native.registerV2.view.RegisterV2Activity;
import com.gmeremit.online.gmeremittance_native.resetpassV2.view.ResetPassV2Activity;
import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionPasswordPromptActivity;
import com.gmeremit.online.gmeremittance_native.utils.security.SecurityUtils;
import com.gmeremit.online.gmeremittance_native.utils.security.securitykeypad.SecurityKeyboardManager;
import com.gmeremit.online.gmeremittance_native.utils.security.securitykeypad.SecurityKeyboardView;
import com.gmeremit.online.gmeremittance_native.utils.security.securitykeypad.SecurityKeypadRequestParamBuilder;
import com.softsecurity.transkey.TransKeyActivity;
import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.Observable;
import io.reactivex.disposables.Disposable;
public class LoginV2Activity extends BaseActivity implements View.OnClickListener, LoginV2PresenterInterface.LoginV2ContractInterface, SecurityKeyboardView.SecurityKeyboardFocusStateListener {
@ -174,6 +180,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
loginBtn.setOnClickListener(this);
// iv_back.setOnClickListener(this);
securityKeyboardView.setSecurityKeyboardFocusStateListener(this);
presenter.startObservingFingerPrintIfRequired(true);
}
@ -187,6 +194,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
loginBtn.setOnClickListener(null);
// iv_back.setOnClickListener(null);
securityKeyboardView.setSecurityKeyboardFocusStateListener(null);
presenter.startObservingFingerPrintIfRequired(false);
}
@ -194,12 +202,14 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
@Override
protected void onResume() {
super.onResume();
if (!isLoadingInProgress)
animateFingerPrintAppearAnimationIfRequired();
}
@Override
protected void onPause() {
super.onPause();
if (!isLoadingInProgress)
animateFingerPrintAppearAnimationIfRequired();
}
@ -217,8 +227,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
}
}, 400);
}
else {
} else {
new Handler().postDelayed(() -> {
fingerprintScannerImgView.setImageDrawable(null);
}, 200);
@ -255,10 +264,15 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
if (presenter.validateAll(usernameId.getText().toString())) {
hideKeyBoard();
rootView.clearFocus();
morphButtonIntoProgressBar();
onLoginPerformTask(() -> presenter.loginUser(usernameId.getText().toString(), ""));
}
}
@Override
public void onLoginPerformTask(Runnable task) {
morphButtonIntoProgressBar(task);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return (isLoadingInProgress || securityKeyboardView.checkIfTouchIntersectKeypadLayout(ev) || super.dispatchTouchEvent(ev));
@ -276,7 +290,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
}
private void morphButtonIntoProgressBar() {
private void morphButtonIntoProgressBar(Runnable task) {
GradientDrawable mGradientDrawable = (GradientDrawable) loginBtn.getBackground();
@ -312,9 +326,9 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
@Override
public void onAnimationEnd(Animator animation) {
mIsMorphingInProgress = false;
// ViewCompat.setTranslationZ(progressbar_login, 100);
progressbar_login.setVisibility(View.VISIBLE);
presenter.loginUser(usernameId.getText().toString(), "");
if (task != null)
task.run();
}
});
mMorphingAnimatorSet.start();
@ -351,7 +365,6 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
mIsMorphingInProgress = true;
// ViewCompat.setTranslationZ(progressbar_login, 0);
progressbar_login.setVisibility(View.GONE);
}
@ -382,7 +395,6 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
@Override
public void redirectToDashboard() {
// Intent intent = new Intent(this, HomeActivity.class);
Intent intent = new Intent(this, HomeActivityV2.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

86
app/src/main/java/com/gmeremit/online/gmeremittance_native/settings/view/SettingsView.java

@ -4,8 +4,9 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.support.v7.widget.SwitchCompat;
import android.view.View;
import android.widget.CompoundButton;
import com.gmeremit.online.gmeremittance_native.GmeApplication;
import com.gmeremit.online.gmeremittance_native.R;
@ -15,9 +16,8 @@ import com.gmeremit.online.gmeremittance_native.changepasswordV2.view.ChangePass
import com.gmeremit.online.gmeremittance_native.customwidgets.CustomAlertDialog;
import com.gmeremit.online.gmeremittance_native.settings.adapter.LanguageSelectionDialogRVAdapter;
import com.gmeremit.online.gmeremittance_native.splash_screen.model.LanguageModel;
import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionPasswordPromptActivity;
import com.gmeremit.online.gmeremittance_native.utils.security.SecurityUtils;
import com.mtramin.rxfingerprint.RxFingerprint;
import com.mtramin.rxfingerprint.data.FingerprintAuthenticationResult;
import com.mtramin.rxfingerprint.data.FingerprintEncryptionResult;
import java.util.ArrayList;
@ -26,6 +26,7 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
@ -39,14 +40,16 @@ import static com.gmeremit.online.gmeremittance_native.base.PrefKeys.USER_PREFER
* Created by FMI-LT-17 on 2/20/2018.
*/
public class SettingsView extends BaseActivity {
public class SettingsView extends BaseActivity implements CompoundButton.OnCheckedChangeListener {
@BindView(R.id.view_fingerprint)
View view_fingerprint;
SwitchCompat view_fingerprint;
@BindView(R.id.view_fingerprint_divider)
View view_fingerprint_divider;
@Override
Disposable fingerPrintAuthEnableSubs;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
@ -55,11 +58,18 @@ public class SettingsView extends BaseActivity {
private void init() {
ButterKnife.bind(this);
if(!SecurityUtils.doesAppHasBiometricFeature(this))
{
if (!SecurityUtils.doesAppHasBiometricFeature(this)) {
view_fingerprint.setVisibility(View.GONE);
view_fingerprint_divider.setVisibility(View.GONE);
}
else
{
checkIfFingerPrintIsEnabled();
}
}
private void checkIfFingerPrintIsEnabled() {
view_fingerprint.setChecked(GmeApplication.getStorage().getBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,false));
}
@OnClick({R.id.view_change_password, R.id.iv_back, R.id.view_language, R.id.view_fingerprint})
@ -78,52 +88,23 @@ public class SettingsView extends BaseActivity {
promptLanguageSelectionDialog();
break;
case R.id.view_fingerprint:
mockEncryption("1234");
break;
}
}
private void promptForFingerprintAuth() {
}
private void mockEncryption(String abc) {
SecurityUtils.encryptSecret(this, abc)
.doOnSubscribe(subs->showProgressBar(true,getString(R.string.processing_request_text)))
.doFinally(()->showProgressBar(false,""))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<FingerprintEncryptionResult>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(FingerprintEncryptionResult fingerprintEncryptionResult) {
if(fingerprintEncryptionResult.isSuccess()) {
showPopUpMessage("Now you can use your fingerprint to perform transactions",CustomAlertDialog.AlertType.SUCCESS,action->GmeApplication.getStorage().edit().putString(PrefKeys.APP_USER_SECRET_KEY, fingerprintEncryptionResult.getEncrypted()).apply());
}
else
showPopUpMessage(fingerprintEncryptionResult.getMessage(),CustomAlertDialog.AlertType.FAILED,null);
}
@Override
public void onError(Throwable e) {
showPopUpMessage(e.getMessage(),CustomAlertDialog.AlertType.FAILED,null);
protected void onStart() {
super.onStart();
view_fingerprint.setOnCheckedChangeListener(this);
}
@Override
public void onComplete() {
}
});
protected void onStop() {
super.onStop();
view_fingerprint.setOnCheckedChangeListener(null);
}
private void promptLanguageSelectionDialog() {
LanguageSelectionListingDialog languageSelectionDialog = new LanguageSelectionListingDialog();
languageSelectionDialog.setLanguageData(getLanguagedata());
@ -185,4 +166,23 @@ public class SettingsView extends BaseActivity {
return models;
}
@Override
protected void onDestroy() {
super.onDestroy();
if (fingerPrintAuthEnableSubs != null && !fingerPrintAuthEnableSubs.isDisposed())
fingerPrintAuthEnableSubs.dispose();
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch(buttonView.getId())
{
case R.id.view_fingerprint:
{
GmeApplication.getStorage().edit().putBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,isChecked).apply();
}
}
}
}

16
app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/gateway/TransactionPasswordPromptV2Gateway.java

@ -1,6 +1,7 @@
package com.gmeremit.online.gmeremittance_native.transactionpasspromt.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.transactionpasspromt.presenter.TransactionPasswordPromptV2InteractorInterface;
import com.gmeremit.online.gmeremittance_native.utils.https.HttpClientV2;
@ -39,4 +40,19 @@ public class TransactionPasswordPromptV2Gateway extends PrivilegedGateway implem
public String getStoredSecretKey() {
return GmeApplication.getStorage().getString(APP_USER_SECRET_KEY,"");
}
@Override
public boolean isFingerPrintAuthEnabled() {
return GmeApplication.getStorage().getBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED,false);
}
@Override
public String getPersistedUserId() {
return GmeApplication.getStorage().getString(PrefKeys.APP_USER_ID_SECRET_KEY,null);
}
@Override
public String getPersistedUserPwd() {
return GmeApplication.getStorage().getString(PrefKeys.APP_USER_SECRET_KEY,null);
}
}

6
app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2InteractorInterface.java

@ -15,5 +15,11 @@ public interface TransactionPasswordPromptV2InteractorInterface extends BaseInte
boolean isFingerPrintEnabled();
String getStoredSecretKey();
boolean isFingerPrintAuthEnabled();
String getPersistedUserId();
String getPersistedUserPwd();
}
}

3
app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2Presenter.java

@ -80,8 +80,7 @@ public class TransactionPasswordPromptV2Presenter extends BasePresenter implemen
@Override
public boolean checkIfUserHasEnabledBiometricAuth() {
return true;
// return gateway.isFingerPrintEnabled()&&SecurityUtils.doesAppHasBiometricFeature(view.getContext());
return SecurityUtils.doesAppHasBiometricFeature(view.getContext())&&gateway.isFingerPrintAuthEnabled()&&gateway.getPersistedUserId()!=null&&gateway.getPersistedUserPwd()!=null;
}
@Override

17
app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptActivity.java

@ -45,15 +45,18 @@ import com.mtramin.rxfingerprint.data.FingerprintEncryptionResult;
import com.softsecurity.transkey.TransKeyActivity;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
public class TransactionPasswordPromptActivity extends BaseActivity implements SecurityKeyboardView.SecurityKeyboardFocusStateListener, TransactionPasswordPromptV2PresenterInterface.TransactionPasswordPromptV2ContractInterface, View.OnClickListener {
@ -285,10 +288,11 @@ public class TransactionPasswordPromptActivity extends BaseActivity implements S
private Disposable startObservingFingerPrintScanner() {
return SecurityUtils.decryptSecret(this, presenter.getSecretKey())
.subscribeOn(Schedulers.io())
.flatMap(authentication -> {
switch (authentication.getResult()) {
case FAILED:
return io.reactivex.Observable.error(new SecurityUtils.FailedFingerPrintException(authentication.getMessage()));
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:
@ -298,6 +302,17 @@ public class TransactionPasswordPromptActivity extends BaseActivity implements S
}
})
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(errors->errors.flatMap(
error->{
if(error instanceof SecurityUtils.FailedFingerPrintException || error instanceof SecurityUtils.SensorNotReadyException)
{
showToastMessage(error.getMessage());
return Observable.timer(100,TimeUnit.MILLISECONDS);
}
return Observable.error(error);
}
))
.subscribeWith(new FingerPrintScannerObserver());
}

2
app/src/main/res/layout/activity_transaction_password_prompt.xml

@ -42,7 +42,7 @@
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:gravity="center"
android:text="Or place your finger on the fingerprint sensor to perform transaction."
android:text="@string/fingerprint_user_text"
android:textColor="@color/darkgray"
android:textSize="14sp" />

2
app/src/main/res/values/strings.xml

@ -462,6 +462,8 @@
<string name="fingerprint_auth_text">Fingerprint Authentication</string>
<string name="verify_account_button_text">Verify Account</string>
<string name="to_add_account_enter_information">To add account, enter information.</string>
<string name="fingerprint_not_recognized">Fingerprint not recognized, please try again.</string>
<string name="fingerprint_user_text">Or place your finger on the fingerprint sensor to perform transaction.</string>
</resources>
Loading…
Cancel
Save