Add max history preferences

This commit is contained in:
J-Jamet
2019-09-19 17:53:32 +02:00
parent ffb547c452
commit d0dd478ac8
10 changed files with 261 additions and 47 deletions

View File

@@ -112,9 +112,6 @@ class Database {
return pwDatabaseV4?.kdfEngine ?: return KdfFactory.aesKdf
}
val numberKeyEncryptionRoundsAsString: String
get() = numberKeyEncryptionRounds.toString()
var numberKeyEncryptionRounds: Long
get() = pwDatabaseV3?.numberKeyEncryptionRounds ?: pwDatabaseV4?.numberKeyEncryptionRounds ?: 0
@Throws(NumberFormatException::class)
@@ -123,9 +120,6 @@ class Database {
pwDatabaseV4?.numberKeyEncryptionRounds = numberRounds
}
val memoryUsageAsString: String
get() = memoryUsage.toString()
var memoryUsage: Long
get() {
return pwDatabaseV4?.memoryUsage ?: return KdfEngine.UNKNOWN_VALUE.toLong()
@@ -134,9 +128,6 @@ class Database {
pwDatabaseV4?.memoryUsage = memory
}
val parallelismAsString: String
get() = parallelism.toString()
var parallelism: Int
get() = pwDatabaseV4?.parallelism ?: KdfEngine.UNKNOWN_VALUE
set(parallelism) {
@@ -161,6 +152,22 @@ class Database {
return null
}
var historyMaxItems: Int
get() {
return pwDatabaseV4?.historyMaxItems ?: 0
}
set(value) {
pwDatabaseV4?.historyMaxItems = value
}
var historyMaxSize: Long
get() {
return pwDatabaseV4?.historyMaxSize ?: 0
}
set(value) {
pwDatabaseV4?.historyMaxSize = value
}
/**
* Determine if RecycleBin is available or not for this version of database
* @return true if RecycleBin available
@@ -708,14 +715,14 @@ class Database {
pwDatabaseV4?.let {
val history = entry.getHistory()
val maxItems = it.historyMaxItems
val maxItems = historyMaxItems
if (maxItems >= 0) {
while (history.size > maxItems) {
entry.removeOldestEntryFromHistory()
}
}
val maxSize = it.historyMaxSize
val maxSize = historyMaxSize
if (maxSize >= 0) {
while (true) {
var historySize: Long = 0

View File

@@ -74,7 +74,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
activity?.let { activity ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val autoFillEnablePreference: SwitchPreference? = findPreference<SwitchPreference>(getString(R.string.settings_autofill_enable_key))
val autoFillEnablePreference: SwitchPreference? = findPreference(getString(R.string.settings_autofill_enable_key))
if (autoFillEnablePreference != null) {
val autofillManager = activity.getSystemService(AutofillManager::class.java)
autoFillEnablePreference.isChecked = autofillManager != null
@@ -139,7 +139,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
setPreferencesFromResource(R.xml.preferences_form_filling, rootKey)
activity?.let { activity ->
val autoFillEnablePreference: SwitchPreference? = findPreference<SwitchPreference>(getString(R.string.settings_autofill_enable_key))
val autoFillEnablePreference: SwitchPreference? = findPreference(getString(R.string.settings_autofill_enable_key))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val autofillManager = activity.getSystemService(AutofillManager::class.java)
if (autofillManager != null && autofillManager.hasEnabledAutofillServices())
@@ -217,7 +217,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
setPreferencesFromResource(R.xml.preferences_advanced_unlock, rootKey)
activity?.let { activity ->
val biometricUnlockEnablePreference: SwitchPreference? = findPreference<SwitchPreference>(getString(R.string.biometric_unlock_enable_key))
val biometricUnlockEnablePreference: SwitchPreference? = findPreference(getString(R.string.biometric_unlock_enable_key))
// < M solve verifyError exception
var biometricUnlockSupported = false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@@ -240,7 +240,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
}
}
val deleteKeysFingerprints: Preference? = findPreference<Preference>(getString(R.string.biometric_delete_all_key_key))
val deleteKeysFingerprints: Preference? = findPreference(getString(R.string.biometric_delete_all_key_key))
if (!biometricUnlockSupported) {
deleteKeysFingerprints?.isEnabled = false
} else {
@@ -338,10 +338,10 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
if (mDatabase.loaded) {
val dbGeneralPrefCategory: PreferenceCategory? = findPreference<PreferenceCategory>(getString(R.string.database_general_key))
val dbGeneralPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_general_key))
// Db name
val dbNamePref: InputTextPreference? = findPreference<InputTextPreference>(getString(R.string.database_name_key))
val dbNamePref: InputTextPreference? = findPreference(getString(R.string.database_name_key))
if (mDatabase.containsName()) {
dbNamePref?.summary = mDatabase.name
} else {
@@ -349,15 +349,27 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
}
// Db description
val dbDescriptionPref: InputTextPreference? = findPreference<InputTextPreference>(getString(R.string.database_description_key))
val dbDescriptionPref: InputTextPreference? = findPreference(getString(R.string.database_description_key))
if (mDatabase.containsDescription()) {
dbDescriptionPref?.summary = mDatabase.description
} else {
dbGeneralPrefCategory?.removePreference(dbDescriptionPref)
}
// Version
findPreference<Preference>(getString(R.string.database_version_key))
?.summary = mDatabase.getVersion()
// Max history items
findPreference<InputNumberPreference>(getString(R.string.max_history_items_key))
?.summary = mDatabase.historyMaxItems.toString()
// Max history size
findPreference<InputNumberPreference>(getString(R.string.max_history_size_key))
?.summary = mDatabase.historyMaxSize.toString()
// Recycle bin
val recycleBinPref: SwitchPreference? = findPreference<SwitchPreference>(getString(R.string.recycle_bin_key))
val recycleBinPref: SwitchPreference? = findPreference(getString(R.string.recycle_bin_key))
// TODO Recycle
dbGeneralPrefCategory?.removePreference(recycleBinPref) // To delete
if (mDatabase.isRecycleBinAvailable) {
@@ -367,10 +379,6 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
dbGeneralPrefCategory?.removePreference(recycleBinPref)
}
// Version
findPreference<Preference>(getString(R.string.database_version_key))
?.summary = mDatabase.getVersion()
// Encryption Algorithm
findPreference<DialogListExplanationPreference>(getString(R.string.encryption_algorithm_key))
?.summary = mDatabase.getEncryptionAlgorithmName(resources)
@@ -380,16 +388,16 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
?.summary = mDatabase.getKeyDerivationName(resources)
// Round encryption
mRoundPref = findPreference<InputNumberPreference>(getString(R.string.transform_rounds_key))
mRoundPref?.summary = mDatabase.numberKeyEncryptionRoundsAsString
mRoundPref = findPreference(getString(R.string.transform_rounds_key))
mRoundPref?.summary = mDatabase.numberKeyEncryptionRounds.toString()
// Memory Usage
mMemoryPref = findPreference<InputNumberPreference>(getString(R.string.memory_usage_key))
mMemoryPref?.summary = mDatabase.memoryUsageAsString
mMemoryPref = findPreference(getString(R.string.memory_usage_key))
mMemoryPref?.summary = mDatabase.memoryUsage.toString()
// Parallelism
mParallelismPref = findPreference<InputNumberPreference>(getString(R.string.parallelism_key))
mParallelismPref?.summary = mDatabase.parallelismAsString
mParallelismPref = findPreference(getString(R.string.parallelism_key))
mParallelismPref?.summary = mDatabase.parallelism.toString()
} else {
Log.e(javaClass.name, "Database isn't ready")
@@ -397,7 +405,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
}
private fun allowCopyPassword() {
val copyPasswordPreference: SwitchPreference? = findPreference<SwitchPreference>(getString(R.string.allow_copy_password_key))
val copyPasswordPreference: SwitchPreference? = findPreference(getString(R.string.allow_copy_password_key))
copyPasswordPreference?.setOnPreferenceChangeListener { _, newValue ->
if (newValue as Boolean && context != null) {
val message = getString(R.string.allow_copy_password_warning) +
@@ -461,6 +469,12 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
preference.key == getString(R.string.database_description_key) -> {
dialogFragment = DatabaseDescriptionPreferenceDialogFragmentCompat.newInstance(preference.key)
}
preference.key == getString(R.string.max_history_items_key) -> {
dialogFragment = MaxHistoryItemsPreferenceDialogFragmentCompat.newInstance(preference.key)
}
preference.key == getString(R.string.max_history_size_key) -> {
dialogFragment = MaxHistorySizePreferenceDialogFragmentCompat.newInstance(preference.key)
}
preference.key == getString(R.string.encryption_algorithm_key) -> {
dialogFragment = DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat.newInstance(preference.key)
}

View File

@@ -0,0 +1,84 @@
/*
* Copyright 2019 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle
import android.view.View
import android.widget.Toast
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.tasks.ActionRunnable
class MaxHistoryItemsPreferenceDialogFragmentCompat : InputDatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) {
super.onBindDialogView(view)
inputText = database?.historyMaxItems?.toString() ?: "0"
}
override fun onDialogClosed(positiveResult: Boolean) {
if (database != null && positiveResult) {
var maxHistoryItems: Int
try {
maxHistoryItems = inputText.toInt()
} catch (e: NumberFormatException) {
Toast.makeText(context, R.string.error_rounds_not_number, Toast.LENGTH_LONG).show() // TODO change error
return
}
if (maxHistoryItems < 1) {
maxHistoryItems = 1
}
val oldMaxHistoryItems = database!!.historyMaxItems
database!!.historyMaxItems = maxHistoryItems
actionInUIThreadAfterSaveDatabase = AfterMaxHistoryItemsSave(maxHistoryItems, oldMaxHistoryItems)
}
super.onDialogClosed(positiveResult)
}
private inner class AfterMaxHistoryItemsSave(private val mNewMaxHistoryItems: Int,
private val mOldMaxHistoryItems: Int)
: ActionRunnable() {
override fun onFinishRun(result: Result) {
var maxHistoryItemsToShow = mOldMaxHistoryItems
if (!result.isSuccess) {
maxHistoryItemsToShow = mNewMaxHistoryItems
database?.historyMaxItems = mNewMaxHistoryItems
}
preference.summary = maxHistoryItemsToShow.toString()
}
}
companion object {
fun newInstance(key: String): MaxHistoryItemsPreferenceDialogFragmentCompat {
val fragment = MaxHistoryItemsPreferenceDialogFragmentCompat()
val bundle = Bundle(1)
bundle.putString(ARG_KEY, key)
fragment.arguments = bundle
return fragment
}
}
}

View File

@@ -0,0 +1,86 @@
/*
* Copyright 2019 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.settings.preferencedialogfragment
import android.os.Bundle
import android.view.View
import android.widget.Toast
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.tasks.ActionRunnable
class MaxHistorySizePreferenceDialogFragmentCompat : InputDatabaseSavePreferenceDialogFragmentCompat() {
override fun onBindDialogView(view: View) {
super.onBindDialogView(view)
inputText = database?.historyMaxSize?.toString() ?: "0"
}
override fun onDialogClosed(positiveResult: Boolean) {
if (positiveResult) {
database?.let { database ->
var maxHistorySize: Long
try {
maxHistorySize = inputText.toLong()
} catch (e: NumberFormatException) {
Toast.makeText(context, R.string.error_rounds_not_number, Toast.LENGTH_LONG).show() // TODO change error
return
}
if (maxHistorySize < 1) {
maxHistorySize = 1
}
val oldMaxHistorySize = database.historyMaxSize
database.historyMaxSize = maxHistorySize
actionInUIThreadAfterSaveDatabase = AfterMaxHistorySizeSave(maxHistorySize, oldMaxHistorySize)
}
}
super.onDialogClosed(positiveResult)
}
private inner class AfterMaxHistorySizeSave(private val mNewMaxHistorySize: Long,
private val mOldMaxHistorySize: Long)
: ActionRunnable() {
override fun onFinishRun(result: Result) {
var maxHistorySizeToShow = mNewMaxHistorySize
if (!result.isSuccess) {
maxHistorySizeToShow = mOldMaxHistorySize
database?.historyMaxSize = mOldMaxHistorySize
}
preference.summary = maxHistorySizeToShow.toString()
}
}
companion object {
fun newInstance(key: String): MaxHistorySizePreferenceDialogFragmentCompat {
val fragment = MaxHistorySizePreferenceDialogFragmentCompat()
val bundle = Bundle(1)
bundle.putString(ARG_KEY, key)
fragment.arguments = bundle
return fragment
}
}
}

View File

@@ -31,15 +31,14 @@ class MemoryUsagePreferenceDialogFragmentCompat : InputDatabaseSavePreferenceDia
super.onBindDialogView(view)
setExplanationText(R.string.memory_usage_explanation)
inputText = database?.memoryUsageAsString ?: ""
inputText = database?.memoryUsage?.toString()?: "0"
}
override fun onDialogClosed(positiveResult: Boolean) {
if (database != null && positiveResult) {
var memoryUsage: Long
try {
val stringMemory = inputText
memoryUsage = java.lang.Long.parseLong(stringMemory)
memoryUsage = inputText.toLong()
} catch (e: NumberFormatException) {
Toast.makeText(context, R.string.error_rounds_not_number, Toast.LENGTH_LONG).show() // TODO change error
return

View File

@@ -31,15 +31,14 @@ class ParallelismPreferenceDialogFragmentCompat : InputDatabaseSavePreferenceDia
super.onBindDialogView(view)
setExplanationText(R.string.parallelism_explanation)
inputText = database?.parallelismAsString ?: ""
inputText = database?.parallelism?.toString() ?: "0"
}
override fun onDialogClosed(positiveResult: Boolean) {
if (database != null && positiveResult) {
var parallelism: Int
try {
val stringParallelism = inputText
parallelism = Integer.parseInt(stringParallelism)
parallelism = inputText.toInt()
} catch (e: NumberFormatException) {
Toast.makeText(context, R.string.error_rounds_not_number, Toast.LENGTH_LONG).show() // TODO change error
return

View File

@@ -31,15 +31,14 @@ class RoundsPreferenceDialogFragmentCompat : InputDatabaseSavePreferenceDialogFr
super.onBindDialogView(view)
explanationText = getString(R.string.rounds_explanation)
inputText = database?.numberKeyEncryptionRoundsAsString ?: ""
inputText = database?.numberKeyEncryptionRounds?.toString() ?: "0"
}
override fun onDialogClosed(positiveResult: Boolean) {
if (database != null && positiveResult) {
var rounds: Long
try {
val strRounds = inputText
rounds = java.lang.Long.parseLong(strRounds)
rounds = inputText.toLong()
} catch (e: NumberFormatException) {
Toast.makeText(context, R.string.error_rounds_not_number, Toast.LENGTH_LONG).show()
return

View File

@@ -149,12 +149,17 @@
<!-- Database Settings -->
<string name="settings_database_key" translatable="false">settings_database_key</string>
<string name="settings_database_change_credentials_key" translatable="false">settings_database_change_credentials_key</string>
<string name="database_general_key" translatable="false">database_general_key</string>
<string name="database_general_key" translatable="false">database_general_key</string>
<string name="database_name_key" translatable="false">database_name_key</string>
<string name="database_description_key" translatable="false">database_description_key</string>
<string name="recycle_bin_key" translatable="false">recycle_bin_key</string>
<string name="database_version_key" translatable="false">database_version_key</string>
<string name="database_history_key" translatable="false">database_history_key</string>
<string name="max_history_items_key" translatable="false">max_history_items_key</string>
<string name="max_history_size_key" translatable="false">max_history_size_key</string>
<string name="recycle_bin_key" translatable="false">recycle_bin_key</string>
<string name="encryption_algorithm_key" translatable="false">algorithm</string>
<string name="key_derivation_function_key" translatable="false">key_derivation_function_key</string>
<string name="transform_rounds_key" translatable="false">transform_rounds_key</string>

View File

@@ -289,6 +289,8 @@
<string name="full_file_path_enable_summary">View the full file path</string>
<string name="recycle_bin_title">Use recycle bin</string>
<string name="recycle_bin_summary">Moves groups and entries to \"Recycle bin\" before deleting</string>
<string name="max_history_items_title">Max. history items</string>
<string name="max_history_size_title">Max. history size</string>
<string name="monospace_font_fields_enable_title">Field font</string>
<string name="monospace_font_fields_enable_summary">Change font used in fields for better character visibility</string>
<string name="auto_open_file_uri_title">Open files by selecting</string>

View File

@@ -36,12 +36,6 @@
android:title="@string/database_description_title"
android:positiveButtonText="@string/entry_save"
android:negativeButtonText="@string/entry_cancel"/>
<SwitchPreference
android:key="@string/recycle_bin_key"
android:persistent="false"
android:title="@string/recycle_bin_title"
android:summary="@string/recycle_bin_summary"
android:checked="false"/>
<Preference
android:key="@string/database_version_key"
android:persistent="false"
@@ -49,6 +43,31 @@
</PreferenceCategory>
<PreferenceCategory
android:key="@string/database_history_key"
android:title="@string/entry_history">
<com.kunzisoft.keepass.settings.preference.InputNumberPreference
android:key="@string/max_history_items_key"
android:persistent="false"
android:title="@string/max_history_items_title"
android:positiveButtonText="@string/entry_save"
android:negativeButtonText="@string/entry_cancel"/>
<com.kunzisoft.keepass.settings.preference.InputNumberPreference
android:key="@string/max_history_size_key"
android:persistent="false"
android:title="@string/max_history_size_title"
android:positiveButtonText="@string/entry_save"
android:negativeButtonText="@string/entry_cancel"/>
<SwitchPreference
android:key="@string/recycle_bin_key"
android:persistent="false"
android:title="@string/recycle_bin_title"
android:summary="@string/recycle_bin_summary"
android:checked="false"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/encryption">