fix: Refactoring database as flow

This commit is contained in:
J-Jamet
2025-10-08 12:11:41 +02:00
parent e4d0cd89c6
commit 51c62034df
22 changed files with 118 additions and 79 deletions

View File

@@ -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
lifecycleScope.launch {
// Initialize the parameters
mDatabaseViewModel.uiState.collect { uiState ->
when (uiState) {
is DatabaseViewModel.UIState.Loading -> {}
is DatabaseViewModel.UIState.OnDatabaseRetrieved -> {
resetAppTimeoutOnTouchOrFocus()
onDatabaseRetrieved(database)
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
)
}
}

View File

@@ -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()
}
}

View File

@@ -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<Node>): 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,

View File

@@ -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<Preference>(getString(R.string.settings_database_key))
?.isEnabled = mDatabaseLoaded
?.isEnabled = isDatabaseLoaded
findPreference<PreferenceCategory>(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 {

View File

@@ -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()

View File

@@ -96,8 +96,6 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.let {
var initColor = it.customColor
if (initColor != null) {

View File

@@ -51,7 +51,6 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
setExplanationText(R.string.database_data_compression_summary)
mRecyclerView?.adapter = mCompressionAdapter

View File

@@ -25,7 +25,6 @@ import com.kunzisoft.keepass.database.ContextualDatabase
class DatabaseDefaultUsernamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
inputText = database?.defaultUsername?: ""
}

View File

@@ -25,7 +25,6 @@ import com.kunzisoft.keepass.database.ContextualDatabase
class DatabaseDescriptionPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
inputText = database?.description ?: ""
}

View File

@@ -52,7 +52,6 @@ class DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.let {
algorithmSelected = database.encryptionAlgorithm
mEncryptionAlgorithmAdapter?.setItems(database.availableEncryptionAlgorithms, algorithmSelected)

View File

@@ -55,7 +55,6 @@ class DatabaseKeyDerivationPreferenceDialogFragmentCompat
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.let {
kdfEngineSelected = database.kdfEngine
mKdfAdapter?.setItems(database.availableKdfEngines, kdfEngineSelected)

View File

@@ -32,7 +32,6 @@ class DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePrefer
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.historyMaxItems?.let { maxItemsDatabase ->
inputText = maxItemsDatabase.toString()
setSwitchAction({ isChecked ->

View File

@@ -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()

View File

@@ -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)

View File

@@ -25,7 +25,6 @@ import com.kunzisoft.keepass.database.ContextualDatabase
class DatabaseNamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
inputText = database?.name ?: ""
}

View File

@@ -32,7 +32,6 @@ class DatabaseParallelismPreferenceDialogFragmentCompat : DatabaseSavePreference
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
inputText = database?.parallelism?.toString() ?: MIN_PARALLELISM.toString()
}

View File

@@ -49,7 +49,6 @@ class DatabaseRecycleBinGroupPreferenceDialogFragmentCompat
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.let {
mGroupRecycleBin = database.recycleBin
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupRecycleBin)

View File

@@ -46,6 +46,8 @@ class DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat : DatabaseSavePre
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {}
companion object {
fun newInstance(key: String): DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat {

View File

@@ -33,7 +33,6 @@ class DatabaseRoundsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialo
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
inputText = database?.numberKeyEncryptionRounds?.toString() ?: MIN_ITERATIONS.toString()
}

View File

@@ -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,18 +50,19 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mDatabaseViewModel.database.observe(this) { database ->
onDatabaseRetrieved(database)
}
}
override fun onResume() {
super.onResume()
onDatabaseRetrieved(mDatabase)
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 onDatabaseRetrieved(database: ContextualDatabase?) {
this.mDatabase = database
}
override fun onDatabaseActionFinished(
@@ -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) {

View File

@@ -49,7 +49,6 @@ class DatabaseTemplatesGroupPreferenceDialogFragmentCompat
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.let {
mGroupTemplates = database.templatesGroup
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupTemplates)

View File

@@ -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<ContextualDatabase?> get() = _database
private val _database = MutableLiveData<ContextualDatabase?>()
var database: ContextualDatabase? = null
private set
private val mUiState = MutableStateFlow<UIState>(UIState.Loading)
val uiState: StateFlow<UIState> = mUiState
val actionFinished : LiveData<ActionResult> get() = _actionFinished
private val _actionFinished = SingleLiveEvent<ActionResult>()
@@ -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)