fix: auto prompt #2105

This commit is contained in:
J-Jamet
2025-08-12 14:54:52 +02:00
parent dfd7ade416
commit fe526089d7
4 changed files with 22 additions and 18 deletions

View File

@@ -51,7 +51,7 @@ import com.kunzisoft.keepass.activities.dialogs.DuplicateUuidDialog
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
import com.kunzisoft.keepass.activities.helpers.SpecialMode
import com.kunzisoft.keepass.activities.legacy.DatabaseLockActivity
import com.kunzisoft.keepass.activities.legacy.DatabaseLockActivity.Companion.UI_VISIBLE_DURING_LOCK
import com.kunzisoft.keepass.activities.legacy.DatabaseModeActivity
import com.kunzisoft.keepass.autofill.AutofillComponent
import com.kunzisoft.keepass.autofill.AutofillHelper
@@ -265,6 +265,11 @@ class MainCredentialActivity : DatabaseModeActivity() {
override fun onResume() {
super.onResume()
// Don't allow auto open prompt if lock become when UI visible
if (UI_VISIBLE_DURING_LOCK) {
mDeviceUnlockViewModel.allowAutoOpenBiometricPrompt = false
}
// Init Biometric elements only if allowed
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& PreferencesUtil.isAdvancedUnlockEnable(this)) {
@@ -291,11 +296,6 @@ class MainCredentialActivity : DatabaseModeActivity() {
sendBroadcast(Intent(BACK_PREVIOUS_KEYBOARD_ACTION))
}
// Don't allow auto open prompt if lock become when UI visible
if (DatabaseLockActivity.LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK == true) {
mDeviceUnlockViewModel.allowAutoOpenBiometricPrompt = false
}
mDatabaseFileUri?.let { databaseFileUri ->
mDatabaseFileViewModel.loadDatabaseFile(databaseFileUri)
}
@@ -420,6 +420,7 @@ class MainCredentialActivity : DatabaseModeActivity() {
// Check if database really loaded
if (database.loaded) {
clearCredentialsViews(clearKeyFile = true, clearHardwareKey = true)
mDeviceUnlockViewModel.autoPromptAlreadyShown = false
GroupActivity.launch(this,
database,
{ onValidateSpecialMode() },
@@ -541,8 +542,7 @@ class MainCredentialActivity : DatabaseModeActivity() {
override fun onPause() {
// Reinit locking activity UI variable
DatabaseLockActivity.LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK = null
UI_VISIBLE_DURING_LOCK = false
super.onPause()
}

View File

@@ -47,10 +47,14 @@ import com.kunzisoft.keepass.services.DatabaseTaskNotificationService
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.*
import com.kunzisoft.keepass.utils.LOCK_ACTION
import com.kunzisoft.keepass.utils.LockReceiver
import com.kunzisoft.keepass.utils.closeDatabase
import com.kunzisoft.keepass.utils.registerLockReceiver
import com.kunzisoft.keepass.utils.unregisterLockReceiver
import com.kunzisoft.keepass.view.showActionErrorIfNeeded
import com.kunzisoft.keepass.viewmodels.NodesViewModel
import java.util.*
import java.util.UUID
abstract class DatabaseLockActivity : DatabaseModeActivity(),
PasswordEncodingDialogFragment.Listener {
@@ -184,8 +188,7 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
mLockReceiver = LockReceiver {
mDatabase = null
closeDatabase(database)
if (LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK == null)
LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK = LOCKING_ACTIVITY_UI_VISIBLE
UI_VISIBLE_DURING_LOCK = UI_VISIBLE
mExitLock = true
closeOptionsMenu()
finish()
@@ -414,7 +417,7 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
invalidateOptionsMenu()
LOCKING_ACTIVITY_UI_VISIBLE = true
UI_VISIBLE = true
}
protected fun checkTimeAndLockIfTimeoutOrResetTimeout(action: (() -> Unit)? = null) {
@@ -429,7 +432,7 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
}
override fun onPause() {
LOCKING_ACTIVITY_UI_VISIBLE = false
UI_VISIBLE = false
super.onPause()
@@ -481,8 +484,8 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
const val TIMEOUT_ENABLE_KEY = "TIMEOUT_ENABLE_KEY"
const val TIMEOUT_ENABLE_KEY_DEFAULT = true
private var LOCKING_ACTIVITY_UI_VISIBLE = false
var LOCKING_ACTIVITY_UI_VISIBLE_DURING_LOCK: Boolean? = null
var UI_VISIBLE: Boolean = false
var UI_VISIBLE_DURING_LOCK: Boolean = false
}
}

View File

@@ -74,7 +74,6 @@ class DeviceUnlockFragment: Fragment() {
private var mDeviceCredentialResultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
mDeviceUnlockViewModel.allowAutoOpenBiometricPrompt = false
// To wait resume
if (keepConnection) {
mDeviceUnlockViewModel.deviceCredentialAuthSucceeded =
@@ -295,8 +294,9 @@ class DeviceUnlockFragment: Fragment() {
}
// Auto open the biometric prompt
if (mDeviceUnlockViewModel.allowAutoOpenBiometricPrompt
&& !mDeviceUnlockViewModel.autoPromptAlreadyShown
&& PreferencesUtil.isAdvancedUnlockPromptAutoOpenEnable(requireContext())) {
mDeviceUnlockViewModel.allowAutoOpenBiometricPrompt = false
mDeviceUnlockViewModel.autoPromptAlreadyShown = true
openDecryptionPrompt(cryptoPrompt)
}
}

View File

@@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.update
class DeviceUnlockViewModel(application: Application): AndroidViewModel(application) {
var allowAutoOpenBiometricPrompt : Boolean = true
var autoPromptAlreadyShown : Boolean = false
var deviceCredentialAuthSucceeded: Boolean? = null
private var cipherDatabaseListener: CipherDatabaseAction.CipherDatabaseListener? = null