Merge branch 'feature/Check_Broken_Link' into develop

This commit is contained in:
J-Jamet
2020-02-23 13:33:56 +01:00
52 changed files with 348 additions and 320 deletions

View File

@@ -8,10 +8,15 @@
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.USE_BIOMETRIC" />
<uses-permission
android:name="android.permission.VIBRATE"/>
<uses-permission
android:maxSdkVersion="18"
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:label="@string/app_name"

View File

@@ -34,6 +34,7 @@ import android.widget.ProgressBar
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.google.android.material.appbar.CollapsingToolbarLayout
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper
@@ -60,11 +61,13 @@ import com.kunzisoft.keepass.utils.UriUtil
import com.kunzisoft.keepass.utils.createDocument
import com.kunzisoft.keepass.utils.onCreateDocumentResult
import com.kunzisoft.keepass.view.EntryContentsView
import com.kunzisoft.keepass.view.showActionError
import java.util.*
import kotlin.collections.HashMap
class EntryActivity : LockingActivity() {
private var coordinatorLayout: CoordinatorLayout? = null
private var collapsingToolbarLayout: CollapsingToolbarLayout? = null
private var titleIconView: ImageView? = null
private var historyView: View? = null
@@ -114,6 +117,7 @@ class EntryActivity : LockingActivity() {
invalidateOptionsMenu()
// Get views
coordinatorLayout = findViewById(R.id.toolbar_coordinator)
collapsingToolbarLayout = findViewById(R.id.toolbar_layout)
titleIconView = findViewById(R.id.entry_icon)
historyView = findViewById(R.id.history_container)
@@ -137,7 +141,7 @@ class EntryActivity : LockingActivity() {
finish()
}
}
// TODO Visual error for entry history
coordinatorLayout?.showActionError(result)
}
}

View File

@@ -29,13 +29,15 @@ import android.view.View
import android.widget.ScrollView
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.google.android.material.snackbar.Snackbar
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.SetOTPDialogFragment
import com.kunzisoft.keepass.activities.dialogs.GeneratePasswordDialogFragment
import com.kunzisoft.keepass.activities.dialogs.IconPickerDialogFragment
import com.kunzisoft.keepass.activities.dialogs.SetOTPDialogFragment
import com.kunzisoft.keepass.activities.lock.LockingActivity
import com.kunzisoft.keepass.database.element.*
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.DateInstant
import com.kunzisoft.keepass.database.element.Entry
import com.kunzisoft.keepass.database.element.Group
import com.kunzisoft.keepass.database.element.icon.IconImage
import com.kunzisoft.keepass.database.element.node.NodeId
import com.kunzisoft.keepass.education.EntryEditActivityEducation
@@ -49,7 +51,7 @@ import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.view.EntryEditContentsView
import com.kunzisoft.keepass.view.asError
import com.kunzisoft.keepass.view.showActionError
import java.util.*
class EntryEditActivity : LockingActivity(),
@@ -188,15 +190,7 @@ class EntryEditActivity : LockingActivity(),
finish()
}
}
// Show error
if (!result.isSuccess) {
result.message?.let { resultMessage ->
Snackbar.make(coordinatorLayout!!,
resultMessage,
Snackbar.LENGTH_LONG).asError().show()
}
}
coordinatorLayout?.showActionError(result)
}
}

View File

@@ -52,6 +52,7 @@ import com.kunzisoft.keepass.database.action.ProgressDialogThread
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.education.FileDatabaseSelectActivityEducation
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_CREATE_TASK
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.utils.*
import com.kunzisoft.keepass.view.asError
import kotlinx.android.synthetic.main.activity_file_selection.*
@@ -274,12 +275,28 @@ class FileDatabaseSelectActivity : StylishActivity(),
updateExternalStorageWarning()
// Construct adapter with listeners
mFileDatabaseHistoryAction?.getAllFileDatabaseHistories { databaseFileHistoryList ->
databaseFileHistoryList?.let {
mAdapterDatabaseHistory?.addDatabaseFileHistoryList(it)
updateFileListVisibility()
mAdapterDatabaseHistory?.notifyDataSetChanged()
if (PreferencesUtil.showRecentFiles(this)) {
mFileDatabaseHistoryAction?.getAllFileDatabaseHistories { databaseFileHistoryList ->
databaseFileHistoryList?.let { historyList ->
val hideBrokenLocations = PreferencesUtil.hideBrokenLocations(this@FileDatabaseSelectActivity)
mAdapterDatabaseHistory?.addDatabaseFileHistoryList(
// Show only uri accessible
historyList.filter {
if (hideBrokenLocations) {
UriUtil.parse(it.databaseUri)?.let { historyUri ->
UriUtil.isUriAccessible(contentResolver, historyUri)
} ?: false
} else
true
})
mAdapterDatabaseHistory?.notifyDataSetChanged()
updateFileListVisibility()
}
}
} else {
mAdapterDatabaseHistory?.clearDatabaseFileHistoryList()
mAdapterDatabaseHistory?.notifyDataSetChanged()
updateFileListVisibility()
}
// Register progress task

View File

@@ -76,6 +76,7 @@ import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.view.AddNodeButtonView
import com.kunzisoft.keepass.view.ToolbarAction
import com.kunzisoft.keepass.view.asError
import com.kunzisoft.keepass.view.showActionError
class GroupActivity : LockingActivity(),
GroupEditDialogFragment.EditGroupListener,
@@ -251,15 +252,7 @@ class GroupActivity : LockingActivity(),
}
}
if (!result.isSuccess) {
coordinatorLayout?.let { coordinatorLayout ->
result.exception?.errorId?.let { errorId ->
Snackbar.make(coordinatorLayout, errorId, Snackbar.LENGTH_LONG).asError().show()
} ?: result.message?.let { message ->
Snackbar.make(coordinatorLayout, message, Snackbar.LENGTH_LONG).asError().show()
}
}
}
coordinatorLayout?.showActionError(result)
finishNodeAction()

View File

