From 28a034d6edfc1271e21b813574b5a0d9c53be467 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 26 Mar 2020 17:54:27 -0700 Subject: [PATCH] Adjust ConfirmDeviceCredentialActivity system bars CDCA is a transparent activity with the sole purpose of requesting authentication. Since authentication is all drawn by SystemUI, we should also stop this activity from drawing the StatusBar. Register to receive biometric system events (early user canceled), so that we can finish() and start the activity transition simultaneously. This fixes some navigation bar jank. Bug: 148273355 Test: Set up a work profile, then install BiometricPromptDemo Disable one-lock and set up a password/biometric for the work profile. Lock/unlock screen, then open the work profile version of the app. No status bar jank seen. Change-Id: I54a352527ed007dcaf1bea14a51711e4022fe028 --- ..._credential_biometric_transition_enter.xml | 24 ------------------- .../settings/password/BiometricFragment.java | 14 +++++++---- .../ConfirmDeviceCredentialActivity.java | 23 +++++++++++------- 3 files changed, 24 insertions(+), 37 deletions(-) delete mode 100644 res/anim/confirm_credential_biometric_transition_enter.xml diff --git a/res/anim/confirm_credential_biometric_transition_enter.xml b/res/anim/confirm_credential_biometric_transition_enter.xml deleted file mode 100644 index 56f35930b8e..00000000000 --- a/res/anim/confirm_credential_biometric_transition_enter.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java index 7e783227362..fc9e42e00fa 100644 --- a/src/com/android/settings/password/BiometricFragment.java +++ b/src/com/android/settings/password/BiometricFragment.java @@ -77,6 +77,13 @@ public class BiometricFragment extends InstrumentedFragment { mClientCallback.onAuthenticationFailed(); }); } + + @Override + public void onSystemEvent(int event) { + mClientExecutor.execute(() -> { + mClientCallback.onSystemEvent(event); + }); + } }; private final DialogInterface.OnClickListener mNegativeButtonListener = @@ -121,10 +128,6 @@ public class BiometricFragment extends InstrumentedFragment { } } - boolean isAuthenticating() { - return mAuthenticating; - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -144,7 +147,8 @@ public class BiometricFragment extends InstrumentedFragment { .setConfirmationRequired(mBundle.getBoolean( BiometricPrompt.KEY_REQUIRE_CONFIRMATION, true)) .setDisallowBiometricsIfPolicyExists(mBundle.getBoolean( - BiometricPrompt.EXTRA_DISALLOW_BIOMETRICS_IF_POLICY_EXISTS, false)); + BiometricPrompt.EXTRA_DISALLOW_BIOMETRICS_IF_POLICY_EXISTS, false)) + .setReceiveSystemEvents(true); mBiometricPrompt = builder.build(); mCancellationSignal = new CancellationSignal(); diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java index 220b64929ad..a9a28469c6f 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java @@ -25,6 +25,7 @@ import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricPrompt; @@ -35,6 +36,7 @@ import android.os.Looper; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; +import android.view.WindowManager; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; @@ -142,6 +144,16 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { public void onAuthenticationFailed() { mDevicePolicyManager.reportFailedBiometricAttempt(mUserId); } + + @Override + public void onSystemEvent(int event) { + Log.d(TAG, "SystemEvent: " + event); + switch (event) { + case BiometricConstants.BIOMETRIC_SYSTEM_EVENT_EARLY_USER_CANCEL: + finish(); + break; + } + } }; private String getStringForError(int errorCode) { @@ -159,6 +171,9 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + getWindow().setStatusBarColor(Color.TRANSPARENT); + mBiometricManager = getSystemService(BiometricManager.class); mDevicePolicyManager = getSystemService(DevicePolicyManager.class); mUserManager = UserManager.get(this); @@ -379,14 +394,6 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { finish(); } - @Override - public void finish() { - super.finish(); - // Finish without animation since the activity is just there so we can launch - // BiometricPrompt. - overridePendingTransition(R.anim.confirm_credential_biometric_transition_enter, 0); - } - private boolean isInternalActivity() { return this instanceof ConfirmDeviceCredentialActivity.InternalActivity; }