@ -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 ;
BiometricEncrypter Params ( 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 ) {
}
}
}