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 android.view.WindowManager.LayoutParams.FLAG_SECURE
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval
import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused
import com.kunzisoft.keepass.database.ContextualDatabase 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.tasks.ActionRunnable
import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
import kotlinx.coroutines.launch
abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval { abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
private var mDatabase: ContextualDatabase? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
mDatabaseViewModel.database.observe(this) { database -> lifecycleScope.launch {
this.mDatabase = database // Initialize the parameters
resetAppTimeoutOnTouchOrFocus() mDatabaseViewModel.uiState.collect { uiState ->
onDatabaseRetrieved(database) when (uiState) {
is DatabaseViewModel.UIState.Loading -> {}
is DatabaseViewModel.UIState.OnDatabaseRetrieved -> {
resetAppTimeoutOnTouchOrFocus()
onDatabaseRetrieved(uiState.database)
}
}
}
} }
mDatabaseViewModel.actionFinished.observe(this) { result -> mDatabaseViewModel.actionFinished.observe(this) { result ->
@@ -67,7 +74,7 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
fun resetAppTimeout() { fun resetAppTimeout() {
context?.let { context?.let {
TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(it, TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(it,
mDatabase?.loaded ?: false) mDatabaseViewModel.database?.loaded ?: false)
} }
} }
@@ -80,7 +87,7 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
context?.let { context?.let {
dialog?.window?.decorView?.resetAppTimeoutWhenViewTouchedOrFocused( dialog?.window?.decorView?.resetAppTimeoutWhenViewTouchedOrFocused(
it, it,
mDatabase?.loaded mDatabaseViewModel.database?.loaded
) )
} }
} }

View File

@@ -4,25 +4,31 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval
import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused
import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.database.element.binary.BinaryData import com.kunzisoft.keepass.database.element.binary.BinaryData
import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
import kotlinx.coroutines.launch
abstract class DatabaseFragment : Fragment(), DatabaseRetrieval { abstract class DatabaseFragment : Fragment(), DatabaseRetrieval {
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
protected var mDatabase: ContextualDatabase? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> lifecycleScope.launch {
if (mDatabase == null || mDatabase != database) { // Initialize the parameters
this.mDatabase = database mDatabaseViewModel.uiState.collect { uiState ->
onDatabaseRetrieved(database) 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?) { protected fun resetAppTimeoutWhenViewFocusedOrChanged(view: View?) {
context?.let { 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? { 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.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.utils.KeyboardUtil.hideKeyboard import com.kunzisoft.keepass.utils.KeyboardUtil.hideKeyboard
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
import com.kunzisoft.keepass.viewmodels.GroupViewModel import com.kunzisoft.keepass.viewmodels.GroupViewModel
import java.util.LinkedList import java.util.LinkedList
@@ -60,6 +61,7 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen
private var mLayoutManager: LinearLayoutManager? = null private var mLayoutManager: LinearLayoutManager? = null
private var mAdapter: NodesAdapter? = null private var mAdapter: NodesAdapter? = null
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
private val mGroupViewModel: GroupViewModel by activityViewModels() private val mGroupViewModel: GroupViewModel by activityViewModels()
private var mCurrentGroup: Group? = null private var mCurrentGroup: Group? = null
@@ -103,7 +105,7 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen
PreferencesUtil.getListSort(context), PreferencesUtil.getListSort(context),
PreferencesUtil.getAscendingSort(context), PreferencesUtil.getAscendingSort(context),
PreferencesUtil.getGroupsBeforeSort(context), PreferencesUtil.getGroupsBeforeSort(context),
if (mDatabase?.isRecycleBinEnabled == true) { if (mDatabaseViewModel.database?.isRecycleBinEnabled == true) {
PreferencesUtil.getRecycleBinBottomSort(context) PreferencesUtil.getRecycleBinBottomSort(context)
} else null } else null
) )
@@ -300,8 +302,9 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen
} }
private fun containsRecycleBin(nodes: List<Node>): Boolean { private fun containsRecycleBin(nodes: List<Node>): Boolean {
return mDatabase?.isRecycleBinEnabled == true val database = mDatabaseViewModel.database
&& nodes.any { it == mDatabase?.recycleBin } return database?.isRecycleBinEnabled == true
&& nodes.any { it == database.recycleBin }
} }
fun actionNodesCallback(database: ContextualDatabase, fun actionNodesCallback(database: ContextualDatabase,

View File

@@ -23,18 +23,19 @@ import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceCategory import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
import kotlinx.coroutines.launch
class MainPreferenceFragment : PreferenceFragmentCompat() { class MainPreferenceFragment : PreferenceFragmentCompat() {
private var mCallback: Callback? = null private var mCallback: Callback? = null
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
private var mDatabaseLoaded: Boolean = false
override fun onAttach(context: Context) { override fun onAttach(context: Context) {
super.onAttach(context) super.onAttach(context)
@@ -51,19 +52,26 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
super.onDetach() super.onDetach()
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> lifecycleScope.launch {
mDatabaseLoaded = database?.loaded == true // Initialize the parameters
checkDatabaseLoaded() mDatabaseViewModel.uiState.collect { uiState ->
when (uiState) {
is DatabaseViewModel.UIState.Loading -> {}
is DatabaseViewModel.UIState.OnDatabaseRetrieved -> {
checkDatabaseLoaded(uiState.database?.loaded == true)
}
}
}
} }
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
} }
private fun checkDatabaseLoaded() { private fun checkDatabaseLoaded(isDatabaseLoaded: Boolean) {
findPreference<Preference>(getString(R.string.settings_database_key)) findPreference<Preference>(getString(R.string.settings_database_key))
?.isEnabled = mDatabaseLoaded ?.isEnabled = isDatabaseLoaded
findPreference<PreferenceCategory>(getString(R.string.settings_database_category_key)) findPreference<PreferenceCategory>(getString(R.string.settings_database_category_key))
?.isVisible = mDatabaseLoaded ?.isVisible = isDatabaseLoaded
} }
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@@ -119,7 +127,7 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
} }
} }
checkDatabaseLoaded() checkDatabaseLoaded(mDatabaseViewModel.database?.loaded == true)
} }
interface Callback { interface Callback {

View File

@@ -19,13 +19,14 @@
*/ */
package com.kunzisoft.keepass.settings package com.kunzisoft.keepass.settings
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.* import android.view.*
import androidx.core.graphics.toColorInt
import androidx.core.view.MenuProvider import androidx.core.view.MenuProvider
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceCategory import androidx.preference.PreferenceCategory
import androidx.preference.TwoStatePreference 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.getParcelableCompat
import com.kunzisoft.keepass.utils.getSerializableCompat import com.kunzisoft.keepass.utils.getSerializableCompat
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
import kotlinx.coroutines.launch
class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetrieval { class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetrieval {
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
private var mDatabase: ContextualDatabase? = null
private var mDatabaseReadOnly: Boolean = false private var mDatabaseReadOnly: Boolean = false
private var mMergeDataAllowed: Boolean = false private var mMergeDataAllowed: Boolean = false
private var mDatabaseAutoSaveEnabled: Boolean = true private var mDatabaseAutoSaveEnabled: Boolean = true
@@ -119,10 +120,19 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
activity?.addMenuProvider(menuProvider, viewLifecycleOwner) activity?.addMenuProvider(menuProvider, viewLifecycleOwner)
mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> lifecycleScope.launch {
mDatabase = database mDatabaseViewModel.uiState.collect { uiState ->
view.resetAppTimeoutWhenViewTouchedOrFocused(requireContext(), database?.loaded) when (uiState) {
onDatabaseRetrieved(database) is DatabaseViewModel.UIState.Loading -> {}
is DatabaseViewModel.UIState.OnDatabaseRetrieved -> {
view.resetAppTimeoutWhenViewTouchedOrFocused(
context = requireContext(),
databaseLoaded = uiState.database?.loaded
)
onDatabaseRetrieved(uiState.database)
}
}
}
} }
mDatabaseViewModel.actionFinished.observe(viewLifecycleOwner) { mDatabaseViewModel.actionFinished.observe(viewLifecycleOwner) {
@@ -132,7 +142,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) { override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) {
mScreen = screen mScreen = screen
val database = mDatabase val database = mDatabaseViewModel.database
// Load the preferences from an XML resource // Load the preferences from an XML resource
when (screen) { when (screen) {
Screen.DATABASE -> { Screen.DATABASE -> {
@@ -168,11 +178,10 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
} }
override fun onDatabaseRetrieved(database: ContextualDatabase?) { override fun onDatabaseRetrieved(database: ContextualDatabase?) {
mDatabase = database
mDatabaseReadOnly = database?.isReadOnly == true mDatabaseReadOnly = database?.isReadOnly == true
mMergeDataAllowed = database?.isMergeDataAllowed() == true mMergeDataAllowed = database?.isMergeDataAllowed() == true
mDatabase?.let { database?.let {
if (it.loaded) { if (it.loaded) {
when (mScreen) { when (mScreen) {
Screen.DATABASE -> { Screen.DATABASE -> {
@@ -458,7 +467,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newDefaultUsername newDefaultUsername
} else { } else {
mDatabase?.defaultUsername = oldDefaultUsername database.defaultUsername = oldDefaultUsername
oldDefaultUsername oldDefaultUsername
} }
dbDefaultUsernamePref?.summary = defaultUsernameToShow dbDefaultUsernamePref?.summary = defaultUsernameToShow
@@ -471,7 +480,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newColor newColor
} else { } else {
mDatabase?.customColor = Color.parseColor(oldColor) database.customColor = oldColor.toColorInt()
oldColor oldColor
} }
dbCustomColorPref?.summary = defaultColorToShow dbCustomColorPref?.summary = defaultColorToShow
@@ -483,7 +492,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newCompression newCompression
} else { } else {
mDatabase?.compressionAlgorithm = oldCompression database.compressionAlgorithm = oldCompression
oldCompression oldCompression
} }
dbDataCompressionPref?.summary = algorithmToShow?.getLocalizedName(resources) dbDataCompressionPref?.summary = algorithmToShow?.getLocalizedName(resources)
@@ -497,7 +506,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
} else { } else {
oldRecycleBin oldRecycleBin
} }
mDatabase?.setRecycleBin(recycleBinToShow) database.setRecycleBin(recycleBinToShow)
refreshRecycleBinGroup(database) refreshRecycleBinGroup(database)
} }
DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK -> { DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK -> {
@@ -509,7 +518,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
} else { } else {
oldTemplatesGroup oldTemplatesGroup
} }
mDatabase?.setTemplatesGroup(templatesGroupToShow) database.setTemplatesGroup(templatesGroupToShow)
refreshTemplatesGroup(database) refreshTemplatesGroup(database)
} }
DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK -> { DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK -> {
@@ -519,7 +528,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newMaxHistoryItems newMaxHistoryItems
} else { } else {
mDatabase?.historyMaxItems = oldMaxHistoryItems database.historyMaxItems = oldMaxHistoryItems
oldMaxHistoryItems oldMaxHistoryItems
} }
dbMaxHistoryItemsPref?.summary = maxHistoryItemsToShow.toString() dbMaxHistoryItemsPref?.summary = maxHistoryItemsToShow.toString()
@@ -531,7 +540,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newMaxHistorySize newMaxHistorySize
} else { } else {
mDatabase?.historyMaxSize = oldMaxHistorySize database.historyMaxSize = oldMaxHistorySize
oldMaxHistorySize oldMaxHistorySize
} }
dbMaxHistorySizePref?.summary = maxHistorySizeToShow.toString() dbMaxHistorySizePref?.summary = maxHistorySizeToShow.toString()
@@ -549,7 +558,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newEncryption newEncryption
} else { } else {
mDatabase?.encryptionAlgorithm = oldEncryption database.encryptionAlgorithm = oldEncryption
oldEncryption oldEncryption
} }
mEncryptionAlgorithmPref?.summary = algorithmToShow.toString() mEncryptionAlgorithmPref?.summary = algorithmToShow.toString()
@@ -561,7 +570,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newKeyDerivationEngine newKeyDerivationEngine
} else { } else {
mDatabase?.kdfEngine = oldKeyDerivationEngine database.kdfEngine = oldKeyDerivationEngine
oldKeyDerivationEngine oldKeyDerivationEngine
} }
mKeyDerivationPref?.summary = kdfEngineToShow.toString() mKeyDerivationPref?.summary = kdfEngineToShow.toString()
@@ -578,7 +587,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newIterations newIterations
} else { } else {
mDatabase?.numberKeyEncryptionRounds = oldIterations database.numberKeyEncryptionRounds = oldIterations
oldIterations oldIterations
} }
mRoundPref?.summary = roundsToShow.toString() mRoundPref?.summary = roundsToShow.toString()
@@ -590,7 +599,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newMemoryUsage newMemoryUsage
} else { } else {
mDatabase?.memoryUsage = oldMemoryUsage database.memoryUsage = oldMemoryUsage
oldMemoryUsage oldMemoryUsage
} }
mMemoryPref?.summary = memoryToShow.toString() mMemoryPref?.summary = memoryToShow.toString()
@@ -602,7 +611,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
if (result.isSuccess) { if (result.isSuccess) {
newParallelism newParallelism
} else { } else {
mDatabase?.parallelism = oldParallelism database.parallelism = oldParallelism
oldParallelism oldParallelism
} }
mParallelismPref?.summary = parallelismToShow.toString() mParallelismPref?.summary = parallelismToShow.toString()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -35,7 +35,6 @@ class DatabaseMaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePrefere
} }
override fun onDatabaseRetrieved(database: ContextualDatabase?) { override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.historyMaxSize?.let { maxItemsDatabase -> database?.historyMaxSize?.let { maxItemsDatabase ->
dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE) dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE)
.toBetterByteFormat() .toBetterByteFormat()

View File

@@ -35,7 +35,6 @@ class DatabaseMemoryUsagePreferenceDialogFragmentCompat : DatabaseSavePreference
} }
override fun onDatabaseRetrieved(database: ContextualDatabase?) { override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
database?.let { database?.let {
val memoryBytes = database.memoryUsage val memoryBytes = database.memoryUsage
dataByte = DataByte(memoryBytes, DataByte.ByteFormat.BYTE) dataByte = DataByte(memoryBytes, DataByte.ByteFormat.BYTE)

View File

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

View File

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

View File

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

View File

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

View File

@@ -33,7 +33,6 @@ class DatabaseRoundsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialo
} }
override fun onDatabaseRetrieved(database: ContextualDatabase?) { override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
inputText = database?.numberKeyEncryptionRounds?.toString() ?: MIN_ITERATIONS.toString() 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.content.Context
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.activityViewModels 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.androidclearchroma.ChromaUtil
import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval
import com.kunzisoft.keepass.database.ContextualDatabase 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.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
import kotlinx.coroutines.launch
abstract class DatabaseSavePreferenceDialogFragmentCompat abstract class DatabaseSavePreferenceDialogFragmentCompat
: InputPreferenceDialogFragmentCompat(), DatabaseRetrieval { : InputPreferenceDialogFragmentCompat(), DatabaseRetrieval {
private var mDatabaseAutoSaveEnable = true private var mDatabaseAutoSaveEnable = true
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
private var mDatabase: ContextualDatabase? = null
override fun onAttach(context: Context) { override fun onAttach(context: Context) {
super.onAttach(context) super.onAttach(context)
@@ -47,20 +50,21 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) 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( override fun onDatabaseActionFinished(
database: ContextualDatabase, database: ContextualDatabase,
actionTask: String, actionTask: String,
@@ -70,7 +74,7 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(positiveResult: Boolean) {
onDialogClosed(mDatabase, positiveResult) onDialogClosed(mDatabaseViewModel.database, positiveResult)
} }
open fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) { open fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

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

View File

@@ -1,7 +1,6 @@
package com.kunzisoft.keepass.viewmodels package com.kunzisoft.keepass.viewmodels
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm 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.Group
import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm
import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ActionRunnable
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
class DatabaseViewModel: ViewModel() { class DatabaseViewModel: ViewModel() {
val database : LiveData<ContextualDatabase?> get() = _database var database: ContextualDatabase? = null
private val _database = MutableLiveData<ContextualDatabase?>() private set
private val mUiState = MutableStateFlow<UIState>(UIState.Loading)
val uiState: StateFlow<UIState> = mUiState
val actionFinished : LiveData<ActionResult> get() = _actionFinished val actionFinished : LiveData<ActionResult> get() = _actionFinished
private val _actionFinished = SingleLiveEvent<ActionResult>() private val _actionFinished = SingleLiveEvent<ActionResult>()
@@ -74,7 +78,8 @@ class DatabaseViewModel: ViewModel() {
fun defineDatabase(database: ContextualDatabase?) { fun defineDatabase(database: ContextualDatabase?) {
this._database.value = database this.database = database
this.mUiState.value = UIState.OnDatabaseRetrieved(database)
} }
fun onActionFinished(database: ContextualDatabase, fun onActionFinished(database: ContextualDatabase,
@@ -184,6 +189,13 @@ class DatabaseViewModel: ViewModel() {
_saveParallelism.value = SuperLong(oldValue, newValue, save) _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, data class ActionResult(val database: ContextualDatabase,
val actionTask: String, val actionTask: String,
val result: ActionRunnable.Result) val result: ActionRunnable.Result)