@@ -24,7 +24,6 @@ import android.app.assist.AssistStructure
import android.app.backup.BackupManager
import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
@@ -33,16 +32,15 @@ import android.preference.PreferenceManager
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.*
import android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import android.widget.*
import android.widget.Button
import android.widget.CompoundButton
import android.widget.EditText
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.widget.Toolbar
import androidx.biometric.BiometricManager
import androidx.core.app.ActivityCompat
import com.google.android.material.snackbar.Snackbar
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.DuplicateUuidDialog
@@ -74,11 +72,10 @@ import com.kunzisoft.keepass.view.asError
import kotlinx.android.synthetic.main.activity_password.*
import java.io.FileNotFoundException
class PasswordActivity : StylishActivity() {
open class PasswordActivity : StylishActivity() {
// Views
private var toolbar: Toolbar? = null
private var containerView: View? = null
private var filenameView: TextView? = null
private var passwordView: EditText? = null
@@ -88,18 +85,28 @@ class PasswordActivity : StylishActivity() {
private var checkboxKeyFileView: CompoundButton? = null
private var checkboxDefaultDatabaseView: CompoundButton? = null
private var advancedUnlockInfoView: AdvancedUnlockInfoView? = null
private var infoContainerView: ViewGroup? = null
private var enableButtonOnCheckedChangeListener: CompoundButton.OnCheckedChangeListener? = null
private var mDatabaseFileUri: Uri? = null
private var mDatabaseKeyFileUri: Uri? = null
private var prefs: SharedPreferences? = null
private var mSharedPreferences: SharedPreferences? = null
private var mRememberKeyFile: Boolean = false
private var mOpenFileHelper: OpenFileHelper? = null
private var mPermissionAsked = false
private var readOnly: Boolean = false
private var mForceReadOnly: Boolean = false
set(value) {
infoContainerView?.visibility = if (value) {
readOnly = true
View.VISIBLE
} else {
View.GONE
}
field = value
}
private var mProgressDialogThread: ProgressDialogThread? = null
@@ -108,9 +115,9 @@ class PasswordActivity : StylishActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
prefs = PreferenceManager.getDefaultSharedPreferences(this)
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
mRememberKeyFile = PreferencesUtil.rememberKeyFiles(this)
mRememberKeyFile = PreferencesUtil.rememberKeyFileLocations(this)
setContentView(R.layout.activity_password)
@@ -121,7 +128,7 @@ class PasswordActivity : StylishActivity() {
supportActionBar?.setDisplayShowHomeEnabled(true)
containerView = findViewById(R.id.container)
confirmButtonView = findViewById(R.id.pass_ok)
confirmButtonView = findViewById(R.id.activity_password_open_button)
filenameView = findViewById(R.id.filename)
passwordView = findViewById(R.id.password)
keyFileView = findViewById(R.id.pass_keyfile)
@@ -129,8 +136,8 @@ class PasswordActivity : StylishActivity() {
checkboxKeyFileView = findViewById(R.id.keyfile_checkox)
checkboxDefaultDatabaseView = findViewById(R.id.default_database)
advancedUnlockInfoView = findViewById(R.id.biometric_info)
infoContainerView = findViewById(R.id.activity_password_info_container)
mPermissionAsked = savedInstanceState?.getBoolean(KEY_PERMISSION_ASKED) ?: mPermissionAsked
readOnly = ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrPreference(this, savedInstanceState)
val browseView = findViewById<View>(R.id.open_database_button)
@@ -180,6 +187,7 @@ class PasswordActivity : StylishActivity() {
removePassword()
if (result.isSuccess) {
setEmptyViews()
launchGroupActivity()
} else {
var resultError = ""
@@ -281,7 +289,6 @@ class PasswordActivity : StylishActivity() {
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putBoolean(KEY_PERMISSION_ASKED, mPermissionAsked)
ReadOnlyHelper.onSaveInstanceState(outState, readOnly)
super.onSaveInstanceState(outState)
}
@@ -302,6 +309,8 @@ class PasswordActivity : StylishActivity() {
keyFileUri = intent.getParcelableExtra(KEY_KEYFILE)
}
mForceReadOnly = UriUtil.isUriNotWritable(contentResolver, databaseUri)
// Post init uri with KeyFile if needed
if (mRememberKeyFile && (keyFileUri == null || keyFileUri.toString().isEmpty())) {
// Retrieve KeyFile in a thread
@@ -340,7 +349,7 @@ class PasswordActivity : StylishActivity() {
newDefaultFileName = databaseFileUri ?: newDefaultFileName
}
prefs?.edit()?.apply {
mSharedPreferences?.edit()?.apply {
newDefaultFileName?.let {
putString(KEY_DEFAULT_DATABASE_PATH, newDefaultFileName.toString())
} ?: kotlin.run {
@@ -355,7 +364,7 @@ class PasswordActivity : StylishActivity() {
confirmButtonView?.setOnClickListener { verifyCheckboxesAndLoadDatabase() }
// Retrieve settings for default database
val defaultFilename = prefs?.getString(KEY_DEFAULT_DATABASE_PATH, "")
val defaultFilename = mSharedPreferences?.getString(KEY_DEFAULT_DATABASE_PATH, "")
if (databaseFileUri != null
&& databaseFileUri.path != null && databaseFileUri.path!!.isNotEmpty()
&& databaseFileUri == UriUtil.parse(defaultFilename)) {
@@ -551,7 +560,12 @@ class PasswordActivity : StylishActivity() {
val inflater = menuInflater
// Read menu
inflater.inflate(R.menu.open_file, menu)
changeOpenFileReadIcon(menu.findItem(R.id.menu_open_file_read_mode_key))
if (mForceReadOnly) {
menu.removeItem(R.id.menu_open_file_read_mode_key)
} else {
changeOpenFileReadIcon(menu.findItem(R.id.menu_open_file_read_mode_key))
}
MenuUtil.defaultMenuInflater(inflater, menu)
@@ -562,45 +576,14 @@ class PasswordActivity : StylishActivity() {
super.onCreateOptionsMenu(menu)
launchEducation(menu) {
launchCheckPermission()
}
launchEducation(menu)
return true
}
// Check permission
private fun launchCheckPermission() {
val writePermission = android.Manifest.permission.WRITE_EXTERNAL_STORAGE
val permissions = arrayOf(writePermission)
if (Build.VERSION.SDK_INT >= 23
&& !readOnly
&& !mPermissionAsked) {
mPermissionAsked = true
// Check self permission to show or not the dialog
if (toolbar != null
&& ActivityCompat.checkSelfPermission(this, writePermission) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissions, WRITE_EXTERNAL_STORAGE_REQUEST)
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
WRITE_EXTERNAL_STORAGE_REQUEST -> {
if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE))
Toast.makeText(this, R.string.read_only_warning, Toast.LENGTH_LONG).show()
}
}
}
}
// To fix multiple view education
private var performedEductionInProgress = false
private fun launchEducation(menu: Menu, onEducationFinished: ()-> Unit) {
private fun launchEducation(menu: Menu, onEducationFinished: (()-> Unit)? = null) {
if (!performedEductionInProgress) {
performedEductionInProgress = true
// Show education views
@@ -610,7 +593,7 @@ class PasswordActivity : StylishActivity() {
private fun performedNextEducation(passwordActivityEducation: PasswordActivityEducation,
menu: Menu,
onEducationFinished: ()-> Unit) {
onEducationFinished: (()-> Unit)? = null) {
val educationToolbar = toolbar
val unlockEducationPerformed = educationToolbar != null
&& passwordActivityEducation.checkAndPerformedUnlockEducation(
@@ -650,7 +633,7 @@ class PasswordActivity : StylishActivity() {
})
if (!biometricEducationPerformed) {
onEducationFinished.invoke()
onEducationFinished?.invoke()
}
}
}
@@ -727,10 +710,6 @@ class PasswordActivity : StylishActivity() {
private const val KEY_PASSWORD = "password"
private const val KEY_LAUNCH_IMMEDIATELY = "launchImmediately"
private const val KEY_PERMISSION_ASKED = "KEY_PERMISSION_ASKED"
private const val WRITE_EXTERNAL_STORAGE_REQUEST = 647
private fun buildAndLaunchIntent(activity: Activity, databaseFile: Uri, keyFile: Uri?,
intentBuildLauncher: (Intent) -> Unit) {
val intent = Intent(activity, PasswordActivity::class.java)

View File

@@ -20,6 +20,8 @@
package com.kunzisoft.keepass.adapters
import android.content.Context
import android.graphics.Color
import android.graphics.PorterDuff
import androidx.annotation.ColorInt
import androidx.recyclerview.widget.RecyclerView
import android.util.TypedValue
@@ -82,15 +84,26 @@ class FileDatabaseHistoryAdapter(private val context: Context)
// File path
holder.filePath.text = UriUtil.decode(fileDatabaseInfo.fileUri?.toString())
holder.filePreciseInfoContainer.visibility = if (fileDatabaseInfo.found()) {
// Modification
holder.fileModification.text = fileDatabaseInfo.getModificationString()
// Size
holder.fileSize.text = fileDatabaseInfo.getSizeString()
if (fileDatabaseInfo.dataAccessible()) {
holder.fileInformation.clearColorFilter()
} else {
holder.fileInformation.setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY)
}
View.VISIBLE
} else
View.GONE
// Modification
if (fileDatabaseInfo.lastModificationAccessible()) {
holder.fileModification.text = fileDatabaseInfo.getModificationString()
holder.fileModification.visibility = View.VISIBLE
} else {
holder.fileModification.visibility = View.GONE
}
// Size
if (fileDatabaseInfo.sizeAccessible()) {
holder.fileSize.text = fileDatabaseInfo.getSizeString()
holder.fileSize.visibility = View.VISIBLE
} else {
holder.fileSize.visibility = View.GONE
}
// Click on information
val isExpanded = position == mExpandedPosition
@@ -142,6 +155,10 @@ class FileDatabaseHistoryAdapter(private val context: Context)
return listDatabaseFiles.size
}
fun clearDatabaseFileHistoryList() {
listDatabaseFiles.clear()
}
fun addDatabaseFileHistoryList(listFileDatabaseHistoryToAdd: List<FileDatabaseHistoryEntity>) {
listDatabaseFiles.clear()
listDatabaseFiles.addAll(listFileDatabaseHistoryToAdd)
@@ -178,7 +195,6 @@ class FileDatabaseHistoryAdapter(private val context: Context)
var fileModifyButton: ImageView = itemView.findViewById(R.id.file_modify_button)
var fileDeleteButton: ImageView = itemView.findViewById(R.id.file_delete_button)
var filePath: TextView = itemView.findViewById(R.id.file_path)
var filePreciseInfoContainer: ViewGroup = itemView.findViewById(R.id.file_precise_info_container)
var fileModification: TextView = itemView.findViewById(R.id.file_modification)
var fileSize: TextView = itemView.findViewById(R.id.file_size)
}

View File

@@ -24,6 +24,7 @@ import android.net.Uri
import android.util.Log
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.settings.PreferencesUtil
class CreateDatabaseRunnable(context: Context,
private val mDatabase: Database,
@@ -57,8 +58,11 @@ class CreateDatabaseRunnable(context: Context,
if (result.isSuccess) {
// Add database to recent files
FileDatabaseHistoryAction.getInstance(context.applicationContext)
.addOrUpdateDatabaseUri(mDatabaseUri, mKeyFile)
if (PreferencesUtil.rememberDatabaseLocations(context)) {
FileDatabaseHistoryAction.getInstance(context.applicationContext)
.addOrUpdateDatabaseUri(mDatabaseUri,
if (PreferencesUtil.rememberKeyFileLocations(context)) mKeyFile else null)
}
} else {
Log.e("CreateDatabaseRunnable", "Unable to create the database")
}

View File

@@ -74,14 +74,10 @@ class LoadDatabaseRunnable(private val context: Context,
override fun onFinishRun() {
if (result.isSuccess) {
// Save keyFile in app database
val rememberKeyFile = PreferencesUtil.rememberKeyFiles(context)
if (rememberKeyFile) {
var keyUri = mKey
if (!rememberKeyFile) {
keyUri = null
}
if (PreferencesUtil.rememberDatabaseLocations(context)) {
FileDatabaseHistoryAction.getInstance(context)
.addOrUpdateDatabaseUri(mUri, keyUri)
.addOrUpdateDatabaseUri(mUri,
if (PreferencesUtil.rememberKeyFileLocations(context)) mKey else null)
}
// Register the biometric

View File

@@ -75,16 +75,16 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
activity?.let { activity ->
allowCopyPassword()
findPreference<Preference>(getString(R.string.keyfile_key))?.setOnPreferenceChangeListener { _, newValue ->
findPreference<Preference>(getString(R.string.remember_database_locations_key))?.setOnPreferenceChangeListener { _, newValue ->
if (!(newValue as Boolean)) {
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAllKeyFiles()
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAll()
}
true
}
findPreference<Preference>(getString(R.string.recentfile_key))?.setOnPreferenceChangeListener { _, newValue ->
findPreference<Preference>(getString(R.string.remember_keyfile_locations_key))?.setOnPreferenceChangeListener { _, newValue ->
if (!(newValue as Boolean)) {
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAll()
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAllKeyFiles()
}
true
}

View File

@@ -28,10 +28,28 @@ import java.util.*
object PreferencesUtil {
fun rememberKeyFiles(context: Context): Boolean {
fun rememberDatabaseLocations(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.keyfile_key),
context.resources.getBoolean(R.bool.keyfile_default))
return prefs.getBoolean(context.getString(R.string.remember_database_locations_key),
context.resources.getBoolean(R.bool.remember_database_locations_default))
}
fun showRecentFiles(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.show_recent_files_key),
context.resources.getBoolean(R.bool.show_recent_files_default))
}
fun hideBrokenLocations(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.hide_broken_locations_key),
context.resources.getBoolean(R.bool.hide_broken_locations_default))
}
fun rememberKeyFileLocations(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.remember_keyfile_locations_key),
context.resources.getBoolean(R.bool.remember_keyfile_locations_default))
}
fun omitBackup(context: Context): Boolean {

View File

@@ -27,6 +27,7 @@ import android.net.Uri
import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.app.Fragment
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.AssignMasterKeyDialogFragment
@@ -35,6 +36,7 @@ import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper
import com.kunzisoft.keepass.activities.lock.LockingActivity
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.view.showActionError
open class SettingsActivity
: LockingActivity(),
@@ -43,6 +45,7 @@ open class SettingsActivity
private var backupManager: BackupManager? = null
private var coordinatorLayout: CoordinatorLayout? = null
private var toolbar: Toolbar? = null
companion object {
@@ -74,6 +77,8 @@ open class SettingsActivity
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_toolbar)
coordinatorLayout = findViewById(R.id.toolbar_coordinator)
toolbar = findViewById(R.id.toolbar)
toolbar?.setTitle(R.string.settings)
setSupportActionBar(toolbar)
@@ -92,6 +97,8 @@ open class SettingsActivity
(supportFragmentManager
.findFragmentByTag(TAG_NESTED) as NestedSettingsFragment?)
?.onProgressDialogThreadResult(actionTask, result)
coordinatorLayout?.showActionError(result)
}
}

View File

@@ -98,10 +98,14 @@ class ClipboardHelper(private val context: Context) {
@Throws(ClipboardException::class)
fun cleanClipboard(label: String = "") {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getClipboardManager()?.clearPrimaryClip()
} else {
copyToClipboard(label, "")
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getClipboardManager()?.clearPrimaryClip()
} else {
copyToClipboard(label, "")
}
} catch (e: Exception) {
throw ClipboardException(e)
}
}

View File

@@ -22,8 +22,6 @@ package com.kunzisoft.keepass.utils
import android.content.Context
import android.net.Uri
import android.text.format.Formatter
import androidx.documentfile.provider.DocumentFile
import java.io.File
import java.io.Serializable
import java.text.DateFormat
import java.util.*
@@ -34,7 +32,7 @@ open class FileInfo : Serializable {
var fileUri: Uri?
var filePath: String? = null
var fileName: String? = ""
var lastModification = Date()
var lastModification = Date(0L)
var size: Long = 0L
constructor(context: Context, fileUri: Uri) {
@@ -51,22 +49,11 @@ open class FileInfo : Serializable {
fun init() {
this.filePath = fileUri?.path
if (EXTERNAL_STORAGE_AUTHORITY == fileUri?.authority) {
fileUri?.let { fileUri ->
DocumentFile.fromSingleUri(context, fileUri)?.let { file ->
size = file.length()
fileName = file.name
lastModification = Date(file.lastModified())
}
}
} else {
filePath?.let {
File(it).let { file ->
size = file.length()
fileName = file.name
lastModification = Date(file.lastModified())
}
}
UriUtil.getFileData(context, fileUri)?.let { file ->
size = file.length()
fileName = file.name
lastModification = Date(file.lastModified())
}
if (fileName == null || fileName!!.isEmpty()) {
@@ -74,10 +61,18 @@ open class FileInfo : Serializable {
}
}
fun found(): Boolean {
fun lastModificationAccessible(): Boolean {
return lastModification.after(Date(0L))
}
fun sizeAccessible(): Boolean {
return size != 0L
}
fun dataAccessible(): Boolean {
return UriUtil.isUriAccessible(context.contentResolver, fileUri)
}
fun getModificationString(): String {
return DateFormat.getDateTimeInstance()
.format(lastModification)
@@ -86,9 +81,4 @@ open class FileInfo : Serializable {
fun getSizeString(): String {
return Formatter.formatFileSize(context, size)
}
companion object {
private const val EXTERNAL_STORAGE_AUTHORITY = "com.android.externalstorage.documents"
}
}

View File

@@ -24,29 +24,87 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.util.Log
import android.widget.Toast
import androidx.documentfile.provider.DocumentFile
import com.kunzisoft.keepass.R
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.InputStream
import java.util.*
object UriUtil {
@Throws(FileNotFoundException::class)
fun getUriInputStream(contentResolver: ContentResolver, uri: Uri?): InputStream? {
if (uri == null)
return null
val scheme = uri.scheme
return if (scheme == null || scheme.isEmpty() || scheme == "file") {
FileInputStream(uri.path!!)
} else if (scheme == "content") {
contentResolver.openInputStream(uri)
} else {
null
fun isUriAccessible(contentResolver: ContentResolver, fileUri: Uri?): Boolean {
if (fileUri == null)
return false
return try {
//https://developer.android.com/reference/android/content/res/AssetFileDescriptor
contentResolver.openAssetFileDescriptor(fileUri, "r")?.close()
true
} catch (e: Exception) {
Log.e(UriUtil.javaClass.name, "Unable to access uri $fileUri : ${e.message}")
false
}
}
fun isUriNotWritable(contentResolver: ContentResolver, fileUri: Uri?): Boolean {
if (fileUri == null)
return true
return try {
contentResolver.openAssetFileDescriptor(fileUri, "wa")?.close()
false
} catch (e: Exception) {
Log.e(UriUtil.javaClass.name, "Unable to access uri $fileUri : ${e.message}")
true
}
}
fun getFileData(context: Context, fileUri: Uri?): DocumentFile? {
if (fileUri == null)
return null
return when {
isFileScheme(fileUri) -> {
fileUri.path?.let {
File(it).let { file ->
return DocumentFile.fromFile(file)
}
}
}
isContentScheme(fileUri) -> DocumentFile.fromSingleUri(context, fileUri)
else -> null
}
}
@Throws(FileNotFoundException::class)
fun getUriInputStream(contentResolver: ContentResolver, fileUri: Uri?): InputStream? {
if (fileUri == null)
return null
return when {
isFileScheme(fileUri) -> fileUri.path?.let { FileInputStream(it) }
isContentScheme(fileUri) -> contentResolver.openInputStream(fileUri)
else -> null
}
}
private fun isFileScheme(fileUri: Uri): Boolean {
val scheme = fileUri.scheme
if (scheme == null || scheme.isEmpty() || scheme.toLowerCase(Locale.ENGLISH) == "file") {
return true
}
return false
}
private fun isContentScheme(fileUri: Uri): Boolean {
val scheme = fileUri.scheme
if (scheme != null && scheme.toLowerCase(Locale.ENGLISH) == "content") {
return true
}
return false
}
fun parse(stringUri: String?): Uri? {
return if (stringUri?.isNotEmpty() == true) {
Uri.parse(stringUri)

View File

@@ -29,8 +29,10 @@ import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.google.android.material.snackbar.Snackbar
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.tasks.ActionRunnable
/**
* Replace font by monospace, must be called after seText()
@@ -99,4 +101,14 @@ fun Toolbar.expand(animate: Boolean = true) {
play(slideAnimator)
interpolator = AccelerateDecelerateInterpolator()
}.start()
}
fun CoordinatorLayout.showActionError(result: ActionRunnable.Result) {
if (!result.isSuccess) {
result.exception?.errorId?.let { errorId ->
Snackbar.make(this, errorId, Snackbar.LENGTH_LONG).asError().show()
} ?: result.message?.let { message ->
Snackbar.make(this, message, Snackbar.LENGTH_LONG).asError().show()
}
}
}

View File

@@ -32,7 +32,7 @@
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/pass_ok">
app:layout_constraintBottom_toTopOf="@+id/activity_password_info_container">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
@@ -101,11 +101,10 @@
<androidx.core.widget.NestedScrollView
android:id="@+id/scroll_container"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
android:fillViewport="true">
android:scrollbarStyle="insideOverlay"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
@@ -223,8 +222,36 @@
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<LinearLayout
android:id="@+id/activity_password_info_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/activity_password_open_button">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/activity_password_info_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="24dp"
android:paddingStart="24dp"
android:paddingLeft="24dp"
android:paddingEnd="24dp"
android:paddingRight="24dp"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:text="@string/warning_database_read_only"
android:textColor="?attr/textColorInverse"
android:background="?attr/colorAccent"
app:layout_constraintBottom_toTopOf="@+id/activity_password_info_delimiter"
android:layout_gravity="bottom"/>
<View
android:id="@+id/activity_password_info_delimiter"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/colorAccentLight"/>
</LinearLayout>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/pass_ok"
android:id="@+id/activity_password_open_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"

View File

@@ -17,18 +17,25 @@
You should have received a copy of the GNU General Public License
along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar_default" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent">
</LinearLayout>
<include
android:id="@+id/toolbar"
layout="@layout/toolbar_default" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -186,7 +186,7 @@
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/file_size"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="match_parent"
android:gravity="end|bottom"
android:textColor="?android:attr/textColorHintInverse"

View File

@@ -87,7 +87,6 @@
<string name="progress_create">إنشاء قاعدة بيانات جديدة …</string>
<string name="protection">الحماية</string>
<string name="read_only">للقراءة فقط</string>
<string name="recentfile_summary">تذكر أسماء الملفات المستخدمة مؤخرا</string>
<string name="content_description_remove_from_list">حذف</string>
<string name="root">الجذر</string>
<string name="memory_usage">استخدام الذاكرة</string>
@@ -172,11 +171,8 @@
<string name="omitbackup_title">لا تبحثفي مدخلات النسخ الاحتياطي</string>
<string name="progress_title">قيد العمل…</string>
<string name="read_only_warning">KeePassDX يحتاج صلاحية الكتابة من اجل تعديل قاعدة البيانات.</string>
<string name="remember_keyfile_summary">تذكر موقع ملف المفتاح قاعدة البيانات</string>
<string name="remember_keyfile_title">حفظ الملف المفتاحي</string>
<string name="encryption_explanation">خوارزمية تشفير جميع البيانات.</string>
<string name="unsupported_db_version">قاعدة بيانات غير مدعومة.</string>
<string name="warning_read_only">اسمح بالكتابة على بطاقة الذاكرة لحفظ التغيرات.</string>
<string name="warning_unmounted">اربط بطاقة الذاكرة لإنشاء او تحميل قاعدة بيانات.</string>
<string name="build_label">بناء %1$s</string>
<string name="encrypted_value_stored">تم حفظ كلمة السر المشفرة</string>

View File

@@ -113,8 +113,6 @@
<string name="omitbackup_summary">Omet els grups \'Còpia de seguretat\' i paperera dels resultats de cerca</string>
<string name="progress_create">Creant nova base de dades&#8230;</string>
<string name="progress_title">Treballant&#8230;</string>
<string name="remember_keyfile_summary">Recorda la localització d\'arxius clau</string>
<string name="remember_keyfile_title">Guarda arxiu clau</string>
<string name="content_description_remove_from_list">Elimina</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Arrel</string>

View File

@@ -123,10 +123,6 @@
<string name="progress_title">Zpracování…</string>
<string name="protection">Ochrana</string>
<string name="read_only_warning">Ke změně v databázi potřebuje KeePassDX oprávnění pro zápis.</string>
<string name="recentfile_title">Historie nedávných souborů</string>
<string name="recentfile_summary">Pamatovat si nedávno otevřené soubory</string>
<string name="remember_keyfile_summary">Pamatovat si umístění souborů s klíči</string>
<string name="remember_keyfile_title">Uložit soubor s klíčem</string>
<string name="content_description_remove_from_list">Odstranit</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Kořen</string>
@@ -144,7 +140,6 @@
<string name="unsupported_db_version">Nepodporovaná verze databáze.</string>
<string name="uppercase">Velká písmena</string>
<string name="version_label">Verze %1$s</string>
<string name="warning_read_only">Povolte oprávnění k zápisu na SD kartu, aby bylo možné uložit změny v databázi.</string>
<string name="warning_unmounted">Připojte SD kartu, aby bylo možné vytvořit a otevřít databázi.</string>
<string name="education_unlock_summary">Databázi odemknete zadáním hesla a/nebo souboru s klíčem.
\n

View File

@@ -122,10 +122,6 @@
<string name="progress_title">Arbejder…</string>
<string name="protection">Beskyttelse</string>
<string name="read_only_warning">KeePassDX behøver skrivetilladelse for at ændre i databasen.</string>
<string name="recentfile_title">Seneste filhistorik</string>
<string name="recentfile_summary">Husk de seneste filnavne</string>
<string name="remember_keyfile_summary">Husker placeringen af databasernøglefiler</string>
<string name="remember_keyfile_title">Gem nøglefil</string>
<string name="content_description_remove_from_list">Fjern</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Rod</string>
@@ -142,7 +138,6 @@
<string name="underline">Understregning</string>
<string name="unsupported_db_version">Database-versionen er ikke understøttet.</string>
<string name="uppercase">Store bogstaver</string>
<string name="warning_read_only">Giv SD-kort skrive adgang for at gemme databasen ændringer.</string>
<string name="warning_unmounted">Monter SD-kortet for at oprette eller indlæse en database.</string>
<string name="version_label">Version %1$s</string>
<string name="education_unlock_summary">Angiv en adgangskode og/eller en nøglefil til at låse databasen op.

View File

@@ -127,10 +127,6 @@
<string name="protection">Sicherheit</string>
<string name="read_only">Schreibgeschützt</string>
<string name="read_only_warning">KeePassDX benötigt Schreibrechte, um etwas an der Datenbank zu ändern.</string>
<string name="recentfile_title">Zuletzt verwendete Datenbanken</string>
<string name="recentfile_summary">Zuletzt verwendete Datenbanken merken</string>
<string name="remember_keyfile_summary">Erinnert sich an den Speicherort der Schlüsseldateien der Datenbanken</string>
<string name="remember_keyfile_title">Schlüsselquelle merken</string>
<string name="content_description_remove_from_list">Löschen</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Start</string>
@@ -149,7 +145,6 @@
<string name="uppercase">Großbuchstaben</string>
<string name="warning">Warnung</string>
<string name="warning_password_encoding">Passwortzeichen in der Datenbank vermeiden, die kein Text-Encoding-Format besitzen (nicht erkannte Zeichen werden in denselben Buchstaben umgewandelt).</string>
<string name="warning_read_only">Schreibzugriff auf die SD-Karte gewähren, um Datenbankänderungen speichern zu können.</string>
<string name="warning_unmounted">Die SD-Karte einbinden, um eine Datenbank erstellen oder laden zu können.</string>
<string name="version_label">Version %1$s</string>
<string name="education_unlock_summary">Geben Sie das Passwort und/oder die Schlüsseldatei ein, um Ihre Datenbank zu entsperren.

View File

@@ -122,10 +122,6 @@
<string name="progress_title">Επεξεργασία…</string>
<string name="protection">Προστασία</string>
<string name="read_only_warning">Το KeePassDX χρειάζεται άδεια εγγραφής για να αλλάξει οτιδήποτε στη βάση δεδομένων σας.</string>
<string name="recentfile_title">Πρόσφατο ιστορικό αρχείων</string>
<string name="recentfile_summary">Απομνημόνευση πρόσφατων ονομάτων αρχείων</string>
<string name="remember_keyfile_summary">Απομνημόνευση της τοποθεσίας αρχείων-κλειδιών των βάσεων δεδομένων</string>
<string name="remember_keyfile_title">Αποθήκευση αρχείου-κλειδιού</string>
<string name="content_description_remove_from_list">Αφαίρεση</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Ριζικός Κατάλογος</string>
@@ -190,7 +186,6 @@
<string name="sort_last_access_time">Προσπέλαση</string>
<string name="warning">Προειδοποίηση</string>
<string name="warning_password_encoding">Αποφύγετε τους χαρακτήρες κωδικού πρόσβασης έξω από τη μορφή κωδικοποίησης κειμένου στο αρχείο βάσης δεδομένων (οι μη αναγνωρισμένοι χαρακτήρες μετατρέπονται στο ίδιο γράμμα).</string>
<string name="warning_read_only">Δώστε πρόσβαση εγγραφής στην κάρτα SD για να αποθηκεύσετε τις αλλαγές της βάσης δεδομένων.</string>
<string name="warning_empty_password">Θέλετε πραγματικά να μην έχετε κανέναν κωδικό προστασίας ξεκλειδώματος;</string>
<string name="warning_no_encryption_key">Είστε βέβαιοι ότι δεν θέλετε να χρησιμοποιήσετε κάποιο κλειδί κρυπτογράφησης;</string>
<string name="encrypted_value_stored">Ο Κρυπτογραφημένος κωδικός έχει αποθηκευτεί</string>

View File

@@ -106,15 +106,11 @@
<string name="never">Nunca</string>
<string name="no_results">Sin resultado de búsqueda</string>
<string name="no_url_handler">Instale un navegador web para abrir este URL.</string>
<string name="recentfile_title">Historial de archivos recientes</string>
<string name="recentfile_summary">Recordar nombres de archivos recientes</string>
<string name="open_recent">Bases de datos recientes</string>
<string name="omitbackup_title">No buscar en las entradas de respaldo</string>
<string name="omitbackup_summary">Omite los grupos «Respaldo» y «Papelera de reciclaje» de los resultados de búsqueda</string>
<string name="progress_create">Creando nueva base de datos…</string>
<string name="progress_title">Trabajando…</string>
<string name="remember_keyfile_summary">Recuerda la ubicación de los archivos de clave de bases de datos</string>
<string name="remember_keyfile_title">Guardando archivo de clave</string>
<string name="content_description_remove_from_list">Quitar</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Raíz</string>
@@ -314,7 +310,6 @@
<string name="menu_open_file_read_and_write">Modificable</string>
<string name="build_label">Compilación %1$s</string>
<string name="clipboard_warning">Si la supresión automática del portapapeles falla, borran el historial manualmente.</string>
<string name="warning_read_only">Otorgue permiso de escritura a la tarjeta SD para guardar los cambios en la base de datos.</string>
<string name="allow_copy_password_warning">ATENCIÓN: todas las aplicaciones comparten el portapapeles. Si copia datos confidenciales, otros programas podrían recuperarlos.</string>
<string name="allow_no_password_title">No permitir claves maestras</string>
<string name="allow_no_password_summary">Activar el botón «Abrir» si no se selecciona ninguna credencial</string>

View File

@@ -122,10 +122,6 @@
<string name="progress_create">Datubase berria sortzen…</string>
<string name="progress_title">Lanean…</string>
<string name="protection">Babesa</string>
<string name="recentfile_title">Duela gutxiko fitxategien historia</string>
<string name="recentfile_summary">Gogoratu duela gutxi erabili diren fitxategien izenak</string>
<string name="remember_keyfile_summary">Gogoratu gako fitxategien kokapenak</string>
<string name="remember_keyfile_title">Gako fitxategia gorde</string>
<string name="content_description_remove_from_list">Ezabatu</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Root</string>

View File

@@ -121,10 +121,6 @@
<string name="progress_create">Luodaan uutta tietokantaa&#8230;</string>
<string name="progress_title">Työskennellään&#8230;</string>
<string name="protection">Suojaus</string>
<string name="recentfile_title">Viimeisten tiedostojen lista</string>
<string name="recentfile_summary">Muista viimeksi käytettyjen tiedostojen nimet</string>
<string name="remember_keyfile_summary">Muista avaintiedostojen sijainti</string>
<string name="remember_keyfile_title">Tallenna avaintiedosto</string>
<string name="content_description_remove_from_list">Poista</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Juuri</string>

View File

@@ -132,10 +132,6 @@
<string name="protection">Protection</string>
<string name="read_only">Protégé en écriture</string>
<string name="read_only_warning">Selon votre gestionnaire de fichiers, KeePassDX peut ne pas être autorisé à écrire dans votre stockage.</string>
<string name="recentfile_title">Historique de fichiers récents</string>
<string name="recentfile_summary">Mémorise les noms des fichiers récents</string>
<string name="remember_keyfile_summary">Mémorise lemplacement des fichiers clé des bases de données</string>
<string name="remember_keyfile_title">Enregistrer le fichier clé</string>
<string name="content_description_remove_from_list">Supprimer</string>
<string name="root">Racine</string>
<string name="encryption_explanation">Algorithme de chiffrement de la base de données utilisé pour toutes les données.</string>
@@ -167,7 +163,6 @@
<string name="uppercase">Majuscules</string>
<string name="warning">Alerte</string>
<string name="warning_password_encoding">Éviter les caractères en dehors du format de codage de caractères du fichier de base de données (les caractères non reconnus sont convertis en une même lettre).</string>
<string name="warning_read_only">Accorder laccès en écriture à la mémoire pour enregistrer les modifications de la base de données.</string>
<string name="warning_unmounted">Monter la carte mémoire pour créer ou charger une base de données.</string>
<string name="warning_empty_password">Ne voulez-vous vraiment aucune protection de déverrouillage par mot de passe\?</string>
<string name="warning_no_encryption_key">Êtes-vous sûr de ne vouloir utiliser aucune clé de chiffrement\?</string>

View File

@@ -123,10 +123,6 @@
<string name="protection">Védelem</string>
<string name="read_only">Írásvédett</string>
<string name="read_only_warning">A KeePassDX-nek írási engedélyre van szüksége, hogy bármit is módosíthasson az adatbázisban.</string>
<string name="recentfile_title">Előző fájlok előzményei</string>
<string name="recentfile_summary">Az előző fájlnevek megjegyzése</string>
<string name="remember_keyfile_summary">Megjegyzi az adatbázis-kulcsfájlok helyét</string>
<string name="remember_keyfile_title">Kulcsfájl mentése</string>
<string name="content_description_remove_from_list">Eltávolítás</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Gyökérkönyvár</string>
@@ -212,7 +208,6 @@
<string name="sort_creation_time">Létrehozás</string>
<string name="sort_last_modify_time">Módosítás</string>
<string name="sort_last_access_time">Hozzáférés</string>
<string name="warning_read_only">SD kártya írási jogosultság megadása az adatbázis-változások mentéséhez.</string>
<string name="warning_empty_password">Biztos, hogy nem akar jelszavas feloldási védelmet\?</string>
<string name="warning_no_encryption_key">Biztos, hogy nem akar semmilyen titkosítási kulcsot használni\?</string>
<string name="build_label">Összeállítás: %1$s</string>

View File

@@ -123,10 +123,6 @@
<string name="protection">Protezione</string>
<string name="read_only">Sola lettura</string>
<string name="read_only_warning">KeePassDX richiede l\'autorizzazione di scrittura per poter modificare il tuo database.</string>
<string name="recentfile_title">Cronologia file recenti</string>
<string name="recentfile_summary">Ricorda i file recenti</string>
<string name="remember_keyfile_summary">Ricorda la posizione dei file chiave dei database</string>
<string name="remember_keyfile_title">Salva il file chiave</string>
<string name="content_description_remove_from_list">Elimina</string>
<string name="root">Root</string>
<string name="rounds">Livello cifratura</string>
@@ -143,7 +139,6 @@
<string name="uppercase">Maiuscole</string>
<string name="warning">Attenzione</string>
<string name="warning_password_encoding">Evita password con caratteri al di fuori del formato di codifica del testo nel file di database (i caratteri non riconosciuti vengono convertiti nella stessa lettera).</string>
<string name="warning_read_only">Permetti l\'accesso in scrittura alla scheda SD per salvare le modifiche al database.</string>
<string name="warning_unmounted">Monta la scheda SD per creare o caricare un database.</string>
<string name="version_label">Versione %1$s</string>
<string name="configure_biometric">La scansione di impronte è supportata ma non impostata.</string>

View File

@@ -119,10 +119,6 @@
<string name="progress_title">עובד…</string>
<string name="protection">הגנה</string>
<string name="read_only_warning">ל-KeePassDX אין הרשאות כתיבה למסד הנתונים הזה, ולכן הוא יפתח לקריאה בלבד.</string>
<string name="recentfile_title">היסטוריית קובץ אחרונה</string>
<string name="recentfile_summary">שמור קבצים שהיו בשימוש לאחרונה</string>
<string name="remember_keyfile_summary">זכור מיקום קבצי מפתח</string>
<string name="remember_keyfile_title">שמור קובץ מפתח</string>
<string name="content_description_remove_from_list">הסר</string>
<string name="rounds">סיבובי הצפנה</string>
<string name="rounds_explanation">מספר סיבובי הצפנה גבוה יותר מספר הגה טובה יותר נגד התקפות, אבל יכול להעלות בהרבה את זמן הטעינה והשמירה.</string>

View File

@@ -109,8 +109,6 @@
<string name="omitbackup_summary">\"バックアップ\"と\"ごみ箱\"を検索対象から除外します</string>
<string name="progress_create">データベースファイルを作成中…</string>
<string name="progress_title">実行中…</string>
<string name="remember_keyfile_summary">前回使用したキーファイルを次回も表示します</string>
<string name="remember_keyfile_title">キーファイルを記憶</string>
<string name="content_description_remove_from_list">消去</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Root</string>
@@ -181,8 +179,6 @@
<string name="protection">保護</string>
<string name="read_only">書き込み保護</string>
<string name="read_only_warning">KeePassDX は、データベースを変更するために書き込みアクセス許可が必要です。</string>
<string name="recentfile_title">最近使用したファイルの履歴</string>
<string name="recentfile_summary">最近使用したファイル名を記憶します</string>
<string name="encryption_explanation">すべてのデータで使用するデータベース暗号化アルゴリズム。</string>
<string name="sort_menu">並び順</string>
<string name="sort_ascending">昇順</string>

View File

@@ -145,10 +145,6 @@
<string name="protection">보호</string>
<string name="read_only">쓰기 보호됨</string>
<string name="read_only_warning">KeePassDX는 데이터베이스를 수정하기 위해 쓰기 권한이 필요합니다.</string>
<string name="recentfile_title">최근 파일 기록</string>
<string name="recentfile_summary">최근 파일 이름 기억하기</string>
<string name="remember_keyfile_summary">데이터베이스 키 파일 위치 기억하기</string>
<string name="remember_keyfile_title">키 파일 저장</string>
<string name="content_description_remove_from_list">삭제</string>
<string name="root">루트</string>
<string name="encryption_explanation">데이터베이스 암호화 알고리즘이 모든 데이터에 적용됩니다.</string>

View File

@@ -58,10 +58,6 @@
<string name="warning">Įspėjimas</string>
<string name="select_database_file">Įveskite duomenų bazės failą</string>
<string name="error_wrong_length">Įveskite teigiamą skaičių ilgio lauke</string>
<string name="recentfile_title">Naujausių failų istorija</string>
<string name="recentfile_summary">Atsiminti paskutinius naudotus failų pavadinimus</string>
<string name="remember_keyfile_title">Saugoti rakto failą</string>
<string name="remember_keyfile_summary">Atsimena rakto failų vietą</string>
<string name="content_description_remove_from_list">Pašalinti</string>
<string name="root">Šaknis</string>
<string name="read_only">Tik skaitymui</string>

View File

@@ -101,10 +101,6 @@
<string name="progress_create">Izveido jaunu datu bāzi…</string>
<string name="progress_title">Darbojas…</string>
<string name="protection">Aizsardzība</string>
<string name="recentfile_title">Nesen atvērtie</string>
<string name="recentfile_summary">Glabāt atvērto failu nosaukumus</string>
<string name="remember_keyfile_summary">Atcerēties šo atslēgas faila vietu</string>
<string name="remember_keyfile_title">Saglabāt atslēgas failu</string>
<string name="content_description_remove_from_list">Noņemt</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Root</string>

View File

@@ -144,10 +144,6 @@
<string name="protection">Beskyttelse</string>
<string name="read_only">Skrivebeskyttet</string>
<string name="read_only_warning">KeePassDX har ikke skrivetilgang til din databaseplassering, så den vil bli åpnet skrivebeskyttet.</string>
<string name="recentfile_title">Nylig filhistorikk</string>
<string name="recentfile_summary">Husk nylig brukte filnavn</string>
<string name="remember_keyfile_summary">Husk nøkkelfilers plassering</string>
<string name="remember_keyfile_title">Lagre nøkkelfil</string>
<string name="content_description_remove_from_list">Fjern</string>
<string name="root">Rot</string>
<string name="encryption_explanation">Algoritme for å kryptere hele databasen. (Passord, brukernavn, merknader og all data i databasen er kryptert med valgt algoritme).</string>
@@ -179,7 +175,6 @@
<string name="uppercase">Store bokstaver</string>
<string name="warning">Advarsel</string>
<string name="warning_password_encoding">Unngå passordtegn utenfor tekstkodingsformat i databasefil (ukjente tegn blir konvertert til samme bokstav).</string>
<string name="warning_read_only">SD-kortet ditt er i øyeblikket skrivebeskyttet. Det kan hende du ikke kan lagre endringer i databasen din.</string>
<string name="warning_unmounted">SD-kortet ditt er ikke montert på enheten din. Du vil ikke kunne laste inne eller opprette din database.</string>
<string name="warning_empty_password">Ønsker du virkelig å bruke en tom streng som ditt passord?</string>
<string name="warning_no_encryption_key">Er du sikker på at du ønsker å bruke en krypteringsnøkkel?</string>

View File

@@ -111,8 +111,6 @@
<string name="omitbackup_summary">Hiermee worden groepen \"Back-up\" en \"Prullenbak\" uit de zoekresultaten weggelaten</string>
<string name="progress_create">Bezig met creëren van nieuwe databank…</string>
<string name="progress_title">Bezig met verwerken…</string>
<string name="remember_keyfile_summary">Locatie van databank-sleutelbestanden onthouden</string>
<string name="remember_keyfile_title">Sleutelbestand opslaan</string>
<string name="content_description_remove_from_list">Verwijderen</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Hoofdmap</string>
@@ -128,7 +126,6 @@
<string name="underline">Onderstrepen</string>
<string name="unsupported_db_version">Niet-ondersteunde databankversie.</string>
<string name="uppercase">Hoofdletters</string>
<string name="warning_read_only">Machtig schrijftoegang om de databankwijzigingen op ge slaan.</string>
<string name="warning_unmounted">Koppel de SD-kaart aan om een databank te creëren of laden.</string>
<string name="version_label">Versie %1$s</string>
<string name="education_unlock_summary">Geef het wachtwoord en/of sleutelbestand op om je databank te ontgrendelen.
@@ -185,8 +182,8 @@
<string name="protection">Beveiliging</string>
<string name="read_only">Alleen-lezen</string>
<string name="read_only_warning">KeePassDX moet worden gemachtigd om je databank te kunnen aanpassen.</string>
<string name="recentfile_title">Recente bestandgeschiedenis</string>
<string name="recentfile_summary">Recent gebruikte bestandsnamen onthouden</string>
<string name="show_recent_files_title">Recente bestandgeschiedenis</string>
<string name="show_recent_files_summary">Recent gebruikte bestandsnamen onthouden</string>
<string name="encryption_explanation">Het algoritme dat moet worden gebruikt om de gehele databank te versleutelen.</string>
<string name="kdf_explanation">Om de sleutel voor het algoritme te kunnen genereren, wordt de hoofdsleutel getransformeerd middels een willekeurige afleidingsfunctie.</string>
<string name="memory_usage">Geheugengebruik</string>

View File

@@ -110,8 +110,6 @@
<string name="omitbackup_summary">Søkjeresultatet inneheld ikkje oppføringar frå \'Backup\' eller søppelbøtta</string>
<string name="progress_create">Lager ny database …</string>
<string name="progress_title">Arbeider …</string>
<string name="remember_keyfile_summary">Hugsar staden til nøkkelfilene</string>
<string name="remember_keyfile_title">Lagra nøkkelfila</string>
<string name="content_description_remove_from_list">Ta vekk</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Rot</string>

View File

@@ -108,10 +108,6 @@
<string name="omitbackup_summary">Pomija grupy „Kopia zapasowa” i „Kosz” w wynikach wyszukiwania</string>
<string name="progress_create">Tworzenie nowej bazy danych…</string>
<string name="progress_title">Pracuję…</string>
<string name="recentfile_title">Najnowsza historia plików</string>
<string name="recentfile_summary">Zapamiętaj najnowsze nazwy plików</string>
<string name="remember_keyfile_summary">Zapamiętuje lokalizację plików kluczy baz danych</string>
<string name="remember_keyfile_title">Zapisz plik klucza</string>
<string name="content_description_remove_from_list">Usuń</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Root</string>
@@ -127,7 +123,6 @@
<string name="underline">Podkreślenie</string>
<string name="unsupported_db_version">Nieobsługiwana wersja bazy danych.</string>
<string name="uppercase">Wielkie litery</string>
<string name="warning_read_only">Przydziel dostęp do zapisu na karcie SD, aby zapisać zmiany w bazie danych.</string>
<string name="warning_unmounted">Zamontuj kartę SD, aby utworzyć lub załadować bazę danych.</string>
<string name="education_unlock_summary">prowadź hasło i/lub plik klucza, aby odblokować bazę danych.
\n

View File

@@ -109,8 +109,6 @@
<string name="omitbackup_summary">Omite os grupos \"Backup\" e \"Lixeira\" dos resultados da busca</string>
<string name="progress_create">Criando novo banco de dados…</string>
<string name="progress_title">Trabalhando…</string>
<string name="remember_keyfile_summary">Lembra o local dos arquivos-chave dos bancos de dados</string>
<string name="remember_keyfile_title">Salvar arquivo de chave</string>
<string name="content_description_remove_from_list">Remover</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Raiz</string>
@@ -177,8 +175,8 @@
<string name="protection">Proteção</string>
<string name="read_only">Apenas leitura</string>
<string name="read_only_warning">KeePassDX precisa de permissões de escrita para poder mudar qualquer coisa no seu banco.</string>
<string name="recentfile_title">Histórico de arquivos recentes</string>
<string name="recentfile_summary">Lembrar nomes recentes de arquivos</string>
<string name="show_recent_files_title">Histórico de arquivos recentes</string>
<string name="show_recent_files_summary">Lembrar nomes recentes de arquivos</string>
<string name="encryption_explanation">Algoritmo de encriptação usado para todos os dados.</string>
<string name="kdf_explanation">Para gerar uma chave para o algoritmo de encriptação, a chave mestre é transformada usando uma função de derivação de chave.</string>
<string name="memory_usage">Uso de memória</string>
@@ -321,7 +319,6 @@
<string name="icon_pack_choose_title">Pacote de ícones</string>
<string name="icon_pack_choose_summary">Pacote de ícones usado no aplicativo</string>
<string name="edit_entry">Editar entrada</string>
<string name="warning_read_only">Conceda acesso de escrita ao cartão SD para salvar alterações do banco.</string>
<string name="error_load_database">Falha ao carregar o banco.</string>
<string name="error_load_database_KDF_memory">Não pôde carregar a chave. Tente diminuir o \"Uso de Memória\" do KDF.</string>
<string name="list_entries_show_username_title">Mostrar nomes de usuário</string>

View File

@@ -124,10 +124,6 @@
<string name="protection">Proteção</string>
<string name="read_only">Apenas leitura</string>
<string name="read_only_warning">KeePassDX precisa de permissões de escrita para poder mudar qualquer coisa no seu banco.</string>
<string name="recentfile_title">Histórico de ficheiros recentes</string>
<string name="recentfile_summary">Lembrar nomes recentes de ficheiros</string>
<string name="remember_keyfile_summary">Lembra o local dos ficheiros-chave dos bancos de dados</string>
<string name="remember_keyfile_title">Guardar ficheiro chave</string>
<string name="content_description_remove_from_list">Remover</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Raiz</string>
@@ -221,7 +217,6 @@
<string name="clipboard_swipe_clean">Deslize para o lado para limpar agora a área de transferência</string>
<string name="error_autofill_enable_service">Não pôde ser habilitado o serviço de preenchimento automático.</string>
<string name="encryption_explanation">Algoritmo de encriptação usado para todos os dados.</string>
<string name="warning_read_only">Conceda acesso de escrita ao cartão SD para salvar alterações do banco.</string>
<string name="password_size_summary">Define o tamanho padrão para palavras-passe geradas</string>
<string name="list_password_generator_options_title">Caracteres da palavra-passe</string>
<string name="list_password_generator_options_summary">Definir os caracteres padrão do gerador de palavra-passe</string>

View File

@@ -123,10 +123,6 @@
<string name="protection">Защита</string>
<string name="read_only">Только чтение</string>
<string name="read_only_warning">KeePassDX необходимо разрешение на запись, чтобы иметь возможность изменить что-либо в вашей базе.</string>
<string name="recentfile_title">Базы паролей</string>
<string name="recentfile_summary">Хранить имена недавно открытых баз</string>
<string name="remember_keyfile_summary">Хранить пути к файлам ключей</string>
<string name="remember_keyfile_title">Файлы ключей</string>
<string name="content_description_remove_from_list">Убрать из списка</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">База</string>
@@ -145,7 +141,6 @@
<string name="uppercase">ЗАГЛАВНЫЕ</string>
<string name="warning">Внимание</string>
<string name="warning_password_encoding">Избегайте использования в пароле символов вне кодировки текста в файле базы, так как эти символы будут преобразованы в одинаковый символ.</string>
<string name="warning_read_only">Предоставьте доступ к хранилищу на запись для сохранения изменений в базе.</string>
<string name="warning_unmounted">Подключите хранилище для создания или загрузки базы.</string>
<string name="version_label">Версия %1$s</string>
<string name="configure_biometric">Биометрия поддерживается, но не настроена.</string>

View File

@@ -109,8 +109,6 @@
<string name="omitbackup_summary">Vynechať skupinu \'Backup\' a Recycle Bin z výsledkov hľadania</string>
<string name="progress_create">Vytváram novú databázu…</string>
<string name="progress_title">Pracujem…</string>
<string name="remember_keyfile_summary">Zapamätať si umiestnenie keyfile</string>
<string name="remember_keyfile_title">Uložiť keyfile</string>
<string name="content_description_remove_from_list">Odstrániť</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Root</string>

View File

@@ -121,8 +121,6 @@
<string name="progress_create">Skapar ny databas…</string>
<string name="progress_title">Arbetar…</string>
<string name="protection">Skydd</string>
<string name="remember_keyfile_summary">Kommer ihåg sökvägar till databasers nyckelfiler</string>
<string name="remember_keyfile_title">Spara nyckelfil</string>
<string name="content_description_remove_from_list">Ta bort</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Root</string>
@@ -192,8 +190,6 @@
<string name="menu_form_filling_settings">Formulär-ifyllning</string>
<string name="read_only">Skrivskyddad</string>
<string name="read_only_warning">KeePass DX behöver skrivbehörighet för att ändra något i din databas.</string>
<string name="recentfile_title">Senaste filhistorik</string>
<string name="recentfile_summary">Kom ihåg senaste filnamn</string>
<string name="encryption_explanation">Krypteringsalgoritm som används för all data i databasen.</string>
<string name="kdf_explanation">För att generera nyckeln till krypteringsalgoritmen kommer huvudnyckeln transformeras med en slumpmässigt saltad nyckelderivatsfunktion.</string>
<string name="memory_usage">Minnesanvändning</string>
@@ -211,7 +207,6 @@
<string name="sort_last_access_time">Åtkomst</string>
<string name="warning">Varning</string>
<string name="warning_password_encoding">Undvik lösenordstecken utöver textkodningsformatet i databasfilen (okända tecken konverteras till samma bokstav).</string>
<string name="warning_read_only">Ge tillåtelse att skriva till SD-kortet för att spara ändringar i databasen.</string>
<string name="warning_empty_password">Är du säker på att du verkligen inte vill skydda dina lösenord från att låsas upp\?</string>
<string name="warning_no_encryption_key">Är du säker på att du inte vill använda en krypteringsnyckel\?</string>
<string name="encrypted_value_stored">Krypterat lösenord sparat</string>

View File

@@ -144,10 +144,6 @@
<string name="protection">Koruma</string>
<string name="read_only">Yazma korumalı</string>
<string name="read_only_warning">Veritabanınızdaki herhangi bir şeyi değiştirmek için KeePassDX\'in yazma iznine ihtiyacı var.</string>
<string name="recentfile_title">Son dosya geçmişi</string>
<string name="recentfile_summary">Son dosya adlarını hatırla</string>
<string name="remember_keyfile_summary">Veritabanı anahtar dosyaların yerini hatırlar</string>
<string name="remember_keyfile_title">Anahtar dosya kaydet</string>
<string name="content_description_remove_from_list">Kaldır</string>
<string name="root">Kök</string>
<string name="encryption_explanation">Tüm veriler için veritabanı şifreleme algoritması kullanılmıştır.</string>
@@ -180,7 +176,6 @@
<string name="uppercase">Büyük harf</string>
<string name="warning">Uyarı</string>
<string name="warning_password_encoding">Veritabanı dosyasındaki metin kodlama formatının dışındaki parola karakterlerinden kaçının (tanınmayan karakterler benzer harfe dönüştürülür).</string>
<string name="warning_read_only">Veritabanı değişikliklerini kaydetmek için bellek yazma erişimi verin.</string>
<string name="warning_unmounted">Bir veritabanı oluşturmak veya yüklemek için hafıza kartını takın.</string>
<string name="warning_empty_password">Gerçekten parolasız açma koruması mı istiyorsunuz\?</string>
<string name="warning_no_encryption_key">Herhangi bir şifreleme anahtarı kullanmak istemediğinize emin misiniz\?</string>

View File

@@ -110,8 +110,6 @@
<string name="omitbackup_summary">Пропустити групу \'Резервна копія\' та Кошик серед результатів пошуку</string>
<string name="progress_create">Створення нової бази даних&#8230;</string>
<string name="progress_title">Працює&#8230;</string>
<string name="remember_keyfile_summary">Запам’ятати розташування файла ключа</string>
<string name="remember_keyfile_title">Збережіть файл ключа</string>
<string name="content_description_remove_from_list">Вилучити</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Корінь</string>

View File

@@ -106,8 +106,6 @@
<string name="open_recent">最近使用过的数据库</string>
<string name="progress_create">正在创建新数据库…</string>
<string name="progress_title">正在处理…</string>
<string name="remember_keyfile_summary">记住密钥文件的位置</string>
<string name="remember_keyfile_title">保存密钥文件</string>
<string name="content_description_remove_from_list">移除</string>
<string name="encryption_rijndael">Rijndael (AES)</string>
<string name="root">Root</string>
@@ -123,7 +121,6 @@
<string name="underline">下划线</string>
<string name="unsupported_db_version">不支持的数据库版本。</string>
<string name="uppercase">大写</string>
<string name="warning_read_only">请授予 SD 卡写入权限以保存数据库。</string>
<string name="warning_unmounted">请挂载SD卡以创建或加载数据库。</string>
<string name="education_unlock_summary">输入密码和/或一个密钥文件来解锁你的数据库。
\n
@@ -184,8 +181,8 @@
<string name="protection">保护</string>
<string name="read_only">只读</string>
<string name="read_only_warning">KeePassDX 需要写入权限以修改数据库。</string>
<string name="recentfile_title">最近文件历史</string>
<string name="recentfile_summary">记住最近使用的文件名</string>
<string name="show_recent_files_title">最近文件历史</string>
<string name="show_recent_files_summary">记住最近使用的文件名</string>
<string name="encryption_explanation">加密所有数据时采用的算法。</string>
<string name="kdf_explanation">将转换主密钥以生成加密数据库所需的密钥,转换方式为随机加盐算法。</string>
<string name="memory_usage">内存使用量</string>

View File

@@ -106,8 +106,6 @@
<string name="open_recent">最近打開的資料庫:</string>
<string name="progress_create">創建新資料庫中…</string>
<string name="progress_title">工作中…</string>
<string name="remember_keyfile_summary">記住密鑰檔的位置</string>
<string name="remember_keyfile_title">保存密鑰檔</string>
<string name="content_description_remove_from_list">移除</string>
<string name="encryption_rijndael">Rijndael加密(AES)</string>
<string name="root">Root</string>
@@ -206,8 +204,6 @@
<string name="field_value">欄位值</string>
<string name="file_not_found_content">找不到檔案。嘗試從檔案瀏覽器重新打開它。</string>
<string name="omitbackup_summary">從搜尋結果中省略\"備份\"和\"回收站\"組</string>
<string name="recentfile_title">最近的檔案歷史記錄</string>
<string name="recentfile_summary">記住最近的檔案名</string>
<string name="encryption_explanation">用於所有資料的資料庫加密演算法。</string>
<string name="memory_usage">記憶體使用情況</string>
<string name="memory_usage_explanation">密钥推導函數要使用的記憶體量(以二进制字节为单位)。</string>

View File

@@ -83,10 +83,14 @@
<bool name="maskpass_default" translatable="false">true</bool>
<string name="allow_copy_password_key" translatable="false">allow_copy_password_key</string>
<bool name="allow_copy_password_default" translatable="false">false</bool>
<string name="recentfile_key" translatable="false">recentfile</string>
<bool name="recentfile_default" translatable="false">true</bool>
<string name="keyfile_key" translatable="false">keyfile</string>
<bool name="keyfile_default" translatable="false">true</bool>
<string name="remember_database_locations_key" translatable="false">remember_database_locations_key</string>
<bool name="remember_database_locations_default" translatable="false">true</bool>
<string name="show_recent_files_key" translatable="false">show_recent_files_key</string>
<bool name="show_recent_files_default" translatable="false">true</bool>
<string name="hide_broken_locations_key" translatable="false">hide_broken_locations_key</string>
<bool name="hide_broken_locations_default" translatable="false">true</bool>
<string name="remember_keyfile_locations_key" translatable="false">remember_keyfile_locations_key</string>
<bool name="remember_keyfile_locations_default" translatable="false">true</bool>
<string name="advanced_unlock_explanation_key" translatable="false">advanced_unlock_explanation_key</string>
<string name="biometric_unlock_enable_key" translatable="false">biometric_unlock_enable_key</string>
<bool name="biometric_unlock_enable_default" translatable="false">false</bool>

View File

@@ -203,10 +203,14 @@
<string name="contains_duplicate_uuid">The database contains duplicate UUIDs.</string>
<string name="contains_duplicate_uuid_procedure">By validating this dialog, KeePassDX will fix the problem (by generating new UUIDs for duplicates) and continue.</string>
<string name="selection_mode">Selection mode</string>
<string name="recentfile_title">Recent file history</string>
<string name="recentfile_summary">Remember recent filenames</string>
<string name="remember_keyfile_summary">Remembers the location of databases keyfiles</string>
<string name="remember_keyfile_title">Save keyfile</string>
<string name="remember_database_locations_title">Save location of databases</string>
<string name="remember_database_locations_summary">Remember the location of databases</string>
<string name="show_recent_files_title">Show recent files</string>
<string name="show_recent_files_summary">Show locations of recent databases</string>
<string name="hide_broken_locations_title">Hide broken database links</string>
<string name="hide_broken_locations_summary">Hide broken links in the list of recent databases</string>
<string name="remember_keyfile_locations_title">Save location of keyfiles</string>
<string name="remember_keyfile_locations_summary">Remember the location of databases keyfiles</string>
<string name="root">Root</string>
<string name="encryption_explanation">Database encryption algorithm used for all data.</string>
<string name="kdf_explanation">To generate the key for the encryption algorithm, the master key is transformed using a randomly salted key derivation function.</string>
@@ -240,7 +244,7 @@
<string name="uppercase">Upper-case</string>
<string name="warning">Warning</string>
<string name="warning_password_encoding">Avoid password characters outside of text encoding format in database file (unrecognized chars are converted to the same letter).</string>
<string name="warning_read_only">Grant memory write access to save database changes.</string>
<string name="warning_database_read_only">Grant file write access to save database changes</string>
<string name="warning_unmounted">Mount the memory card to create or load a database.</string>
<string name="warning_empty_password">Do you really want no password unlocking protection?</string>
<string name="warning_no_encryption_key">Are you sure you do not want to use any encryption key?</string>

View File

@@ -121,16 +121,28 @@
android:title="@string/database_history">
<SwitchPreference
android:key="@string/recentfile_key"
android:title="@string/recentfile_title"
android:summary="@string/recentfile_summary"
android:defaultValue="@bool/recentfile_default"/>
android:key="@string/remember_database_locations_key"
android:title="@string/remember_database_locations_title"
android:summary="@string/remember_database_locations_summary"
android:defaultValue="@bool/remember_database_locations_default"/>
<SwitchPreference
android:key="@string/keyfile_key"
android:title="@string/remember_keyfile_title"
android:summary="@string/remember_keyfile_summary"
android:dependency="@string/recentfile_key"
android:defaultValue="@bool/keyfile_default"/>
android:key="@string/show_recent_files_key"
android:title="@string/show_recent_files_title"
android:summary="@string/show_recent_files_summary"
android:dependency="@string/remember_database_locations_key"
android:defaultValue="@bool/show_recent_files_default"/>
<SwitchPreference
android:key="@string/hide_broken_locations_key"
android:title="@string/hide_broken_locations_title"
android:summary="@string/hide_broken_locations_summary"
android:dependency="@string/show_recent_files_key"
android:defaultValue="@bool/hide_broken_locations_default"/>
<SwitchPreference
android:key="@string/remember_keyfile_locations_key"
android:title="@string/remember_keyfile_locations_title"
android:summary="@string/remember_keyfile_locations_summary"
android:dependency="@string/remember_database_locations_key"
android:defaultValue="@bool/remember_keyfile_locations_default"/>
</PreferenceCategory>