fix: Auto prompt #2111

This commit is contained in:
J-Jamet
2025-08-14 17:02:40 +02:00
parent 9e1f6d29a5
commit 23bebf9597
8 changed files with 23 additions and 29 deletions

View File

@@ -1,3 +1,6 @@
KeePassDX(4.1.4)
* Fix auto prompt #2111
KeePassDX(4.1.4) KeePassDX(4.1.4)
* Fix UnlockManager #2098 #2101 * Fix UnlockManager #2098 #2101
* Auto device unlock prompt #2105 * Auto device unlock prompt #2105

View File

@@ -11,8 +11,8 @@ android {
applicationId "com.kunzisoft.keepass" applicationId "com.kunzisoft.keepass"
minSdkVersion 15 minSdkVersion 15
targetSdkVersion 34 targetSdkVersion 34
versionCode = 136 versionCode = 137
versionName = "4.1.4" versionName = "4.1.5"
multiDexEnabled true multiDexEnabled true
testApplicationId = "com.kunzisoft.keepass.tests" testApplicationId = "com.kunzisoft.keepass.tests"

View File

@@ -51,7 +51,6 @@ import com.kunzisoft.keepass.activities.dialogs.DuplicateUuidDialog
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
import com.kunzisoft.keepass.activities.helpers.SpecialMode import com.kunzisoft.keepass.activities.helpers.SpecialMode
import com.kunzisoft.keepass.activities.legacy.DatabaseLockActivity.Companion.UI_VISIBLE_DURING_LOCK
import com.kunzisoft.keepass.activities.legacy.DatabaseModeActivity import com.kunzisoft.keepass.activities.legacy.DatabaseModeActivity
import com.kunzisoft.keepass.autofill.AutofillComponent import com.kunzisoft.keepass.autofill.AutofillComponent
import com.kunzisoft.keepass.autofill.AutofillHelper import com.kunzisoft.keepass.autofill.AutofillHelper
@@ -87,7 +86,6 @@ import com.kunzisoft.keepass.view.MainCredentialView
import com.kunzisoft.keepass.view.asError import com.kunzisoft.keepass.view.asError
import com.kunzisoft.keepass.view.showActionErrorIfNeeded import com.kunzisoft.keepass.view.showActionErrorIfNeeded
import com.kunzisoft.keepass.viewmodels.DatabaseFileViewModel import com.kunzisoft.keepass.viewmodels.DatabaseFileViewModel
import com.kunzisoft.keepass.viewmodels.DeviceUnlockState
import com.kunzisoft.keepass.viewmodels.DeviceUnlockViewModel import com.kunzisoft.keepass.viewmodels.DeviceUnlockViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.FileNotFoundException import java.io.FileNotFoundException
@@ -416,7 +414,6 @@ class MainCredentialActivity : DatabaseModeActivity() {
private fun launchGroupActivityIfLoaded(database: ContextualDatabase) { private fun launchGroupActivityIfLoaded(database: ContextualDatabase) {
// Check if database really loaded // Check if database really loaded
if (database.loaded) { if (database.loaded) {
mDeviceUnlockViewModel.allowAutoOpenBiometricPrompt = true
clearCredentialsViews(clearKeyFile = true, clearHardwareKey = true) clearCredentialsViews(clearKeyFile = true, clearHardwareKey = true)
GroupActivity.launch(this, GroupActivity.launch(this,
database, database,
@@ -537,12 +534,6 @@ class MainCredentialActivity : DatabaseModeActivity() {
} }
} }
override fun onPause() {
// Reinit locking activity UI variable
UI_VISIBLE_DURING_LOCK = false
super.onPause()
}
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
outState.putBoolean(KEY_READ_ONLY, mReadOnly) outState.putBoolean(KEY_READ_ONLY, mReadOnly)
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)

View File

@@ -53,6 +53,7 @@ import com.kunzisoft.keepass.utils.closeDatabase
import com.kunzisoft.keepass.utils.registerLockReceiver import com.kunzisoft.keepass.utils.registerLockReceiver
import com.kunzisoft.keepass.utils.unregisterLockReceiver import com.kunzisoft.keepass.utils.unregisterLockReceiver
import com.kunzisoft.keepass.view.showActionErrorIfNeeded import com.kunzisoft.keepass.view.showActionErrorIfNeeded
import com.kunzisoft.keepass.viewmodels.DeviceUnlockViewModel.Companion.isAutoOpenBiometricPromptAllowed
import com.kunzisoft.keepass.viewmodels.NodesViewModel import com.kunzisoft.keepass.viewmodels.NodesViewModel
import java.util.UUID import java.util.UUID
@@ -70,6 +71,8 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
protected var mMergeDataAllowed: Boolean = false protected var mMergeDataAllowed: Boolean = false
private var mAutoSaveEnable: Boolean = true private var mAutoSaveEnable: Boolean = true
private var isDatabaseUiVisible: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -188,7 +191,8 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
mLockReceiver = LockReceiver { mLockReceiver = LockReceiver {
mDatabase = null mDatabase = null
closeDatabase(database) closeDatabase(database)
UI_VISIBLE_DURING_LOCK = UI_VISIBLE // Don't allow auto open prompt if lock become when UI visible
isAutoOpenBiometricPromptAllowed = !isDatabaseUiVisible
mExitLock = true mExitLock = true
closeOptionsMenu() closeOptionsMenu()
finish() finish()
@@ -417,7 +421,7 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
invalidateOptionsMenu() invalidateOptionsMenu()
UI_VISIBLE = true isDatabaseUiVisible = true
} }
protected fun checkTimeAndLockIfTimeoutOrResetTimeout(action: (() -> Unit)? = null) { protected fun checkTimeAndLockIfTimeoutOrResetTimeout(action: (() -> Unit)? = null) {
@@ -432,7 +436,7 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
} }
override fun onPause() { override fun onPause() {
UI_VISIBLE = false isDatabaseUiVisible = false
super.onPause() super.onPause()
@@ -483,9 +487,6 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
const val TIMEOUT_ENABLE_KEY = "TIMEOUT_ENABLE_KEY" const val TIMEOUT_ENABLE_KEY = "TIMEOUT_ENABLE_KEY"
const val TIMEOUT_ENABLE_KEY_DEFAULT = true const val TIMEOUT_ENABLE_KEY_DEFAULT = true
var UI_VISIBLE: Boolean = false
var UI_VISIBLE_DURING_LOCK: Boolean = false
} }
} }

View File

@@ -45,7 +45,6 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.legacy.DatabaseLockActivity.Companion.UI_VISIBLE_DURING_LOCK
import com.kunzisoft.keepass.view.DeviceUnlockView import com.kunzisoft.keepass.view.DeviceUnlockView
import com.kunzisoft.keepass.view.hideByFading import com.kunzisoft.keepass.view.hideByFading
import com.kunzisoft.keepass.view.showByFading import com.kunzisoft.keepass.view.showByFading
@@ -146,12 +145,6 @@ class DeviceUnlockFragment: Fragment() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
// Don't allow auto open prompt if lock become when UI visible
if (UI_VISIBLE_DURING_LOCK) {
mDeviceUnlockViewModel.allowAutoOpenBiometricPrompt = false
}
mDeviceUnlockViewModel.checkUnlockAvailability() mDeviceUnlockViewModel.checkUnlockAvailability()
} }

