Fix database settings

This commit is contained in:
J-Jamet
2021-08-04 12:11:24 +02:00
parent 7a2536c559
commit fa5ae17621
20 changed files with 456 additions and 372 deletions

View File

@@ -1,7 +1,9 @@
package com.kunzisoft.keepass.settings package com.kunzisoft.keepass.settings
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.kunzisoft.keepass.activities.DatabaseRetrieval import com.kunzisoft.keepass.activities.DatabaseRetrieval
@@ -13,15 +15,23 @@ import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
abstract class DatabasePreferenceFragment : PreferenceFragmentCompat(), DatabaseRetrieval { abstract class DatabasePreferenceFragment : PreferenceFragmentCompat(), DatabaseRetrieval {
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
private var mDatabase: Database? = null
override fun onViewCreated(view: View, override fun onCreateView(
savedInstanceState: Bundle?) { inflater: LayoutInflater,
super.onViewCreated(view, savedInstanceState) container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> mDatabaseViewModel.database.observe(viewLifecycleOwner) { database ->
view.resetAppTimeoutWhenViewFocusedOrChanged(requireContext(), database) mDatabase = database
onDatabaseRetrieved(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( override fun onDatabaseActionFinished(

View File

@@ -24,7 +24,6 @@ import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.* import android.view.*
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceCategory import androidx.preference.PreferenceCategory
import androidx.preference.SwitchPreference import androidx.preference.SwitchPreference
@@ -42,7 +41,6 @@ import com.kunzisoft.keepass.settings.preference.*
import com.kunzisoft.keepass.settings.preferencedialogfragment.* import com.kunzisoft.keepass.settings.preferencedialogfragment.*
import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.utils.MenuUtil import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
class NestedDatabaseSettingsFragment : NestedSettingsFragment() { class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
@@ -50,6 +48,8 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
private var mDatabaseReadOnly: Boolean = false private var mDatabaseReadOnly: Boolean = false
private var mDatabaseAutoSaveEnabled: Boolean = true private var mDatabaseAutoSaveEnabled: Boolean = true
private var mScreen: Screen? = null
private var dbNamePref: InputTextPreference? = null private var dbNamePref: InputTextPreference? = null
private var dbDescriptionPref: InputTextPreference? = null private var dbDescriptionPref: InputTextPreference? = null
private var dbDefaultUsername: InputTextPreference? = null private var dbDefaultUsername: InputTextPreference? = null
@@ -65,181 +65,201 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
private var mMemoryPref: InputKdfSizePreference? = null private var mMemoryPref: InputKdfSizePreference? = null
private var mParallelismPref: InputKdfNumberPreference? = null private var mParallelismPref: InputKdfNumberPreference? = null
override fun onDatabaseRetrieved(database: Database?) {
mDatabase = database
}
override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) { override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) {
setHasOptionsMenu(true) setHasOptionsMenu(true)
mDatabaseReadOnly = mDatabase?.isReadOnly == true // TODO Read only
|| ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrArguments(savedInstanceState, arguments) mDatabaseReadOnly = mDatabaseReadOnly || ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrArguments(savedInstanceState, arguments)
mScreen = screen
val database = mDatabase
// Load the preferences from an XML resource // Load the preferences from an XML resource
when (screen) { when (screen) {
Screen.DATABASE -> { Screen.DATABASE -> {
onCreateDatabasePreference(rootKey) setPreferencesFromResource(R.xml.preferences_database, rootKey)
if (database?.loaded == true)
onCreateDatabasePreference(database)
} }
Screen.DATABASE_SECURITY -> { Screen.DATABASE_SECURITY -> {
onCreateDatabaseSecurityPreference(rootKey) setPreferencesFromResource(R.xml.preferences_database_security, rootKey)
if (database?.loaded == true)
onCreateDatabaseSecurityPreference(database)
} }
Screen.DATABASE_MASTER_KEY -> { Screen.DATABASE_MASTER_KEY -> {
onCreateDatabaseMasterKeyPreference(rootKey) setPreferencesFromResource(R.xml.preferences_database_master_key, rootKey)
if (database?.loaded == true)
onCreateDatabaseMasterKeyPreference(database)
}
else -> {
} }
else -> {}
} }
} }
private fun onCreateDatabasePreference(rootKey: String?) { override fun onDatabaseRetrieved(database: Database?) {
setPreferencesFromResource(R.xml.preferences_database, rootKey) mDatabase = database
mDatabaseReadOnly = mDatabaseReadOnly || database?.isReadOnly == true
mDatabase?.let { database -> mDatabase?.let {
if (database.loaded) { if (it.loaded) {
when (mScreen) {
val dbGeneralPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_general_key)) Screen.DATABASE -> {
onCreateDatabasePreference(it)
// Database name
dbNamePref = findPreference(getString(R.string.database_name_key))
if (database.allowName) {
dbNamePref?.summary = database.name
} else {
dbGeneralPrefCategory?.removePreference(dbNamePref)
}
// Database description
dbDescriptionPref = findPreference(getString(R.string.database_description_key))
if (database.allowDescription) {
dbDescriptionPref?.summary = database.description
} else {
dbGeneralPrefCategory?.removePreference(dbDescriptionPref)
}
// Database default username
dbDefaultUsername = findPreference(getString(R.string.database_default_username_key))
if (database.allowDefaultUsername) {
dbDefaultUsername?.summary = database.defaultUsername
} else {
dbDefaultUsername?.isEnabled = false
// TODO dbGeneralPrefCategory?.removePreference(dbDefaultUsername)
}
// Database custom color
dbCustomColorPref = findPreference(getString(R.string.database_custom_color_key))
if (database.allowCustomColor) {
dbCustomColorPref?.apply {
try {
color = Color.parseColor(database.customColor)
summary = database.customColor
} catch (e: Exception) {
color = DialogColorPreference.DISABLE_COLOR
summary = ""
}
} }
} else { Screen.DATABASE_SECURITY -> {
dbCustomColorPref?.isEnabled = false onCreateDatabaseSecurityPreference(it)
// TODO dbGeneralPrefCategory?.removePreference(dbCustomColorPref)
}
// Version
findPreference<Preference>(getString(R.string.database_version_key))
?.summary = database.version
val dbCompressionPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_data_key))
// Database compression
dbDataCompressionPref = findPreference(getString(R.string.database_data_compression_key))
if (database.allowDataCompression) {
dbDataCompressionPref?.summary = (database.compressionAlgorithm
?: CompressionAlgorithm.None).getName(resources)
} else {
dbCompressionPrefCategory?.isVisible = false
}
val dbRecycleBinPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_recycle_bin_key))
recycleBinGroupPref = findPreference(getString(R.string.recycle_bin_group_key))
// Recycle bin
if (database.allowConfigurableRecycleBin) {
val recycleBinEnablePref: SwitchPreference? = findPreference(getString(R.string.recycle_bin_enable_key))
recycleBinEnablePref?.apply {
isChecked = database.isRecycleBinEnabled
isEnabled = if (!mDatabaseReadOnly) {
setOnPreferenceChangeListener { _, newValue ->
val recycleBinEnabled = newValue as Boolean
database.enableRecycleBin(recycleBinEnabled, resources)
refreshRecycleBinGroup()
// Save the database if not in readonly mode
saveDatabase(mDatabaseAutoSaveEnabled)
true
}
true
} else {
false
}
} }
// Change the recycle bin group Screen.DATABASE_MASTER_KEY -> {
recycleBinGroupPref?.setOnPreferenceClickListener { onCreateDatabaseMasterKeyPreference(it)
true
} }
// Recycle Bin group else -> {
refreshRecycleBinGroup()
} else {
recycleBinGroupPref?.onPreferenceClickListener = null
dbRecycleBinPrefCategory?.isVisible = false
}
// Templates
val templatesGroupPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_templates_key))
templatesGroupPref = findPreference(getString(R.string.templates_group_uuid_key))
if (database.allowConfigurableTemplatesGroup) {
val templatesEnablePref: SwitchPreference? = findPreference(getString(R.string.templates_group_enable_key))
templatesEnablePref?.apply {
isChecked = database.isTemplatesEnabled
isEnabled = if (!mDatabaseReadOnly) {
setOnPreferenceChangeListener { _, newValue ->
val templatesEnabled = newValue as Boolean
database.enableTemplates(templatesEnabled, resources)
refreshTemplatesGroup()
// Save the database if not in readonly mode
saveDatabase(mDatabaseAutoSaveEnabled)
true
}
true
} else {
false
}
} }
// Recycle Bin group
refreshTemplatesGroup()
} else {
templatesGroupPrefCategory?.isVisible = false
} }
// History
findPreference<PreferenceCategory>(getString(R.string.database_category_history_key))
?.isVisible = database.manageHistory == true
// Max history items
dbMaxHistoryItemsPref = findPreference<InputNumberPreference>(getString(R.string.max_history_items_key))?.apply {
summary = database.historyMaxItems.toString()
}
// Max history size
dbMaxHistorySizePref = findPreference<InputNumberPreference>(getString(R.string.max_history_size_key))?.apply {
summary = database.historyMaxSize.toString()
}
} else { } else {
Log.e(javaClass.name, "Database isn't ready") Log.e(javaClass.name, "Database isn't ready")
} }
} }
} }
private fun refreshRecycleBinGroup() { private fun onCreateDatabasePreference(database: Database) {
val dbGeneralPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_general_key))
// Database name
dbNamePref = findPreference(getString(R.string.database_name_key))
if (database.allowName) {
dbNamePref?.summary = database.name
} else {
dbGeneralPrefCategory?.removePreference(dbNamePref)
}
// Database description
dbDescriptionPref = findPreference(getString(R.string.database_description_key))
if (database.allowDescription) {
dbDescriptionPref?.summary = database.description
} else {
dbGeneralPrefCategory?.removePreference(dbDescriptionPref)
}
// Database default username
dbDefaultUsername = findPreference(getString(R.string.database_default_username_key))
if (database.allowDefaultUsername) {
dbDefaultUsername?.summary = database.defaultUsername
} else {
dbDefaultUsername?.isEnabled = false
// TODO dbGeneralPrefCategory?.removePreference(dbDefaultUsername)
}
// Database custom color
dbCustomColorPref = findPreference(getString(R.string.database_custom_color_key))
if (database.allowCustomColor) {
dbCustomColorPref?.apply {
try {
color = Color.parseColor(database.customColor)
summary = database.customColor
} catch (e: Exception) {
color = DialogColorPreference.DISABLE_COLOR
summary = ""
}
}
} else {
dbCustomColorPref?.isEnabled = false
// TODO dbGeneralPrefCategory?.removePreference(dbCustomColorPref)
}
// Version
findPreference<Preference>(getString(R.string.database_version_key))
?.summary = database.version
val dbCompressionPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_data_key))
// Database compression
dbDataCompressionPref = findPreference(getString(R.string.database_data_compression_key))
if (database.allowDataCompression) {
dbDataCompressionPref?.summary = (database.compressionAlgorithm
?: CompressionAlgorithm.None).getName(resources)
} else {
dbCompressionPrefCategory?.isVisible = false
}
val dbRecycleBinPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_recycle_bin_key))
recycleBinGroupPref = findPreference(getString(R.string.recycle_bin_group_key))
// Recycle bin
if (database.allowConfigurableRecycleBin) {
val recycleBinEnablePref: SwitchPreference? = findPreference(getString(R.string.recycle_bin_enable_key))
recycleBinEnablePref?.apply {
isChecked = database.isRecycleBinEnabled
isEnabled = if (!mDatabaseReadOnly) {
setOnPreferenceChangeListener { _, newValue ->
val recycleBinEnabled = newValue as Boolean
database.enableRecycleBin(recycleBinEnabled, resources)
refreshRecycleBinGroup(database)
// Save the database if not in readonly mode
saveDatabase(mDatabaseAutoSaveEnabled)
true
}
true
} else {
false
}
}
// Change the recycle bin group
recycleBinGroupPref?.setOnPreferenceClickListener {
true
}
// Recycle Bin group
refreshRecycleBinGroup(database)
} else {
recycleBinGroupPref?.onPreferenceClickListener = null
dbRecycleBinPrefCategory?.isVisible = false
}
// Templates
val templatesGroupPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_templates_key))
templatesGroupPref = findPreference(getString(R.string.templates_group_uuid_key))
if (database.allowConfigurableTemplatesGroup) {
val templatesEnablePref: SwitchPreference? = findPreference(getString(R.string.templates_group_enable_key))
templatesEnablePref?.apply {
isChecked = database.isTemplatesEnabled
isEnabled = if (!mDatabaseReadOnly) {
setOnPreferenceChangeListener { _, newValue ->
val templatesEnabled = newValue as Boolean
database.enableTemplates(templatesEnabled, resources)
refreshTemplatesGroup(database)
// Save the database if not in readonly mode
saveDatabase(mDatabaseAutoSaveEnabled)
true
}
true
} else {
false
}
}
// Recycle Bin group
refreshTemplatesGroup(database)
} else {
templatesGroupPrefCategory?.isVisible = false
}
// History
findPreference<PreferenceCategory>(getString(R.string.database_category_history_key))
?.isVisible = database.manageHistory == true
// Max history items
dbMaxHistoryItemsPref = findPreference<InputNumberPreference>(getString(R.string.max_history_items_key))?.apply {
summary = database.historyMaxItems.toString()
}
// Max history size
dbMaxHistorySizePref = findPreference<InputNumberPreference>(getString(R.string.max_history_size_key))?.apply {
summary = database.historyMaxSize.toString()
}
}
private fun refreshRecycleBinGroup(database: Database?) {
recycleBinGroupPref?.apply { recycleBinGroupPref?.apply {
if (mDatabase?.isRecycleBinEnabled == true) { if (database?.isRecycleBinEnabled == true) {
summary = mDatabase?.recycleBin?.toString() summary = database.recycleBin?.toString()
isEnabled = true isEnabled = true
} else { } else {
summary = null summary = null
@@ -248,10 +268,10 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
} }
} }
private fun refreshTemplatesGroup() { private fun refreshTemplatesGroup(database: Database?) {
templatesGroupPref?.apply { templatesGroupPref?.apply {
if (mDatabase?.isTemplatesEnabled == true) { if (database?.isTemplatesEnabled == true) {
summary = mDatabase?.templatesGroup?.toString() summary = database.templatesGroup?.toString()
isEnabled = true isEnabled = true
} else { } else {
summary = null summary = null
@@ -260,60 +280,44 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
} }
} }
private fun onCreateDatabaseSecurityPreference(rootKey: String?) { private fun onCreateDatabaseSecurityPreference(database: Database) {
setPreferencesFromResource(R.xml.preferences_database_security, rootKey) // Encryption Algorithm
mEncryptionAlgorithmPref = findPreference<DialogListExplanationPreference>(getString(R.string.encryption_algorithm_key))?.apply {
summary = database.getEncryptionAlgorithmName()
}
mDatabase?.let { database -> // Key derivation function
if (database.loaded) { mKeyDerivationPref = findPreference<DialogListExplanationPreference>(getString(R.string.key_derivation_function_key))?.apply {
// Encryption Algorithm summary = database.getKeyDerivationName()
mEncryptionAlgorithmPref = findPreference<DialogListExplanationPreference>(getString(R.string.encryption_algorithm_key))?.apply { }
summary = database.getEncryptionAlgorithmName()
}
// Key derivation function // Round encryption
mKeyDerivationPref = findPreference<DialogListExplanationPreference>(getString(R.string.key_derivation_function_key))?.apply { mRoundPref = findPreference<InputKdfNumberPreference>(getString(R.string.transform_rounds_key))?.apply {
summary = database.getKeyDerivationName() summary = database.numberKeyEncryptionRounds.toString()
} }
// Round encryption // Memory Usage
mRoundPref = findPreference<InputKdfNumberPreference>(getString(R.string.transform_rounds_key))?.apply { mMemoryPref = findPreference<InputKdfSizePreference>(getString(R.string.memory_usage_key))?.apply {
summary = database.numberKeyEncryptionRounds.toString() summary = database.memoryUsage.toString()
} }
// Memory Usage // Parallelism
mMemoryPref = findPreference<InputKdfSizePreference>(getString(R.string.memory_usage_key))?.apply { mParallelismPref = findPreference<InputKdfNumberPreference>(getString(R.string.parallelism_key))?.apply {
summary = database.memoryUsage.toString() summary = database.parallelism.toString()
}
// Parallelism
mParallelismPref = findPreference<InputKdfNumberPreference>(getString(R.string.parallelism_key))?.apply {
summary = database.parallelism.toString()
}
} else {
Log.e(javaClass.name, "Database isn't ready")
}
} }
} }
private fun onCreateDatabaseMasterKeyPreference(rootKey: String?) { private fun onCreateDatabaseMasterKeyPreference(database: Database) {
setPreferencesFromResource(R.xml.preferences_database_master_key, rootKey) findPreference<Preference>(getString(R.string.settings_database_change_credentials_key))?.apply {
isEnabled = if (!mDatabaseReadOnly) {
mDatabase?.let { database -> onPreferenceClickListener = Preference.OnPreferenceClickListener {
if (database.loaded) { AssignMasterKeyDialogFragment.getInstance(database.allowNoMasterKey)
findPreference<Preference>(getString(R.string.settings_database_change_credentials_key))?.apply { .show(parentFragmentManager, "passwordDialog")
isEnabled = if (!mDatabaseReadOnly) { false
onPreferenceClickListener = Preference.OnPreferenceClickListener {
AssignMasterKeyDialogFragment.getInstance(database.allowNoMasterKey)
.show(parentFragmentManager, "passwordDialog")
false
}
true
} else {
false
}
} }
true
} else { } else {
Log.e(javaClass.name, "Database isn't ready") false
} }
} }
} }
@@ -339,8 +343,9 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
return view return view
} }
override fun onProgressDialogThreadResult(actionTask: String, override fun onDatabaseActionFinished(database: Database,
result: ActionRunnable.Result) { actionTask: String,
result: ActionRunnable.Result) {
result.data?.let { data -> result.data?.let { data ->
if (data.containsKey(DatabaseTaskNotificationService.OLD_ELEMENT_KEY) if (data.containsKey(DatabaseTaskNotificationService.OLD_ELEMENT_KEY)
&& data.containsKey(DatabaseTaskNotificationService.NEW_ELEMENT_KEY)) { && data.containsKey(DatabaseTaskNotificationService.NEW_ELEMENT_KEY)) {
@@ -357,7 +362,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
if (result.isSuccess) { if (result.isSuccess) {
newName newName
} else { } else {
mDatabase?.name = oldName database.name = oldName
oldName oldName
} }
dbNamePref?.summary = nameToShow dbNamePref?.summary = nameToShow
@@ -369,7 +374,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
if (result.isSuccess) { if (result.isSuccess) {
newDescription newDescription
} else { } else {
mDatabase?.description = oldDescription database.description = oldDescription
oldDescription oldDescription
} }
dbDescriptionPref?.summary = descriptionToShow dbDescriptionPref?.summary = descriptionToShow
@@ -421,7 +426,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
oldRecycleBin oldRecycleBin
} }
mDatabase?.setRecycleBin(recycleBinToShow) mDatabase?.setRecycleBin(recycleBinToShow)
refreshRecycleBinGroup() refreshRecycleBinGroup(database)
} }
DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK -> { DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK -> {
val oldTemplatesGroup = data.getParcelable<Group?>(DatabaseTaskNotificationService.OLD_ELEMENT_KEY) val oldTemplatesGroup = data.getParcelable<Group?>(DatabaseTaskNotificationService.OLD_ELEMENT_KEY)
@@ -433,7 +438,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
oldTemplatesGroup oldTemplatesGroup
} }
mDatabase?.setTemplatesGroup(templatesGroupToShow) mDatabase?.setTemplatesGroup(templatesGroupToShow)
refreshTemplatesGroup() refreshTemplatesGroup(database)
} }
DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK -> { DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK -> {
val oldMaxHistoryItems = data.getInt(DatabaseTaskNotificationService.OLD_ELEMENT_KEY) val oldMaxHistoryItems = data.getInt(DatabaseTaskNotificationService.OLD_ELEMENT_KEY)
@@ -569,10 +574,10 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
dialogFragment = DatabaseTemplatesGroupPreferenceDialogFragmentCompat.newInstance(preference.key) dialogFragment = DatabaseTemplatesGroupPreferenceDialogFragmentCompat.newInstance(preference.key)
} }
getString(R.string.max_history_items_key) -> { getString(R.string.max_history_items_key) -> {
dialogFragment = MaxHistoryItemsPreferenceDialogFragmentCompat.newInstance(preference.key) dialogFragment = DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat.newInstance(preference.key)
} }
getString(R.string.max_history_size_key) -> { getString(R.string.max_history_size_key) -> {
dialogFragment = MaxHistorySizePreferenceDialogFragmentCompat.newInstance(preference.key) dialogFragment = DatabaseMaxHistorySizePreferenceDialogFragmentCompat.newInstance(preference.key)
} }
// Security // Security
@@ -588,13 +593,13 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment() {
dialogFragment = keyDerivationDialogFragment dialogFragment = keyDerivationDialogFragment
} }
getString(R.string.transform_rounds_key) -> { getString(R.string.transform_rounds_key) -> {
dialogFragment = RoundsPreferenceDialogFragmentCompat.newInstance(preference.key) dialogFragment = DatabaseRoundsPreferenceDialogFragmentCompat.newInstance(preference.key)
} }
getString(R.string.memory_usage_key) -> { getString(R.string.memory_usage_key) -> {
dialogFragment = MemoryUsagePreferenceDialogFragmentCompat.newInstance(preference.key) dialogFragment = DatabaseMemoryUsagePreferenceDialogFragmentCompat.newInstance(preference.key)
} }
getString(R.string.parallelism_key) -> { getString(R.string.parallelism_key) -> {
dialogFragment = ParallelismPreferenceDialogFragmentCompat.newInstance(preference.key) dialogFragment = DatabaseParallelismPreferenceDialogFragmentCompat.newInstance(preference.key)
} }
else -> otherDialogFragment = true else -> otherDialogFragment = true
} }

