diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java index 6e646a5d00..7ccc8619be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java @@ -75,6 +75,7 @@ public class PassphrasePromptActivity extends PassphraseActivity { private static final int BIOMETRIC_AUTHENTICATORS = Authenticators.BIOMETRIC_STRONG | Authenticators.BIOMETRIC_WEAK; private static final int ALLOWED_AUTHENTICATORS = BIOMETRIC_AUTHENTICATORS | Authenticators.DEVICE_CREDENTIAL; private static final short AUTHENTICATE_REQUEST_CODE = 1007; + private static final String BUNDLE_ALREADY_SHOWN = "bundle_already_shown"; private DynamicIntroTheme dynamicTheme = new DynamicIntroTheme(); private DynamicLanguage dynamicLanguage = new DynamicLanguage(); @@ -94,6 +95,7 @@ public class PassphrasePromptActivity extends PassphraseActivity { private boolean authenticated; private boolean hadFailure; + private boolean alreadyShown; @Override public void onCreate(Bundle savedInstanceState) { @@ -106,6 +108,14 @@ public class PassphrasePromptActivity extends PassphraseActivity { setContentView(R.layout.prompt_passphrase_activity); initializeResources(); + + alreadyShown = savedInstanceState != null && savedInstanceState.getBoolean(BUNDLE_ALREADY_SHOWN); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(BUNDLE_ALREADY_SHOWN, alreadyShown); } @Override @@ -117,7 +127,8 @@ public class PassphrasePromptActivity extends PassphraseActivity { setLockTypeVisibility(); if (TextSecurePreferences.isScreenLockEnabled(this) && !authenticated && !hadFailure) { - resumeScreenLock(); + resumeScreenLock(!alreadyShown); + alreadyShown = true; } hadFailure = false; @@ -248,7 +259,7 @@ public class PassphrasePromptActivity extends PassphraseActivity { fingerprintPrompt.setImageResource(R.drawable.ic_fingerprint_white_48dp); fingerprintPrompt.getBackground().setColorFilter(getResources().getColor(R.color.core_ultramarine), PorterDuff.Mode.SRC_IN); - lockScreenButton.setOnClickListener(v -> resumeScreenLock()); + lockScreenButton.setOnClickListener(v -> resumeScreenLock(true)); } private void setLockTypeVisibility() { @@ -264,7 +275,7 @@ public class PassphrasePromptActivity extends PassphraseActivity { } } - private void resumeScreenLock() { + private void resumeScreenLock(boolean force) { KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); assert keyguardManager != null; @@ -276,8 +287,12 @@ public class PassphrasePromptActivity extends PassphraseActivity { } if (biometricManager.canAuthenticate(ALLOWED_AUTHENTICATORS) == BiometricManager.BIOMETRIC_SUCCESS) { - Log.i(TAG, "Listening for biometric authentication..."); - biometricPrompt.authenticate(biometricPromptInfo); + if (force) { + Log.i(TAG, "Listening for biometric authentication..."); + biometricPrompt.authenticate(biometricPromptInfo); + } else { + Log.i(TAG, "Skipping show system biometric dialog unless forced"); + } } else if (Build.VERSION.SDK_INT >= 21){ Log.i(TAG, "firing intent..."); Intent intent = keyguardManager.createConfirmDeviceCredentialIntent(getString(R.string.PassphrasePromptActivity_unlock_signal), "");