From fa34618d676d48da8e7f95530e618654a71ab6f0 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 18 Aug 2025 16:55:39 +0200 Subject: [PATCH] fix: Connect database --- .../activities/MainCredentialActivity.kt | 5 +-- .../viewmodels/DeviceUnlockViewModel.kt | 43 ++++++++----------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt index 9164b08c1..d26bbca6d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt @@ -176,8 +176,7 @@ class MainCredentialActivity : DatabaseModeActivity() { mainCredentialView?.onConditionToStoreCredentialChanged = { _, verified -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mDeviceUnlockViewModel.checkConditionToStoreCredential( - condition = verified, - databaseFileUri = mDatabaseFileUri + condition = verified ) } // TODO Async by ViewModel @@ -509,7 +508,7 @@ class MainCredentialActivity : DatabaseModeActivity() { } else { // Init Biometric elements if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mDeviceUnlockViewModel.databaseFileLoaded(databaseFileUri) + mDeviceUnlockViewModel.connect(databaseFileUri) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt index ff4046b13..994ec11f6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt @@ -57,13 +57,13 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat }.launchIn(viewModelScope) } - fun checkConditionToStoreCredential(condition: Boolean, databaseFileUri: Uri?) { + fun checkConditionToStoreCredential(condition: Boolean) { isConditionToStoreCredentialVerified = condition - checkUnlockAvailability(databaseFileUri) + checkUnlockAvailability() } /** - * Check unlock availability by verifying device settings and database mode + * Check unlock availability and change the current mode depending of device's state */ fun checkUnlockAvailability() { cipherDatabaseAction.containsCipherDatabase(databaseUri) { containsCipherDatabase -> @@ -82,12 +82,12 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat if (biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED) { changeMode(DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED) } else { - selectMode(containsCipherDatabase) + changeMode(containsCipherDatabase) } } } else if (PreferencesUtil.isDeviceCredentialUnlockEnable(getApplication())) { if (DeviceUnlockManager.isDeviceSecure(getApplication())) { - selectMode(containsCipherDatabase) + changeMode(containsCipherDatabase) } else { changeMode(DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED) } @@ -95,14 +95,7 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat } } - /** - * Check unlock availability and change the current mode depending of device's state - */ - fun checkUnlockAvailability(databaseFileUri: Uri?) { - databaseUri = databaseFileUri - checkUnlockAvailability() - } - fun selectMode(containsCipherDatabase: Boolean) { + private fun changeMode(containsCipherDatabase: Boolean) { try { if (isConditionToStoreCredentialVerified) { // listen for encryption @@ -144,12 +137,12 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat } } - fun connect(databaseUri: Uri) { + private fun connectDatabase(databaseUri: Uri) { this.databaseUri = databaseUri cipherDatabaseListener = object: CipherDatabaseAction.CipherDatabaseListener { override fun onCipherDatabaseCleared() { closeBiometricPrompt() - checkUnlockAvailability(databaseUri) + checkUnlockAvailability() } } cipherDatabaseAction.apply { @@ -158,7 +151,7 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat registerDatabaseListener(it) } } - checkUnlockAvailability(databaseUri) + checkUnlockAvailability() } private fun showPendingIfNecessary() { @@ -178,23 +171,23 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat changeMode(DeviceUnlockMode.BIOMETRIC_UNAVAILABLE) } - fun disconnect() { - showPendingIfNecessary() - disconnectDatabase() - } - - fun databaseFileLoaded(databaseUri: Uri?) { + fun connect(databaseUri: Uri?) { // To get device credential unlock result, only if same database uri if (databaseUri != null && PreferencesUtil.isAdvancedUnlockEnable(getApplication())) { if (databaseUri != this.databaseUri) { - connect(databaseUri) + connectDatabase(databaseUri) } } else { disconnectDatabase() } } + fun disconnect() { + showPendingIfNecessary() + disconnectDatabase() + } + fun onAuthenticationSucceeded() { cryptoPrompt?.let { prompt -> when (prompt.type) { @@ -403,9 +396,9 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat closeBiometricPrompt() databaseUri?.let { databaseUri -> cipherDatabaseAction.deleteByDatabaseUri(databaseUri) { - checkUnlockAvailability(databaseUri) + checkUnlockAvailability() } - } ?: checkUnlockAvailability(null) + } ?: checkUnlockAvailability() _uiState.update { currentState -> currentState.copy( allowAdvancedUnlockMenu = false