View File

@@ -26,7 +26,6 @@ import androidx.preference.SwitchPreference
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.UnderDevelopmentFeatureDialogFragment import com.kunzisoft.keepass.activities.dialogs.UnderDevelopmentFeatureDialogFragment
import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper
import com.kunzisoft.keepass.tasks.ActionRunnable
// TODO Move database fragment in sub class // TODO Move database fragment in sub class
abstract class NestedSettingsFragment : DatabasePreferenceFragment() { abstract class NestedSettingsFragment : DatabasePreferenceFragment() {
@@ -48,9 +47,6 @@ abstract class NestedSettingsFragment : DatabasePreferenceFragment() {
abstract fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) abstract fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?)
open fun onProgressDialogThreadResult(actionTask: String,
result: ActionRunnable.Result) {}
protected fun preferenceInDevelopment(preferenceInDev: Preference) { protected fun preferenceInDevelopment(preferenceInDev: Preference) {
preferenceInDev.setOnPreferenceClickListener { preference -> preferenceInDev.setOnPreferenceClickListener { preference ->
try { // don't check if we can try { // don't check if we can

View File

@@ -134,10 +134,10 @@ open class SettingsActivity
} }
} }
else -> { else -> {
// Call result in fragment // TODO Call result in fragment by viewmodel
(supportFragmentManager (supportFragmentManager
.findFragmentByTag(TAG_NESTED) as NestedSettingsFragment?) .findFragmentByTag(TAG_NESTED) as NestedSettingsFragment?)
?.onProgressDialogThreadResult(actionTask, result) ?.onDatabaseActionFinished(database, actionTask, result)
} }
} }
coordinatorLayout?.showActionErrorIfNeeded(result) coordinatorLayout?.showActionErrorIfNeeded(result)
@@ -219,6 +219,7 @@ open class SettingsActivity
* To keep the current screen when activity is reloaded * To keep the current screen when activity is reloaded
*/ */
fun keepCurrentScreen() { fun keepCurrentScreen() {
// TODO Nested screen
(supportFragmentManager.findFragmentByTag(TAG_NESTED) as? NestedSettingsFragment?) (supportFragmentManager.findFragmentByTag(TAG_NESTED) as? NestedSettingsFragment?)
?.getScreen()?.let { fragmentKey -> ?.getScreen()?.let { fragmentKey ->
intent.putExtra(FRAGMENT_ARG, fragmentKey.name) intent.putExtra(FRAGMENT_ARG, fragmentKey.name)

View File

@@ -47,6 +47,7 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
var onColorSelectedListener: ((enable: Boolean, color: Int) -> Unit)? = null var onColorSelectedListener: ((enable: Boolean, color: Int) -> Unit)? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
super.onCreateDialog(savedInstanceState)
val alertDialogBuilder = AlertDialog.Builder(requireActivity()) val alertDialogBuilder = AlertDialog.Builder(requireActivity())
@@ -56,17 +57,6 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
val fragmentManager = childFragmentManager val fragmentManager = childFragmentManager
chromaColorFragment = fragmentManager.findFragmentByTag(TAG_FRAGMENT_COLORS) as ChromaColorFragment? chromaColorFragment = fragmentManager.findFragmentByTag(TAG_FRAGMENT_COLORS) as ChromaColorFragment?
mDatabase?.let { database ->
val initColor = try {
enableSwitchView.isChecked = true
Color.parseColor(database.customColor)
} catch (e: Exception) {
enableSwitchView.isChecked = false
DEFAULT_COLOR
}
arguments?.putInt(ARG_INITIAL_COLOR, initColor)
}
if (chromaColorFragment == null) { if (chromaColorFragment == null) {
chromaColorFragment = newInstance(arguments) chromaColorFragment = newInstance(arguments)
fragmentManager.beginTransaction().apply { fragmentManager.beginTransaction().apply {
@@ -76,22 +66,6 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
} }
alertDialogBuilder.setPositiveButton(android.R.string.ok) { _, _ -> alertDialogBuilder.setPositiveButton(android.R.string.ok) { _, _ ->
val currentColor = chromaColorFragment!!.currentColor
val customColorEnable = enableSwitchView.isChecked
onColorSelectedListener?.invoke(customColorEnable, currentColor)
mDatabase?.let { database ->
val newColor = if (customColorEnable) {
ChromaUtil.getFormattedColorString(currentColor, false)
} else {
""
}
val oldColor = database.customColor
database.customColor = newColor
saveColor(oldColor, newColor)
}
onDialogClosed(true) onDialogClosed(true)
dismiss() dismiss()
} }
@@ -112,8 +86,38 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
return dialog return dialog
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDatabaseRetrieved(database: Database?) {
// Nothing here super.onDatabaseRetrieved(database)
database?.let {
val initColor = try {
enableSwitchView.isChecked = true
Color.parseColor(it.customColor)
} catch (e: Exception) {
enableSwitchView.isChecked = false
DEFAULT_COLOR
}
arguments?.putInt(ARG_INITIAL_COLOR, initColor)
}
}
override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) {
val currentColor = chromaColorFragment!!.currentColor
val customColorEnable = enableSwitchView.isChecked
onColorSelectedListener?.invoke(customColorEnable, currentColor)
database?.let {
val newColor = if (customColorEnable) {
ChromaUtil.getFormattedColorString(currentColor, false)
} else {
""
}
val oldColor = database.customColor
database.customColor = newColor
saveColor(oldColor, newColor)
}
}
} }
/** /**

View File

@@ -24,6 +24,7 @@ import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm
import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter
@@ -31,6 +32,8 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat
: DatabaseSavePreferenceDialogFragmentCompat(), : DatabaseSavePreferenceDialogFragmentCompat(),
ListRadioItemAdapter.RadioItemSelectedCallback<CompressionAlgorithm> { ListRadioItemAdapter.RadioItemSelectedCallback<CompressionAlgorithm> {
private var mRecyclerView: RecyclerView? = null
private var mCompressionAdapter: ListRadioItemAdapter<CompressionAlgorithm>? = null
private var compressionSelected: CompressionAlgorithm? = null private var compressionSelected: CompressionAlgorithm? = null
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
@@ -38,25 +41,31 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat
setExplanationText(R.string.database_data_compression_summary) setExplanationText(R.string.database_data_compression_summary)
val recyclerView = view.findViewById<RecyclerView>(R.id.pref_dialog_list) mRecyclerView = view.findViewById(R.id.pref_dialog_list)
recyclerView.layoutManager = LinearLayoutManager(context) mRecyclerView?.layoutManager = LinearLayoutManager(context)
activity?.let { activity -> activity?.let { activity ->
val compressionAdapter = ListRadioItemAdapter<CompressionAlgorithm>(activity) mCompressionAdapter = ListRadioItemAdapter<CompressionAlgorithm>(activity)
compressionAdapter.setRadioItemSelectedCallback(this) mCompressionAdapter?.setRadioItemSelectedCallback(this)
recyclerView.adapter = compressionAdapter
mDatabase?.let { database ->
compressionSelected = database.compressionAlgorithm
compressionAdapter.setItems(database.availableCompressionAlgorithms, compressionSelected)
}
} }
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
setExplanationText(R.string.database_data_compression_summary)
mRecyclerView?.adapter = mCompressionAdapter
database?.let {
compressionSelected = it.compressionAlgorithm
mCompressionAdapter?.setItems(it.availableCompressionAlgorithms, compressionSelected)
}
}
override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
if (compressionSelected != null) { if (compressionSelected != null) {
val newCompression = compressionSelected val newCompression = compressionSelected
val oldCompression = database.compressionAlgorithm val oldCompression = database.compressionAlgorithm

View File

@@ -20,18 +20,18 @@
package com.kunzisoft.keepass.settings.preferencedialogfragment package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle import android.os.Bundle
import android.view.View import com.kunzisoft.keepass.database.element.Database
class DatabaseDefaultUsernamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseDefaultUsernamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) { override fun onDatabaseRetrieved(database: Database?) {
super.onBindDialogView(view) super.onDatabaseRetrieved(database)
inputText = database?.defaultUsername?: ""
inputText = mDatabase?.defaultUsername?: ""
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
mDatabase?.let { database -> super.onDialogClosed(database, positiveResult)
database?.let {
if (positiveResult) { if (positiveResult) {
val newDefaultUsername = inputText val newDefaultUsername = inputText
val oldDefaultUsername = database.defaultUsername val oldDefaultUsername = database.defaultUsername

View File

@@ -20,18 +20,18 @@
package com.kunzisoft.keepass.settings.preferencedialogfragment package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle import android.os.Bundle
import android.view.View import com.kunzisoft.keepass.database.element.Database
class DatabaseDescriptionPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseDescriptionPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) { override fun onDatabaseRetrieved(database: Database?) {
super.onBindDialogView(view) super.onDatabaseRetrieved(database)
inputText = database?.description ?: ""
inputText = mDatabase?.description ?: ""
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
mDatabase?.let { database -> super.onDialogClosed(database, positiveResult)
database?.let {
if (positiveResult) { if (positiveResult) {
val newDescription = inputText val newDescription = inputText
val oldDescription = database.description val oldDescription = database.description

View File

@@ -25,12 +25,15 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter
class DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat class DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat
: DatabaseSavePreferenceDialogFragmentCompat(), : DatabaseSavePreferenceDialogFragmentCompat(),
ListRadioItemAdapter.RadioItemSelectedCallback<EncryptionAlgorithm> { ListRadioItemAdapter.RadioItemSelectedCallback<EncryptionAlgorithm> {
private var mRecyclerView: RecyclerView? = null
private var mEncryptionAlgorithmAdapter: ListRadioItemAdapter<EncryptionAlgorithm>? = null
private var algorithmSelected: EncryptionAlgorithm? = null private var algorithmSelected: EncryptionAlgorithm? = null
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
@@ -38,25 +41,28 @@ class DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat
setExplanationText(R.string.encryption_explanation) setExplanationText(R.string.encryption_explanation)
val recyclerView = view.findViewById<RecyclerView>(R.id.pref_dialog_list) mRecyclerView = view.findViewById(R.id.pref_dialog_list)
recyclerView.layoutManager = LinearLayoutManager(context) mRecyclerView?.layoutManager = LinearLayoutManager(context)
activity?.let { activity -> activity?.let { activity ->
val encryptionAlgorithmAdapter = ListRadioItemAdapter<EncryptionAlgorithm>(activity) mEncryptionAlgorithmAdapter = ListRadioItemAdapter(activity)
encryptionAlgorithmAdapter.setRadioItemSelectedCallback(this) mEncryptionAlgorithmAdapter?.setRadioItemSelectedCallback(this)
recyclerView.adapter = encryptionAlgorithmAdapter mRecyclerView?.adapter = mEncryptionAlgorithmAdapter
mDatabase?.let { database ->
algorithmSelected = database.encryptionAlgorithm
encryptionAlgorithmAdapter.setItems(database.availableEncryptionAlgorithms, algorithmSelected)
}
} }
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
database?.let {
algorithmSelected = database.encryptionAlgorithm
mEncryptionAlgorithmAdapter?.setItems(database.availableEncryptionAlgorithms, algorithmSelected)
}
}
override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
if (algorithmSelected != null) { if (algorithmSelected != null) {
val newAlgorithm = algorithmSelected val newAlgorithm = algorithmSelected
val oldAlgorithm = database.encryptionAlgorithm val oldAlgorithm = database.encryptionAlgorithm

View File

@@ -26,6 +26,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter
class DatabaseKeyDerivationPreferenceDialogFragmentCompat class DatabaseKeyDerivationPreferenceDialogFragmentCompat
@@ -33,6 +34,7 @@ class DatabaseKeyDerivationPreferenceDialogFragmentCompat
ListRadioItemAdapter.RadioItemSelectedCallback<KdfEngine> { ListRadioItemAdapter.RadioItemSelectedCallback<KdfEngine> {
private var kdfEngineSelected: KdfEngine? = null private var kdfEngineSelected: KdfEngine? = null
private var mKdfAdapter: ListRadioItemAdapter<KdfEngine>? = null
private var roundPreference: Preference? = null private var roundPreference: Preference? = null
private var memoryPreference: Preference? = null private var memoryPreference: Preference? = null
private var parallelismPreference: Preference? = null private var parallelismPreference: Preference? = null
@@ -46,20 +48,24 @@ class DatabaseKeyDerivationPreferenceDialogFragmentCompat
recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.layoutManager = LinearLayoutManager(context)
activity?.let { activity -> activity?.let { activity ->
val kdfAdapter = ListRadioItemAdapter<KdfEngine>(activity) mKdfAdapter = ListRadioItemAdapter(activity)
kdfAdapter.setRadioItemSelectedCallback(this) mKdfAdapter?.setRadioItemSelectedCallback(this)
recyclerView.adapter = kdfAdapter recyclerView.adapter = mKdfAdapter
mDatabase?.let { database ->
kdfEngineSelected = database.kdfEngine
kdfAdapter.setItems(database.availableKdfEngines, kdfEngineSelected)
}
} }
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
database?.let {
kdfEngineSelected = database.kdfEngine
mKdfAdapter?.setItems(database.availableKdfEngines, kdfEngineSelected)
}
}
override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
if (database.allowKdfModification) { if (database.allowKdfModification) {
val newKdfEngine = kdfEngineSelected val newKdfEngine = kdfEngineSelected
val oldKdfEngine = database.kdfEngine val oldKdfEngine = database.kdfEngine

View File

@@ -22,14 +22,18 @@ package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
class MaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
super.onBindDialogView(view) super.onBindDialogView(view)
setExplanationText(R.string.max_history_items_summary) setExplanationText(R.string.max_history_items_summary)
mDatabase?.historyMaxItems?.let { maxItemsDatabase -> }
override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
database?.historyMaxItems?.let { maxItemsDatabase ->
inputText = maxItemsDatabase.toString() inputText = maxItemsDatabase.toString()
setSwitchAction({ isChecked -> setSwitchAction({ isChecked ->
inputText = if (!isChecked) { inputText = if (!isChecked) {
@@ -42,9 +46,10 @@ class MaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDial
} }
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
var maxHistoryItems: Int = try { var maxHistoryItems: Int = try {
inputText.toInt() inputText.toInt()
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
@@ -70,8 +75,8 @@ class MaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDial
const val DEFAULT_MAX_HISTORY_ITEMS = 10 const val DEFAULT_MAX_HISTORY_ITEMS = 10
const val NONE_MAX_HISTORY_ITEMS = -1 const val NONE_MAX_HISTORY_ITEMS = -1
fun newInstance(key: String): MaxHistoryItemsPreferenceDialogFragmentCompat { fun newInstance(key: String): DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat {
val fragment = MaxHistoryItemsPreferenceDialogFragmentCompat() val fragment = DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat()
val bundle = Bundle(1) val bundle = Bundle(1)
bundle.putString(ARG_KEY, key) bundle.putString(ARG_KEY, key)
fragment.arguments = bundle fragment.arguments = bundle

View File

@@ -22,19 +22,23 @@ package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.utils.DataByte import com.kunzisoft.keepass.utils.DataByte
class MaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseMaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
private var dataByte = DataByte(2L, DataByte.ByteFormat.MEBIBYTE) private var dataByte = DataByte(2L, DataByte.ByteFormat.MEBIBYTE)
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
super.onBindDialogView(view) super.onBindDialogView(view)
setExplanationText(R.string.max_history_size_summary) setExplanationText(R.string.max_history_size_summary)
mDatabase?.historyMaxSize?.let { maxItemsDatabase -> }
override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
database?.historyMaxSize?.let { maxItemsDatabase ->
dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE) dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE)
.toBetterByteFormat() .toBetterByteFormat()
inputText = dataByte.number.toString() inputText = dataByte.number.toString()
if (dataByte.number >= 0) { if (dataByte.number >= 0) {
setUnitText(dataByte.format.stringId) setUnitText(dataByte.format.stringId)
@@ -54,13 +58,13 @@ class MaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialo
} }
showInputText(isChecked) showInputText(isChecked)
}, maxItemsDatabase > INFINITE_MAX_HISTORY_SIZE) }, maxItemsDatabase > INFINITE_MAX_HISTORY_SIZE)
} }
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
val maxHistorySize: Long = try { val maxHistorySize: Long = try {
inputText.toLong() inputText.toLong()
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
@@ -92,8 +96,8 @@ class MaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialo
private val INFINITE_MAX_HISTORY_SIZE_DATA_BYTE = DataByte(INFINITE_MAX_HISTORY_SIZE, DataByte.ByteFormat.MEBIBYTE) private val INFINITE_MAX_HISTORY_SIZE_DATA_BYTE = DataByte(INFINITE_MAX_HISTORY_SIZE, DataByte.ByteFormat.MEBIBYTE)
private val DEFAULT_MAX_HISTORY_SIZE_DATA_BYTE = DataByte(6L, DataByte.ByteFormat.MEBIBYTE) private val DEFAULT_MAX_HISTORY_SIZE_DATA_BYTE = DataByte(6L, DataByte.ByteFormat.MEBIBYTE)
fun newInstance(key: String): MaxHistorySizePreferenceDialogFragmentCompat { fun newInstance(key: String): DatabaseMaxHistorySizePreferenceDialogFragmentCompat {
val fragment = MaxHistorySizePreferenceDialogFragmentCompat() val fragment = DatabaseMaxHistorySizePreferenceDialogFragmentCompat()
val bundle = Bundle(1) val bundle = Bundle(1)
bundle.putString(ARG_KEY, key) bundle.putString(ARG_KEY, key)
fragment.arguments = bundle fragment.arguments = bundle

View File

@@ -22,27 +22,32 @@ package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.utils.DataByte import com.kunzisoft.keepass.utils.DataByte
class MemoryUsagePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseMemoryUsagePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
private var dataByte = DataByte(MIN_MEMORY_USAGE, DataByte.ByteFormat.BYTE) private var dataByte = DataByte(MIN_MEMORY_USAGE, DataByte.ByteFormat.BYTE)
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
super.onBindDialogView(view) super.onBindDialogView(view)
setExplanationText(R.string.memory_usage_explanation) setExplanationText(R.string.memory_usage_explanation)
val memoryBytes = mDatabase?.memoryUsage ?: MIN_MEMORY_USAGE
dataByte = DataByte(memoryBytes, DataByte.ByteFormat.BYTE)
.toBetterByteFormat()
inputText = dataByte.number.toString()
setUnitText(dataByte.format.stringId)
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
database?.let {
val memoryBytes = database.memoryUsage
dataByte = DataByte(memoryBytes, DataByte.ByteFormat.BYTE)
.toBetterByteFormat()
inputText = dataByte.number.toString()
setUnitText(dataByte.format.stringId)
}
}
override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
var newMemoryUsage: Long = try { var newMemoryUsage: Long = try {
inputText.toLong() inputText.toLong()
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
@@ -70,8 +75,8 @@ class MemoryUsagePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFr
const val MIN_MEMORY_USAGE = 1L const val MIN_MEMORY_USAGE = 1L
fun newInstance(key: String): MemoryUsagePreferenceDialogFragmentCompat { fun newInstance(key: String): DatabaseMemoryUsagePreferenceDialogFragmentCompat {
val fragment = MemoryUsagePreferenceDialogFragmentCompat() val fragment = DatabaseMemoryUsagePreferenceDialogFragmentCompat()
val bundle = Bundle(1) val bundle = Bundle(1)
bundle.putString(ARG_KEY, key) bundle.putString(ARG_KEY, key)
fragment.arguments = bundle fragment.arguments = bundle

View File

@@ -20,19 +20,19 @@
package com.kunzisoft.keepass.settings.preferencedialogfragment package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle import android.os.Bundle
import android.view.View import com.kunzisoft.keepass.database.element.Database
class DatabaseNamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseNamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) { override fun onDatabaseRetrieved(database: Database?) {
super.onBindDialogView(view) super.onDatabaseRetrieved(database)
inputText = database?.name ?: ""
inputText = mDatabase?.name ?: ""
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
val newName = inputText val newName = inputText
val oldName = database.name val oldName = database.name
database.name = newName database.name = newName

View File

@@ -22,19 +22,23 @@ package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
class ParallelismPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseParallelismPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
super.onBindDialogView(view) super.onBindDialogView(view)
setExplanationText(R.string.parallelism_explanation) setExplanationText(R.string.parallelism_explanation)
inputText = mDatabase?.parallelism?.toString() ?: MIN_PARALLELISM.toString()
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
inputText = database?.parallelism?.toString() ?: MIN_PARALLELISM.toString()
}
override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
val parallelism: Long = try { val parallelism: Long = try {
inputText.toLong() inputText.toLong()
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
@@ -53,8 +57,8 @@ class ParallelismPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFr
const val MIN_PARALLELISM = 1L const val MIN_PARALLELISM = 1L
fun newInstance(key: String): ParallelismPreferenceDialogFragmentCompat { fun newInstance(key: String): DatabaseParallelismPreferenceDialogFragmentCompat {
val fragment = ParallelismPreferenceDialogFragmentCompat() val fragment = DatabaseParallelismPreferenceDialogFragmentCompat()
val bundle = Bundle(1) val bundle = Bundle(1)
bundle.putString(ARG_KEY, key) bundle.putString(ARG_KEY, key)
fragment.arguments = bundle fragment.arguments = bundle

View File

@@ -24,6 +24,7 @@ import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.Group
import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter
@@ -31,6 +32,7 @@ class DatabaseRecycleBinGroupPreferenceDialogFragmentCompat
: DatabaseSavePreferenceDialogFragmentCompat(), : DatabaseSavePreferenceDialogFragmentCompat(),
ListRadioItemAdapter.RadioItemSelectedCallback<Group> { ListRadioItemAdapter.RadioItemSelectedCallback<Group> {
private var mGroupsAdapter: ListRadioItemAdapter<Group>? = null
private var mGroupRecycleBin: Group? = null private var mGroupRecycleBin: Group? = null
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
@@ -40,14 +42,17 @@ class DatabaseRecycleBinGroupPreferenceDialogFragmentCompat
recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.layoutManager = LinearLayoutManager(context)
activity?.let { activity -> activity?.let { activity ->
val groupsAdapter = ListRadioItemAdapter<Group>(activity) mGroupsAdapter = ListRadioItemAdapter(activity)
groupsAdapter.setRadioItemSelectedCallback(this) mGroupsAdapter?.setRadioItemSelectedCallback(this)
recyclerView.adapter = groupsAdapter recyclerView.adapter = mGroupsAdapter
}
}
mDatabase?.let { database -> override fun onDatabaseRetrieved(database: Database?) {
mGroupRecycleBin = database.recycleBin super.onDatabaseRetrieved(database)
groupsAdapter.setItems(database.getAllGroupsWithoutRoot(), mGroupRecycleBin) database?.let {
} mGroupRecycleBin = database.recycleBin
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupRecycleBin)
} }
} }
@@ -55,9 +60,10 @@ class DatabaseRecycleBinGroupPreferenceDialogFragmentCompat
mGroupRecycleBin = item mGroupRecycleBin = item
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
if (database.allowConfigurableRecycleBin) { if (database.allowConfigurableRecycleBin) {
val oldGroup = database.recycleBin val oldGroup = database.recycleBin
val newGroup = mGroupRecycleBin val newGroup = mGroupRecycleBin

View File

@@ -23,6 +23,7 @@ import android.os.Bundle
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.view.View import android.view.View
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
class DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
@@ -36,8 +37,9 @@ class DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat : DatabaseSavePre
}.toString() }.toString()
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
mDatabase?.let { _ -> super.onDialogClosed(database, positiveResult)
database?.let {
if (positiveResult) { if (positiveResult) {
removeUnlinkedData() removeUnlinkedData()
} }

View File

@@ -23,19 +23,23 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
class RoundsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() { class DatabaseRoundsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
super.onBindDialogView(view) super.onBindDialogView(view)
explanationText = getString(R.string.rounds_explanation) explanationText = getString(R.string.rounds_explanation)
inputText = mDatabase?.numberKeyEncryptionRounds?.toString() ?: MIN_ITERATIONS.toString()
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDatabaseRetrieved(database: Database?) {
super.onDatabaseRetrieved(database)
inputText = database?.numberKeyEncryptionRounds?.toString() ?: MIN_ITERATIONS.toString()
}
override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
var rounds: Long = try { var rounds: Long = try {
inputText.toLong() inputText.toLong()
} catch (e: NumberFormatException) { } catch (e: NumberFormatException) {
@@ -63,8 +67,8 @@ class RoundsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmen
const val MIN_ITERATIONS = 1L const val MIN_ITERATIONS = 1L
fun newInstance(key: String): RoundsPreferenceDialogFragmentCompat { fun newInstance(key: String): DatabaseRoundsPreferenceDialogFragmentCompat {
val fragment = RoundsPreferenceDialogFragmentCompat() val fragment = DatabaseRoundsPreferenceDialogFragmentCompat()
val bundle = Bundle(1) val bundle = Bundle(1)
bundle.putString(ARG_KEY, key) bundle.putString(ARG_KEY, key)
fragment.arguments = bundle fragment.arguments = bundle

View File

@@ -21,7 +21,6 @@ package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.kunzisoft.keepass.activities.DatabaseRetrieval import com.kunzisoft.keepass.activities.DatabaseRetrieval
import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm
@@ -38,31 +37,43 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat
private var mDatabaseAutoSaveEnable = true private var mDatabaseAutoSaveEnable = true
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
protected var mDatabase: Database? = null private var mDatabase: Database? = null
override fun onAttach(context: Context) { override fun onAttach(context: Context) {
super.onAttach(context) super.onAttach(context)
this.mDatabaseAutoSaveEnable = PreferencesUtil.isAutoSaveDatabaseEnabled(context) this.mDatabaseAutoSaveEnable = PreferencesUtil.isAutoSaveDatabaseEnabled(context)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onCreate(savedInstanceState)
mDatabaseViewModel.database.observe(this) { database ->
mDatabaseViewModel.database.observe(viewLifecycleOwner) { database ->
onDatabaseRetrieved(database) onDatabaseRetrieved(database)
} }
} }
override fun onResume() {
super.onResume()
onDatabaseRetrieved(mDatabase)
}
override fun onDatabaseRetrieved(database: Database?) { override fun onDatabaseRetrieved(database: Database?) {
this.mDatabase = database 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( override fun onDatabaseActionFinished(
database: Database, database: Database,
actionTask: String, actionTask: String,
result: ActionRunnable.Result result: ActionRunnable.Result
) { ) {
// Optional // Not used
} }
protected fun saveColor(oldColor: String, protected fun saveColor(oldColor: String,

View File

@@ -24,6 +24,7 @@ import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.Group
import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter
@@ -31,6 +32,7 @@ class DatabaseTemplatesGroupPreferenceDialogFragmentCompat
: DatabaseSavePreferenceDialogFragmentCompat(), : DatabaseSavePreferenceDialogFragmentCompat(),
ListRadioItemAdapter.RadioItemSelectedCallback<Group> { ListRadioItemAdapter.RadioItemSelectedCallback<Group> {
private var mGroupsAdapter: ListRadioItemAdapter<Group>? = null
private var mGroupTemplates: Group? = null private var mGroupTemplates: Group? = null
override fun onBindDialogView(view: View) { override fun onBindDialogView(view: View) {
@@ -40,14 +42,17 @@ class DatabaseTemplatesGroupPreferenceDialogFragmentCompat
recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.layoutManager = LinearLayoutManager(context)
activity?.let { activity -> activity?.let { activity ->
val groupsAdapter = ListRadioItemAdapter<Group>(activity) mGroupsAdapter = ListRadioItemAdapter(activity)
groupsAdapter.setRadioItemSelectedCallback(this) mGroupsAdapter?.setRadioItemSelectedCallback(this)
recyclerView.adapter = groupsAdapter recyclerView.adapter = mGroupsAdapter
}
}
mDatabase?.let { database -> override fun onDatabaseRetrieved(database: Database?) {
mGroupTemplates = database.templatesGroup super.onDatabaseRetrieved(database)
groupsAdapter.setItems(database.getAllGroupsWithoutRoot(), mGroupTemplates) database?.let {
} mGroupTemplates = database.templatesGroup
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupTemplates)
} }
} }
@@ -55,9 +60,10 @@ class DatabaseTemplatesGroupPreferenceDialogFragmentCompat
mGroupTemplates = item mGroupTemplates = item
} }
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(database: Database?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)
if (positiveResult) { if (positiveResult) {
mDatabase?.let { database -> database?.let {
if (database.allowConfigurableTemplatesGroup) { if (database.allowConfigurableTemplatesGroup) {
val oldGroup = database.templatesGroup val oldGroup = database.templatesGroup
val newGroup = mGroupTemplates val newGroup = mGroupTemplates