View File

@@ -24,9 +24,6 @@ import kotlinx.coroutines.flow.update
import javax.crypto.Cipher import javax.crypto.Cipher
class DeviceUnlockViewModel(application: Application): AndroidViewModel(application) { class DeviceUnlockViewModel(application: Application): AndroidViewModel(application) {
var allowAutoOpenBiometricPrompt : Boolean = true
private var cipherDatabaseListener: CipherDatabaseAction.CipherDatabaseListener? = null private var cipherDatabaseListener: CipherDatabaseAction.CipherDatabaseListener? = null
private var isConditionToStoreCredentialVerified: Boolean = false private var isConditionToStoreCredentialVerified: Boolean = false
@@ -306,7 +303,7 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
} }
fun promptShown() { fun promptShown() {
allowAutoOpenBiometricPrompt = false isAutoOpenBiometricPromptAllowed = false
_uiState.update { currentState -> _uiState.update { currentState ->
currentState.copy( currentState.copy(
cryptoPromptState = DeviceUnlockPromptMode.IDLE cryptoPromptState = DeviceUnlockPromptMode.IDLE
@@ -348,7 +345,10 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
cipherDatabase?.let { cipherDatabase?.let {
try { try {
deviceUnlockManager?.initDecryptData(cipherDatabase.specParameters) { cryptoPrompt -> deviceUnlockManager?.initDecryptData(cipherDatabase.specParameters) { cryptoPrompt ->
onPromptRequested(cryptoPrompt, autoOpen = allowAutoOpenBiometricPrompt) onPromptRequested(
cryptoPrompt,
autoOpen = isAutoOpenBiometricPromptAllowed
)
} ?: setException(Exception("AdvancedUnlockManager not initialized")) } ?: setException(Exception("AdvancedUnlockManager not initialized"))
} catch (e: Exception) { } catch (e: Exception) {
setException(e) setException(e)
@@ -417,6 +417,10 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
deviceUnlockManager = null deviceUnlockManager = null
} }
} }
companion object {
var isAutoOpenBiometricPromptAllowed = true
}
} }
enum class DeviceUnlockPromptMode { enum class DeviceUnlockPromptMode {

View File

@@ -0,0 +1 @@
* Fix auto prompt #2111

View File

@@ -0,0 +1 @@
* Correction invite de commande auto #2111