AuthActivity
package com.example.testapp2;
import android.app.Activity;
import android.content.Intent;
import android.hardware.biometrics.BiometricPrompt;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.service.autofill.Dataset;
import android.util.Log;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
import android.widget.Toast;
public class AuthActivity extends Activity {
private static final String TAG = "TEE_AuthActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(this)
.setTitle("Xác thực TEE")
.setSubtitle("Vui lòng quét vân tay hoặc dùng mật khẩu máy")
.setDeviceCredentialAllowed(true)
.build();
CancellationSignal cancellationSignal = new CancellationSignal();
biometricPrompt.authenticate(cancellationSignal, getMainExecutor(), new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
unlockAndReturnPassword();
}
@Override
public void onAuthenticationFailed(){
super.onAuthenticationFailed();
Toast.makeText(AuthActivity.this, "Xác thực thất bại", Toast.LENGTH_SHORT).show();
}
@Override
public void onAuthenticationError(int errorCode, CharSequence errString){
Log.e(TAG, "Biometric error: " + errString);
setResult(RESULT_CANCELED);
finish();
}
});
} else {
unlockAndReturnPassword();
}
}
private void unlockAndReturnPassword(){
Intent intent = getIntent();
String pkg = intent.getStringExtra("EXTRA_PKG");
String user = intent.getStringExtra("EXTRA_USER");
AutofillId usernameId = intent.getParcelableExtra("EXTRA_USER_ID");
AutofillId passwordId = intent.getParcelableExtra("EXTRA_PASSWORD_ID");
Log.d(TAG, "Biometric authen success. Fletching pass from TEE");
String pass = new ExecuteCommandTask(this, true).executeSync("get", pkg, user);
if(pass != null && !pass.isEmpty()){
Dataset unlockedDataset = new Dataset.Builder()
.setValue(usernameId, AutofillValue.forText(user))
.setValue(passwordId, AutofillValue.forText(pass.trim()))
.build();
Intent replyIntent = new Intent();
replyIntent.putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, unlockedDataset);
setResult(RESULT_OK, replyIntent);
} else {
setResult(RESULT_CANCELED);
}
finish();
}
}
Editor is loading...
Leave a Comment