From c88413f7f786e24a86e37d5ddab34148074cfaf7 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 4 Dec 2025 12:35:42 +0100 Subject: [PATCH] feat: Add UV behind database merge #2283 --- .../keepass/activities/EntryActivity.kt | 6 +-- .../keepass/activities/EntryEditActivity.kt | 6 +-- .../keepass/activities/GroupActivity.kt | 39 +++++++++++++------ .../UserVerificationData.kt | 2 +- .../activity/PasskeyLauncherActivity.kt | 6 +-- .../NestedDatabaseSettingsFragment.kt | 6 +-- .../viewmodels/UserVerificationViewModel.kt | 18 ++++----- 7 files changed, 50 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt index e7a00baf5..4fdabea73 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt @@ -361,12 +361,12 @@ class EntryActivity : DatabaseLockActivity() { repeatOnLifecycle(Lifecycle.State.RESUMED) { mUserVerificationViewModel.userVerificationState.collect { uVState -> when (uVState) { - is UserVerificationViewModel.UIState.Loading -> {} - is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { + is UserVerificationViewModel.UVState.Loading -> {} + is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> { coordinatorLayout?.showError(uVState.error) mUserVerificationViewModel.onUserVerificationReceived() } - is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { + is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> { val data = uVState.dataToVerify when (data.actionType) { UserVerificationActionType.SHOW_PROTECTED_FIELD -> { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt index d5fba9e34..d2412d5a7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -421,12 +421,12 @@ class EntryEditActivity : DatabaseLockActivity(), repeatOnLifecycle(Lifecycle.State.STARTED) { mUserVerificationViewModel.userVerificationState.collect { uVState -> when (uVState) { - is UserVerificationViewModel.UIState.Loading -> {} - is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { + is UserVerificationViewModel.UVState.Loading -> {} + is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> { coordinatorLayout?.showError(uVState.error) mUserVerificationViewModel.onUserVerificationReceived() } - is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { + is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> { when (uVState.dataToVerify.actionType) { UserVerificationActionType.SHOW_PROTECTED_FIELD -> { uVState.dataToVerify.protectedFieldView?.unprotect() diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index 2f73bb379..6e535133f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -367,14 +367,22 @@ class GroupActivity : DatabaseLockActivity(), SettingsActivity.launch(this@GroupActivity, true) } R.id.menu_merge_from -> { - mExternalFileHelper?.openDocument() + checkUserVerification( + userVerificationViewModel = mUserVerificationViewModel, + dataToVerify = UserVerificationData( + actionType = UserVerificationActionType.MERGE_FROM_DATABASE, + database = mDatabase + ) + ) } R.id.menu_save_copy_to -> { - mExternalFileHelper?.createDocument( - getString(R.string.database_file_name_default) + - "_" + - LocalDateTime.now().toString() + - mDatabase?.defaultFileExtension) + checkUserVerification( + userVerificationViewModel = mUserVerificationViewModel, + dataToVerify = UserVerificationData( + actionType = UserVerificationActionType.SAVE_DATABASE_COPY_TO, + database = mDatabase + ) + ) } R.id.menu_lock_all -> { lockAndExit() @@ -581,19 +589,28 @@ class GroupActivity : DatabaseLockActivity(), repeatOnLifecycle(Lifecycle.State.RESUMED) { mUserVerificationViewModel.userVerificationState.collect { uVState -> when (uVState) { - is UserVerificationViewModel.UIState.Loading -> {} - is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { + is UserVerificationViewModel.UVState.Loading -> {} + is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> { coordinatorLayout?.showError(uVState.error) mUserVerificationViewModel.onUserVerificationReceived() } - is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { + is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> { val data = uVState.dataToVerify when (data.actionType) { UserVerificationActionType.EDIT_ENTRY -> { editEntry(uVState.dataToVerify.database, uVState.dataToVerify.entryId) } - UserVerificationActionType.MERGE_FROM_DATABASE -> {} - UserVerificationActionType.SAVE_TO_DATABASE -> {} + UserVerificationActionType.MERGE_FROM_DATABASE -> { + mExternalFileHelper?.openDocument() + } + UserVerificationActionType.SAVE_DATABASE_COPY_TO -> { + mExternalFileHelper?.createDocument( + getString(R.string.database_file_name_default) + + "_" + + LocalDateTime.now().toString() + + uVState.dataToVerify.database?.defaultFileExtension + ) + } else -> {} } mUserVerificationViewModel.onUserVerificationReceived() diff --git a/app/src/main/java/com/kunzisoft/keepass/credentialprovider/UserVerificationData.kt b/app/src/main/java/com/kunzisoft/keepass/credentialprovider/UserVerificationData.kt index 60d7e0bd1..bb54f2a2e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/credentialprovider/UserVerificationData.kt +++ b/app/src/main/java/com/kunzisoft/keepass/credentialprovider/UserVerificationData.kt @@ -21,5 +21,5 @@ enum class UserVerificationActionType { EDIT_ENTRY, EDIT_DATABASE_SETTING, MERGE_FROM_DATABASE, - SAVE_TO_DATABASE + SAVE_DATABASE_COPY_TO } \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/credentialprovider/activity/PasskeyLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/credentialprovider/activity/PasskeyLauncherActivity.kt index 9e7771060..03197d161 100644 --- a/app/src/main/java/com/kunzisoft/keepass/credentialprovider/activity/PasskeyLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/credentialprovider/activity/PasskeyLauncherActivity.kt @@ -178,8 +178,8 @@ class PasskeyLauncherActivity : DatabaseLockActivity() { repeatOnLifecycle(Lifecycle.State.RESUMED) { userVerificationViewModel.userVerificationState.collect { uiState -> when (uiState) { - is UserVerificationViewModel.UIState.Loading -> {} - is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { + is UserVerificationViewModel.UVState.Loading -> {} + is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> { val data = uiState.dataToVerify when (data.actionType) { UserVerificationActionType.LAUNCH_PASSKEY_CEREMONY -> { @@ -194,7 +194,7 @@ class PasskeyLauncherActivity : DatabaseLockActivity() { } userVerificationViewModel.onUserVerificationReceived() } - is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { + is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> { toastError(uiState.error) passkeyLauncherViewModel.cancelResult() userVerificationViewModel.onUserVerificationReceived() diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt index 268f863cf..1cc1d21df 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -183,12 +183,12 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev repeatOnLifecycle(Lifecycle.State.RESUMED) { mUserVerificationViewModel.userVerificationState.collect { state -> when (state) { - is UserVerificationViewModel.UIState.Loading -> {} - is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { + is UserVerificationViewModel.UVState.Loading -> {} + is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> { mSettingsViewModel.showError(state.error) mUserVerificationViewModel.onUserVerificationReceived() } - is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { + is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> { val data = state.dataToVerify when (data.actionType) { UserVerificationActionType.EDIT_DATABASE_SETTING -> { diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/UserVerificationViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/UserVerificationViewModel.kt index 2e84f5a1d..9f011653b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/UserVerificationViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/UserVerificationViewModel.kt @@ -12,8 +12,8 @@ import kotlinx.coroutines.flow.StateFlow */ class UserVerificationViewModel: ViewModel() { - private val mUiState = MutableStateFlow(UIState.Loading) - val userVerificationState: StateFlow = mUiState + private val mUVState = MutableStateFlow(UVState.Loading) + val userVerificationState: StateFlow = mUVState var dataToVerify: UserVerificationData? = null @@ -29,7 +29,7 @@ class UserVerificationViewModel: ViewModel() { } fun onUserVerificationSucceeded(dataToVerify: UserVerificationData) { - mUiState.value = UIState.OnUserVerificationSucceeded(dataToVerify) + mUVState.value = UVState.OnUserVerificationSucceeded(dataToVerify) } fun onUserVerificationFailed( @@ -37,22 +37,22 @@ class UserVerificationViewModel: ViewModel() { error: Throwable? = null ) { this.dataToVerify = dataToVerify - mUiState.value = UIState.OnUserVerificationCanceled(dataToVerify, error) + mUVState.value = UVState.OnUserVerificationCanceled(dataToVerify, error) } fun onUserVerificationReceived() { - mUiState.value = UIState.Loading + mUVState.value = UVState.Loading } - sealed class UIState { - object Loading: UIState() + sealed class UVState { + object Loading: UVState() data class OnUserVerificationSucceeded( val dataToVerify: UserVerificationData - ): UIState() + ): UVState() data class OnUserVerificationCanceled( val dataToVerify: UserVerificationData?, val error: Throwable? - ): UIState() + ): UVState() } } \ No newline at end of file