From 9f7a0d4f17edc01f23a855dbeb9f49171438b94e Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 4 Aug 2021 13:24:45 +0200 Subject: [PATCH] Better inheritance --- .../activities/selection/DatabaseActivity.kt | 1 + .../keepass/icons/IconPackChooser.kt | 10 ++-- .../settings/DatabasePreferenceFragment.kt | 52 ------------------- .../settings/MainPreferenceFragment.kt | 26 +++++++--- .../settings/NestedAppSettingsFragment.kt | 13 +---- .../NestedDatabaseSettingsFragment.kt | 31 ++++++++++- .../settings/NestedSettingsFragment.kt | 4 +- .../keepass/settings/SettingsActivity.kt | 6 --- ...abaseSavePreferenceDialogFragmentCompat.kt | 16 +++--- .../keepass/viewmodels/DatabaseViewModel.kt | 41 ++++++++++++--- 10 files changed, 100 insertions(+), 100 deletions(-) delete mode 100644 app/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferenceFragment.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt index 1636e5406..ccb7f55de 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt @@ -116,6 +116,7 @@ abstract class DatabaseActivity: StylishActivity(), DatabaseRetrieval { actionTask: String, result: ActionRunnable.Result ) { + mDatabaseViewModel.onActionFinished(database, actionTask, result) // optional method implementation } diff --git a/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt b/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt index ed1d0da36..332032ab8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt +++ b/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt @@ -90,10 +90,10 @@ object IconPackChooser { } - fun setSelectedIconPack(iconDrawableFactory: IconDrawableFactory, iconPackIdString: String?) { + fun setSelectedIconPack(iconPackIdString: String?) { + // TODO Clear Icon pack cache for (iconPack in iconPackList) { if (iconPack.id == iconPackIdString) { - iconDrawableFactory.clearCache() iconPackSelected = iconPack break } @@ -108,8 +108,10 @@ object IconPackChooser { */ fun getSelectedIconPack(context: Context, iconDrawableFactory: IconDrawableFactory): IconPack? { build(context) - if (iconPackSelected == null) - setSelectedIconPack(iconDrawableFactory, PreferencesUtil.getIconPackSelectedId(context)) + if (iconPackSelected == null) { + setSelectedIconPack(PreferencesUtil.getIconPackSelectedId(context)) + iconDrawableFactory.clearCache() + } return iconPackSelected } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferenceFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferenceFragment.kt deleted file mode 100644 index 0b6255dfb..000000000 --- a/app/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferenceFragment.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.kunzisoft.keepass.settings - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.activityViewModels -import androidx.preference.PreferenceFragmentCompat -import com.kunzisoft.keepass.activities.DatabaseRetrieval -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged -import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.tasks.ActionRunnable -import com.kunzisoft.keepass.viewmodels.DatabaseViewModel - -abstract class DatabasePreferenceFragment : PreferenceFragmentCompat(), DatabaseRetrieval { - - private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() - private var mDatabase: Database? = null - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> - mDatabase = database - onDatabaseRetrieved(database) - } - return super.onCreateView(inflater, container, savedInstanceState) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - view.resetAppTimeoutWhenViewFocusedOrChanged(requireContext(), mDatabase) - } - - override fun onDatabaseActionFinished( - database: Database, - actionTask: String, - result: ActionRunnable.Result - ) { - // Can be overridden by a subclass - } - - protected fun saveDatabase(save: Boolean) { - mDatabaseViewModel.saveDatabase(save) - } - - protected fun reloadDatabase() { - mDatabaseViewModel.reloadDatabase(false) - } -} \ No newline at end of file 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 7ab781b23..0e0696858 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt @@ -21,14 +21,18 @@ package com.kunzisoft.keepass.settings import android.content.Context import android.os.Bundle +import android.view.View +import androidx.fragment.app.activityViewModels import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.viewmodels.DatabaseViewModel -class MainPreferenceFragment : DatabasePreferenceFragment() { +class MainPreferenceFragment : PreferenceFragmentCompat() { private var mCallback: Callback? = null + private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private var mDatabaseLoaded: Boolean = false override fun onAttach(context: Context) { @@ -45,9 +49,17 @@ class MainPreferenceFragment : DatabasePreferenceFragment() { mCallback = null super.onDetach() } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> + mDatabaseLoaded = database?.loaded == true + checkDatabaseLoaded() + } + super.onViewCreated(view, savedInstanceState) + } - override fun onDatabaseRetrieved(database: Database?) { - mDatabaseLoaded = database?.loaded == true + private fun checkDatabaseLoaded() { + findPreference(getString(R.string.settings_database_key)) + ?.isEnabled = mDatabaseLoaded } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -87,10 +99,6 @@ class MainPreferenceFragment : DatabasePreferenceFragment() { mCallback?.onNestedPreferenceSelected(NestedSettingsFragment.Screen.DATABASE) false } - // TODO Check - if (mDatabaseLoaded) { - isEnabled = false - } } findPreference(getString(R.string.settings_database_security_key))?.apply { @@ -106,6 +114,8 @@ class MainPreferenceFragment : DatabasePreferenceFragment() { false } } + + checkDatabaseLoaded() } interface Callback { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt index afcba0b07..d73945abd 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt @@ -43,9 +43,7 @@ import com.kunzisoft.keepass.activities.stylish.Stylish import com.kunzisoft.keepass.app.database.CipherDatabaseAction import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.biometric.AdvancedUnlockManager -import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.education.Education -import com.kunzisoft.keepass.icons.IconDrawableFactory import com.kunzisoft.keepass.icons.IconPackChooser import com.kunzisoft.keepass.settings.preference.IconPackListPreference import com.kunzisoft.keepass.settings.preferencedialogfragment.DurationDialogFragmentCompat @@ -56,12 +54,6 @@ class NestedAppSettingsFragment : NestedSettingsFragment() { private var deleteKeysAlertDialog: AlertDialog? = null - private var mIconDrawableFactory: IconDrawableFactory? = null - - override fun onDatabaseRetrieved(database: Database?) { - this.mIconDrawableFactory = database?.iconDrawableFactory - } - override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) { // Load the preferences from an XML resource @@ -434,10 +426,7 @@ class NestedAppSettingsFragment : NestedSettingsFragment() { } } if (iconPackEnabled) { - // TODO Check - mIconDrawableFactory?.let { - IconPackChooser.setSelectedIconPack(it, iconPackId) - } + IconPackChooser.setSelectedIconPack(iconPackId) } iconPackEnabled } 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 ee8c8e31a..2fdc3d82c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -24,13 +24,16 @@ import android.os.Bundle import android.util.Log import android.view.* import androidx.fragment.app.DialogFragment +import androidx.fragment.app.activityViewModels import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.SwitchPreference import com.kunzisoft.androidclearchroma.ChromaUtil import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.activities.DatabaseRetrieval import com.kunzisoft.keepass.activities.dialogs.AssignMasterKeyDialogFragment import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper +import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Database @@ -41,9 +44,11 @@ import com.kunzisoft.keepass.settings.preference.* import com.kunzisoft.keepass.settings.preferencedialogfragment.* import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.utils.MenuUtil +import com.kunzisoft.keepass.viewmodels.DatabaseViewModel -class NestedDatabaseSettingsFragment : NestedSettingsFragment() { +class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetrieval { + private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private var mDatabase: Database? = null private var mDatabaseReadOnly: Boolean = false private var mDatabaseAutoSaveEnabled: Boolean = true @@ -65,6 +70,21 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() { private var mMemoryPref: InputKdfSizePreference? = null private var mParallelismPref: InputKdfNumberPreference? = null + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> + mDatabase = database + onDatabaseRetrieved(database) + } + + mDatabaseViewModel.actionFinished.observe(viewLifecycleOwner) { + onDatabaseActionFinished(it.database, it.actionTask, it.result) + } + + view.resetAppTimeoutWhenViewFocusedOrChanged(requireContext(), mDatabase) + } + override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) { setHasOptionsMenu(true) @@ -95,6 +115,14 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() { } } + private fun saveDatabase(save: Boolean) { + mDatabaseViewModel.saveDatabase(save) + } + + private fun reloadDatabase() { + mDatabaseViewModel.reloadDatabase(false) + } + override fun onDatabaseRetrieved(database: Database?) { mDatabase = database mDatabaseReadOnly = mDatabaseReadOnly || database?.isReadOnly == true @@ -343,6 +371,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() { return view } + // TODO check error override fun onDatabaseActionFinished(database: Database, actionTask: String, result: ActionRunnable.Result) { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt index 50f90789a..935784a24 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt @@ -22,13 +22,13 @@ package com.kunzisoft.keepass.settings import android.content.res.Resources import android.os.Bundle import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.dialogs.UnderDevelopmentFeatureDialogFragment import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper -// TODO Move database fragment in sub class -abstract class NestedSettingsFragment : DatabasePreferenceFragment() { +abstract class NestedSettingsFragment : PreferenceFragmentCompat() { enum class Screen { APPLICATION, FORM_FILLING, ADVANCED_UNLOCK, APPEARANCE, DATABASE, DATABASE_SECURITY, DATABASE_MASTER_KEY diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt index 91b78e18c..0fee49704 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt @@ -133,12 +133,6 @@ open class SettingsActivity finish() } } - else -> { - // TODO Call result in fragment by viewmodel - (supportFragmentManager - .findFragmentByTag(TAG_NESTED) as NestedSettingsFragment?) - ?.onDatabaseActionFinished(database, actionTask, result) - } } coordinatorLayout?.showActionErrorIfNeeded(result) } 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 b9f99a699..54e1424f2 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 @@ -60,14 +60,6 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat this.mDatabase = database } - override fun onDialogClosed(positiveResult: Boolean) { - onDialogClosed(mDatabase, positiveResult) - } - - open fun onDialogClosed(database: Database?, positiveResult: Boolean) { - // To inherit to save element in database - } - override fun onDatabaseActionFinished( database: Database, actionTask: String, @@ -76,6 +68,14 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat // Not used } + override fun onDialogClosed(positiveResult: Boolean) { + onDialogClosed(mDatabase, positiveResult) + } + + open fun onDialogClosed(database: Database?, positiveResult: Boolean) { + // To inherit to save element in database + } + protected fun saveColor(oldColor: String, newColor: String) { mDatabaseViewModel.saveColor(oldColor, newColor, mDatabaseAutoSaveEnable) 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 3a485021a..9e3dafcaa 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt @@ -8,12 +8,16 @@ import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.tasks.ActionRunnable class DatabaseViewModel: ViewModel() { val database : LiveData get() = _database private val _database = MutableLiveData() + val actionFinished : LiveData get() = _actionFinished + private val _actionFinished = SingleLiveEvent() + val saveDatabase : LiveData get() = _saveDatabase private val _saveDatabase = SingleLiveEvent() @@ -70,6 +74,12 @@ class DatabaseViewModel: ViewModel() { this._database.value = database } + fun onActionFinished(database: Database, + actionTask: String, + result: ActionRunnable.Result) { + this._actionFinished.value = ActionResult(database, actionTask, result) + } + fun saveDatabase(save: Boolean) { _saveDatabase.value = save } @@ -167,12 +177,29 @@ class DatabaseViewModel: ViewModel() { _saveParallelism.value = SuperLong(oldValue, newValue, save) } - data class SuperString(val oldValue: String, val newValue: String, val save: Boolean) - data class SuperInt(val oldValue: Int, val newValue: Int, val save: Boolean) - data class SuperLong(val oldValue: Long, val newValue: Long, val save: Boolean) - data class SuperCompression(val oldValue: CompressionAlgorithm, val newValue: CompressionAlgorithm, val save: Boolean) - data class SuperEncryption(val oldValue: EncryptionAlgorithm, val newValue: EncryptionAlgorithm, val save: Boolean) - data class SuperKeyDerivation(val oldValue: KdfEngine, val newValue: KdfEngine, val save: Boolean) - data class SuperGroup(val oldValue: Group?, val newValue: Group?, val save: Boolean) + data class ActionResult(val database: Database, + val actionTask: String, + val result: ActionRunnable.Result) + data class SuperString(val oldValue: String, + val newValue: String, + val save: Boolean) + data class SuperInt(val oldValue: Int, + val newValue: Int, + val save: Boolean) + data class SuperLong(val oldValue: Long, + val newValue: Long, + val save: Boolean) + data class SuperCompression(val oldValue: CompressionAlgorithm, + val newValue: CompressionAlgorithm, + val save: Boolean) + data class SuperEncryption(val oldValue: EncryptionAlgorithm, + val newValue: EncryptionAlgorithm, + val save: Boolean) + data class SuperKeyDerivation(val oldValue: KdfEngine, + val newValue: KdfEngine, + val save: Boolean) + data class SuperGroup(val oldValue: Group?, + val newValue: Group?, + val save: Boolean) } \ No newline at end of file