diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt index 2f6e0500c..b74572873 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.WindowManager.LayoutParams.FLAG_SECURE import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused import com.kunzisoft.keepass.database.ContextualDatabase @@ -12,19 +13,25 @@ import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.viewmodels.DatabaseViewModel +import kotlinx.coroutines.launch abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval { private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() - private var mDatabase: ContextualDatabase? = null - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mDatabaseViewModel.database.observe(this) { database -> - this.mDatabase = database - resetAppTimeoutOnTouchOrFocus() - onDatabaseRetrieved(database) + lifecycleScope.launch { + // Initialize the parameters + mDatabaseViewModel.uiState.collect { uiState -> + when (uiState) { + is DatabaseViewModel.UIState.Loading -> {} + is DatabaseViewModel.UIState.OnDatabaseRetrieved -> { + resetAppTimeoutOnTouchOrFocus() + onDatabaseRetrieved(uiState.database) + } + } + } } mDatabaseViewModel.actionFinished.observe(this) { result -> @@ -67,7 +74,7 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval { fun resetAppTimeout() { context?.let { TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(it, - mDatabase?.loaded ?: false) + mDatabaseViewModel.database?.loaded ?: false) } } @@ -80,7 +87,7 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval { context?.let { dialog?.window?.decorView?.resetAppTimeoutWhenViewTouchedOrFocused( it, - mDatabase?.loaded + mDatabaseViewModel.database?.loaded ) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt index e59b48871..ecd00b34a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt @@ -4,25 +4,31 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.database.element.binary.BinaryData import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.viewmodels.DatabaseViewModel +import kotlinx.coroutines.launch abstract class DatabaseFragment : Fragment(), DatabaseRetrieval { private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() - protected var mDatabase: ContextualDatabase? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> - if (mDatabase == null || mDatabase != database) { - this.mDatabase = database - onDatabaseRetrieved(database) + lifecycleScope.launch { + // Initialize the parameters + mDatabaseViewModel.uiState.collect { uiState -> + when (uiState) { + is DatabaseViewModel.UIState.Loading -> {} + is DatabaseViewModel.UIState.OnDatabaseRetrieved -> { + onDatabaseRetrieved(uiState.database) + } + } } } @@ -33,7 +39,10 @@ abstract class DatabaseFragment : Fragment(), DatabaseRetrieval { protected fun resetAppTimeoutWhenViewFocusedOrChanged(view: View?) { context?.let { - view?.resetAppTimeoutWhenViewTouchedOrFocused(it, mDatabase?.loaded) + view?.resetAppTimeoutWhenViewTouchedOrFocused( + context = it, + databaseLoaded = mDatabaseViewModel.database?.loaded + ) } } @@ -46,6 +55,6 @@ abstract class DatabaseFragment : Fragment(), DatabaseRetrieval { } protected fun buildNewBinaryAttachment(): BinaryData? { - return mDatabase?.buildNewBinaryAttachment() + return mDatabaseViewModel.database?.buildNewBinaryAttachment() } } \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt index 610c24109..7b4b27e9f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt @@ -47,6 +47,7 @@ import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.utils.KeyboardUtil.hideKeyboard +import com.kunzisoft.keepass.viewmodels.DatabaseViewModel import com.kunzisoft.keepass.viewmodels.GroupViewModel import java.util.LinkedList @@ -60,6 +61,7 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen private var mLayoutManager: LinearLayoutManager? = null private var mAdapter: NodesAdapter? = null + private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mGroupViewModel: GroupViewModel by activityViewModels() private var mCurrentGroup: Group? = null @@ -103,7 +105,7 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen PreferencesUtil.getListSort(context), PreferencesUtil.getAscendingSort(context), PreferencesUtil.getGroupsBeforeSort(context), - if (mDatabase?.isRecycleBinEnabled == true) { + if (mDatabaseViewModel.database?.isRecycleBinEnabled == true) { PreferencesUtil.getRecycleBinBottomSort(context) } else null ) @@ -300,8 +302,9 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen } private fun containsRecycleBin(nodes: List): Boolean { - return mDatabase?.isRecycleBinEnabled == true - && nodes.any { it == mDatabase?.recycleBin } + val database = mDatabaseViewModel.database + return database?.isRecycleBinEnabled == true + && nodes.any { it == database.recycleBin } } fun actionNodesCallback(database: ContextualDatabase, diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt index 9fa58d188..020bfb398 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt @@ -23,18 +23,19 @@ import android.content.Context import android.os.Bundle import android.view.View import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import com.kunzisoft.keepass.R import com.kunzisoft.keepass.viewmodels.DatabaseViewModel +import kotlinx.coroutines.launch class MainPreferenceFragment : PreferenceFragmentCompat() { private var mCallback: Callback? = null private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() - private var mDatabaseLoaded: Boolean = false override fun onAttach(context: Context) { super.onAttach(context) @@ -51,19 +52,26 @@ class MainPreferenceFragment : PreferenceFragmentCompat() { super.onDetach() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> - mDatabaseLoaded = database?.loaded == true - checkDatabaseLoaded() + lifecycleScope.launch { + // Initialize the parameters + mDatabaseViewModel.uiState.collect { uiState -> + when (uiState) { + is DatabaseViewModel.UIState.Loading -> {} + is DatabaseViewModel.UIState.OnDatabaseRetrieved -> { + checkDatabaseLoaded(uiState.database?.loaded == true) + } + } + } } super.onViewCreated(view, savedInstanceState) } - private fun checkDatabaseLoaded() { + private fun checkDatabaseLoaded(isDatabaseLoaded: Boolean) { findPreference(getString(R.string.settings_database_key)) - ?.isEnabled = mDatabaseLoaded + ?.isEnabled = isDatabaseLoaded findPreference(getString(R.string.settings_database_category_key)) - ?.isVisible = mDatabaseLoaded + ?.isVisible = isDatabaseLoaded } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -119,7 +127,7 @@ class MainPreferenceFragment : PreferenceFragmentCompat() { } } - checkDatabaseLoaded() + checkDatabaseLoaded(mDatabaseViewModel.database?.loaded == true) } interface Callback { 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 080ece82f..47a986135 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -19,13 +19,14 @@ */ package com.kunzisoft.keepass.settings -import android.graphics.Color import android.os.Bundle import android.util.Log import android.view.* +import androidx.core.graphics.toColorInt import androidx.core.view.MenuProvider import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.TwoStatePreference @@ -47,11 +48,11 @@ import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.utils.getParcelableCompat import com.kunzisoft.keepass.utils.getSerializableCompat import com.kunzisoft.keepass.viewmodels.DatabaseViewModel +import kotlinx.coroutines.launch class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetrieval { private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() - private var mDatabase: ContextualDatabase? = null private var mDatabaseReadOnly: Boolean = false private var mMergeDataAllowed: Boolean = false private var mDatabaseAutoSaveEnabled: Boolean = true @@ -119,10 +120,19 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev activity?.addMenuProvider(menuProvider, viewLifecycleOwner) - mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> - mDatabase = database - view.resetAppTimeoutWhenViewTouchedOrFocused(requireContext(), database?.loaded) - onDatabaseRetrieved(database) + lifecycleScope.launch { + mDatabaseViewModel.uiState.collect { uiState -> + when (uiState) { + is DatabaseViewModel.UIState.Loading -> {} + is DatabaseViewModel.UIState.OnDatabaseRetrieved -> { + view.resetAppTimeoutWhenViewTouchedOrFocused( + context = requireContext(), + databaseLoaded = uiState.database?.loaded + ) + onDatabaseRetrieved(uiState.database) + } + } + } } mDatabaseViewModel.actionFinished.observe(viewLifecycleOwner) { @@ -132,7 +142,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) { mScreen = screen - val database = mDatabase + val database = mDatabaseViewModel.database // Load the preferences from an XML resource when (screen) { Screen.DATABASE -> { @@ -168,11 +178,10 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - mDatabase = database mDatabaseReadOnly = database?.isReadOnly == true mMergeDataAllowed = database?.isMergeDataAllowed() == true - mDatabase?.let { + database?.let { if (it.loaded) { when (mScreen) { Screen.DATABASE -> { @@ -458,7 +467,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newDefaultUsername } else { - mDatabase?.defaultUsername = oldDefaultUsername + database.defaultUsername = oldDefaultUsername oldDefaultUsername } dbDefaultUsernamePref?.summary = defaultUsernameToShow @@ -471,7 +480,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newColor } else { - mDatabase?.customColor = Color.parseColor(oldColor) + database.customColor = oldColor.toColorInt() oldColor } dbCustomColorPref?.summary = defaultColorToShow @@ -483,7 +492,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newCompression } else { - mDatabase?.compressionAlgorithm = oldCompression + database.compressionAlgorithm = oldCompression oldCompression } dbDataCompressionPref?.summary = algorithmToShow?.getLocalizedName(resources) @@ -497,7 +506,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev } else { oldRecycleBin } - mDatabase?.setRecycleBin(recycleBinToShow) + database.setRecycleBin(recycleBinToShow) refreshRecycleBinGroup(database) } DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK -> { @@ -509,7 +518,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev } else { oldTemplatesGroup } - mDatabase?.setTemplatesGroup(templatesGroupToShow) + database.setTemplatesGroup(templatesGroupToShow) refreshTemplatesGroup(database) } DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK -> { @@ -519,7 +528,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newMaxHistoryItems } else { - mDatabase?.historyMaxItems = oldMaxHistoryItems + database.historyMaxItems = oldMaxHistoryItems oldMaxHistoryItems } dbMaxHistoryItemsPref?.summary = maxHistoryItemsToShow.toString() @@ -531,7 +540,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newMaxHistorySize } else { - mDatabase?.historyMaxSize = oldMaxHistorySize + database.historyMaxSize = oldMaxHistorySize oldMaxHistorySize } dbMaxHistorySizePref?.summary = maxHistorySizeToShow.toString() @@ -549,7 +558,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newEncryption } else { - mDatabase?.encryptionAlgorithm = oldEncryption + database.encryptionAlgorithm = oldEncryption oldEncryption } mEncryptionAlgorithmPref?.summary = algorithmToShow.toString() @@ -561,7 +570,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newKeyDerivationEngine } else { - mDatabase?.kdfEngine = oldKeyDerivationEngine + database.kdfEngine = oldKeyDerivationEngine oldKeyDerivationEngine } mKeyDerivationPref?.summary = kdfEngineToShow.toString() @@ -578,7 +587,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newIterations } else { - mDatabase?.numberKeyEncryptionRounds = oldIterations + database.numberKeyEncryptionRounds = oldIterations oldIterations } mRoundPref?.summary = roundsToShow.toString() @@ -590,7 +599,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newMemoryUsage } else { - mDatabase?.memoryUsage = oldMemoryUsage + database.memoryUsage = oldMemoryUsage oldMemoryUsage } mMemoryPref?.summary = memoryToShow.toString() @@ -602,7 +611,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev if (result.isSuccess) { newParallelism } else { - mDatabase?.parallelism = oldParallelism + database.parallelism = oldParallelism oldParallelism } mParallelismPref?.summary = parallelismToShow.toString() diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseColorPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseColorPreferenceDialogFragmentCompat.kt index 516fff33e..ac197b519 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseColorPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseColorPreferenceDialogFragmentCompat.kt @@ -96,8 +96,6 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) - database?.let { var initColor = it.customColor if (initColor != null) { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt index 98a34265b..d864601c8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt @@ -51,7 +51,6 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) setExplanationText(R.string.database_data_compression_summary) mRecyclerView?.adapter = mCompressionAdapter diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDefaultUsernamePreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDefaultUsernamePreferenceDialogFragmentCompat.kt index 9f0f6d116..3bfc7a2dd 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDefaultUsernamePreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDefaultUsernamePreferenceDialogFragmentCompat.kt @@ -25,7 +25,6 @@ import com.kunzisoft.keepass.database.ContextualDatabase class DatabaseDefaultUsernamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) inputText = database?.defaultUsername?: "" } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDescriptionPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDescriptionPreferenceDialogFragmentCompat.kt index 496d14835..f8ac2f944 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDescriptionPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDescriptionPreferenceDialogFragmentCompat.kt @@ -25,7 +25,6 @@ import com.kunzisoft.keepass.database.ContextualDatabase class DatabaseDescriptionPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) inputText = database?.description ?: "" } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat.kt index 2f76bb07b..535072633 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat.kt @@ -52,7 +52,6 @@ class DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) database?.let { algorithmSelected = database.encryptionAlgorithm mEncryptionAlgorithmAdapter?.setItems(database.availableEncryptionAlgorithms, algorithmSelected) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseKeyDerivationPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseKeyDerivationPreferenceDialogFragmentCompat.kt index 12aac2292..70cea411d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseKeyDerivationPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseKeyDerivationPreferenceDialogFragmentCompat.kt @@ -55,7 +55,6 @@ class DatabaseKeyDerivationPreferenceDialogFragmentCompat } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) database?.let { kdfEngineSelected = database.kdfEngine mKdfAdapter?.setItems(database.availableKdfEngines, kdfEngineSelected) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat.kt index d253cc6fd..46f3f74e4 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat.kt @@ -32,7 +32,6 @@ class DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePrefer } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) database?.historyMaxItems?.let { maxItemsDatabase -> inputText = maxItemsDatabase.toString() setSwitchAction({ isChecked -> diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistorySizePreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistorySizePreferenceDialogFragmentCompat.kt index 845d7c4b0..91a154f8e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistorySizePreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMaxHistorySizePreferenceDialogFragmentCompat.kt @@ -35,7 +35,6 @@ class DatabaseMaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePrefere } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) database?.historyMaxSize?.let { maxItemsDatabase -> dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE) .toBetterByteFormat() diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMemoryUsagePreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMemoryUsagePreferenceDialogFragmentCompat.kt index 53724b180..b388bf2af 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMemoryUsagePreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseMemoryUsagePreferenceDialogFragmentCompat.kt @@ -35,7 +35,6 @@ class DatabaseMemoryUsagePreferenceDialogFragmentCompat : DatabaseSavePreference } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) database?.let { val memoryBytes = database.memoryUsage dataByte = DataByte(memoryBytes, DataByte.ByteFormat.BYTE) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseNamePreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseNamePreferenceDialogFragmentCompat.kt index 9ce8af0b7..cf3127111 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseNamePreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseNamePreferenceDialogFragmentCompat.kt @@ -25,7 +25,6 @@ import com.kunzisoft.keepass.database.ContextualDatabase class DatabaseNamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) inputText = database?.name ?: "" } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseParallelismPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseParallelismPreferenceDialogFragmentCompat.kt index 2dfd7c8df..09b93c59c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseParallelismPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseParallelismPreferenceDialogFragmentCompat.kt @@ -32,7 +32,6 @@ class DatabaseParallelismPreferenceDialogFragmentCompat : DatabaseSavePreference } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) inputText = database?.parallelism?.toString() ?: MIN_PARALLELISM.toString() } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRecycleBinGroupPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRecycleBinGroupPreferenceDialogFragmentCompat.kt index 8574dfc61..d4f573fe6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRecycleBinGroupPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRecycleBinGroupPreferenceDialogFragmentCompat.kt @@ -49,7 +49,6 @@ class DatabaseRecycleBinGroupPreferenceDialogFragmentCompat } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) database?.let { mGroupRecycleBin = database.recycleBin mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupRecycleBin) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat.kt index 34862d853..766e8de17 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat.kt @@ -46,6 +46,8 @@ class DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat : DatabaseSavePre } } + override fun onDatabaseRetrieved(database: ContextualDatabase?) {} + companion object { fun newInstance(key: String): DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRoundsPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRoundsPreferenceDialogFragmentCompat.kt index df16f8cd4..28db953ce 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRoundsPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseRoundsPreferenceDialogFragmentCompat.kt @@ -33,7 +33,6 @@ class DatabaseRoundsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialo } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) inputText = database?.numberKeyEncryptionRounds?.toString() ?: MIN_ITERATIONS.toString() } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt index 563c70d5c..59b57037e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt @@ -22,6 +22,9 @@ package com.kunzisoft.keepass.settings.preferencedialogfragment import android.content.Context import android.os.Bundle import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.kunzisoft.androidclearchroma.ChromaUtil import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval import com.kunzisoft.keepass.database.ContextualDatabase @@ -32,13 +35,13 @@ import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.viewmodels.DatabaseViewModel +import kotlinx.coroutines.launch abstract class DatabaseSavePreferenceDialogFragmentCompat : InputPreferenceDialogFragmentCompat(), DatabaseRetrieval { private var mDatabaseAutoSaveEnable = true private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() - private var mDatabase: ContextualDatabase? = null override fun onAttach(context: Context) { super.onAttach(context) @@ -47,20 +50,21 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mDatabaseViewModel.database.observe(this) { database -> - onDatabaseRetrieved(database) + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.RESUMED) { + mDatabaseViewModel.uiState.collect { uiState -> + when (uiState) { + is DatabaseViewModel.UIState.Loading -> {} + is DatabaseViewModel.UIState.OnDatabaseRetrieved -> { + onDatabaseRetrieved(uiState.database) + } + } + } + } } } - override fun onResume() { - super.onResume() - onDatabaseRetrieved(mDatabase) - } - - override fun onDatabaseRetrieved(database: ContextualDatabase?) { - this.mDatabase = database - } - override fun onDatabaseActionFinished( database: ContextualDatabase, actionTask: String, @@ -70,7 +74,7 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat } override fun onDialogClosed(positiveResult: Boolean) { - onDialogClosed(mDatabase, positiveResult) + onDialogClosed(mDatabaseViewModel.database, positiveResult) } open fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseTemplatesGroupPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseTemplatesGroupPreferenceDialogFragmentCompat.kt index 1919420ef..6565967b2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseTemplatesGroupPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseTemplatesGroupPreferenceDialogFragmentCompat.kt @@ -49,7 +49,6 @@ class DatabaseTemplatesGroupPreferenceDialogFragmentCompat } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - super.onDatabaseRetrieved(database) database?.let { mGroupTemplates = database.templatesGroup mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupTemplates) 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 c8dfe9814..ca9277d6b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt @@ -1,7 +1,6 @@ package com.kunzisoft.keepass.viewmodels import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm @@ -9,11 +8,16 @@ import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm import com.kunzisoft.keepass.tasks.ActionRunnable +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow class DatabaseViewModel: ViewModel() { - val database : LiveData get() = _database - private val _database = MutableLiveData() + var database: ContextualDatabase? = null + private set + + private val mUiState = MutableStateFlow(UIState.Loading) + val uiState: StateFlow = mUiState val actionFinished : LiveData get() = _actionFinished private val _actionFinished = SingleLiveEvent() @@ -74,7 +78,8 @@ class DatabaseViewModel: ViewModel() { fun defineDatabase(database: ContextualDatabase?) { - this._database.value = database + this.database = database + this.mUiState.value = UIState.OnDatabaseRetrieved(database) } fun onActionFinished(database: ContextualDatabase, @@ -184,6 +189,13 @@ class DatabaseViewModel: ViewModel() { _saveParallelism.value = SuperLong(oldValue, newValue, save) } + sealed class UIState { + object Loading: UIState() + data class OnDatabaseRetrieved( + val database: ContextualDatabase? + ): UIState() + } + data class ActionResult(val database: ContextualDatabase, val actionTask: String, val result: ActionRunnable.Result)