feat: Add UV behind database merge #2283

This commit is contained in:
J-Jamet
2025-12-04 12:35:42 +01:00
parent 7b1fb8a4bf
commit c88413f7f7
7 changed files with 50 additions and 33 deletions

View File

@@ -361,12 +361,12 @@ class EntryActivity : DatabaseLockActivity() {
repeatOnLifecycle(Lifecycle.State.RESUMED) { repeatOnLifecycle(Lifecycle.State.RESUMED) {
mUserVerificationViewModel.userVerificationState.collect { uVState -> mUserVerificationViewModel.userVerificationState.collect { uVState ->
when (uVState) { when (uVState) {
is UserVerificationViewModel.UIState.Loading -> {} is UserVerificationViewModel.UVState.Loading -> {}
is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> {
coordinatorLayout?.showError(uVState.error) coordinatorLayout?.showError(uVState.error)
mUserVerificationViewModel.onUserVerificationReceived() mUserVerificationViewModel.onUserVerificationReceived()
} }
is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> {
val data = uVState.dataToVerify val data = uVState.dataToVerify
when (data.actionType) { when (data.actionType) {
UserVerificationActionType.SHOW_PROTECTED_FIELD -> { UserVerificationActionType.SHOW_PROTECTED_FIELD -> {

View File

@@ -421,12 +421,12 @@ class EntryEditActivity : DatabaseLockActivity(),
repeatOnLifecycle(Lifecycle.State.STARTED) { repeatOnLifecycle(Lifecycle.State.STARTED) {
mUserVerificationViewModel.userVerificationState.collect { uVState -> mUserVerificationViewModel.userVerificationState.collect { uVState ->
when (uVState) { when (uVState) {
is UserVerificationViewModel.UIState.Loading -> {} is UserVerificationViewModel.UVState.Loading -> {}
is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> {
coordinatorLayout?.showError(uVState.error) coordinatorLayout?.showError(uVState.error)
mUserVerificationViewModel.onUserVerificationReceived() mUserVerificationViewModel.onUserVerificationReceived()
} }
is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> {
when (uVState.dataToVerify.actionType) { when (uVState.dataToVerify.actionType) {
UserVerificationActionType.SHOW_PROTECTED_FIELD -> { UserVerificationActionType.SHOW_PROTECTED_FIELD -> {
uVState.dataToVerify.protectedFieldView?.unprotect() uVState.dataToVerify.protectedFieldView?.unprotect()

View File

@@ -367,14 +367,22 @@ class GroupActivity : DatabaseLockActivity(),
SettingsActivity.launch(this@GroupActivity, true) SettingsActivity.launch(this@GroupActivity, true)
} }
R.id.menu_merge_from -> { 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 -> { R.id.menu_save_copy_to -> {
mExternalFileHelper?.createDocument( checkUserVerification(
getString(R.string.database_file_name_default) + userVerificationViewModel = mUserVerificationViewModel,
"_" + dataToVerify = UserVerificationData(
LocalDateTime.now().toString() + actionType = UserVerificationActionType.SAVE_DATABASE_COPY_TO,
mDatabase?.defaultFileExtension) database = mDatabase
)
)
} }
R.id.menu_lock_all -> { R.id.menu_lock_all -> {
lockAndExit() lockAndExit()
@@ -581,19 +589,28 @@ class GroupActivity : DatabaseLockActivity(),
repeatOnLifecycle(Lifecycle.State.RESUMED) { repeatOnLifecycle(Lifecycle.State.RESUMED) {
mUserVerificationViewModel.userVerificationState.collect { uVState -> mUserVerificationViewModel.userVerificationState.collect { uVState ->
when (uVState) { when (uVState) {
is UserVerificationViewModel.UIState.Loading -> {} is UserVerificationViewModel.UVState.Loading -> {}
is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> {
coordinatorLayout?.showError(uVState.error) coordinatorLayout?.showError(uVState.error)
mUserVerificationViewModel.onUserVerificationReceived() mUserVerificationViewModel.onUserVerificationReceived()
} }
is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> {
val data = uVState.dataToVerify val data = uVState.dataToVerify
when (data.actionType) { when (data.actionType) {
UserVerificationActionType.EDIT_ENTRY -> { UserVerificationActionType.EDIT_ENTRY -> {
editEntry(uVState.dataToVerify.database, uVState.dataToVerify.entryId) editEntry(uVState.dataToVerify.database, uVState.dataToVerify.entryId)
} }
UserVerificationActionType.MERGE_FROM_DATABASE -> {} UserVerificationActionType.MERGE_FROM_DATABASE -> {
UserVerificationActionType.SAVE_TO_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 -> {} else -> {}
} }
mUserVerificationViewModel.onUserVerificationReceived() mUserVerificationViewModel.onUserVerificationReceived()

View File

@@ -21,5 +21,5 @@ enum class UserVerificationActionType {
EDIT_ENTRY, EDIT_ENTRY,
EDIT_DATABASE_SETTING, EDIT_DATABASE_SETTING,
MERGE_FROM_DATABASE, MERGE_FROM_DATABASE,
SAVE_TO_DATABASE SAVE_DATABASE_COPY_TO
} }

View File

@@ -178,8 +178,8 @@ class PasskeyLauncherActivity : DatabaseLockActivity() {
repeatOnLifecycle(Lifecycle.State.RESUMED) { repeatOnLifecycle(Lifecycle.State.RESUMED) {
userVerificationViewModel.userVerificationState.collect { uiState -> userVerificationViewModel.userVerificationState.collect { uiState ->
when (uiState) { when (uiState) {
is UserVerificationViewModel.UIState.Loading -> {} is UserVerificationViewModel.UVState.Loading -> {}
is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> {
val data = uiState.dataToVerify val data = uiState.dataToVerify
when (data.actionType) { when (data.actionType) {
UserVerificationActionType.LAUNCH_PASSKEY_CEREMONY -> { UserVerificationActionType.LAUNCH_PASSKEY_CEREMONY -> {
@@ -194,7 +194,7 @@ class PasskeyLauncherActivity : DatabaseLockActivity() {
} }
userVerificationViewModel.onUserVerificationReceived() userVerificationViewModel.onUserVerificationReceived()
} }
is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> {
toastError(uiState.error) toastError(uiState.error)
passkeyLauncherViewModel.cancelResult() passkeyLauncherViewModel.cancelResult()
userVerificationViewModel.onUserVerificationReceived() userVerificationViewModel.onUserVerificationReceived()

View File

@@ -183,12 +183,12 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
repeatOnLifecycle(Lifecycle.State.RESUMED) { repeatOnLifecycle(Lifecycle.State.RESUMED) {
mUserVerificationViewModel.userVerificationState.collect { state -> mUserVerificationViewModel.userVerificationState.collect { state ->
when (state) { when (state) {
is UserVerificationViewModel.UIState.Loading -> {} is UserVerificationViewModel.UVState.Loading -> {}
is UserVerificationViewModel.UIState.OnUserVerificationCanceled -> { is UserVerificationViewModel.UVState.OnUserVerificationCanceled -> {
mSettingsViewModel.showError(state.error) mSettingsViewModel.showError(state.error)
mUserVerificationViewModel.onUserVerificationReceived() mUserVerificationViewModel.onUserVerificationReceived()
} }
is UserVerificationViewModel.UIState.OnUserVerificationSucceeded -> { is UserVerificationViewModel.UVState.OnUserVerificationSucceeded -> {
val data = state.dataToVerify val data = state.dataToVerify
when (data.actionType) { when (data.actionType) {
UserVerificationActionType.EDIT_DATABASE_SETTING -> { UserVerificationActionType.EDIT_DATABASE_SETTING -> {

View File

@@ -12,8 +12,8 @@ import kotlinx.coroutines.flow.StateFlow
*/ */
class UserVerificationViewModel: ViewModel() { class UserVerificationViewModel: ViewModel() {
private val mUiState = MutableStateFlow<UIState>(UIState.Loading) private val mUVState = MutableStateFlow<UVState>(UVState.Loading)
val userVerificationState: StateFlow<UIState> = mUiState val userVerificationState: StateFlow<UVState> = mUVState
var dataToVerify: UserVerificationData? = null var dataToVerify: UserVerificationData? = null
@@ -29,7 +29,7 @@ class UserVerificationViewModel: ViewModel() {
} }
fun onUserVerificationSucceeded(dataToVerify: UserVerificationData) { fun onUserVerificationSucceeded(dataToVerify: UserVerificationData) {
mUiState.value = UIState.OnUserVerificationSucceeded(dataToVerify) mUVState.value = UVState.OnUserVerificationSucceeded(dataToVerify)
} }
fun onUserVerificationFailed( fun onUserVerificationFailed(
@@ -37,22 +37,22 @@ class UserVerificationViewModel: ViewModel() {
error: Throwable? = null error: Throwable? = null
) { ) {
this.dataToVerify = dataToVerify this.dataToVerify = dataToVerify
mUiState.value = UIState.OnUserVerificationCanceled(dataToVerify, error) mUVState.value = UVState.OnUserVerificationCanceled(dataToVerify, error)
} }
fun onUserVerificationReceived() { fun onUserVerificationReceived() {
mUiState.value = UIState.Loading mUVState.value = UVState.Loading
} }
sealed class UIState { sealed class UVState {
object Loading: UIState() object Loading: UVState()
data class OnUserVerificationSucceeded( data class OnUserVerificationSucceeded(
val dataToVerify: UserVerificationData val dataToVerify: UserVerificationData
): UIState() ): UVState()
data class OnUserVerificationCanceled( data class OnUserVerificationCanceled(
val dataToVerify: UserVerificationData?, val dataToVerify: UserVerificationData?,
val error: Throwable? val error: Throwable?
): UIState() ): UVState()
} }
} }