public class BioFingerprintActivity extends DeviceCVMKeyguardActivity {
private static String TAG = BioFingerprintActivity.class.getName();
private PaymentBusinessService paymentBusinessService;
private DeviceCVMVerifier deviceCVMVerifier;
private CancellationSignal cancellationSignal;
private TextView message;
private boolean isBioFPVerificationStarted = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bio_fingerprint_2);
unlockAndWake();
Bundle extras = getIntent().getExtras();
// obtener el objeto cvm pasado a través del paquete
CHVerificationMethod cvm = (CHVerificationMethod) extras.getSerializable(Tags.CVM);
message = (TextView) findViewById(R.id.message);
paymentBusinessService = PaymentBusinessManager.getPaymentBusinessService();
PaymentService paymentService = paymentBusinessService.getActivatedPaymentService();
// gracias al objeto cvm, obtiene una instancia de 'DeviceCVMVerifier'
deviceCVMVerifier = (DeviceCVMVerifier) paymentService.getCHVerifier(cvm);
// establece el listener correspondiente
deviceCVMVerifier.setDeviceCVMVerifyListener(new DeviceCVMVerifyListener() {
@Override
public void onVerifySuccess() {
// ¡La verificación es correcta!
message.setText("");
BioFingerprintActivity.this.finish();
}
@Override
public void onVerifyError(int errorCode, CharSequence charSequence) {
Log.d(TAG, "BioFingerprintActivity:error :" + errorCode);
// Caso especial cuando se activa en modo de pantalla de bloqueo
// se lanza el error FINGERPRINT_ERROR_CANCELED
if (errorCode == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
Log.d(TAG, "reiniciar huella");
if (cancellationSignal != null)
cancellationSignal.cancel();
isBioFPVerificationStarted=true;
cancellationSignal = new CancellationSignal();
DeviceCVMVerifierInput input = new DeviceCVMVerifierInput(cancellationSignal);
deviceCVMVerifier.startAuthentication(input);
}
// tratamiento habitual del código de error
else {
message.setText(charSequence + ". Por favor, inténtalo de nuevo...");
if(errorCode == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {
confirmCredential("Verificar mediante Keyguard", "Demasiados intentos. Verifica usando tu PIN / patrón / contraseña");
}
}
}
@Override
public void onVerifyFailed() {
message.setText("No se pudo reconocer la huella digital. Por favor, inténtalo de nuevo.");
}
@Override
public void onVerifyHelp(int i, CharSequence charSequence) {
message.setText(charSequence + ". Por favor, inténtalo de nuevo.");
}
});
deviceCVMVerifier.setKeyguardActivity(this);
cancellationSignal = new CancellationSignal();
// Inicia la autenticación cuando la pantalla está encendida y desbloqueada
if (DeviceUtil.isDeviceScreenOn(getApplicationContext())) {
Log.d(TAG, "Iniciando la autenticación por huella digital");
DeviceCVMVerifierInput input = new DeviceCVMVerifierInput(cancellationSignal);
deviceCVMVerifier.startAuthentication(input);
} else {
Log.d(TAG, "La pantalla está desactivada, se omite la autenticación por huella digital");
}
}
/* En caso de fallo de la verificación por huella digital, es posible implementar el siguiente callback
para recurrir a la verificación de Keyguard.
**/
public void onKeyguardFallback(View v) {
Log.d(TAG, "onKeyguardFallback");
// llamar a deviceCVMVerifier.startAuthentication(input)
}
@Override
public void onCancel(View v) {
Log.d(TAG, "Cancelar autenticación");
cancelTransaction("La transacción ha sido cancelada.");
}
@Override
public void onBackPressed() {
Log.d(TAG, "onBackPressed()");
cancelTransaction("La transacción ha sido cancelada.");
}
/*
Después de cancelar la autenticación biométrica por huella digital, el servicio de pago deberá desactivarse
**/
private void cancelTransaction(String message) {
if (cancellationSignal != null) {
cancellationSignal.cancel();
}
PaymentBusinessManager.getPaymentBusinessService().deactivate();
}
}