OSDN Git Service

ConfirmDeviceCredential should respond to cancel when launched through BP
authorKevin Chyn <kchyn@google.com>
Tue, 26 Mar 2019 01:15:57 +0000 (18:15 -0700)
committerKevin Chyn <kchyn@google.com>
Thu, 4 Apr 2019 17:22:23 +0000 (17:22 +0000)
Fixes: 128747871

Test: BiometricPrompt launched by ConfirmDeviceCredential is canceled
Test: ConfirmLock* can also now be canceled
Test: No effect on non-biometric related paths

Change-Id: I237de136e63d523fece87fad7a93f4ecd66d800b

src/com/android/settings/password/BiometricFragment.java
src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java

index baefa09..7f09071 100644 (file)
 
 package com.android.settings.password;
 
+import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.content.DialogInterface;
 import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.BiometricPrompt;
 import android.hardware.biometrics.BiometricPrompt.AuthenticationCallback;
 import android.hardware.biometrics.BiometricPrompt.AuthenticationResult;
+import android.hardware.biometrics.IBiometricConfirmDeviceCredentialCallback;
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Handler;
 import android.os.Looper;
+import android.util.Log;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedFragment;
@@ -40,6 +42,8 @@ import java.util.concurrent.Executor;
  */
 public class BiometricFragment extends InstrumentedFragment {
 
+    private static final String TAG = "ConfirmDeviceCredential/BiometricFragment";
+
     // Re-set by the application. Should be done upon orientation changes, etc
     private Executor mClientExecutor;
     private AuthenticationCallback mClientCallback;
@@ -48,7 +52,6 @@ public class BiometricFragment extends InstrumentedFragment {
     private int mUserId;
 
     // Created/Initialized once and retained
-    private final Handler mHandler = new Handler(Looper.getMainLooper());
     private Bundle mBundle;
     private BiometricPrompt mBiometricPrompt;
     private CancellationSignal mCancellationSignal;
@@ -82,6 +85,20 @@ public class BiometricFragment extends InstrumentedFragment {
         }
     };
 
+    // TODO(b/123378871): Remove when moved.
+    private final IBiometricConfirmDeviceCredentialCallback mCancelCallback
+        = new IBiometricConfirmDeviceCredentialCallback.Stub() {
+        @Override
+        public void cancel() {
+            final Activity activity = getActivity();
+            if (activity != null) {
+                activity.finish();
+            } else {
+                Log.e(TAG, "Activity null!");
+            }
+        }
+    };
+
     /**
      * @param bundle Bundle passed from {@link BiometricPrompt.Builder#buildIntent()}
      * @return
@@ -123,6 +140,7 @@ public class BiometricFragment extends InstrumentedFragment {
         mBiometricPrompt = new BiometricPrompt.Builder(getContext())
             .setTitle(mBundle.getString(BiometricPrompt.KEY_TITLE))
             .setUseDefaultTitle() // use default title if title is null/empty
+            .setFromConfirmDeviceCredential()
             .setSubtitle(mBundle.getString(BiometricPrompt.KEY_SUBTITLE))
             .setDescription(mBundle.getString(BiometricPrompt.KEY_DESCRIPTION))
             .setConfirmationRequired(
@@ -135,7 +153,7 @@ public class BiometricFragment extends InstrumentedFragment {
 
         // TODO: CC doesn't use crypto for now
         mBiometricPrompt.authenticateUser(mCancellationSignal, mClientExecutor,
-                mAuthenticationCallback, mUserId);
+                mAuthenticationCallback, mUserId, mCancelCallback);
     }
 
     @Override
index d3d5c49..53841e8 100644 (file)
@@ -106,13 +106,11 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
     private AuthenticationCallback mAuthenticationCallback = new AuthenticationCallback() {
         public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
             if (!mGoingToBackground) {
-                if (errorCode == BiometricPrompt.BIOMETRIC_ERROR_USER_CANCELED) {
+                if (errorCode == BiometricPrompt.BIOMETRIC_ERROR_USER_CANCELED
+                        || errorCode == BiometricPrompt.BIOMETRIC_ERROR_CANCELED) {
                     if (mIsFallback) {
                         mBiometricManager.onConfirmDeviceCredentialError(
-                                BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED,
-                                getString(
-                                        com.android.internal.R.string
-                                                .biometric_error_user_canceled));
+                                errorCode, getStringForError(errorCode));
                     }
                     finish();
                 } else {
@@ -139,6 +137,17 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
         }
     };
 
+    private String getStringForError(int errorCode) {
+        switch (errorCode) {
+            case BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED:
+                return getString(com.android.internal.R.string.biometric_error_user_canceled);
+            case BiometricConstants.BIOMETRIC_ERROR_CANCELED:
+                return getString(com.android.internal.R.string.biometric_error_canceled);
+            default:
+                return null;
+        }
+    }
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -178,7 +187,6 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
                 intent.getBundleExtra(KeyguardManager.EXTRA_BIOMETRIC_PROMPT_BUNDLE);
         if (bpBundle != null) {
             mIsFallback = true;
-            // TODO: CDC maybe should show description as well.
             mTitle = bpBundle.getString(BiometricPrompt.KEY_TITLE);
             mDetails = bpBundle.getString(BiometricPrompt.KEY_SUBTITLE);
         } else {
index 82883ca..aa40d27 100644 (file)
@@ -19,6 +19,7 @@ package com.android.settings.password;
 import android.app.KeyguardManager;
 import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.BiometricManager;
+import android.hardware.biometrics.IBiometricConfirmDeviceCredentialCallback;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.util.Log;
@@ -51,6 +52,15 @@ public abstract class ConfirmDeviceCredentialBaseActivity extends SettingsActivi
     private ConfirmCredentialTheme mConfirmCredentialTheme;
     private BiometricManager mBiometricManager;
 
+    // TODO(b/123378871): Remove when moved.
+    private final IBiometricConfirmDeviceCredentialCallback mCancelCallback
+            = new IBiometricConfirmDeviceCredentialCallback.Stub() {
+        @Override
+        public void cancel() {
+            finish();
+        }
+    };
+
     private boolean isInternalActivity() {
         return (this instanceof ConfirmLockPassword.InternalActivity)
                 || (this instanceof ConfirmLockPattern.InternalActivity);
@@ -81,6 +91,7 @@ public abstract class ConfirmDeviceCredentialBaseActivity extends SettingsActivi
         super.onCreate(savedState);
 
         mBiometricManager = getSystemService(BiometricManager.class);
+        mBiometricManager.registerCancellationCallback(mCancelCallback);
 
         if (mConfirmCredentialTheme == ConfirmCredentialTheme.NORMAL) {
             // Prevent the content parent from consuming the window insets because GlifLayout uses