diff --git a/CHANGELOG b/CHANGELOG index b296c0875..bdfbc4929 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +KeePassDX(4.2.3) + * Fix multiple Passkey selection #2253 + KeePassDX(4.2.2) * Fix database merge algorithm #2223 * Fix save search info #2243 diff --git a/app/build.gradle b/app/build.gradle index c154fe923..e6bce9972 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.kunzisoft.keepass" minSdkVersion 19 targetSdkVersion 35 - versionCode = 147 - versionName = "4.2.2" + versionCode = 148 + versionName = "4.2.3" multiDexEnabled true testApplicationId = "com.kunzisoft.keepass.tests" diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseActivity.kt index ad4ce1f08..d86ad34a0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseActivity.kt @@ -1,9 +1,11 @@ package com.kunzisoft.keepass.activities.legacy import android.Manifest +import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle +import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog @@ -16,6 +18,7 @@ import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment.Companion.DATABASE_CHANGED_DIALOG_TAG import com.kunzisoft.keepass.activities.stylish.StylishActivity +import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.setActivityResult import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.database.DatabaseTaskProvider.Companion.startDatabaseService import com.kunzisoft.keepass.model.SnapFileDatabaseInfo @@ -54,49 +57,82 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval { } } + /** + * Useful to only waiting for the activity result and prevent any parallel action + */ + protected var mAllowViewModelAction = true + + /** + * Utility activity result launcher, + * Used recursively, close each activity with return data + */ + protected open var mCredentialActivityResultLauncher: ActivityResultLauncher? = + registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + setActivityResult( + lockDatabase = false, + resultCode = it.resultCode, + data = it.data + ) + } + get() { + // Prevent parallel action + mAllowViewModelAction = false + return field + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { mDatabaseViewModel.actionState.collect { uiState -> - when (uiState) { - is DatabaseViewModel.ActionState.Loading -> {} - is DatabaseViewModel.ActionState.OnDatabaseReloaded -> { - if (finishActivityIfReloadRequested()) { - finish() + if (mAllowViewModelAction) { + when (uiState) { + is DatabaseViewModel.ActionState.Wait -> {} + is DatabaseViewModel.ActionState.OnDatabaseReloaded -> { + if (finishActivityIfReloadRequested()) { + finish() + } } - } - is DatabaseViewModel.ActionState.OnDatabaseInfoChanged -> { - if (manageDatabaseInfo()) { - showDatabaseChangedDialog( - uiState.previousDatabaseInfo, - uiState.newDatabaseInfo, - uiState.readOnlyDatabase + + is DatabaseViewModel.ActionState.OnDatabaseInfoChanged -> { + if (manageDatabaseInfo()) { + showDatabaseChangedDialog( + uiState.previousDatabaseInfo, + uiState.newDatabaseInfo, + uiState.readOnlyDatabase + ) + } + } + + is DatabaseViewModel.ActionState.OnDatabaseActionRequested -> { + startDatabasePermissionService( + uiState.bundle, + uiState.actionTask ) } - } - is DatabaseViewModel.ActionState.OnDatabaseActionRequested -> { - startDatabasePermissionService( - uiState.bundle, - uiState.actionTask - ) - } - is DatabaseViewModel.ActionState.OnDatabaseActionStarted -> { - progressTaskViewModel.start(uiState.progressMessage) - } - is DatabaseViewModel.ActionState.OnDatabaseActionUpdated -> { - progressTaskViewModel.update(uiState.progressMessage) - } - is DatabaseViewModel.ActionState.OnDatabaseActionStopped -> { - progressTaskViewModel.stop() - } - is DatabaseViewModel.ActionState.OnDatabaseActionFinished -> { - onDatabaseActionFinished( - uiState.database, - uiState.actionTask, - uiState.result - ) - progressTaskViewModel.stop() + + is DatabaseViewModel.ActionState.OnDatabaseActionStarted -> { + progressTaskViewModel.start(uiState.progressMessage) + } + + is DatabaseViewModel.ActionState.OnDatabaseActionUpdated -> { + progressTaskViewModel.update(uiState.progressMessage) + } + + is DatabaseViewModel.ActionState.OnDatabaseActionStopped -> { + progressTaskViewModel.stop() + } + + is DatabaseViewModel.ActionState.OnDatabaseActionFinished -> { + onDatabaseActionFinished( + uiState.database, + uiState.actionTask, + uiState.result + ) + progressTaskViewModel.stop() + } } } } @@ -117,10 +153,12 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.RESUMED) { mDatabaseViewModel.databaseState.collect { database -> - // Nullable function - onUnknownDatabaseRetrieved(database) - database?.let { - onDatabaseRetrieved(database) + if (mAllowViewModelAction) { + // Nullable function + onUnknownDatabaseRetrieved(database) + database?.let { + onDatabaseRetrieved(database) + } } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt index 4f9860753..ee2b03ac1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt @@ -1,12 +1,9 @@ package com.kunzisoft.keepass.activities.legacy -import android.content.Intent import android.os.Bundle import android.view.View import android.widget.Toast import androidx.activity.OnBackPressedCallback -import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.contract.ActivityResultContracts import com.kunzisoft.keepass.R import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.isIntentSenderMode import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.removeInfo @@ -15,7 +12,6 @@ import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveReg import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveSearchInfo import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveSpecialMode import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveTypeMode -import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.setActivityResult import com.kunzisoft.keepass.credentialprovider.SpecialMode import com.kunzisoft.keepass.credentialprovider.TypeMode import com.kunzisoft.keepass.model.RegisterInfo @@ -34,21 +30,6 @@ abstract class DatabaseModeActivity : DatabaseActivity() { private var mToolbarSpecial: ToolbarSpecial? = null - /** - * Utility activity result launcher, - * Used recursively, close each activity with return data - */ - protected open var mCredentialActivityResultLauncher: ActivityResultLauncher? = - registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - setActivityResult( - lockDatabase = false, - resultCode = it.resultCode, - data = it.data - ) - } - open fun onDatabaseBackPressed() { if (mSpecialMode != SpecialMode.DEFAULT) onCancelSpecialMode() diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt index 200b88f7d..3b9b5a97c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt @@ -32,7 +32,7 @@ class DatabaseViewModel(application: Application): AndroidViewModel(application) val database: ContextualDatabase? get() = databaseState.value - private val mActionState = MutableStateFlow(ActionState.Loading) + private val mActionState = MutableStateFlow(ActionState.Wait) val actionState: StateFlow = mActionState private var mDatabaseTaskProvider: DatabaseTaskProvider = DatabaseTaskProvider( @@ -469,7 +469,7 @@ class DatabaseViewModel(application: Application): AndroidViewModel(application) } sealed class ActionState { - object Loading: ActionState() + object Wait: ActionState() object OnDatabaseReloaded: ActionState() data class OnDatabaseActionRequested( val bundle: Bundle? = null, diff --git a/fastlane/metadata/android/en-US/changelogs/148.txt b/fastlane/metadata/android/en-US/changelogs/148.txt new file mode 100644 index 000000000..7477bbf01 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/148.txt @@ -0,0 +1 @@ + * Fix multiple Passkey selection #2253 \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/148.txt b/fastlane/metadata/android/fr-FR/changelogs/148.txt new file mode 100644 index 000000000..b84304ece --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/148.txt @@ -0,0 +1 @@ + * Correction de la selection multiple des Passkeys #2253 \ No newline at end of file