Merge branch 'feature/Biometric' into develop

This commit is contained in:
J-Jamet
2019-09-04 13:17:59 +02:00
90 changed files with 1816 additions and 1439 deletions

View File

@@ -1,6 +1,7 @@
KeepassDX (2.5.0.0beta23)
* New, more secure database creation workflow
* Add alias for history files (WARNING: history is erased)
* New Biometric unlock (Fingerprint with new API)
KeepassDX (2.5.0.0beta22)
* Rebuild code for actions

View File

@@ -89,6 +89,7 @@ dependencies {
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.biometric:biometric:1.0.0-beta01'
implementation 'com.google.android.material:material:1.0.0'
implementation "androidx.room:room-runtime:$room_version"

View File

@@ -8,7 +8,7 @@
android:largeScreens="true"
android:anyDensity="true" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
@@ -128,6 +128,7 @@
<activity android:name="com.kunzisoft.keepass.settings.SettingsActivity" />
<activity android:name="com.kunzisoft.keepass.autofill.AutofillLauncherActivity"
android:configChanges="keyboardHidden" />
<activity android:name="com.kunzisoft.keepass.settings.SettingsAdvancedUnlockActivity" />
<activity android:name="com.kunzisoft.keepass.settings.SettingsAutofillActivity" />
<activity android:name="com.kunzisoft.keepass.magikeyboard.KeyboardLauncherActivity"
android:label="@string/keyboard_name">

View File

@@ -48,7 +48,7 @@ import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.helpers.OpenFileHelper
import com.kunzisoft.keepass.activities.stylish.StylishActivity
import com.kunzisoft.keepass.adapters.FileDatabaseHistoryAdapter
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.autofill.AutofillHelper
import com.kunzisoft.keepass.database.action.CreateDatabaseRunnable
import com.kunzisoft.keepass.database.action.ProgressDialogThread
@@ -79,7 +79,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
// Adapter to manage database history list
private var mAdapterDatabaseHistory: FileDatabaseHistoryAdapter? = null
private var mFileDatabaseHistory: FileDatabaseHistory? = null
private var mFileDatabaseHistoryAction: FileDatabaseHistoryAction? = null
private var mDatabaseFileUri: Uri? = null
@@ -90,7 +90,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mFileDatabaseHistory = FileDatabaseHistory.getInstance(applicationContext)
mFileDatabaseHistoryAction = FileDatabaseHistoryAction.getInstance(applicationContext)
setContentView(R.layout.activity_file_selection)
fileListContainer = findViewById(R.id.container_file_list)
@@ -167,7 +167,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
}
mAdapterDatabaseHistory?.setOnFileDatabaseHistoryDeleteListener { fileDatabaseHistoryToDelete ->
// Remove from app database
mFileDatabaseHistory?.deleteFileDatabaseHistory(fileDatabaseHistoryToDelete) { fileHistoryDeleted ->
mFileDatabaseHistoryAction?.deleteFileDatabaseHistory(fileDatabaseHistoryToDelete) { fileHistoryDeleted ->
// Remove from adapter
fileHistoryDeleted?.let { databaseFileHistoryDeleted ->
mAdapterDatabaseHistory?.deleteDatabaseFileHistory(databaseFileHistoryDeleted)
@@ -178,7 +178,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
true
}
mAdapterDatabaseHistory?.setOnSaveAliasListener { fileDatabaseHistoryWithNewAlias ->
mFileDatabaseHistory?.addOrUpdateFileDatabaseHistory(fileDatabaseHistoryWithNewAlias)
mFileDatabaseHistoryAction?.addOrUpdateFileDatabaseHistory(fileDatabaseHistoryWithNewAlias)
}
fileDatabaseHistoryRecyclerView.adapter = mAdapterDatabaseHistory
@@ -295,7 +295,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
updateExternalStorageWarning()
// Construct adapter with listeners
mFileDatabaseHistory?.getAllFileDatabaseHistories { databaseFileHistoryList ->
mFileDatabaseHistoryAction?.getAllFileDatabaseHistories { databaseFileHistoryList ->
databaseFileHistoryList?.let {
mAdapterDatabaseHistory?.addDatabaseFileHistoryList(it)
updateFileListVisibility()
@@ -361,7 +361,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
runOnUiThread {
if (result.isSuccess) {
// Add database to recent files
mFileDatabaseHistory?.addOrUpdateDatabaseUri(databaseFileUri, keyFileUri)
mFileDatabaseHistoryAction?.addOrUpdateDatabaseUri(databaseFileUri, keyFileUri)
mAdapterDatabaseHistory?.notifyDataSetChanged()
updateFileListVisibility()
GroupActivity.launch(this@FileDatabaseSelectActivity)

View File

@@ -25,7 +25,6 @@ import android.app.backup.BackupManager
import android.content.DialogInterface
import android.content.Intent
import android.content.SharedPreferences
import android.hardware.fingerprint.FingerprintManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
@@ -43,7 +42,9 @@ import android.view.MenuItem
import android.view.View
import android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import android.widget.*
import androidx.biometric.BiometricManager
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.FingerPrintExplanationDialog
import com.kunzisoft.keepass.activities.dialogs.PasswordEncodingDialogFragment
import com.kunzisoft.keepass.utils.ClipDataCompat
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
@@ -52,20 +53,19 @@ import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper
import com.kunzisoft.keepass.activities.lock.LockingActivity
import com.kunzisoft.keepass.activities.stylish.StylishActivity
import com.kunzisoft.keepass.utils.FileDatabaseInfo
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.autofill.AutofillHelper
import com.kunzisoft.keepass.database.action.LoadDatabaseRunnable
import com.kunzisoft.keepass.database.action.ProgressDialogThread
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.education.PasswordActivityEducation
import com.kunzisoft.keepass.fingerprint.FingerPrintHelper
import com.kunzisoft.keepass.fingerprint.FingerPrintViewsManager
import com.kunzisoft.keepass.biometric.AdvancedUnlockedManager
import com.kunzisoft.keepass.magikeyboard.KeyboardHelper
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.utils.MenuUtil
import com.kunzisoft.keepass.utils.UriUtil
import com.kunzisoft.keepass.view.FingerPrintInfoView
import com.kunzisoft.keepass.view.AdvancedUnlockInfoView
import com.kunzisoft.keepass.view.asError
import kotlinx.android.synthetic.main.activity_password.*
import java.io.FileNotFoundException
@@ -84,7 +84,7 @@ class PasswordActivity : StylishActivity() {
private var checkboxPasswordView: CompoundButton? = null
private var checkboxKeyFileView: CompoundButton? = null
private var checkboxDefaultDatabaseView: CompoundButton? = null
private var fingerPrintInfoView: FingerPrintInfoView? = null
private var advancedUnlockInfoView: AdvancedUnlockInfoView? = null
private var enableButtonOnCheckedChangeListener: CompoundButton.OnCheckedChangeListener? = null
private var mDatabaseFileUri: Uri? = null
@@ -95,7 +95,7 @@ class PasswordActivity : StylishActivity() {
private var readOnly: Boolean = false
private var fingerPrintViewsManager: FingerPrintViewsManager? = null
private var advancedUnlockedManager: AdvancedUnlockedManager? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -120,7 +120,7 @@ class PasswordActivity : StylishActivity() {
checkboxPasswordView = findViewById(R.id.password_checkbox)
checkboxKeyFileView = findViewById(R.id.keyfile_checkox)
checkboxDefaultDatabaseView = findViewById(R.id.default_database)
fingerPrintInfoView = findViewById(R.id.fingerprint_info)
advancedUnlockInfoView = findViewById(R.id.fingerprint_info)
readOnly = ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrPreference(this, savedInstanceState)
@@ -216,7 +216,7 @@ class PasswordActivity : StylishActivity() {
if (mRememberKeyFile && (keyFileUri == null || keyFileUri.toString().isEmpty())) {
// Retrieve KeyFile in a thread
databaseUri?.let { databaseUriNotNull ->
FileDatabaseHistory.getInstance(applicationContext)
FileDatabaseHistoryAction.getInstance(applicationContext)
.getKeyFileUriByDatabaseUri(databaseUriNotNull) {
onPostInitUri(databaseUri, it)
}
@@ -280,11 +280,16 @@ class PasswordActivity : StylishActivity() {
// Init FingerPrint elements
var fingerPrintInit = false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (PreferencesUtil.isFingerprintEnable(this)) {
if (fingerPrintViewsManager == null) {
fingerPrintViewsManager = FingerPrintViewsManager(this,
if (PreferencesUtil.isBiometricUnlockEnable(this)) {
advancedUnlockInfoView?.setOnClickListener {
FingerPrintExplanationDialog().show(supportFragmentManager, "fingerPrintExplanationDialog")
}
if (advancedUnlockedManager == null && databaseFileUri != null) {
advancedUnlockedManager = AdvancedUnlockedManager(this,
databaseFileUri,
fingerPrintInfoView,
advancedUnlockInfoView,
checkboxPasswordView,
enableButtonOnCheckedChangeListener,
passwordView) { passwordRetrieve ->
@@ -298,12 +303,10 @@ class PasswordActivity : StylishActivity() {
}
}
}
fingerPrintViewsManager?.initFingerprint()
// checks if fingerprint is available, will also start listening for fingerprints when available
fingerPrintViewsManager?.checkFingerprintAvailability()
advancedUnlockedManager?.initBiometric()
fingerPrintInit = true
} else {
fingerPrintViewsManager?.destroy()
advancedUnlockedManager?.destroy()
}
}
if (!fingerPrintInit) {
@@ -361,14 +364,14 @@ class PasswordActivity : StylishActivity() {
override fun onPause() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintViewsManager?.stopListening()
advancedUnlockedManager?.pause()
}
super.onPause()
}
override fun onDestroy() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintViewsManager?.destroy()
advancedUnlockedManager?.destroy()
}
super.onDestroy()
}
@@ -429,9 +432,9 @@ class PasswordActivity : StylishActivity() {
runOnUiThread {
// Recheck fingerprint if error
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (PreferencesUtil.isFingerprintEnable(this@PasswordActivity)) {
// Stay with the same mode
fingerPrintViewsManager?.reInitWithFingerprintMode()
if (PreferencesUtil.isBiometricUnlockEnable(this@PasswordActivity)) {
// Stay with the same mode and init it
advancedUnlockedManager?.initBiometricMode()
}
}
@@ -485,7 +488,7 @@ class PasswordActivity : StylishActivity() {
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Fingerprint menu
fingerPrintViewsManager?.inflateOptionsMenu(inflater, menu)
advancedUnlockedManager?.inflateOptionsMenu(inflater, menu)
}
super.onCreateOptionsMenu(menu)
@@ -523,12 +526,13 @@ class PasswordActivity : StylishActivity() {
if (!readOnlyEducationPerformed) {
val biometricCanAuthenticate = BiometricManager.from(this).canAuthenticate()
// fingerprintEducationPerformed
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& PreferencesUtil.isFingerprintEnable(applicationContext)
&& FingerPrintHelper.isFingerprintSupported(getSystemService(FingerprintManager::class.java))
&& fingerPrintInfoView != null && fingerPrintInfoView?.fingerPrintImageView != null
&& passwordActivityEducation.checkAndPerformedFingerprintEducation(fingerPrintInfoView?.fingerPrintImageView!!))
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& PreferencesUtil.isBiometricUnlockEnable(applicationContext)
&& (biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED || biometricCanAuthenticate == BiometricManager.BIOMETRIC_SUCCESS)
&& advancedUnlockInfoView != null && advancedUnlockInfoView?.unlockIconImageView != null
&& passwordActivityEducation.checkAndPerformedFingerprintEducation(advancedUnlockInfoView?.unlockIconImageView!!)
}
}
@@ -553,7 +557,7 @@ class PasswordActivity : StylishActivity() {
changeOpenFileReadIcon(item)
}
R.id.menu_fingerprint_remove_key -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintViewsManager?.deleteEntryKey()
advancedUnlockedManager?.deleteEntryKey()
}
else -> return MenuUtil.onDefaultMenuOptionsItemSelected(this, item)
}

View File

@@ -87,7 +87,7 @@ class AssignMasterKeyDialogFragment : DialogFragment() {
override fun onAttach(activity: Context) {
super.onAttach(activity)
try {
mListener = activity as AssignPasswordDialogListener?
mListener = activity as AssignPasswordDialogListener
} catch (e: ClassCastException) {
throw ClassCastException(activity.toString()
+ " must implement " + AssignPasswordDialogListener::class.java.name)

View File

@@ -17,7 +17,7 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.fingerprint
package com.kunzisoft.keepass.activities.dialogs
import android.app.Dialog
import android.content.Intent
@@ -28,6 +28,8 @@ import androidx.fragment.app.DialogFragment
import androidx.appcompat.app.AlertDialog
import android.view.View
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.biometric.FingerPrintAnimatedVector
import com.kunzisoft.keepass.settings.SettingsAdvancedUnlockActivity
@RequiresApi(api = Build.VERSION_CODES.M)
class FingerPrintExplanationDialog : DialogFragment() {
@@ -41,11 +43,16 @@ class FingerPrintExplanationDialog : DialogFragment() {
val rootView = inflater.inflate(R.layout.fragment_fingerprint_explanation, null)
val fingerprintSettingWayTextView = rootView.findViewById<View>(R.id.fingerprint_setting_way_text)
fingerprintSettingWayTextView.setOnClickListener { startActivity(Intent(android.provider.Settings.ACTION_SECURITY_SETTINGS)) }
rootView.findViewById<View>(R.id.fingerprint_setting_link_text).setOnClickListener {
startActivity(Intent(android.provider.Settings.ACTION_SECURITY_SETTINGS))
}
rootView.findViewById<View>(R.id.auto_open_biometric_prompt_button).setOnClickListener {
startActivity(Intent(activity, SettingsAdvancedUnlockActivity::class.java))
}
fingerPrintAnimatedVector = FingerPrintAnimatedVector(activity,
rootView.findViewById(R.id.fingerprint_image))
rootView.findViewById(R.id.biometric_image))
builder.setView(rootView)
.setPositiveButton(android.R.string.ok) { _, _ -> }

View File

@@ -40,9 +40,7 @@ class KeyboardExplanationDialogFragment : DialogFragment() {
val rootView = inflater.inflate(R.layout.fragment_keyboard_explanation, null)
rootView.findViewById<View>(R.id.keyboards_activate_setting_path1_text)
.setOnClickListener { launchActivateKeyboardSetting() }
rootView.findViewById<View>(R.id.keyboards_activate_setting_path2_text)
rootView.findViewById<View>(R.id.keyboards_activate_device_setting_button)
.setOnClickListener { launchActivateKeyboardSetting() }
val containerKeyboardSwitcher = rootView.findViewById<View>(R.id.container_keyboard_switcher)

View File

@@ -0,0 +1,20 @@
package com.kunzisoft.keepass.app.database
import android.os.AsyncTask
/**
* Private class to invoke each method in a separate thread
*/
class ActionDatabaseAsyncTask<T>(
private val action: () -> T ,
private val afterActionDatabaseListener: ((T?) -> Unit)? = null
) : AsyncTask<Void, Void, T>() {
override fun doInBackground(vararg args: Void?): T? {
return action.invoke()
}
override fun onPostExecute(result: T?) {
afterActionDatabaseListener?.invoke(result)
}
}

View File

@@ -5,9 +5,11 @@ import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context
@Database(entities = [FileDatabaseHistoryEntity::class], version = 1)
@Database(version = 1, entities = [FileDatabaseHistoryEntity::class, CipherDatabaseEntity::class])
abstract class AppDatabase : RoomDatabase() {
abstract fun databaseFileHistoryDao(): FileDatabaseHistoryDao
abstract fun fileDatabaseHistoryDao(): FileDatabaseHistoryDao
abstract fun cipherDatabaseDao(): CipherDatabaseDao
companion object {
fun getDatabase(applicationContext: Context): AppDatabase {

View File

@@ -0,0 +1,73 @@
package com.kunzisoft.keepass.app.database
import android.content.Context
import android.net.Uri
import com.kunzisoft.keepass.utils.SingletonHolderParameter
class CipherDatabaseAction(applicationContext: Context) {
private val cipherDatabaseDao =
AppDatabase
.getDatabase(applicationContext)
.cipherDatabaseDao()
fun getCipherDatabase(databaseUri: Uri,
cipherDatabaseResultListener: (CipherDatabaseEntity?) -> Unit) {
ActionDatabaseAsyncTask(
{
cipherDatabaseDao.getByDatabaseUri(databaseUri.toString())
},
{
cipherDatabaseResultListener.invoke(it)
}
).execute()
}
fun containsCipherDatabase(databaseUri: Uri,
contains: (Boolean) -> Unit) {
getCipherDatabase(databaseUri) {
contains.invoke(it != null)
}
}
fun addOrUpdateCipherDatabase(cipherDatabaseEntity: CipherDatabaseEntity,
cipherDatabaseResultListener: (() -> Unit)? = null) {
ActionDatabaseAsyncTask(
{
val cipherDatabaseRetrieve = cipherDatabaseDao.getByDatabaseUri(cipherDatabaseEntity.databaseUri)
// Update values if element not yet in the database
if (cipherDatabaseRetrieve == null) {
cipherDatabaseDao.add(cipherDatabaseEntity)
} else {
cipherDatabaseDao.update(cipherDatabaseEntity)
}
},
{
cipherDatabaseResultListener?.invoke()
}
).execute()
}
fun deleteByDatabaseUri(databaseUri: Uri,
cipherDatabaseResultListener: (() -> Unit)? = null) {
ActionDatabaseAsyncTask(
{
cipherDatabaseDao.deleteByDatabaseUri(databaseUri.toString())
},
{
cipherDatabaseResultListener?.invoke()
}
).execute()
}
fun deleteAll() {
ActionDatabaseAsyncTask(
{
cipherDatabaseDao.deleteAll()
}
).execute()
}
companion object : SingletonHolderParameter<CipherDatabaseAction, Context>(::CipherDatabaseAction)
}

View File

@@ -0,0 +1,22 @@
package com.kunzisoft.keepass.app.database
import androidx.room.*
@Dao
interface CipherDatabaseDao {
@Query("SELECT * FROM cipher_database WHERE database_uri = :databaseUriString")
fun getByDatabaseUri(databaseUriString: String): CipherDatabaseEntity?
@Insert
fun add(vararg fileDatabaseHistory: CipherDatabaseEntity)
@Update
fun update(vararg fileDatabaseHistory: CipherDatabaseEntity)
@Query("DELETE FROM cipher_database WHERE database_uri = :databaseUriString")
fun deleteByDatabaseUri(databaseUriString: String)
@Query("DELETE FROM cipher_database")
fun deleteAll()
}

View File

@@ -0,0 +1,33 @@
package com.kunzisoft.keepass.app.database
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "cipher_database")
data class CipherDatabaseEntity(
@PrimaryKey
@ColumnInfo(name = "database_uri")
val databaseUri: String,
@ColumnInfo(name = "encrypted_value")
var encryptedValue: String,
@ColumnInfo(name = "specs_parameters")
var specParameters: String
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as CipherDatabaseEntity
if (databaseUri != other.databaseUri) return false
return true
}
override fun hashCode(): Int {
return databaseUri.hashCode()
}
}

View File

@@ -19,22 +19,20 @@
*/
package com.kunzisoft.keepass.app.database
import androidx.sqlite.db.SimpleSQLiteQuery
import android.content.Context
import android.net.Uri
import android.os.AsyncTask
import com.kunzisoft.keepass.utils.SingletonHolderParameter
class FileDatabaseHistory(applicationContext: Context) {
class FileDatabaseHistoryAction(applicationContext: Context) {
private val databaseFileHistoryDao =
AppDatabase
.getDatabase(applicationContext)
.databaseFileHistoryDao()
.fileDatabaseHistoryDao()
fun getFileDatabaseHistory(databaseUri: Uri,
fileHistoryResultListener: (fileDatabaseHistoryResult: FileDatabaseHistoryEntity?) -> Unit) {
ActionFileHistoryAsyncTask(
ActionDatabaseAsyncTask(
{
databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString())
},
@@ -46,7 +44,7 @@ class FileDatabaseHistory(applicationContext: Context) {
fun getKeyFileUriByDatabaseUri(databaseUri: Uri,
keyFileUriResultListener: (Uri?) -> Unit) {
ActionFileHistoryAsyncTask(
ActionDatabaseAsyncTask(
{
databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString())
},
@@ -61,7 +59,7 @@ class FileDatabaseHistory(applicationContext: Context) {
}
fun getAllFileDatabaseHistories(fileHistoryResultListener: (fileDatabaseHistoryResult: List<FileDatabaseHistoryEntity>?) -> Unit) {
ActionFileHistoryAsyncTask(
ActionDatabaseAsyncTask(
{
databaseFileHistoryDao.getAll()
},
@@ -81,7 +79,7 @@ class FileDatabaseHistory(applicationContext: Context) {
}
fun addOrUpdateFileDatabaseHistory(fileDatabaseHistory: FileDatabaseHistoryEntity, unmodifiedAlias: Boolean = false) {
ActionFileHistoryAsyncTask(
ActionDatabaseAsyncTask(
{
val fileDatabaseHistoryRetrieve = databaseFileHistoryDao.getByDatabaseUri(fileDatabaseHistory.databaseUri)
@@ -100,7 +98,7 @@ class FileDatabaseHistory(applicationContext: Context) {
fun deleteFileDatabaseHistory(fileDatabaseHistory: FileDatabaseHistoryEntity,
fileHistoryDeletedResult: (FileDatabaseHistoryEntity?) -> Unit) {
ActionFileHistoryAsyncTask(
ActionDatabaseAsyncTask(
{
databaseFileHistoryDao.delete(fileDatabaseHistory)
},
@@ -114,39 +112,20 @@ class FileDatabaseHistory(applicationContext: Context) {
}
fun deleteAllKeyFiles() {
// TODO replace for unsupported query databaseFileHistoryDao.deleteAllKeyFiles()
ActionFileHistoryAsyncTask(
ActionDatabaseAsyncTask(
{
databaseFileHistoryDao
.deleteAllKeyFiles(SimpleSQLiteQuery("REPLACE INTO file_database_history(keyfile_uri) VALUES(null)"))
databaseFileHistoryDao.deleteAllKeyFiles()
}
).execute()
}
fun deleteAll() {
ActionFileHistoryAsyncTask(
ActionDatabaseAsyncTask(
{
databaseFileHistoryDao.deleteAll()
}
).execute()
}
/**
* Private class to invoke each method in a separate thread
*/
private class ActionFileHistoryAsyncTask<T>(
private val action: () -> T ,
private val afterActionFileHistoryListener: ((fileHistoryResult: T?) -> Unit)? = null
) : AsyncTask<Void, Void, T>() {
override fun doInBackground(vararg args: Void?): T? {
return action.invoke()
}
override fun onPostExecute(result: T?) {
afterActionFileHistoryListener?.invoke(result)
}
}
companion object : SingletonHolderParameter<FileDatabaseHistory, Context>(::FileDatabaseHistory)
companion object : SingletonHolderParameter<FileDatabaseHistoryAction, Context>(::FileDatabaseHistoryAction)
}

View File

@@ -1,6 +1,5 @@
package com.kunzisoft.keepass.app.database
import androidx.sqlite.db.SupportSQLiteQuery
import androidx.room.*
@Dao
@@ -20,12 +19,8 @@ interface FileDatabaseHistoryDao {
@Delete
fun delete(fileDatabaseHistory: FileDatabaseHistoryEntity): Int
/* TODO Replace (Insert not yet supported)
@Query("REPLACE INTO file_database_history(keyfile_uri) VALUES(null)")
fun deleteAllKeyFiles()
*/
@RawQuery
fun deleteAllKeyFiles(query: SupportSQLiteQuery): Boolean
@Query("DELETE FROM file_database_history")
fun deleteAll()

View File

@@ -0,0 +1,322 @@
package com.kunzisoft.keepass.biometric
import android.net.Uri
import android.os.Build
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.widget.CompoundButton
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.app.database.CipherDatabaseAction
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.view.AdvancedUnlockInfoView
@RequiresApi(api = Build.VERSION_CODES.M)
class AdvancedUnlockedManager(var context: FragmentActivity,
var databaseFileUri: Uri,
var advancedUnlockInfoView: AdvancedUnlockInfoView?,
var checkboxPasswordView: CompoundButton?,
var onCheckedPasswordChangeListener: CompoundButton.OnCheckedChangeListener? = null,
var passwordView: TextView?,
var loadDatabase: (password: String?) -> Unit)
: BiometricUnlockDatabaseHelper.BiometricUnlockCallback {
private var biometricUnlockDatabaseHelper: BiometricUnlockDatabaseHelper? = null
private var biometricMode: Mode = Mode.NOT_CONFIGURED
private var isBiometricPromptAutoOpenEnable = PreferencesUtil.isBiometricPromptAutoOpenEnable(context)
private var cipherDatabaseAction = CipherDatabaseAction.getInstance(context.applicationContext)
// fingerprint related code here
fun initBiometric() {
// Check if fingerprint well init (be called the first time the fingerprint is configured
// and the activity still active)
if (biometricUnlockDatabaseHelper == null || !biometricUnlockDatabaseHelper!!.isFingerprintInitialized) {
biometricUnlockDatabaseHelper = BiometricUnlockDatabaseHelper(context, this)
// callback for fingerprint findings
biometricUnlockDatabaseHelper?.setAuthenticationCallback(biometricCallback)
}
// Add a check listener to change fingerprint mode
checkboxPasswordView?.setOnCheckedChangeListener { compoundButton, checked ->
checkBiometricAvailability()
// Add old listener to enable the button, only be call here because of onCheckedChange bug
onCheckedPasswordChangeListener?.onCheckedChanged(compoundButton, checked)
}
checkBiometricAvailability()
}
@Synchronized
fun checkBiometricAvailability() {
// fingerprint not supported (by API level or hardware) so keep option hidden
// or manually disable
val biometricCanAuthenticate = BiometricManager.from(context).canAuthenticate()
if (!PreferencesUtil.isBiometricUnlockEnable(context)
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE) {
toggleMode(Mode.UNAVAILABLE)
} else {
// fingerprint is available but not configured, show icon but in disabled state with some information
if (biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED) {
toggleMode(Mode.NOT_CONFIGURED)
} else {
if (checkboxPasswordView?.isChecked == true) {
// listen for encryption
toggleMode(Mode.STORE)
} else {
cipherDatabaseAction.containsCipherDatabase(databaseFileUri) {
// fingerprint available but no stored password found yet for this DB so show info don't listen
toggleMode( if (it) {
// listen for decryption
Mode.OPEN
} else {
// wait for typing
Mode.WAIT_CREDENTIAL
})
}
}
}
}
}
private fun toggleMode(newBiometricMode: Mode) {
if (newBiometricMode != biometricMode) {
biometricMode = newBiometricMode
initBiometricMode()
}
}
private val biometricCallback = object : BiometricPrompt.AuthenticationCallback () {
override fun onAuthenticationError(
errorCode: Int,
errString: CharSequence) {
Log.e(TAG, "Biometric authentication error. Code : $errorCode Error : $errString")
setAdvancedUnlockedMessageView(errString.toString())
}
override fun onAuthenticationFailed() {
Log.e(TAG, "Biometric authentication failed, biometric not recognized")
setAdvancedUnlockedMessageView(R.string.fingerprint_not_recognized)
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
when (biometricMode) {
Mode.UNAVAILABLE -> {}
Mode.PAUSE -> {}
Mode.NOT_CONFIGURED -> {}
Mode.WAIT_CREDENTIAL -> {}
Mode.STORE -> {
// newly store the entered password in encrypted way
biometricUnlockDatabaseHelper?.encryptData(passwordView?.text.toString())
}
Mode.OPEN -> {
// retrieve the encrypted value from preferences
cipherDatabaseAction.getCipherDatabase(databaseFileUri) {
it?.encryptedValue?.let { value ->
biometricUnlockDatabaseHelper?.decryptData(value)
}
}
}
}
}
}
private fun initNotAvailable() {
showFingerPrintViews(false)
advancedUnlockInfoView?.setIconViewClickListener(null)
}
private fun initPause() {
advancedUnlockInfoView?.setIconViewClickListener(null)
}
private fun initNotConfigured() {
showFingerPrintViews(true)
setAdvancedUnlockedTitleView(R.string.configure_biometric)
setAdvancedUnlockedMessageView("")
advancedUnlockInfoView?.setIconViewClickListener(null)
}
private fun initWaitData() {
showFingerPrintViews(true)
setAdvancedUnlockedTitleView(R.string.no_credentials_stored)
setAdvancedUnlockedMessageView("")
advancedUnlockInfoView?.setIconViewClickListener(null)
}
private fun initEncryptData() {
showFingerPrintViews(true)
setAdvancedUnlockedTitleView(R.string.open_biometric_prompt_store_credential)
setAdvancedUnlockedMessageView("")
biometricUnlockDatabaseHelper?.initEncryptData { biometricPrompt, cryptoObject, promptInfo ->
cryptoObject?.let { crypto ->
// Set listener to open the biometric dialog and save credential
advancedUnlockInfoView?.setIconViewClickListener { _ ->
context.runOnUiThread {
biometricPrompt?.authenticate(promptInfo, crypto)
}
}
}
}
}
private fun initDecryptData() {
showFingerPrintViews(true)
setAdvancedUnlockedTitleView(R.string.open_biometric_prompt_unlock_database)
setAdvancedUnlockedMessageView("")
if (biometricUnlockDatabaseHelper != null) {
cipherDatabaseAction.getCipherDatabase(databaseFileUri) {
it?.specParameters?.let { specs ->
biometricUnlockDatabaseHelper?.initDecryptData(specs) { biometricPrompt, cryptoObject, promptInfo ->
cryptoObject?.let { crypto ->
// Set listener to open the biometric dialog and check credential
advancedUnlockInfoView?.setIconViewClickListener { _ ->
context.runOnUiThread {
biometricPrompt?.authenticate(promptInfo, crypto)
}
}
// Auto open the biometric prompt
if (isBiometricPromptAutoOpenEnable) {
isBiometricPromptAutoOpenEnable = false
context.runOnUiThread {
biometricPrompt?.authenticate(promptInfo, crypto)
}
}
}
}
}
}
}
}
@Synchronized
fun initBiometricMode() {
when (biometricMode) {
Mode.UNAVAILABLE -> initNotAvailable()
Mode.PAUSE -> initPause()
Mode.NOT_CONFIGURED -> initNotConfigured()
Mode.WAIT_CREDENTIAL -> initWaitData()
Mode.STORE -> initEncryptData()
Mode.OPEN -> initDecryptData()
}
// Show fingerprint key deletion
context.invalidateOptionsMenu()
}
fun pause() {
biometricMode = Mode.PAUSE
initBiometricMode()
}
fun destroy() {
// Restore the checked listener
checkboxPasswordView?.setOnCheckedChangeListener(onCheckedPasswordChangeListener)
biometricMode = Mode.UNAVAILABLE
initBiometricMode()
biometricUnlockDatabaseHelper = null
}
fun inflateOptionsMenu(menuInflater: MenuInflater, menu: Menu) {
cipherDatabaseAction.containsCipherDatabase(databaseFileUri) {
if ((biometricMode != Mode.UNAVAILABLE
&& biometricMode != Mode.NOT_CONFIGURED) && it)
menuInflater.inflate(R.menu.advanced_unlock, menu)
}
}
fun deleteEntryKey() {
biometricUnlockDatabaseHelper?.deleteEntryKey()
cipherDatabaseAction.deleteByDatabaseUri(databaseFileUri)
biometricMode = Mode.NOT_CONFIGURED
checkBiometricAvailability()
}
override fun handleEncryptedResult(encryptedValue: String, ivSpec: String) {
cipherDatabaseAction.addOrUpdateCipherDatabase(CipherDatabaseEntity(
databaseFileUri.toString(),
encryptedValue,
ivSpec
)) {
// Only for callback
loadDatabase.invoke(null)
setAdvancedUnlockedMessageView(R.string.encrypted_value_stored)
}
}
override fun handleDecryptedResult(decryptedValue: String) {
// Load database directly with password retrieve
loadDatabase.invoke(decryptedValue)
}
override fun onInvalidKeyException(e: Exception) {
setAdvancedUnlockedMessageView(R.string.biometric_invalid_key)
}
override fun onBiometricException(e: Exception) {
setAdvancedUnlockedMessageView(e.localizedMessage)
}
private fun showFingerPrintViews(show: Boolean) {
context.runOnUiThread { advancedUnlockInfoView?.hide = !show }
}
private fun setAdvancedUnlockedTitleView(textId: Int) {
context.runOnUiThread {
advancedUnlockInfoView?.setTitle(textId)
}
}
private fun setAdvancedUnlockedMessageView(textId: Int) {
context.runOnUiThread {
advancedUnlockInfoView?.setMessage(textId)
}
}
private fun setAdvancedUnlockedMessageView(text: CharSequence) {
context.runOnUiThread {
advancedUnlockInfoView?.message = text
}
}
enum class Mode {
UNAVAILABLE, PAUSE, NOT_CONFIGURED, WAIT_CREDENTIAL, STORE, OPEN
}
companion object {
private val TAG = AdvancedUnlockedManager::class.java.name
}
}

View File

@@ -0,0 +1,306 @@
/*
* 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.biometric
import android.app.KeyguardManager
import android.content.Context
import android.os.Build
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyPermanentlyInvalidatedException
import android.security.keystore.KeyProperties
import android.util.Base64
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity
import com.kunzisoft.keepass.R
import java.security.KeyStore
import java.security.UnrecoverableKeyException
import java.util.concurrent.Executors
import javax.crypto.BadPaddingException
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey
import javax.crypto.spec.IvParameterSpec
@RequiresApi(api = Build.VERSION_CODES.M)
class BiometricUnlockDatabaseHelper(private val context: FragmentActivity,
private val biometricUnlockCallback: BiometricUnlockCallback?) {
private var biometricPrompt: BiometricPrompt? = null
private var keyStore: KeyStore? = null
private var keyGenerator: KeyGenerator? = null
private var cipher: Cipher? = null
private var keyguardManager: KeyguardManager? = null
private var cryptoObject: BiometricPrompt.CryptoObject? = null
private var isBiometricInit = false
private var authenticationCallback: BiometricPrompt.AuthenticationCallback? = null
private val promptInfoStoreCredential = BiometricPrompt.PromptInfo.Builder()
.setTitle(context.getString(R.string.biometric_prompt_store_credential_title))
.setDescription(context.getString(R.string.biometric_prompt_store_credential_message))
//.setDeviceCredentialAllowed(true) TODO device credential
.setNegativeButtonText(context.getString(android.R.string.cancel))
.build()
private val promptInfoExtractCredential = BiometricPrompt.PromptInfo.Builder()
.setTitle(context.getString(R.string.biometric_prompt_extract_credential_title))
.setDescription(context.getString(R.string.biometric_prompt_extract_credential_message))
//.setDeviceCredentialAllowed(true)
.setNegativeButtonText(context.getString(android.R.string.cancel))
.build()
val isFingerprintInitialized: Boolean
get() {
if (!isBiometricInit && biometricUnlockCallback != null) {
biometricUnlockCallback.onBiometricException(Exception("FingerPrint not initialized"))
}
return isBiometricInit
}
init {
if (BiometricManager.from(context).canAuthenticate() != BiometricManager.BIOMETRIC_SUCCESS) {
// really not much to do when no fingerprint support found
isBiometricInit = false
} else {
this.keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
try {
this.keyStore = KeyStore.getInstance(BIOMETRIC_KEYSTORE)
this.keyGenerator = KeyGenerator.getInstance(BIOMETRIC_KEY_ALGORITHM, BIOMETRIC_KEYSTORE)
this.cipher = Cipher.getInstance(
BIOMETRIC_KEY_ALGORITHM + "/"
+ BIOMETRIC_BLOCKS_MODES + "/"
+ BIOMETRIC_ENCRYPTION_PADDING)
this.cryptoObject = BiometricPrompt.CryptoObject(cipher!!)
isBiometricInit = true
} catch (e: Exception) {
Log.e(TAG, "Unable to initialize the keystore", e)
isBiometricInit = false
biometricUnlockCallback?.onBiometricException(e)
}
}
}
private fun getSecretKey(): SecretKey? {
if (!isFingerprintInitialized) {
return null
}
try {
// Create new key if needed
keyStore?.let { keyStore ->
keyStore.load(null)
try {
if (!keyStore.containsAlias(BIOMETRIC_KEYSTORE_KEY)) {
// Set the alias of the entry in Android KeyStore where the key will appear
// and the constrains (purposes) in the constructor of the Builder
keyGenerator?.init(
KeyGenParameterSpec.Builder(
BIOMETRIC_KEYSTORE_KEY,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
// Require the user to authenticate with a fingerprint to authorize every use
// of the key
.setUserAuthenticationRequired(true)
.build())
keyGenerator?.generateKey()
}
} catch (e: Exception) {
Log.e(TAG, "Unable to create a key in keystore", e)
biometricUnlockCallback?.onBiometricException(e)
}
return keyStore.getKey(BIOMETRIC_KEYSTORE_KEY, null) as SecretKey?
}
} catch (e: Exception) {
Log.e(TAG, "Unable to retrieve the key in keystore", e)
biometricUnlockCallback?.onBiometricException(e)
}
return null
}
fun initEncryptData(actionIfCypherInit
: (biometricPrompt: BiometricPrompt?,
cryptoObject: BiometricPrompt.CryptoObject?,
promptInfo: BiometricPrompt.PromptInfo)->Unit) {
if (!isFingerprintInitialized) {
return
}
try {
cipher?.init(Cipher.ENCRYPT_MODE, getSecretKey())
initBiometricPrompt()
actionIfCypherInit.invoke(biometricPrompt, cryptoObject, promptInfoStoreCredential)
} catch (unrecoverableKeyException: UnrecoverableKeyException) {
Log.e(TAG, "Unable to initialize encrypt data", unrecoverableKeyException)
deleteEntryKey()
} catch (invalidKeyException: KeyPermanentlyInvalidatedException) {
Log.e(TAG, "Unable to initialize encrypt data", invalidKeyException)
biometricUnlockCallback?.onInvalidKeyException(invalidKeyException)
} catch (e: Exception) {
Log.e(TAG, "Unable to initialize encrypt data", e)
biometricUnlockCallback?.onBiometricException(e)
}
}
fun encryptData(value: String) {
if (!isFingerprintInitialized) {
return
}
try {
val encrypted = cipher?.doFinal(value.toByteArray())
val encryptedBase64 = Base64.encodeToString(encrypted, Base64.NO_WRAP)
// passes updated iv spec on to callback so this can be stored for decryption
cipher?.parameters?.getParameterSpec(IvParameterSpec::class.java)?.let{ spec ->
val ivSpecValue = Base64.encodeToString(spec.iv, Base64.NO_WRAP)
biometricUnlockCallback?.handleEncryptedResult(encryptedBase64, ivSpecValue)
}
} catch (e: Exception) {
Log.e(TAG, "Unable to encrypt data", e)
biometricUnlockCallback?.onBiometricException(e)
}
}
fun initDecryptData(ivSpecValue: String, actionIfCypherInit
: (biometricPrompt: BiometricPrompt?,
cryptoObject: BiometricPrompt.CryptoObject?,
promptInfo: BiometricPrompt.PromptInfo)->Unit) {
if (!isFingerprintInitialized) {
return
}
try {
// important to restore spec here that was used for decryption
val iv = Base64.decode(ivSpecValue, Base64.NO_WRAP)
val spec = IvParameterSpec(iv)
cipher?.init(Cipher.DECRYPT_MODE, getSecretKey(), spec)
initBiometricPrompt()
actionIfCypherInit.invoke(biometricPrompt, cryptoObject, promptInfoExtractCredential)
} catch (unrecoverableKeyException: UnrecoverableKeyException) {
Log.e(TAG, "Unable to initialize decrypt data", unrecoverableKeyException)
deleteEntryKey()
} catch (invalidKeyException: KeyPermanentlyInvalidatedException) {
Log.e(TAG, "Unable to initialize decrypt data", invalidKeyException)
biometricUnlockCallback?.onInvalidKeyException(invalidKeyException)
} catch (e: Exception) {
Log.e(TAG, "Unable to initialize decrypt data", e)
biometricUnlockCallback?.onBiometricException(e)
}
}
fun decryptData(encryptedValue: String) {
if (!isFingerprintInitialized) {
return
}
try {
// actual decryption here
val encrypted = Base64.decode(encryptedValue, Base64.NO_WRAP)
cipher?.doFinal(encrypted)?.let { decrypted ->
biometricUnlockCallback?.handleDecryptedResult(String(decrypted))
}
} catch (badPaddingException: BadPaddingException) {
Log.e(TAG, "Unable to decrypt data", badPaddingException)
biometricUnlockCallback?.onInvalidKeyException(badPaddingException)
} catch (e: Exception) {
Log.e(TAG, "Unable to decrypt data", e)
biometricUnlockCallback?.onBiometricException(e)
}
}
fun deleteEntryKey() {
try {
keyStore?.load(null)
keyStore?.deleteEntry(BIOMETRIC_KEYSTORE_KEY)
} catch (e: Exception) {
Log.e(TAG, "Unable to delete entry key in keystore", e)
biometricUnlockCallback?.onBiometricException(e)
}
}
fun setAuthenticationCallback(authenticationCallback: BiometricPrompt.AuthenticationCallback) {
this.authenticationCallback = authenticationCallback
}
@Synchronized
fun initBiometricPrompt() {
if (biometricPrompt == null) {
authenticationCallback?.let {
biometricPrompt = BiometricPrompt(context, Executors.newSingleThreadExecutor(), it)
}
}
}
interface BiometricUnlockErrorCallback {
fun onInvalidKeyException(e: Exception)
fun onBiometricException(e: Exception)
}
interface BiometricUnlockCallback : BiometricUnlockErrorCallback {
fun handleEncryptedResult(encryptedValue: String, ivSpec: String)
fun handleDecryptedResult(decryptedValue: String)
}
companion object {
private val TAG = BiometricUnlockDatabaseHelper::class.java.name
private const val BIOMETRIC_KEYSTORE = "AndroidKeyStore"
private const val BIOMETRIC_KEYSTORE_KEY = "com.kunzisoft.keepass.biometric.key"
private const val BIOMETRIC_KEY_ALGORITHM = KeyProperties.KEY_ALGORITHM_AES
private const val BIOMETRIC_BLOCKS_MODES = KeyProperties.BLOCK_MODE_CBC
private const val BIOMETRIC_ENCRYPTION_PADDING = KeyProperties.ENCRYPTION_PADDING_PKCS7
/**
* Remove entry key in keystore
*/
fun deleteEntryKeyInKeystoreForBiometric(context: FragmentActivity,
biometricUnlockCallback: BiometricUnlockErrorCallback) {
val fingerPrintHelper = BiometricUnlockDatabaseHelper(context, object : BiometricUnlockCallback {
override fun handleEncryptedResult(encryptedValue: String, ivSpec: String) {}
override fun handleDecryptedResult(decryptedValue: String) {}
override fun onInvalidKeyException(e: Exception) {
biometricUnlockCallback.onInvalidKeyException(e)
}
override fun onBiometricException(e: Exception) {
biometricUnlockCallback.onBiometricException(e)
}
})
fingerPrintHelper.deleteEntryKey()
}
}
}

View File

@@ -17,7 +17,7 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.fingerprint
package com.kunzisoft.keepass.biometric
import android.content.Context
import android.graphics.drawable.Animatable2
@@ -39,19 +39,23 @@ class FingerPrintAnimatedVector(context: Context, imageView: ImageView) {
imageView.setImageDrawable(scanFingerprint)
}
private var animationCallback = object : Animatable2.AnimationCallback() {
override fun onAnimationEnd(drawable: Drawable) {
if (!scanFingerprint.isRunning)
scanFingerprint.start()
}
}
fun startScan() {
scanFingerprint.registerAnimationCallback(object : Animatable2.AnimationCallback() {
override fun onAnimationEnd(drawable: Drawable) {
if (!scanFingerprint.isRunning)
scanFingerprint.start()
}
})
scanFingerprint.registerAnimationCallback(animationCallback)
if (!scanFingerprint.isRunning)
scanFingerprint.start()
}
fun stopScan() {
scanFingerprint.unregisterAnimationCallback(animationCallback)
if (scanFingerprint.isRunning)
scanFingerprint.stop()
}

View File

@@ -27,7 +27,7 @@ import android.util.Log
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.exception.*
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.ProgressTaskUpdater
import java.io.FileNotFoundException
@@ -120,7 +120,7 @@ class LoadDatabaseRunnable(private val mWeakContext: WeakReference<Context>,
keyFileUri = null
}
mWeakContext.get()?.let {
FileDatabaseHistory.getInstance(it).addOrUpdateDatabaseUri(uri, keyFileUri)
FileDatabaseHistoryAction.getInstance(it).addOrUpdateDatabaseUri(uri, keyFileUri)
}
}

View File

@@ -1,344 +0,0 @@
/*
* 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.fingerprint
import android.annotation.SuppressLint
import android.app.KeyguardManager
import android.content.Context
import android.hardware.fingerprint.FingerprintManager
import android.os.Build
import android.os.CancellationSignal
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyPermanentlyInvalidatedException
import android.security.keystore.KeyProperties
import androidx.annotation.RequiresApi
import android.util.Base64
import android.util.Log
import java.io.IOException
import java.security.KeyStore
import java.security.KeyStoreException
import java.security.NoSuchAlgorithmException
import java.security.UnrecoverableKeyException
import java.security.cert.CertificateException
import javax.crypto.BadPaddingException
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey
import javax.crypto.spec.IvParameterSpec
@RequiresApi(api = Build.VERSION_CODES.M)
class FingerPrintHelper(context: Context, private val fingerPrintCallback: FingerPrintCallback?) {
private val fingerprintManager: FingerprintManager? =
context.getSystemService(FingerprintManager::class.java)
private var keyStore: KeyStore? = null
private var keyGenerator: KeyGenerator? = null
private var cipher: Cipher? = null
private var keyguardManager: KeyguardManager? = null
private var cryptoObject: FingerprintManager.CryptoObject? = null
private var initOk = false
private var cancellationSignal: CancellationSignal? = null
private var authenticationCallback: FingerprintManager.AuthenticationCallback? = null
val isFingerprintInitialized: Boolean
get() = isFingerprintInitialized(true)
fun setAuthenticationCallback(authenticationCallback: FingerprintManager.AuthenticationCallback) {
this.authenticationCallback = authenticationCallback
}
@Synchronized
fun startListening() {
// starts listening for fingerprints with the initialised crypto object
cancellationSignal = CancellationSignal()
fingerprintManager?.authenticate(
cryptoObject,
cancellationSignal,
0 /* flags */,
authenticationCallback!!, null)
}
@Synchronized
fun stopListening() {
if (!isFingerprintInitialized(false)) {
return
}
if (cancellationSignal != null) {
cancellationSignal?.cancel()
cancellationSignal = null
}
}
init {
if (!isFingerprintSupported(fingerprintManager)) {
// really not much to do when no fingerprint support found
initOk = false
} else {
this.keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (hasEnrolledFingerprints()) {
try {
this.keyStore = KeyStore.getInstance("AndroidKeyStore")
this.keyGenerator = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_AES,
"AndroidKeyStore")
this.cipher = Cipher.getInstance(
KeyProperties.KEY_ALGORITHM_AES + "/"
+ KeyProperties.BLOCK_MODE_CBC + "/"
+ KeyProperties.ENCRYPTION_PADDING_PKCS7)
this.cryptoObject = FingerprintManager.CryptoObject(cipher!!)
initOk = true
} catch (e: Exception) {
Log.e(TAG, "Unable to initialize the keystore", e)
initOk = false
fingerPrintCallback?.onFingerPrintException(e)
}
}
}
}
private fun isFingerprintInitialized(throwException: Boolean): Boolean {
val isFingerprintInit = hasEnrolledFingerprints() && initOk
if (!isFingerprintInit && fingerPrintCallback != null) {
if (throwException)
fingerPrintCallback.onFingerPrintException(Exception("FingerPrint not initialized"))
}
return isFingerprintInit
}
fun initEncryptData() {
if (!isFingerprintInitialized) {
return
}
try {
stopListening()
createNewKeyIfNeeded(false) // no need to keep deleting existing keys
keyStore?.load(null)
val key = keyStore?.getKey(FINGERPRINT_KEYSTORE_KEY, null) as SecretKey
cipher?.init(Cipher.ENCRYPT_MODE, key)
startListening()
} catch (unrecoverableKeyException: UnrecoverableKeyException) {
Log.e(TAG, "Unable to initialize encrypt data", unrecoverableKeyException)
deleteEntryKey()
} catch (invalidKeyException: KeyPermanentlyInvalidatedException) {
Log.e(TAG, "Unable to initialize encrypt data", invalidKeyException)
fingerPrintCallback?.onInvalidKeyException(invalidKeyException)
} catch (e: Exception) {
Log.e(TAG, "Unable to initialize encrypt data", e)
fingerPrintCallback?.onFingerPrintException(e)
}
}
fun encryptData(value: String) {
if (!isFingerprintInitialized) {
return
}
try {
// actual do encryption here
val encrypted = cipher?.doFinal(value.toByteArray())
val encryptedValue = Base64.encodeToString(encrypted, Base64.NO_WRAP)
// passes updated iv spec on to callback so this can be stored for decryption
cipher?.parameters?.getParameterSpec(IvParameterSpec::class.java)?.let{ spec ->
val ivSpecValue = Base64.encodeToString(spec.iv, Base64.NO_WRAP)
fingerPrintCallback?.handleEncryptedResult(encryptedValue, ivSpecValue)
}
} catch (e: Exception) {
Log.e(TAG, "Unable to encrypt data", e)
fingerPrintCallback?.onFingerPrintException(e)
}
}
fun initDecryptData(ivSpecValue: String) {
if (!isFingerprintInitialized) {
return
}
try {
stopListening()
createNewKeyIfNeeded(false)
keyStore?.load(null)
val key = keyStore?.getKey(FINGERPRINT_KEYSTORE_KEY, null) as SecretKey
// important to restore spec here that was used for decryption
val iv = Base64.decode(ivSpecValue, Base64.NO_WRAP)
val spec = IvParameterSpec(iv)
cipher?.init(Cipher.DECRYPT_MODE, key, spec)
startListening()
} catch (unrecoverableKeyException: UnrecoverableKeyException) {
Log.e(TAG, "Unable to initialize decrypt data", unrecoverableKeyException)
deleteEntryKey()
} catch (invalidKeyException: KeyPermanentlyInvalidatedException) {
Log.e(TAG, "Unable to initialize decrypt data", invalidKeyException)
fingerPrintCallback?.onInvalidKeyException(invalidKeyException)
} catch (e: Exception) {
Log.e(TAG, "Unable to initialize decrypt data", e)
fingerPrintCallback?.onFingerPrintException(e)
}
}
fun decryptData(encryptedValue: String) {
if (!isFingerprintInitialized) {
return
}
try {
// actual decryption here
val encrypted = Base64.decode(encryptedValue, Base64.NO_WRAP)
cipher?.doFinal(encrypted)?.let { decrypted ->
//final String encryptedString = Base64.encodeToString(encrypted, 0 /* flags */);
fingerPrintCallback?.handleDecryptedResult(String(decrypted))
}
} catch (badPaddingException: BadPaddingException) {
Log.e(TAG, "Unable to decrypt data", badPaddingException)
fingerPrintCallback?.onInvalidKeyException(badPaddingException)
} catch (e: Exception) {
Log.e(TAG, "Unable to decrypt data", e)
fingerPrintCallback?.onFingerPrintException(e)
}
}
@SuppressLint("NewApi")
private fun createNewKeyIfNeeded(allowDeleteExisting: Boolean) {
if (!isFingerprintInitialized) {
return
}
try {
keyStore?.load(null)
if (allowDeleteExisting && keyStore != null && keyStore!!.containsAlias(FINGERPRINT_KEYSTORE_KEY)) {
keyStore?.deleteEntry(FINGERPRINT_KEYSTORE_KEY)
}
// Create new key if needed
if (keyStore != null && !keyStore!!.containsAlias(FINGERPRINT_KEYSTORE_KEY)) {
// Set the alias of the entry in Android KeyStore where the key will appear
// and the constrains (purposes) in the constructor of the Builder
keyGenerator?.init(
KeyGenParameterSpec.Builder(
FINGERPRINT_KEYSTORE_KEY,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
// Require the user to authenticate with a fingerprint to authorize every use
// of the key
.setUserAuthenticationRequired(true)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build())
keyGenerator?.generateKey()
}
} catch (e: Exception) {
Log.e(TAG, "Unable to create a key in keystore", e)
fingerPrintCallback?.onFingerPrintException(e)
}
}
fun deleteEntryKey() {
try {
keyStore?.load(null)
keyStore?.deleteEntry(FINGERPRINT_KEYSTORE_KEY)
} catch (e: KeyStoreException) {
Log.e(TAG, "Unable to delete entry key in keystore", e)
fingerPrintCallback?.onFingerPrintException(e)
} catch (e: CertificateException) {
Log.e(TAG, "Unable to delete entry key in keystore", e)
fingerPrintCallback?.onFingerPrintException(e)
} catch (e: NoSuchAlgorithmException) {
Log.e(TAG, "Unable to delete entry key in keystore", e)
fingerPrintCallback?.onFingerPrintException(e)
} catch (e: IOException) {
Log.e(TAG, "Unable to delete entry key in keystore", e)
fingerPrintCallback?.onFingerPrintException(e)
} catch (e: NullPointerException) {
Log.e(TAG, "Unable to delete entry key in keystore", e)
fingerPrintCallback?.onFingerPrintException(e)
}
}
@SuppressLint("NewApi")
fun hasEnrolledFingerprints(): Boolean {
// fingerprint hardware supported and api level OK
return (isFingerprintSupported(fingerprintManager)
// fingerprints enrolled
&& fingerprintManager != null && fingerprintManager.hasEnrolledFingerprints()
// and lockscreen configured
&& keyguardManager != null && keyguardManager!!.isKeyguardSecure)
}
interface FingerPrintErrorCallback {
fun onInvalidKeyException(e: Exception)
fun onFingerPrintException(e: Exception)
}
interface FingerPrintCallback : FingerPrintErrorCallback {
fun handleEncryptedResult(value: String, ivSpec: String)
fun handleDecryptedResult(value: String)
}
enum class Mode {
NOT_CONFIGURED_MODE, WAITING_PASSWORD_MODE, STORE_MODE, OPEN_MODE
}
companion object {
private val TAG = FingerPrintHelper::class.java.name
private const val FINGERPRINT_KEYSTORE_KEY = "com.kunzisoft.keepass.fingerprint.key"
fun isFingerprintSupported(fingerprintManager: FingerprintManager?): Boolean {
return fingerprintManager != null && fingerprintManager.isHardwareDetected
}
/**
* Remove entry key in keystore
*/
fun deleteEntryKeyInKeystoreForFingerprints(context: Context,
fingerPrintCallback: FingerPrintErrorCallback) {
val fingerPrintHelper = FingerPrintHelper( context, object : FingerPrintCallback {
override fun handleEncryptedResult(value: String, ivSpec: String) {}
override fun handleDecryptedResult(value: String) {}
override fun onInvalidKeyException(e: Exception) {
fingerPrintCallback.onInvalidKeyException(e)
}
override fun onFingerPrintException(e: Exception) {
fingerPrintCallback.onFingerPrintException(e)
}
})
fingerPrintHelper.deleteEntryKey()
}
}
}

View File

@@ -1,343 +0,0 @@
package com.kunzisoft.keepass.fingerprint
import android.content.Context
import android.content.SharedPreferences
import android.hardware.fingerprint.FingerprintManager
import android.net.Uri
import android.os.Build
import android.os.Handler
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.widget.CompoundButton
import android.widget.TextView
import android.widget.Toast
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.view.FingerPrintInfoView
@RequiresApi(api = Build.VERSION_CODES.M)
class FingerPrintViewsManager(var context: AppCompatActivity,
var databaseFileUri: Uri?,
var fingerPrintInfoView: FingerPrintInfoView?,
var checkboxPasswordView: CompoundButton?,
var onCheckedPasswordChangeListener: CompoundButton.OnCheckedChangeListener? = null,
var passwordView: TextView?,
var loadDatabase: (password: String?) -> Unit)
: FingerPrintHelper.FingerPrintCallback {
private var fingerPrintHelper: FingerPrintHelper? = null
private var fingerprintMustBeConfigured = true
private var fingerPrintMode: FingerPrintHelper.Mode = FingerPrintHelper.Mode.NOT_CONFIGURED_MODE
private var checkboxListenerHandler = Handler()
private var checkboxListenerRunnable: Runnable? = null
// makes it possible to store passwords per database
private val preferenceKeyValue: String
get() = PREF_KEY_VALUE_PREFIX + (databaseFileUri?.path ?: "")
private val preferenceKeyIvSpec: String
get() = PREF_KEY_IV_PREFIX + (databaseFileUri?.path ?: "")
private var prefsNoBackup: SharedPreferences? = null
init {
prefsNoBackup = getNoBackupSharedPreferences(context)
}
// fingerprint related code here
fun initFingerprint() {
// Check if fingerprint well init (be called the first time the fingerprint is configured
// and the activity still active)
if (fingerPrintHelper == null || !fingerPrintHelper!!.isFingerprintInitialized) {
fingerPrintMode = FingerPrintHelper.Mode.NOT_CONFIGURED_MODE
showFingerPrintViews(true)
// Start the animation
fingerPrintInfoView?.startFingerPrintAnimation()
// Add a check listener to change fingerprint mode
checkboxPasswordView?.setOnCheckedChangeListener { compoundButton, checked ->
// New runnable to each change
checkboxListenerHandler.removeCallbacks(checkboxListenerRunnable)
checkboxListenerRunnable = Runnable {
if (!fingerprintMustBeConfigured) {
// encrypt or decrypt mode based on how much input or not
if (checked) {
toggleFingerprintMode(FingerPrintHelper.Mode.STORE_MODE)
} else {
if (prefsNoBackup?.contains(preferenceKeyValue) == true) {
toggleFingerprintMode(FingerPrintHelper.Mode.OPEN_MODE)
} else {
// This happens when no fingerprints are registered.
toggleFingerprintMode(FingerPrintHelper.Mode.WAITING_PASSWORD_MODE)
}
}
}
}
checkboxListenerHandler.post(checkboxListenerRunnable)
// Add old listener to enable the button, only be call here because of onCheckedChange bug
onCheckedPasswordChangeListener?.onCheckedChanged(compoundButton, checked)
}
fingerPrintHelper = FingerPrintHelper(context, this)
// callback for fingerprint findings
fingerPrintHelper?.setAuthenticationCallback(authenticationCallback)
}
}
private val authenticationCallback = object : FingerprintManager.AuthenticationCallback() {
override fun onAuthenticationError(
errorCode: Int,
errString: CharSequence) {
when (errorCode) {
5 -> Log.i(TAG, "Fingerprint authentication error. Code : $errorCode Error : $errString")
else -> {
Log.e(TAG, "Fingerprint authentication error. Code : $errorCode Error : $errString")
setFingerPrintView(errString.toString(), true)
}
}
}
override fun onAuthenticationHelp(
helpCode: Int,
helpString: CharSequence) {
Log.w(TAG, "Fingerprint authentication help. Code : $helpCode Help : $helpString")
showError(helpString)
setFingerPrintView(helpString.toString(), true)
fingerPrintInfoView?.text = helpString.toString()
}
override fun onAuthenticationFailed() {
Log.e(TAG, "Fingerprint authentication failed, fingerprint not recognized")
showError(R.string.fingerprint_not_recognized)
}
override fun onAuthenticationSucceeded(result: FingerprintManager.AuthenticationResult) {
when (fingerPrintMode) {
FingerPrintHelper.Mode.STORE_MODE -> {
// newly store the entered password in encrypted way
fingerPrintHelper?.encryptData(passwordView?.text.toString())
}
FingerPrintHelper.Mode.OPEN_MODE -> {
// retrieve the encrypted value from preferences
prefsNoBackup?.getString(preferenceKeyValue, null)?.let {
fingerPrintHelper?.decryptData(it)
}
}
FingerPrintHelper.Mode.NOT_CONFIGURED_MODE -> {}
FingerPrintHelper.Mode.WAITING_PASSWORD_MODE -> {}
}
}
}
private fun initEncryptData() {
setFingerPrintView(R.string.store_with_fingerprint)
fingerPrintMode = FingerPrintHelper.Mode.STORE_MODE
fingerPrintHelper?.initEncryptData()
}
private fun initDecryptData() {
setFingerPrintView(R.string.scanning_fingerprint)
fingerPrintMode = FingerPrintHelper.Mode.OPEN_MODE
if (fingerPrintHelper != null) {
prefsNoBackup?.getString(preferenceKeyIvSpec, null)?.let {
fingerPrintHelper?.initDecryptData(it)
}
}
}
private fun initWaitData() {
setFingerPrintView(R.string.no_password_stored, true)
fingerPrintMode = FingerPrintHelper.Mode.WAITING_PASSWORD_MODE
}
@Synchronized
private fun toggleFingerprintMode(newMode: FingerPrintHelper.Mode) {
when (newMode) {
FingerPrintHelper.Mode.WAITING_PASSWORD_MODE -> setFingerPrintView(R.string.no_password_stored, true)
FingerPrintHelper.Mode.STORE_MODE -> setFingerPrintView(R.string.store_with_fingerprint)
FingerPrintHelper.Mode.OPEN_MODE -> setFingerPrintView(R.string.scanning_fingerprint)
else -> {}
}
if (newMode != fingerPrintMode) {
fingerPrintMode = newMode
reInitWithFingerprintMode()
}
}
@Synchronized
fun reInitWithFingerprintMode() {
when (fingerPrintMode) {
FingerPrintHelper.Mode.STORE_MODE -> initEncryptData()
FingerPrintHelper.Mode.WAITING_PASSWORD_MODE -> initWaitData()
FingerPrintHelper.Mode.OPEN_MODE -> initDecryptData()
else -> {}
}
// Show fingerprint key deletion
context.invalidateOptionsMenu()
}
fun stopListening() {
// stop listening when we go in background
fingerPrintInfoView?.stopFingerPrintAnimation()
fingerPrintMode = FingerPrintHelper.Mode.NOT_CONFIGURED_MODE
fingerPrintHelper?.stopListening()
}
fun destroy() {
// Restore the checked listener
checkboxPasswordView?.setOnCheckedChangeListener(onCheckedPasswordChangeListener)
stopListening()
fingerPrintHelper = null
showFingerPrintViews(false)
}
fun inflateOptionsMenu(menuInflater: MenuInflater, menu: Menu) {
if (!fingerprintMustBeConfigured && prefsNoBackup?.contains(preferenceKeyValue) == true)
menuInflater.inflate(R.menu.fingerprint, menu)
}
private fun showFingerPrintViews(show: Boolean) {
context.runOnUiThread { fingerPrintInfoView?.hide = !show }
}
private fun setFingerPrintView(textId: Int, lock: Boolean = false) {
context.runOnUiThread {
fingerPrintInfoView?.setText(textId, lock)
}
}
private fun setFingerPrintView(text: CharSequence, lock: Boolean = false) {
context.runOnUiThread {
fingerPrintInfoView?.setText(text, lock)
}
}
@Synchronized
fun checkFingerprintAvailability() {
// fingerprint not supported (by API level or hardware) so keep option hidden
// or manually disable
if (!PreferencesUtil.isFingerprintEnable(context)
|| !FingerPrintHelper.isFingerprintSupported(context.getSystemService(FingerprintManager::class.java))) {
showFingerPrintViews(false)
} else {
// all is set here so we can confirm to user and start listening for fingerprints
// show explanations
fingerPrintInfoView?.setOnClickListener { _ ->
FingerPrintExplanationDialog().show(context.supportFragmentManager, "fingerprintDialog")
}
showFingerPrintViews(true)
// fingerprint is available but not configured, show icon but in disabled state with some information
if (fingerPrintHelper?.hasEnrolledFingerprints() != true) {
// This happens when no fingerprints are registered. Listening won't start
setFingerPrintView(R.string.configure_fingerprint, true)
} else {
fingerprintMustBeConfigured = false
// fingerprint available but no stored password found yet for this DB so show info don't listen
if (prefsNoBackup?.contains(preferenceKeyValue) != true) {
if (checkboxPasswordView?.isChecked == true) {
// listen for encryption
initEncryptData()
} else {
// wait for typing
initWaitData()
}
} else {
// listen for decryption
initDecryptData()
}
}// finally fingerprint available and configured so we can use it
}
// Show fingerprint key deletion
context.invalidateOptionsMenu()
}
private fun removePrefsNoBackupKey() {
prefsNoBackup?.edit()
?.remove(preferenceKeyValue)
?.remove(preferenceKeyIvSpec)
?.apply()
}
override fun handleEncryptedResult(
value: String,
ivSpec: String) {
prefsNoBackup?.edit()
?.putString(preferenceKeyValue, value)
?.putString(preferenceKeyIvSpec, ivSpec)
?.apply()
loadDatabase.invoke(null)
setFingerPrintView(R.string.encrypted_value_stored)
}
override fun handleDecryptedResult(value: String) {
// Load database directly with password retrieve
loadDatabase.invoke(value)
}
override fun onInvalidKeyException(e: Exception) {
showError(context.getString(R.string.fingerprint_invalid_key))
deleteEntryKey()
}
override fun onFingerPrintException(e: Exception) {
// Don't show error here;
// showError(getString(R.string.fingerprint_error, e.getMessage()));
// Can be uninit in Activity and init in fragment
setFingerPrintView(e.localizedMessage, true)
}
fun deleteEntryKey() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintHelper?.deleteEntryKey()
removePrefsNoBackupKey()
fingerPrintMode = FingerPrintHelper.Mode.NOT_CONFIGURED_MODE
checkFingerprintAvailability()
}
}
private fun showError(messageId: Int) {
showError(context.getString(messageId))
}
private fun showError(message: CharSequence) {
context.runOnUiThread { Toast.makeText(context, message, Toast.LENGTH_SHORT).show() } // TODO Error
}
companion object {
private val TAG = FingerPrintViewsManager::class.java.name
private const val PREF_KEY_VALUE_PREFIX = "valueFor_" // key is a combination of db file name and this prefix
private const val PREF_KEY_IV_PREFIX = "ivFor_" // key is a combination of db file name and this prefix
private const val NO_BACKUP_PREFERENCE_FILE_NAME = "nobackup"
fun getNoBackupSharedPreferences(context: Context): SharedPreferences {
return context.getSharedPreferences(
NO_BACKUP_PREFERENCE_FILE_NAME,
Context.MODE_PRIVATE)
}
fun deleteAllValuesFromNoBackupPreferences(context: Context) {
val prefsNoBackup = getNoBackupSharedPreferences(context)
val sharedPreferencesEditor = prefsNoBackup.edit()
sharedPreferencesEditor.clear()
sharedPreferencesEditor.apply()
}
}
}

View File

@@ -28,6 +28,6 @@ class MagikIMESettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
// Load the preferences from an XML resource
setPreferencesFromResource(R.xml.keyboard_preferences, rootKey)
setPreferencesFromResource(R.xml.preferences_keyboard, rootKey)
}
}

View File

@@ -31,7 +31,7 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
private var mCallback: Callback? = null
override fun onAttach(context: Context?) {
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is Callback) {
@@ -45,7 +45,7 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
setPreferencesFromResource(R.xml.preferences, rootKey)
// add listeners for non-default actions
findPreference(getString(R.string.app_key)).apply {
findPreference(getString(R.string.settings_app_key)).apply {
onPreferenceClickListener = Preference.OnPreferenceClickListener {
mCallback?.onNestedPreferenceSelected(NestedSettingsFragment.Screen.APPLICATION)
false
@@ -59,6 +59,13 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
}
}
findPreference(getString(R.string.settings_advanced_unlock_key)).apply {
onPreferenceClickListener = Preference.OnPreferenceClickListener {
mCallback?.onNestedPreferenceSelected(NestedSettingsFragment.Screen.ADVANCED_UNLOCK)
false
}
}
findPreference(getString(R.string.settings_appearance_key)).apply {
onPreferenceClickListener = Preference.OnPreferenceClickListener {
mCallback?.onNestedPreferenceSelected(NestedSettingsFragment.Screen.APPEARANCE)
@@ -66,7 +73,7 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
}
}
findPreference(getString(R.string.database_main_menu_key)).apply {
findPreference(getString(R.string.settings_database_key)).apply {
onPreferenceClickListener = Preference.OnPreferenceClickListener {
mCallback?.onNestedPreferenceSelected(NestedSettingsFragment.Screen.DATABASE)
false
@@ -76,9 +83,11 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
}
}
findPreference(getString(R.string.database_change_master_key_key)).apply {
findPreference(getString(R.string.settings_database_change_credentials_key)).apply {
onPreferenceClickListener = Preference.OnPreferenceClickListener {
AssignMasterKeyDialogFragment().show(fragmentManager, "passwordDialog")
fragmentManager?.let { fragmentManager ->
AssignMasterKeyDialogFragment().show(fragmentManager, "passwordDialog")
}
false
}
}

View File

@@ -22,7 +22,6 @@ package com.kunzisoft.keepass.settings
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.res.Resources
import android.hardware.fingerprint.FingerprintManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
@@ -37,6 +36,7 @@ import androidx.preference.PreferenceFragmentCompat
import android.util.Log
import android.view.autofill.AutofillManager
import android.widget.Toast
import androidx.biometric.BiometricManager
import com.kunzisoft.keepass.BuildConfig
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.KeyboardExplanationDialogFragment
@@ -45,11 +45,11 @@ import com.kunzisoft.keepass.activities.dialogs.UnavailableFeatureDialogFragment
import com.kunzisoft.keepass.activities.dialogs.UnderDevelopmentFeatureDialogFragment
import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper
import com.kunzisoft.keepass.activities.stylish.Stylish
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
import com.kunzisoft.keepass.app.database.CipherDatabaseAction
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.education.Education
import com.kunzisoft.keepass.fingerprint.FingerPrintHelper
import com.kunzisoft.keepass.fingerprint.FingerPrintViewsManager
import com.kunzisoft.keepass.biometric.BiometricUnlockDatabaseHelper
import com.kunzisoft.keepass.icons.IconPackChooser
import com.kunzisoft.keepass.settings.preferencedialogfragment.*
@@ -65,7 +65,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
private var parallelismPref: Preference? = null
enum class Screen {
APPLICATION, FORM_FILLING, DATABASE, APPEARANCE
APPLICATION, FORM_FILLING, ADVANCED_UNLOCK, DATABASE, APPEARANCE
}
override fun onResume() {
@@ -100,6 +100,9 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
Screen.FORM_FILLING -> {
onCreateFormFillingPreference(rootKey)
}
Screen.ADVANCED_UNLOCK -> {
onCreateAdvancesUnlockPreferences(rootKey)
}
Screen.APPEARANCE -> {
onCreateAppearancePreferences(rootKey)
}
@@ -110,7 +113,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
}
private fun onCreateApplicationPreferences(rootKey: String?) {
setPreferencesFromResource(R.xml.application_preferences, rootKey)
setPreferencesFromResource(R.xml.preferences_application, rootKey)
activity?.let { activity ->
allowCopyPassword()
@@ -118,7 +121,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
val keyFile = findPreference(getString(R.string.keyfile_key))
keyFile.setOnPreferenceChangeListener { _, newValue ->
if (!(newValue as Boolean)) {
FileDatabaseHistory.getInstance(activity.applicationContext).deleteAllKeyFiles()
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAllKeyFiles()
}
true
}
@@ -126,67 +129,15 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
val recentHistory = findPreference(getString(R.string.recentfile_key))
recentHistory.setOnPreferenceChangeListener { _, newValue ->
if (!(newValue as Boolean)) {
FileDatabaseHistory.getInstance(activity.applicationContext).deleteAll()
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAll()
}
true
}
val fingerprintEnablePreference = findPreference(getString(R.string.fingerprint_enable_key)) as SwitchPreference
// < M solve verifyError exception
var fingerprintSupported = false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
fingerprintSupported = FingerPrintHelper.isFingerprintSupported(
activity.getSystemService(FingerprintManager::class.java))
if (!fingerprintSupported) {
// False if under Marshmallow
fingerprintEnablePreference.isChecked = false
fingerprintEnablePreference.setOnPreferenceClickListener { preference ->
fragmentManager?.let { fragmentManager ->
(preference as SwitchPreference).isChecked = false
UnavailableFeatureDialogFragment.getInstance(Build.VERSION_CODES.M)
.show(fragmentManager, "unavailableFeatureDialog")
}
false
}
}
val deleteKeysFingerprints = findPreference(getString(R.string.fingerprint_delete_all_key))
if (!fingerprintSupported) {
deleteKeysFingerprints.isEnabled = false
} else {
deleteKeysFingerprints.setOnPreferenceClickListener {
context?.let { context ->
AlertDialog.Builder(context)
.setMessage(resources.getString(R.string.fingerprint_delete_all_warning))
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(resources.getString(android.R.string.yes)
) { _, _ ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
FingerPrintHelper.deleteEntryKeyInKeystoreForFingerprints(
context,
object : FingerPrintHelper.FingerPrintErrorCallback {
override fun onInvalidKeyException(e: Exception) {}
override fun onFingerPrintException(e: Exception) {
Toast.makeText(context,
getString(R.string.fingerprint_error, e.localizedMessage),
Toast.LENGTH_SHORT).show()
}
})
}
FingerPrintViewsManager.deleteAllValuesFromNoBackupPreferences(context)
}
.setNegativeButton(resources.getString(android.R.string.no))
{ _, _ -> }.show()
}
false
}
}
}
}
private fun onCreateFormFillingPreference(rootKey: String?) {
setPreferencesFromResource(R.xml.form_filling_preferences, rootKey)
setPreferencesFromResource(R.xml.preferences_form_filling, rootKey)
activity?.let { activity ->
val autoFillEnablePreference = findPreference(getString(R.string.settings_autofill_enable_key)) as SwitchPreference
@@ -264,8 +215,68 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
allowCopyPassword()
}
private fun onCreateAdvancesUnlockPreferences(rootKey: String?) {
setPreferencesFromResource(R.xml.preferences_advanced_unlock, rootKey)
activity?.let { activity ->
val biometricUnlockEnablePreference = findPreference(getString(R.string.biometric_unlock_enable_key)) as SwitchPreference
// < M solve verifyError exception
var biometricUnlockSupported = false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val biometricCanAuthenticate = BiometricManager.from(activity).canAuthenticate()
biometricUnlockSupported = biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED
|| biometricCanAuthenticate == BiometricManager.BIOMETRIC_SUCCESS
}
if (!biometricUnlockSupported) {
// False if under Marshmallow
biometricUnlockEnablePreference.isChecked = false
biometricUnlockEnablePreference.setOnPreferenceClickListener { preference ->
fragmentManager?.let { fragmentManager ->
(preference as SwitchPreference).isChecked = false
UnavailableFeatureDialogFragment.getInstance(Build.VERSION_CODES.M)
.show(fragmentManager, "unavailableFeatureDialog")
}
false
}
}
val deleteKeysFingerprints = findPreference(getString(R.string.biometric_delete_all_key_key))
if (!biometricUnlockSupported) {
deleteKeysFingerprints.isEnabled = false
} else {
deleteKeysFingerprints.setOnPreferenceClickListener {
context?.let { context ->
AlertDialog.Builder(context)
.setMessage(resources.getString(R.string.biometric_delete_all_key_warning))
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(resources.getString(android.R.string.yes)
) { _, _ ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
BiometricUnlockDatabaseHelper.deleteEntryKeyInKeystoreForBiometric(
activity,
object : BiometricUnlockDatabaseHelper.BiometricUnlockErrorCallback {
override fun onInvalidKeyException(e: Exception) {}
override fun onBiometricException(e: Exception) {
Toast.makeText(context,
getString(R.string.biometric_scanning_error, e.localizedMessage),
Toast.LENGTH_SHORT).show()
}
})
}
CipherDatabaseAction.getInstance(context.applicationContext).deleteAll()
}
.setNegativeButton(resources.getString(android.R.string.no))
{ _, _ -> }.show()
}
false
}
}
}
}
private fun onCreateAppearancePreferences(rootKey: String?) {
setPreferencesFromResource(R.xml.appearance_preferences, rootKey)
setPreferencesFromResource(R.xml.preferences_appearance, rootKey)
activity?.let { activity ->
val stylePreference = findPreference(getString(R.string.setting_style_key))
@@ -326,7 +337,7 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
}
private fun onCreateDatabasePreference(rootKey: String?) {
setPreferencesFromResource(R.xml.database_preferences, rootKey)
setPreferencesFromResource(R.xml.preferences_database, rootKey)
if (database.loaded) {
@@ -523,8 +534,9 @@ class NestedSettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferen
return when (key) {
Screen.APPLICATION -> resources.getString(R.string.menu_app_settings)
Screen.FORM_FILLING -> resources.getString(R.string.menu_form_filling_settings)
Screen.DATABASE -> resources.getString(R.string.menu_db_settings)
Screen.APPEARANCE -> resources.getString(R.string.appearance)
Screen.ADVANCED_UNLOCK -> resources.getString(R.string.menu_advanced_unlock_settings)
Screen.DATABASE -> resources.getString(R.string.menu_database_settings)
Screen.APPEARANCE -> resources.getString(R.string.menu_appearance_settings)
}
}
}

View File

@@ -128,10 +128,16 @@ object PreferencesUtil {
context.resources.getBoolean(R.bool.lock_database_back_root_default))
}
fun isFingerprintEnable(context: Context): Boolean {
fun isBiometricUnlockEnable(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.fingerprint_enable_key),
context.resources.getBoolean(R.bool.fingerprint_enable_default))
return prefs.getBoolean(context.getString(R.string.biometric_unlock_enable_key),
context.resources.getBoolean(R.bool.biometric_unlock_enable_default))
}
fun isBiometricPromptAutoOpenEnable(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.biometric_auto_open_prompt_key),
context.resources.getBoolean(R.bool.biometric_auto_open_prompt_default))
}
fun isFullFilePathEnable(context: Context): Boolean {

View File

@@ -0,0 +1,17 @@
package com.kunzisoft.keepass.settings
import android.os.Bundle
import androidx.fragment.app.Fragment
class SettingsAdvancedUnlockActivity : SettingsActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
timeoutEnable = false
}
override fun retrieveMainFragment(): Fragment {
return NestedSettingsFragment.newInstance(NestedSettingsFragment.Screen.ADVANCED_UNLOCK)
}
}

View File

@@ -77,7 +77,7 @@ open class ProgressTaskDialogFragment : DialogFragment(), ProgressTaskUpdater {
return super.onCreateDialog(savedInstanceState)
}
override fun onDismiss(dialog: DialogInterface?) {
override fun onDismiss(dialog: DialogInterface) {
activity?.unlockScreenOrientation()
super.onDismiss(dialog)
}

View File

@@ -2,7 +2,7 @@ package com.kunzisoft.keepass.utils
import android.content.Context
import android.net.Uri
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
import com.kunzisoft.keepass.settings.PreferencesUtil
class FileDatabaseInfo : FileInfo {
@@ -21,7 +21,7 @@ class FileDatabaseInfo : FileInfo {
fun retrieveDatabaseTitle(titleCallback: (String)->Unit) {
FileDatabaseHistory.getInstance(context.applicationContext).getFileDatabaseHistory(fileUri) {
FileDatabaseHistoryAction.getInstance(context.applicationContext).getFileDatabaseHistory(fileUri) {
fileDatabaseHistoryEntity ->
titleCallback.invoke(retrieveDatabaseAlias(fileDatabaseHistoryEntity?.databaseAlias ?: ""))

View File

@@ -0,0 +1,99 @@
package com.kunzisoft.keepass.view
import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.annotation.StringRes
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.biometric.FingerPrintAnimatedVector
class AdvancedUnlockInfoView @JvmOverloads constructor(context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0)
: LinearLayout(context, attrs, defStyle) {
private val unlockContainerView: View
private var unlockAnimatedVector: FingerPrintAnimatedVector? = null
private var unlockTitleTextView: TextView? = null
private var unlockMessageTextView: TextView? = null
var unlockIconImageView: ImageView? = null
init {
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
inflater.inflate(R.layout.view_advanced_unlock, this)
unlockContainerView = findViewById(R.id.fingerprint_container)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
unlockTitleTextView = findViewById(R.id.biometric_title)
unlockMessageTextView = findViewById(R.id.biometric_message)
unlockIconImageView = findViewById(R.id.biometric_image)
// Init the fingerprint animation
unlockAnimatedVector = FingerPrintAnimatedVector(context, unlockIconImageView!!)
}
}
fun startIconViewAnimation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
unlockAnimatedVector?.startScan()
}
}
fun stopIconViewAnimation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
unlockAnimatedVector?.stopScan()
}
}
fun setIconViewClickListener(listener: ((view: View)->Unit)?) {
if (listener == null)
stopIconViewAnimation()
else
startIconViewAnimation()
unlockContainerView.alpha = if (listener == null) 0.8f else 1f
unlockIconImageView?.setOnClickListener(listener)
}
var title: CharSequence
get() {
return unlockTitleTextView?.text?.toString() ?: ""
}
set(value) {
unlockTitleTextView?.text = value
}
fun setTitle(@StringRes textId: Int) {
title = context.getString(textId)
}
var message: CharSequence?
get() {
return unlockMessageTextView?.text?.toString() ?: ""
}
set(value) {
if (value == null || value.isEmpty())
unlockMessageTextView?.visibility = GONE
else
unlockMessageTextView?.visibility = VISIBLE
unlockMessageTextView?.text = value ?: ""
}
fun setMessage(@StringRes textId: Int) {
message = context.getString(textId)
}
var hide: Boolean
get() {
return visibility != VISIBLE
}
set(value) {
visibility = if (value) View.GONE else View.VISIBLE
}
}

View File

@@ -1,76 +0,0 @@
package com.kunzisoft.keepass.view
import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.fingerprint.FingerPrintAnimatedVector
class FingerPrintInfoView @JvmOverloads constructor(context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0)
: LinearLayout(context, attrs, defStyle) {
private val fingerPrintContainerView: View
private var fingerPrintAnimatedVector: FingerPrintAnimatedVector? = null
private var fingerPrintTextView: TextView? = null
var fingerPrintImageView: ImageView? = null
init {
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
inflater.inflate(R.layout.fingerprint_show, this)
fingerPrintContainerView = findViewById(R.id.fingerprint_container)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintTextView = findViewById(R.id.fingerprint_label)
fingerPrintImageView = findViewById(R.id.fingerprint_image)
// Init the fingerprint animation
fingerPrintAnimatedVector = FingerPrintAnimatedVector(context, fingerPrintImageView!!)
}
}
fun startFingerPrintAnimation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintAnimatedVector?.startScan()
}
}
fun stopFingerPrintAnimation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintAnimatedVector?.stopScan()
}
}
var text: CharSequence
get() {
return fingerPrintTextView?.text?.toString() ?: ""
}
set(value) {
fingerPrintTextView?.text = value
}
fun setText(textId: Int, lock: Boolean = false) {
setText(context.getString(textId), lock)
}
fun setText(text: CharSequence, lock: Boolean = false) {
fingerPrintContainerView.alpha = if (lock) 0.8f else 1f
fingerPrintTextView?.text = text
}
var hide: Boolean
get() {
return visibility != VISIBLE
}
set(value) {
visibility = if (value) View.GONE else View.VISIBLE
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/circle"
/>
<item
android:drawable="@drawable/ic_lock_open_white_24dp"
android:bottom="12dp"
android:left="12dp"
android:right="12dp"
android:top="12dp"/>
</layer-list>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:color="@color/white"
tools:targetApi="lollipop">
<item>
<shape
android:shape="oval">
<solid android:color="?attr/colorAccent"/>
</shape>
</item>
</ripple>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="@color/green"/>
</shape>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group>
<group>
<path
android:fillColor="#f5f0f0"
android:strokeWidth="1"
android:pathData="M 12.099609 2 C 9.9496186 2 7.9107813 2.5192969 6.0507812 3.5292969 C 5.8107813 3.6592969 5.7196538 3.9709375 5.8496094 4.2109375 C 5.9896094 4.4509375 6.2892969 4.5401474 6.5292969 4.4101562 C 8.239288 3.4701563 10.119609 3 12.099609 3 C 13.817565 3 15.298631 3.3380125 16.904297 4.0605469 L 17.658203 3.3066406 C 15.801889 2.4224054 14.062357 2 12.099609 2 z M 20.630859 2.7929688 C 20.353595 2.7923499 20.076963 2.8957023 19.869141 3.1035156 L 3.6054688 19.367188 C 3.1898243 19.782837 3.1898065 20.478878 3.6054688 20.894531 C 4.0211132 21.310172 4.7171681 21.310181 5.1328125 20.894531 L 21.396484 4.6308594 C 21.812129 4.2152078 21.809482 3.5211096 21.394531 3.1054688 C 21.1867 2.8976421 20.908124 2.7935876 20.630859 2.7929688 z M 12.082031 4.4394531 C 10.290782 4.4419476 8.4996875 4.8501572 6.9296875 5.6601562 C 5.4296875 6.4301563 4.1696964 7.5296875 3.1796875 8.9296875 C 3.0196875 9.1596875 3.0707902 9.4708594 3.3007812 9.6308594 C 3.3907901 9.6908772 3.4897549 9.7207031 3.5898438 9.7207031 C 3.7498437 9.7207031 3.9004687 9.6497656 3.9804688 9.5097656 C 4.8804687 8.2497656 6.0208594 7.2507813 7.3808594 6.5507812 C 9.702879 5.3492128 12.551839 5.1405673 15.080078 5.8847656 L 15.886719 5.078125 C 14.672134 4.6548553 13.378189 4.4376481 12.082031 4.4394531 z M 12.050781 6.8203125 C 8.8207726 6.8203125 5.8690714 8.6299217 4.5390625 11.419922 C 4.0890714 12.369922 3.859375 13.460156 3.859375 14.660156 C 3.859375 15.410156 3.9419325 16.143623 4.0917969 16.873047 L 4.9453125 16.019531 C 4.8716574 15.480855 4.8496094 15.017564 4.8496094 14.660156 C 4.8496094 13.620156 5.049462 12.669375 5.4394531 11.859375 C 6.609462 9.409375 9.2107815 7.8300781 12.050781 7.8300781 C 12.394543 7.8300781 12.729451 7.8605876 13.060547 7.9042969 L 13.931641 7.0332031 C 13.326222 6.8985547 12.698935 6.8203125 12.050781 6.8203125 z M 20.158203 7.8769531 L 19.451172 8.5859375 C 19.705703 8.8667188 19.944922 9.1654687 20.169922 9.4804688 C 20.329922 9.7104775 20.639132 9.7596094 20.869141 9.5996094 C 21.099185 9.4396094 21.150234 9.1203906 20.990234 8.9003906 C 20.732029 8.5378633 20.452607 8.1983122 20.158203 7.8769531 z M 11.673828 9.2910156 C 8.7939582 9.4920753 6.5090655 11.751686 6.4375 14.527344 L 7.6914062 13.273438 C 8.128702 12.047606 9.1093977 11.060938 10.378906 10.585938 L 11.673828 9.2910156 z M 18.388672 9.6464844 L 17.675781 10.359375 C 18.68916 11.534094 19.300781 13.029838 19.300781 14.660156 C 19.300781 15.730156 18.370712 16.599609 17.220703 16.599609 C 16.070712 16.599609 15.140625 15.730156 15.140625 14.660156 C 15.140625 14.156975 14.994276 13.690121 14.759766 13.275391 L 14.017578 14.017578 C 14.091568 14.216693 14.140625 14.427975 14.140625 14.650391 C 14.140625 16.270391 15.520703 17.589844 17.220703 17.589844 C 18.920703 17.589844 20.300781 16.270391 20.300781 14.650391 C 20.300781 12.747816 19.580533 11.0042 18.388672 9.6464844 z M 16.607422 11.427734 L 15.894531 12.140625 C 16.429255 12.855101 16.75 13.721687 16.75 14.660156 C 16.75 14.940156 16.97 15.160156 17.25 15.160156 C 17.53 15.160156 17.75 14.940156 17.75 14.660156 C 17.75 13.447471 17.320928 12.329733 16.607422 11.427734 z M 12.609375 15.425781 L 11.791016 16.244141 C 12.154172 17.361118 12.886314 18.356772 13.910156 19.050781 C 14.770156 19.640781 15.819757 19.939453 17.009766 19.939453 C 17.149766 19.939453 17.650712 19.930321 18.220703 19.820312 C 18.500756 19.770313 18.680815 19.510234 18.630859 19.240234 C 18.58085 18.960243 18.320772 18.780087 18.050781 18.830078 C 17.650781 18.900087 17.249766 18.929687 17.009766 18.929688 C 16.009766 18.929688 15.180694 18.700703 14.470703 18.220703 C 13.475364 17.551704 12.819631 16.540198 12.609375 15.425781 z M 10.615234 17.419922 L 9.8652344 18.169922 C 10.203152 18.79111 10.634087 19.368244 11.150391 19.880859 C 12.240382 20.950859 13.279132 21.540469 14.869141 21.980469 C 14.909141 21.990513 14.96 22 15 22 C 15.210009 22 15.420748 21.849141 15.470703 21.619141 C 15.540694 21.359141 15.38915 21.079757 15.119141 21.009766 C 13.709149 20.619766 12.7996 20.100156 11.849609 19.160156 C 11.332157 18.646984 10.922915 18.056717 10.615234 17.419922 z M 8.796875 19.238281 L 8.0703125 19.964844 C 8.484727 20.580638 8.8928845 21.043281 9.4902344 21.640625 C 9.5802255 21.740643 9.7098882 21.789062 9.8398438 21.789062 C 9.9698525 21.789062 10.100893 21.740625 10.210938 21.640625 C 10.400928 21.440625 10.400928 21.129687 10.210938 20.929688 C 9.6271185 20.338294 9.2322832 19.910321 8.796875 19.238281 z" />
</group>
</group>
</vector>

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8 0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8 0,1.85 -0.63,3.55 -1.69,4.9z"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="?attr/iconPreferenceColor"
android:pathData="M17.81,4.47c-0.08,0 -0.16,-0.02 -0.23,-0.06C15.66,3.42 14,3 12.01,3c-1.98,0 -3.86,0.47 -5.57,1.41 -0.24,0.13 -0.54,0.04 -0.68,-0.2 -0.13,-0.24 -0.04,-0.55 0.2,-0.68C7.82,2.52 9.86,2 12.01,2c2.13,0 3.99,0.47 6.03,1.52 0.25,0.13 0.34,0.43 0.21,0.67 -0.09,0.18 -0.26,0.28 -0.44,0.28zM3.5,9.72c-0.1,0 -0.2,-0.03 -0.29,-0.09 -0.23,-0.16 -0.28,-0.47 -0.12,-0.7 0.99,-1.4 2.25,-2.5 3.75,-3.27C9.98,4.04 14,4.03 17.15,5.65c1.5,0.77 2.76,1.86 3.75,3.25 0.16,0.22 0.11,0.54 -0.12,0.7 -0.23,0.16 -0.54,0.11 -0.7,-0.12 -0.9,-1.26 -2.04,-2.25 -3.39,-2.94 -2.87,-1.47 -6.54,-1.47 -9.4,0.01 -1.36,0.7 -2.5,1.7 -3.4,2.96 -0.08,0.14 -0.23,0.21 -0.39,0.21zM9.75,21.79c-0.13,0 -0.26,-0.05 -0.35,-0.15 -0.87,-0.87 -1.34,-1.43 -2.01,-2.64 -0.69,-1.23 -1.05,-2.73 -1.05,-4.34 0,-2.97 2.54,-5.39 5.66,-5.39s5.66,2.42 5.66,5.39c0,0.28 -0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5c0,-2.42 -2.09,-4.39 -4.66,-4.39 -2.57,0 -4.66,1.97 -4.66,4.39 0,1.44 0.32,2.77 0.93,3.85 0.64,1.15 1.08,1.64 1.85,2.42 0.19,0.2 0.19,0.51 0,0.71 -0.11,0.1 -0.24,0.15 -0.37,0.15zM16.92,19.94c-1.19,0 -2.24,-0.3 -3.1,-0.89 -1.49,-1.01 -2.38,-2.65 -2.38,-4.39 0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5c0,1.41 0.72,2.74 1.94,3.56 0.71,0.48 1.54,0.71 2.54,0.71 0.24,0 0.64,-0.03 1.04,-0.1 0.27,-0.05 0.53,0.13 0.58,0.41 0.05,0.27 -0.13,0.53 -0.41,0.58 -0.57,0.11 -1.07,0.12 -1.21,0.12zM14.91,22c-0.04,0 -0.09,-0.01 -0.13,-0.02 -1.59,-0.44 -2.63,-1.03 -3.72,-2.1 -1.4,-1.39 -2.17,-3.24 -2.17,-5.22 0,-1.62 1.38,-2.94 3.08,-2.94 1.7,0 3.08,1.32 3.08,2.94 0,1.07 0.93,1.94 2.08,1.94s2.08,-0.87 2.08,-1.94c0,-3.77 -3.25,-6.83 -7.25,-6.83 -2.84,0 -5.44,1.58 -6.61,4.03 -0.39,0.81 -0.59,1.76 -0.59,2.8 0,0.78 0.07,2.01 0.67,3.61 0.1,0.26 -0.03,0.55 -0.29,0.64 -0.26,0.1 -0.55,-0.04 -0.64,-0.29 -0.49,-1.31 -0.73,-2.61 -0.73,-3.96 0,-1.2 0.23,-2.29 0.68,-3.24 1.33,-2.79 4.28,-4.6 7.51,-4.6 4.55,0 8.25,3.51 8.25,7.83 0,1.62 -1.38,2.94 -3.08,2.94s-3.08,-1.32 -3.08,-2.94c0,-1.07 -0.93,-1.94 -2.08,-1.94s-2.08,0.87 -2.08,1.94c0,1.71 0.66,3.31 1.87,4.51 0.95,0.94 1.86,1.46 3.27,1.85 0.27,0.07 0.42,0.35 0.35,0.61 -0.05,0.23 -0.26,0.38 -0.47,0.38z"/>
</vector>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fingerprint_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:visibility="gone">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/colorPrimaryDark"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/fingerprint_image"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginTop="@dimen/default_margin"
android:layout_marginBottom="@dimen/default_margin"
android:layout_marginStart="4dp"
android:layout_marginEnd="@dimen/default_margin"
android:layout_alignParentEnd="true"
android:elevation="8dp"
android:src="@drawable/fingerprint"
android:background="@drawable/circle"
android:backgroundTint="?attr/colorAccent" />
<TextView
android:id="@+id/fingerprint_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="24dp"
android:layout_marginEnd="18dp"
android:layout_toStartOf="@+id/fingerprint_image"
style="@style/KeepassDXStyle.TextAppearance.Default.TextOnPrimary"
android:gravity="center_vertical|start" />
</RelativeLayout>

View File

@@ -15,11 +15,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.Title"
android:text="@string/fingerprint_quick_unlock_title"/>
android:text="@string/fingerprint_advanced_unlock_title"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:orientation="horizontal">
<TextView
android:layout_width="20dp"
@@ -37,13 +38,13 @@
android:paddingTop="5dp"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:text="@string/fingerprint_setting_text"/>
<TextView
android:id="@+id/fingerprint_setting_way_text"
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/fingerprint_setting_link_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:textColor="?attr/colorAccent"
android:text="@string/fingerprint_setting_way_text"/>
android:layout_margin="8dp"
style="@style/KeepassDXStyle.FabMenu"
android:text="@string/fingerprint_setting_link_text"/>
</LinearLayout>
</LinearLayout>
@@ -67,13 +68,12 @@
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:padding="5dp"
android:text="@string/fingerprint_type_password_text"/>
android:text="@string/fingerprint_type_credentials_text"/>
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="38dp"
android:src="@drawable/capture_type_password"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
@@ -95,42 +95,123 @@
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:padding="5dp"
android:text="@string/fingerprint_scan_to_store"/>
android:text="@string/fingerprint_open_biometric_prompt"/>
</LinearLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/fingerprint_image"
android:id="@+id/biometric_image"
android:layout_gravity="center"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginBottom="8dp"
android:elevation="4dp"
android:layout_marginBottom="12dp"
android:src="@drawable/fingerprint"
android:background="@drawable/circle"
android:backgroundTint="?attr/colorAccent"
android:background="@drawable/background_image"
tools:targetApi="lollipop" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="8dp">
<TextView
android:layout_width="20dp"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.WarningTextStyle"
android:text="@string/chapter_4" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:padding="5dp"
android:text="@string/fingerprint_scan_to_store"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
style="@style/KeepassDXStyle.TextAppearance.Title"
android:text="@string/usage" />
<TextView
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:padding="5dp"
android:gravity="center"
android:text="@string/fingerprint_scan_to_open"/>
android:orientation="horizontal"
android:layout_marginTop="12dp">
<TextView
android:layout_width="20dp"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.WarningTextStyle"
android:text="@string/chapter_1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:padding="5dp"
android:text="@string/fingerprint_open_biometric_prompt"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="12dp">
<TextView
android:layout_width="20dp"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.WarningTextStyle"
android:text="@string/chapter_2"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:padding="5dp"
android:text="@string/fingerprint_scan_to_open"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="12dp">
<TextView
android:layout_width="20dp"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.WarningTextStyle"
android:text="@string/chapter_3"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:padding="5dp"
android:text="@string/fingerprint_auto_open_biometric_prompt"/>
</LinearLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/auto_open_biometric_prompt_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:elevation="4dp"
android:layout_marginBottom="8dp"
android:layout_gravity="center"
android:src="@drawable/lock_open"
android:background="@drawable/circle"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_settings_white_24dp"
android:background="@drawable/background_icon"
tools:targetApi="lollipop" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fingerprint_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/biometric_delimiter"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/colorPrimaryDark"
app:layout_constraintTop_toTopOf="parent"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="24dp"
android:layout_marginEnd="18dp"
android:orientation="vertical"
android:gravity="center_vertical"
app:layout_constraintTop_toTopOf="@+id/biometric_delimiter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/biometric_image" >
<TextView
android:id="@+id/biometric_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="@string/biometric_prompt_store_credential_title"
style="@style/KeepassDXStyle.TextAppearance.Default.TextOnPrimary"
android:gravity="center_vertical|end" />
<TextView
android:id="@+id/biometric_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="Sample error"
style="@style/KeepassDXStyle.TextAppearance.Secondary.TextOnPrimary"
android:gravity="center_vertical|end" />
</LinearLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/biometric_image"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="@dimen/default_margin"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:elevation="8dp"
android:src="@drawable/fingerprint"
android:background="@drawable/background_image"
android:backgroundTint="?attr/colorAccent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -58,6 +58,7 @@
android:layout_height="wrap_content"
android:minHeight="48dp"
android:layout_gravity="end"
android:gravity="center_vertical|end"
style="@style/KeepassDXStyle.TextAppearance.Small"
android:textColor="?android:attr/textColorHintInverse"
android:paddingHorizontal="8dp"
@@ -66,7 +67,7 @@
android:layout_marginRight="12dp"
android:layout_marginEnd="12dp"
android:text="@string/default_checkbox"/>
<com.kunzisoft.keepass.view.FingerPrintInfoView
<com.kunzisoft.keepass.view.AdvancedUnlockInfoView
android:id="@+id/fingerprint_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -37,20 +37,13 @@
android:paddingTop="5dp"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:text="@string/magic_keyboard_activate_setting_text"/>
<TextView
android:id="@+id/keyboards_activate_setting_path1_text"
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/keyboards_activate_device_setting_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:textColor="?attr/colorAccent"
android:text="@string/magic_keyboard_activate_setting_path_1_text"/>
<TextView
android:id="@+id/keyboards_activate_setting_path2_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.TinyText"
android:textColor="?attr/colorAccent"
android:text="@string/magic_keyboard_activate_setting_path_2_text"/>
android:layout_margin="8dp"
style="@style/KeepassDXStyle.FabMenu"
android:text="@string/magic_keyboard_activate_device_keyboard_setting"/>
</LinearLayout>
</LinearLayout>

View File

@@ -20,8 +20,8 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_fingerprint_remove_key"
android:icon="@drawable/ic_remove_circle_white_24dp"
android:title="@string/menu_fingerprint_remove_key"
android:icon="@drawable/ic_fingerprint_remove_white_24dp"
android:title="@string/menu_biometric_remove_key"
android:orderInCategory="93"
app:showAsAction="ifRoom" />
</menu>

View File

@@ -70,17 +70,17 @@
<string name="lowercase">حروف صغيرة</string>
<string name="maskpass_summary">إخفاء كلمات المرور بشكل افتراضي</string>
<string name="menu_about">عن التطبيق</string>
<string name="menu_change_key">تغيير المفتاح الرئيسي</string>
<string name="menu_change_key_settings">تغيير المفتاح الرئيسي</string>
<string name="settings">الإعدادات</string>
<string name="menu_app_settings">إعدادات التطبيق</string>
<string name="menu_db_settings">إعدادات قاعدة البيانات</string>
<string name="menu_database_settings">إعدادات قاعدة البيانات</string>
<string name="menu_delete">حذف</string>
<string name="menu_donate">التبرع</string>
<string name="menu_edit">تعديل</string>
<string name="menu_lock">قفل قاعدة البيانات</string>
<string name="menu_open">فتح</string>
<string name="menu_search">البحث</string>
<string name="menu_fingerprint_remove_key">إزالة بصمة المفتاح</string>
<string name="menu_biometric_remove_key">إزالة بصمة المفتاح</string>
<string name="minus">ناقص</string>
<string name="never">أبداً</string>
<string name="no_results">لا توجد نتائج للبحث</string>
@@ -184,8 +184,8 @@
<string name="warning_unmounted">اربط بطاقة الذاكرة لإنشاء او تحميل قاعدة بيانات.</string>
<string name="build_label">بناء %1$s</string>
<string name="encrypted_value_stored">تم حفظ كلمة السر المشفرة</string>
<string name="no_password_stored">قاعدة البيانات لا تمتلك كلمة سر.</string>
<string name="appearance">مظهر</string>
<string name="no_credentials_stored">قاعدة البيانات لا تمتلك كلمة سر.</string>
<string name="menu_appearance_settings">مظهر</string>
<string name="general">عام</string>
<string name="autofill">ملأ تلقائي</string>
<string name="autofill_sign_in_prompt">سجل باستخدام KeePass DX</string>
@@ -199,9 +199,9 @@
<string name="clipboard_warning">اذا فشل الحذف التلقائي من الحافظة ,احذف تأريخه يدويا</string>
<string name="lock_database_screen_off_title">قفل الشاشة</string>
<string name="lock_database_screen_off_summary">اقفل قاعدة البيانات عند انغلاق الشاشة</string>
<string name="fingerprint_type_password_text">ادخل كلمة سر قاعدة البيانات</string>
<string name="fingerprint_type_credentials_text">ادخل كلمة سر قاعدة البيانات</string>
<string name="usage">استخدام</string>
<string name="fingerprint_delete_all_title">حذف مفاتيح التشفير</string>
<string name="biometric_delete_all_key_title">حذف مفاتيح التشفير</string>
<string name="unavailable_feature_text">لا يمكن بدأ هذه الميزة .</string>
<string name="unavailable_feature_version">نسخة الاندرويد %1$s لا تحقق ادنى متطلبات السنخة %2$s.</string>
<string name="file_name">اسم الملف</string>
@@ -209,21 +209,21 @@
<string name="bytes">بايت</string>
<string name="full_file_path_enable_title">مسار الملف</string>
<string name="full_file_path_enable_summary">عرض المسار الكامل للملف</string>
<string name="configure_fingerprint">فحص البصمة مدعوم لكنه ليس معد.</string>
<string name="scanning_fingerprint">فحص البصمة</string>
<string name="fingerprint_invalid_key">لا يمكن قراءة مفتاح البصمة.
<string name="configure_biometric">فحص البصمة مدعوم لكنه ليس معد.</string>
<string name="open_biometric_prompt_unlock_database">فحص البصمة</string>
<string name="biometric_invalid_key">لا يمكن قراءة مفتاح البصمة.
\nاستعد كلمة السر.</string>
<string name="fingerprint_not_recognized">لم يتعرّف على البصمة</string>
<string name="store_with_fingerprint">استخدم البصمة لحفظ كلمة السر</string>
<string name="open_biometric_prompt_store_credential">استخدم البصمة لحفظ كلمة السر</string>
<string name="history">تأريخ</string>
<string name="clipboard_notifications_summary">مكن اشعارات الحافظة لنسخ الحقول</string>
<string name="fingerprint_quick_unlock_title">كيف أعد فحص البصمة للفتح السريع \?</string>
<string name="fingerprint_advanced_unlock_title">كيف أعد فحص البصمة للفتح السريع \?</string>
<string name="fingerprint_setting_text">"احفظ البصمات في "</string>
<string name="fingerprint_scan_to_store">افحص البصمة لتخزين كلمة سر قاعدة البيانات بأمان.</string>
<string name="fingerprint_scan_to_open">افحص البصمة لفتح قاعدة البيانات عند تعطيل كلمة السر.</string>
<string name="fingerprint">البصمة</string>
<string name="fingerprint_enable_title">فحص البصمة</string>
<string name="fingerprint_enable_summary">يسمح بفحص البصمة لفتح قاعدة البيانات</string>
<string name="advanced_unlock">البصمة</string>
<string name="biometric_unlock_enable_title">فحص البصمة</string>
<string name="biometric_unlock_enable_summary">يسمح بفحص البصمة لفتح قاعدة البيانات</string>
<string name="monospace_font_fields_enable_summary">غير خط الحقول لتوضيح المحارف</string>
<string name="auto_open_file_uri_title">افتح الملفات بالتحديد
\n</string>
@@ -270,13 +270,12 @@
<string name="sort_db">قاعده بيانات طبيعية</string>
<string name="sort_last_access_time">الوصول</string>
<string name="lock">إقفال</string>
<string name="fingerprint_setting_way_text">\"الإعدادات\" ← \"الأمان\" ← \"البصمة\"</string>
<string name="fingerprint_setting_link_text">\"الإعدادات\" ← \"الأمان\" ← \"البصمة\"</string>
<string name="assign_master_key">تعيين مفتاح رئيسي</string>
<string name="recycle_bin_title">استخدم سلة المحذوفات</string>
<string name="magic_keyboard_title">Magikeyboard</string>
<string name="magic_keyboard_preference_title">إعدادات Magikeyboard</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"الإعدادات\" ← \"اللغة والإدخال\" ← \"لوحة المفاتيح الحالية\" ثم اختر واحدا.</string>
<string name="magic_keyboard_activate_setting_path_2_text">أو (\"الإعدادات\" ← \"اللغة والإدخال\" ← \"لوحة المفاتيح الافتراضية\" ثم اختر واحدا.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"الإعدادات\" ← \"اللغة والإدخال\" ← \"لوحة المفاتيح الحالية\" ثم اختر واحدا.</string>
<string name="keyboard_name">Magikeyboard</string>
<string name="keyboard_label">Magikeyboard (KeePass DX)</string>
<string name="keyboard_notification_entry_content_title">%1$s متوفر على Magikeyboard</string>

View File

@@ -95,9 +95,9 @@
<string name="maskpass_title">Emmascara contrasenya</string>
<string name="maskpass_summary">Amaga les contrasenyes per defecte</string>
<string name="menu_about">Sobre</string>
<string name="menu_change_key">Canvia Clau Mestra</string>
<string name="menu_change_key_settings">Canvia Clau Mestra</string>
<string name="settings">Paràmetres</string>
<string name="menu_db_settings">Paràmetres de la base de dades</string>
<string name="menu_database_settings">Paràmetres de la base de dades</string>
<string name="menu_delete">Esborra</string>
<string name="menu_donate">Donar</string>
<string name="menu_edit">Editar</string>

View File

@@ -106,9 +106,9 @@
<string name="maskpass_title">Skrýt hesla</string>
<string name="maskpass_summary">Ve výchozím stavu zobrazovat (***) místo hesla</string>
<string name="menu_about">O aplikaci</string>
<string name="menu_change_key">Změnit hlavní klíč</string>
<string name="menu_change_key_settings">Změnit hlavní klíč</string>
<string name="settings">Nastavení</string>
<string name="menu_db_settings">Nastavení databáze</string>
<string name="menu_database_settings">Nastavení databáze</string>
<string name="menu_delete">Smazat</string>
<string name="menu_donate">Podpořit vývoj darem</string>
<string name="menu_edit">Upravit</string>
@@ -193,7 +193,7 @@
<string name="menu_move">Přesunout</string>
<string name="menu_paste">Vložit</string>
<string name="menu_cancel">Storno</string>
<string name="menu_fingerprint_remove_key">Odebrat otisk prstu</string>
<string name="menu_biometric_remove_key">Odebrat otisk prstu</string>
<string name="menu_file_selection_read_only">Pouze pro čtení</string>
<string name="menu_open_file_read_and_write">Čtení a zápis</string>
<string name="read_only">Pouze pro čtení</string>
@@ -216,16 +216,16 @@
<string name="warning_password_encoding">Nepoužívejte v hesle pro .kdb soubory znaky nepodporované znakovou sadou Latin-1 (nepoužívejte znaky s diakritikou).</string>
<string name="warning_empty_password">Opravdu chcete ponechat databázi nechráněnou (bez hesla)?</string>
<string name="warning_no_encryption_key">Opravdu nechcete používat šifrovací klíč?</string>
<string name="configure_fingerprint">Otisk prstu je zařízením podporován, ale není nastavený.</string>
<string name="scanning_fingerprint">Snímání otisku prstu</string>
<string name="configure_biometric">Otisk prstu je zařízením podporován, ale není nastavený.</string>
<string name="open_biometric_prompt_unlock_database">Snímání otisku prstu</string>
<string name="encrypted_value_stored">Šifrované heslo uloženo</string>
<string name="fingerprint_invalid_key">Problém s neplatným otiskem prstu. Obnovte své heslo.</string>
<string name="biometric_invalid_key">Problém s neplatným otiskem prstu. Obnovte své heslo.</string>
<string name="fingerprint_not_recognized">Otisk prstu není rozpoznán</string>
<string name="fingerprint_error">Problém s otiskem prstu: %1$s</string>
<string name="store_with_fingerprint">Použít pro uložení tohoto hesla otisk prstu</string>
<string name="no_password_stored">Tato databáze zatím není chráněna heslem.</string>
<string name="biometric_scanning_error">Problém s otiskem prstu: %1$s</string>
<string name="open_biometric_prompt_store_credential">Použít pro uložení tohoto hesla otisk prstu</string>
<string name="no_credentials_stored">Tato databáze zatím není chráněna heslem.</string>
<string name="history">Historie</string>
<string name="appearance">Vzhled</string>
<string name="menu_appearance_settings">Vzhled</string>
<string name="general">Obecné</string>
<string name="autofill">Automatické vyplnění</string>
<string name="autofill_service_name">KeePass DX automatické vyplňování formulářů</string>
@@ -243,19 +243,19 @@
<string name="lock">Zamknout</string>
<string name="lock_database_screen_off_title">Zamknout obrazovku</string>
<string name="lock_database_screen_off_summary">Při zhasnutí obrazovky uzamknout databázi</string>
<string name="fingerprint_quick_unlock_title">Jak nastavit rychlé odemykání otiskem prstu?</string>
<string name="fingerprint_advanced_unlock_title">Jak nastavit rychlé odemykání otiskem prstu?</string>
<string name="fingerprint_setting_text">Uložte svůj otisk prstu pro své zařízení v</string>
<string name="fingerprint_setting_way_text">„Nastavení“ → „Zabezpečení“ → „Otisk prstu“</string>
<string name="fingerprint_type_password_text">Zadejte heslo pro zamčení databáze</string>
<string name="fingerprint_setting_link_text">„Nastavení“ → „Zabezpečení“ → „Otisk prstu“</string>
<string name="fingerprint_type_credentials_text">Zadejte heslo pro zamčení databáze</string>
<string name="fingerprint_scan_to_store">Přiložte prst na snímač otisku prstu a zabezpečte tak heslo k databázi otiskem.</string>
<string name="fingerprint_scan_to_open">Pro otevření databáze s vypnutým heslem přiložte prst na snímač otisku prstu.</string>
<string name="usage">Použítí</string>
<string name="fingerprint">Otisk</string>
<string name="fingerprint_enable_title">Snímání otisku prstu</string>
<string name="fingerprint_enable_summary">Otevírat databázi otiskem prstu</string>
<string name="fingerprint_delete_all_title">Smazat šifrovací klíče</string>
<string name="fingerprint_delete_all_summary">Smazat všechny šifrovací klíče související s rozpoznáváním otisku prstu</string>
<string name="fingerprint_delete_all_warning">Opravdu chcete smazat všechny klíče přiřazené k otiskům prstů\?</string>
<string name="advanced_unlock">Otisk</string>
<string name="biometric_unlock_enable_title">Snímání otisku prstu</string>
<string name="biometric_unlock_enable_summary">Otevírat databázi otiskem prstu</string>
<string name="biometric_delete_all_key_title">Smazat šifrovací klíče</string>
<string name="biometric_delete_all_key_summary">Smazat všechny šifrovací klíče související s rozpoznáváním otisku prstu</string>
<string name="biometric_delete_all_key_warning">Opravdu chcete smazat všechny klíče přiřazené k otiskům prstů\?</string>
<string name="unavailable_feature_text">Toto funkci se nedaří spustit.</string>
<string name="unavailable_feature_version">Verze %1$s vámi používaného systému Android je starší, než minimální požadovaná %2$s.</string>
<string name="unavailable_feature_hardware">Hardware nebyl rozpoznán.</string>
@@ -289,8 +289,7 @@
<string name="magic_keyboard_preference_title">Nastavení Magikeyboard</string>
<string name="magic_keyboard_configure_title">Nastavit klávesnici pro bezpečné vyplňování formulářů.</string>
<string name="magic_keyboard_activate_setting_text">Zapnout \"Magikeyboard\" v nastavení zařízení.</string>
<string name="magic_keyboard_activate_setting_path_1_text">„Nastavení“ → „Jazyk a vstup“ → „Stávající klávesnice“ a zvolte některou.</string>
<string name="magic_keyboard_activate_setting_path_2_text">nebo („Nastavení“ → „Jazyk a vstup“ → „Virtuální klávesnice“ a zvolte nějakou.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">„Nastavení“ → „Jazyk a vstup“ → „Stávající klávesnice“ a zvolte některou.</string>
<string name="keyboards_choose_magikeyboard_text">Když potřebujete vyplnit formulář, zvolte Magikeyboard.</string>
<string name="keyboards_swicth_magikeyboard_text">Na Magikeyboard můžete přepnout ze své obvyklé klávesnice stisknutím jazykového tlačítka na své klávesnici, dlouhým podržením mezerníku, a pokud nejsou k dispozici tak pomocí:</string>
<string name="keyboard_select_entry_text">Vyberte položku klávesou.</string>

View File

@@ -103,9 +103,9 @@
<string name="maskpass_title">Skjul adgangskoder</string>
<string name="maskpass_summary">Masker adgangskoder (***) som standard</string>
<string name="menu_about">Om</string>
<string name="menu_change_key">Skift hovednøgle</string>
<string name="menu_change_key_settings">Skift hovednøgle</string>
<string name="settings">Indstillinger</string>
<string name="menu_db_settings">Database indstillinger</string>
<string name="menu_database_settings">Database indstillinger</string>
<string name="menu_delete">Slet</string>
<string name="menu_donate">Donér</string>
<string name="menu_edit">Rediger</string>
@@ -189,7 +189,7 @@
<string name="menu_move">Flyt</string>
<string name="menu_paste">Indsæt</string>
<string name="menu_cancel">Annuller</string>
<string name="menu_fingerprint_remove_key">Slet gemt fingeraftryk</string>
<string name="menu_biometric_remove_key">Slet gemt fingeraftryk</string>
<string name="menu_file_selection_read_only">Skrivebeskyttet</string>
<string name="menu_open_file_read_and_write">Modificerbar</string>
<string name="read_only">Skrivebeskyttet</string>
@@ -212,16 +212,16 @@
<string name="warning_password_encoding">Undgå adgangskodetegn uden for tekstkodningsformatet i databasefilen (ukendte tegn konverteres til samme bogstav).</string>
<string name="warning_empty_password">Bekræft brug af ingen adgangskode til beskyttelse mod oplåsning\?</string>
<string name="warning_no_encryption_key">Bekræft ingen brug af en krypteringsnøgle?</string>
<string name="configure_fingerprint">Fingeraftryksscanning understøttes, men er ikke sat op.</string>
<string name="scanning_fingerprint">Fingeraftryks-scanning</string>
<string name="configure_biometric">Fingeraftryksscanning understøttes, men er ikke sat op.</string>
<string name="open_biometric_prompt_unlock_database">Fingeraftryks-scanning</string>
<string name="encrypted_value_stored">Krypteret adgangskode er gemt</string>
<string name="fingerprint_invalid_key">Kunne ikke læse fingeraftryksnøgle. Gendan adgangskode.</string>
<string name="biometric_invalid_key">Kunne ikke læse fingeraftryksnøgle. Gendan adgangskode.</string>
<string name="fingerprint_not_recognized">Kunne ikke genkende fingeraftryk</string>
<string name="fingerprint_error">Problem med fingeraftryk: %1$s</string>
<string name="store_with_fingerprint">Brug fingeraftryk til at gemme adgangskoden</string>
<string name="no_password_stored">Databasen har endnu ikke en adgangskode.</string>
<string name="biometric_scanning_error">Problem med fingeraftryk: %1$s</string>
<string name="open_biometric_prompt_store_credential">Brug fingeraftryk til at gemme adgangskoden</string>
<string name="no_credentials_stored">Databasen har endnu ikke en adgangskode.</string>
<string name="history">Historik</string>
<string name="appearance">Udseende</string>
<string name="menu_appearance_settings">Udseende</string>
<string name="general">Generelt</string>
<string name="autofill">Autoudfyld</string>
<string name="autofill_service_name">KeePass DX formularudfyldning</string>
@@ -239,19 +239,19 @@
<string name="lock">Lås</string>
<string name="lock_database_screen_off_title">Skærmlås</string>
<string name="lock_database_screen_off_summary">Lås databasen, når skærmen er slukket</string>
<string name="fingerprint_quick_unlock_title">Hvordan konfigureres fingeraftryksscanning til hurtig oplåsning\?</string>
<string name="fingerprint_advanced_unlock_title">Hvordan konfigureres fingeraftryksscanning til hurtig oplåsning\?</string>
<string name="fingerprint_setting_text">Gem scannede fingeraftryk for enhed i</string>
<string name="fingerprint_setting_way_text">\"Indstillinger\" → \"Sikkerhed\" → \"Fingeraftryk\"</string>
<string name="fingerprint_type_password_text">Indtast adgangskoden til at låse databasen</string>
<string name="fingerprint_setting_link_text">\"Indstillinger\" → \"Sikkerhed\" → \"Fingeraftryk\"</string>
<string name="fingerprint_type_credentials_text">Indtast adgangskoden til at låse databasen</string>
<string name="fingerprint_scan_to_store">Scan fingeraftryk for at gemme dataseadgangskode sikkert.</string>
<string name="fingerprint_scan_to_open">Scan fingeraftryk til at åbne databasen, når adgangskoden er slået fra.</string>
<string name="usage">Brug</string>
<string name="fingerprint">Fingeraftryk</string>
<string name="fingerprint_enable_title">Fingeraftryksscanning</string>
<string name="fingerprint_enable_summary">Scan fingeraftryk for at åbne databasen</string>
<string name="fingerprint_delete_all_title">Slet krypteringsnøgler</string>
<string name="fingerprint_delete_all_summary">Slet alle krypteringsnøgler, der er relateret til fingeraftryk</string>
<string name="fingerprint_delete_all_warning">Bekræft sletning af alle nøgler, der er relateret til fingeraftryksgenkendelse\?</string>
<string name="advanced_unlock">Fingeraftryk</string>
<string name="biometric_unlock_enable_title">Fingeraftryksscanning</string>
<string name="biometric_unlock_enable_summary">Scan fingeraftryk for at åbne databasen</string>
<string name="biometric_delete_all_key_title">Slet krypteringsnøgler</string>
<string name="biometric_delete_all_key_summary">Slet alle krypteringsnøgler, der er relateret til fingeraftryk</string>
<string name="biometric_delete_all_key_warning">Bekræft sletning af alle nøgler, der er relateret til fingeraftryksgenkendelse\?</string>
<string name="unavailable_feature_text">Funktionen kunne ikke startes.</string>
<string name="unavailable_feature_version">Android-version %1$s opfylder ikke minimum versionskrav %2$s.</string>
<string name="unavailable_feature_hardware">Kunne ikke finde den tilsvarende hardware.</string>
@@ -286,8 +286,7 @@
\n
\nOpsæt tastaturet til autofyld af formularerne sikkert.</string>
<string name="magic_keyboard_activate_setting_text">Aktiver Magikeyboard\" i enhedens indstillinger.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Indstillinger\" → \"Sprog &amp; input\" → \"Aktuelt tastatur\" og vælg et.</string>
<string name="magic_keyboard_activate_setting_path_2_text">eller (\"Indstillinger\" → \"Sprog &amp; input\" → \"Virtuelt tastatur\" og vælg et.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Indstillinger\" → \"Sprog &amp; input\" → \"Aktuelt tastatur\" og vælg et.</string>
<string name="keyboards_choose_magikeyboard_text">Vælg Magikeyboard, når der er brug for at udfylde en formular.</string>
<string name="keyboards_swicth_magikeyboard_text">Skift tastatur med et langt tryk på mellemrumstasten på tastaturet eller -hvis det ikke er tilgængelig - med:</string>
<string name="keyboard_select_entry_text">Vælg post med nøglen.</string>

View File

@@ -107,9 +107,9 @@
<string name="maskpass_title">Passwort verstecken</string>
<string name="maskpass_summary">Passwörter standardmäßig mit (***) maskieren</string>
<string name="menu_about">Über</string>
<string name="menu_change_key">Hauptschlüssel ändern</string>
<string name="menu_change_key_settings">Hauptschlüssel ändern</string>
<string name="settings">Einstellungen</string>
<string name="menu_db_settings">Datenbank-Einstellungen</string>
<string name="menu_database_settings">Datenbank-Einstellungen</string>
<string name="menu_delete">Löschen</string>
<string name="menu_donate">Spenden</string>
<string name="menu_edit">Ändern</string>
@@ -179,7 +179,7 @@
</string-array>
<string name="warning_empty_password">Soll das Entsperren ohne Passwort wirklich möglich sein\?</string>
<string name="warning_no_encryption_key">Soll wirklich kein Verschlüsselungsschlüssel verwendet werden\?</string>
<string name="appearance">Aussehen</string>
<string name="menu_appearance_settings">Aussehen</string>
<string name="password_size_title">Generierte Passwortlänge</string>
<string name="password_size_summary">Legt die Standardlänge des generierten Passworts fest</string>
<string name="clipboard_notifications_title">Zwischenablagenbenachrichtigungen</string>
@@ -192,28 +192,28 @@
<string name="path">Pfad</string>
<string name="file_name">Dateiname</string>
<string name="unavailable_feature_text">Dieses Feature konnte nicht gestartet werden.</string>
<string name="fingerprint_enable_summary">Ermöglicht die Datenbanköffnung mit dem Fingerabdruck</string>
<string name="fingerprint">Fingerabdruck</string>
<string name="fingerprint_enable_title">Fingerabdruckscanner</string>
<string name="biometric_unlock_enable_summary">Ermöglicht die Datenbanköffnung mit dem Fingerabdruck</string>
<string name="advanced_unlock">Fingerabdruck</string>
<string name="biometric_unlock_enable_title">Fingerabdruckscanner</string>
<string name="fingerprint_scan_to_open">Fingerabdruck scannen, um die Datenbank zu öffnen, wenn die Passworteingabe ausgeschaltet ist.</string>
<string name="fingerprint_scan_to_store">Fingerabdruck scannen, um das Datenbank-Passwort sicher zu speichern.</string>
<string name="fingerprint_type_password_text">Datenbank-Passwort eingeben</string>
<string name="fingerprint_type_credentials_text">Datenbank-Passwort eingeben</string>
<string name="lock">Sperre</string>
<string name="list_password_generator_options_summary">Erlaubte Zeichen für Passwortgenerator festlegen</string>
<string name="list_password_generator_options_title">Passwortzeichen</string>
<string name="configure_fingerprint">Fingerabdruck-Scannen wird unterstützt, ist jedoch nicht konfiguriert.</string>
<string name="scanning_fingerprint">Fingerabdruck wird gescannt</string>
<string name="configure_biometric">Fingerabdruck-Scannen wird unterstützt, ist jedoch nicht konfiguriert.</string>
<string name="open_biometric_prompt_unlock_database">Fingerabdruck wird gescannt</string>
<string name="encrypted_value_stored">Verschlüsseltes Passwort wurde gespeichert</string>
<string name="fingerprint_invalid_key">Fingerabdruckschlüssel nicht lesbar. Bitte das Passwort wiederherstellen.</string>
<string name="fingerprint_error">Problem mit dem Fingerabdruck: %1$s</string>
<string name="biometric_invalid_key">Fingerabdruckschlüssel nicht lesbar. Bitte das Passwort wiederherstellen.</string>
<string name="biometric_scanning_error">Problem mit dem Fingerabdruck: %1$s</string>
<string name="history">Verlauf</string>
<string name="fingerprint_quick_unlock_title">Wie richte ich den Fingerabdruckscanner für schnelles Entsperren ein?</string>
<string name="fingerprint_advanced_unlock_title">Wie richte ich den Fingerabdruckscanner für schnelles Entsperren ein?</string>
<string name="fingerprint_setting_text">Eingelesenen Fingerabdruck für das Gerät speichern in</string>
<string name="fingerprint_setting_way_text">„Einstellungen“ → „Sicherheit“ → „Fingerabdruck“</string>
<string name="fingerprint_setting_link_text">„Einstellungen“ → „Sicherheit“ → „Fingerabdruck“</string>
<string name="usage">Verwendung</string>
<string name="general">Allgemein</string>
<string name="store_with_fingerprint">Fingerabdruck verwenden, um dieses Passwort zu speichern</string>
<string name="no_password_stored">Diese Datenbank hat noch kein Passwort.</string>
<string name="open_biometric_prompt_store_credential">Fingerabdruck verwenden, um dieses Passwort zu speichern</string>
<string name="no_credentials_stored">Diese Datenbank hat noch kein Passwort.</string>
<string name="style_choose_summary">App-Design, das in der App genutzt wird</string>
<string name="encryption">Verschlüsselung</string>
<string name="key_derivation_function">Schlüsselableitungsfunktion</string>
@@ -223,7 +223,7 @@
<string name="error_autofill_enable_service">Autofill-Dienst kann nicht aktiviert werden.</string>
<string name="copy_field">Kopie von %1$s</string>
<string name="menu_form_filling_settings">Formularausfüllung</string>
<string name="menu_fingerprint_remove_key">Gespeicherten Fingerabdruck löschen</string>
<string name="menu_biometric_remove_key">Gespeicherten Fingerabdruck löschen</string>
<string name="encryption_explanation">Verschlüsselungsalgorithmus der Datenbank wird für sämtliche Daten verwendet.</string>
<string name="kdf_explanation">Um den Schlüssel für den Verschlüsselungsalgorithmus zu generieren, wird der Hauptschlüssel umgewandelt, wobei ein zufälliger Salt in der Schlüsselberechnung verwendet wird.</string>
<string name="memory_usage">Speichernutzung</string>
@@ -246,9 +246,9 @@
<string name="set_autofill_service_title">Standard Autofill-Dienst auswählen</string>
<string name="set_autofill_service_summary">Autofill aktivieren, um automatisch Eingabefelder in anderen Apps auszufüllen</string>
<string name="clipboard">Zwischenablage</string>
<string name="fingerprint_delete_all_title">Verschlüsselungsschlüssel löschen</string>
<string name="fingerprint_delete_all_summary">Alle Verschlüsselungsschlüssel für Fingerabdruckerkennung löschen</string>
<string name="fingerprint_delete_all_warning">Sollen wirklich alle mit der Fingerabdruckerkennung verknüpften Schlüssel gelöscht werden\?</string>
<string name="biometric_delete_all_key_title">Verschlüsselungsschlüssel löschen</string>
<string name="biometric_delete_all_key_summary">Alle Verschlüsselungsschlüssel für Fingerabdruckerkennung löschen</string>
<string name="biometric_delete_all_key_warning">Sollen wirklich alle mit der Fingerabdruckerkennung verknüpften Schlüssel gelöscht werden\?</string>
<string name="unavailable_feature_version">Die Android-Version, %1$s, erfüllt nicht die Mindestanforderung für Version %2$s.</string>
<string name="unavailable_feature_hardware">Keine entsprechende Hardware.</string>
<string name="bytes">Bytes</string>
@@ -336,8 +336,7 @@
<string name="magic_keyboard_preference_title">Magikeyboard-Einstellungen</string>
<string name="magic_keyboard_configure_title">Tastatur zum sicheren Ausfüllen von Formularen einrichten.</string>
<string name="magic_keyboard_activate_setting_text">Das „Magikeyboard“ in den Geräteeinstellungen aktivieren.</string>
<string name="magic_keyboard_activate_setting_path_1_text">„Einstellungen“ → „Sprache &amp; Eingabe“ → „Aktuelle Tastatur“ und auswählen.</string>
<string name="magic_keyboard_activate_setting_path_2_text">oder („Einstellungen“ → „Sprache &amp; Eingabe“ → „Bildschirmtastatur“ und auswählen.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">„Einstellungen“ → „Sprache &amp; Eingabe“ → „Aktuelle Tastatur“ und auswählen.</string>
<string name="keyboards_choose_magikeyboard_text">Das Magikeyboard auswählen, wenn ein Formular ausgefüllt werden soll.</string>
<string name="keyboards_swicth_magikeyboard_text">Tastaturen durch langes Drücken auf die Leertaste wechseln oder, wenn das nicht zur Verfügung steht, mit:</string>
<string name="keyboard_select_entry_text">Den Eintrag mit dem Schlüssel auswählen.</string>

View File

@@ -103,9 +103,9 @@
<string name="maskpass_title">Απόκρυψη κωδικού</string>
<string name="maskpass_summary">Απόκρυψη κωδικών από προεπιλογή</string>
<string name="menu_about">Σχετικά με</string>
<string name="menu_change_key">Αλλαγή Κύριου Κλειδιού</string>
<string name="menu_change_key_settings">Αλλαγή Κύριου Κλειδιού</string>
<string name="settings">Ρυθμίσεις</string>
<string name="menu_db_settings">Ρυθμίσεις βάσης δεδομένων</string>
<string name="menu_database_settings">Ρυθμίσεις βάσης δεδομένων</string>
<string name="menu_delete">Διαγραφή</string>
<string name="menu_donate">Δωρεά</string>
<string name="menu_edit">Επεξεργασία</string>

View File

@@ -93,9 +93,9 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="maskpass_title">Ocultar contraseña</string>
<string name="maskpass_summary">Ocultar contraseñas por defecto</string>
<string name="menu_about">Acerca de</string>
<string name="menu_change_key">Cambiar Contraseña Maestra</string>
<string name="menu_change_key_settings">Cambiar Contraseña Maestra</string>
<string name="settings">Configuración</string>
<string name="menu_db_settings">Configuración de Base de datos</string>
<string name="menu_database_settings">Configuración de Base de datos</string>
<string name="menu_delete">Eliminar</string>
<string name="menu_donate">Donar</string>
<string name="menu_edit">Editar</string>
@@ -172,7 +172,7 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="keyfile_is_empty">El archivo clave está vacío.</string>
<string name="copy_field">Copia de %1$s</string>
<string name="menu_form_filling_settings">Llenado de formulario</string>
<string name="menu_fingerprint_remove_key">Quite la clave de huella dactilar</string>
<string name="menu_biometric_remove_key">Quite la clave de huella dactilar</string>
<string name="protection">Protección</string>
<string name="read_only">Solo lectura</string>
<string name="read_only_warning">KeePass DX no tiene permiso de escritura en la ubicación de la base de datos, la base de datos se abrirá como solo lectura.</string>
@@ -198,16 +198,16 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="warning_password_encoding">El formato .kdb solo admite el juego de caracteres Latin1. Su contraseña puede contener caracteres fuera de este juego de caracteres. Todos los caracteres no-Latin1 se convierten al mismo carácter, lo que reduce la seguridad de su contraseña. Se recomienda cambiar su contraseña.</string>
<string name="warning_empty_password">¿De verdad quieres usar una cadena vacía como contraseña?</string>
<string name="warning_no_encryption_key">¿Estás seguro que no quieres usar clave de cifrado?</string>
<string name="configure_fingerprint">Huella digital compatible pero no configurada para el dispositivo</string>
<string name="scanning_fingerprint">Monitoreando huellas digitales</string>
<string name="configure_biometric">Huella digital compatible pero no configurada para el dispositivo</string>
<string name="open_biometric_prompt_unlock_database">Monitoreando huellas digitales</string>
<string name="encrypted_value_stored">Contraseña encriptada almacenada</string>
<string name="fingerprint_invalid_key">Problema clave de huella digital no válida. Restaure su contraseña.</string>
<string name="biometric_invalid_key">Problema clave de huella digital no válida. Restaure su contraseña.</string>
<string name="fingerprint_not_recognized">Huella digital no reconocida</string>
<string name="fingerprint_error">Problema de huella digital: %1$s</string>
<string name="store_with_fingerprint">Usa la huella digital para almacenar esta contraseña</string>
<string name="no_password_stored">Aún sin contraseña almacenada para esta base de datos</string>
<string name="biometric_scanning_error">Problema de huella digital: %1$s</string>
<string name="open_biometric_prompt_store_credential">Usa la huella digital para almacenar esta contraseña</string>
<string name="no_credentials_stored">Aún sin contraseña almacenada para esta base de datos</string>
<string name="history">Historial</string>
<string name="appearance">Apariencia</string>
<string name="menu_appearance_settings">Apariencia</string>
<string name="general">General</string>
<string name="autofill">Autocompletar</string>
<string name="autofill_service_name">Servicio de Autocompletar KeePass DX</string>
@@ -224,19 +224,19 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="lock">Bloquear</string>
<string name="lock_database_screen_off_title">Bloqueo de pantalla</string>
<string name="lock_database_screen_off_summary">Bloquear la base de datos cuando la pantalla esté apagada</string>
<string name="fingerprint_quick_unlock_title">¿Cómo configurar la huella digital para un desbloqueo rápido?</string>
<string name="fingerprint_advanced_unlock_title">¿Cómo configurar la huella digital para un desbloqueo rápido?</string>
<string name="fingerprint_setting_text">Establezca su huella digital personal para su dispositivo en</string>
<string name="fingerprint_setting_way_text">Configuración -&gt; Seguridad -&gt; Huella digital</string>
<string name="fingerprint_type_password_text">Escriba su contraseña en Keepass DX</string>
<string name="fingerprint_setting_link_text">Configuración -&gt; Seguridad -&gt; Huella digital</string>
<string name="fingerprint_type_credentials_text">Escriba su contraseña en Keepass DX</string>
<string name="fingerprint_scan_to_store">Escanee su huella digital para almacenar su contraseña maestra de forma segura</string>
<string name="fingerprint_scan_to_open">Escanee su huella digital cuando la casilla de verificación de contraseña esté desmarcada para abrir la base de datos</string>
<string name="usage">Uso</string>
<string name="fingerprint">Huella digital</string>
<string name="fingerprint_enable_title">Monitoreando Huella digital</string>
<string name="fingerprint_enable_summary">Habilitar la apertura de base de datos por huella digital</string>
<string name="fingerprint_delete_all_title">Eliminar claves de cifrado</string>
<string name="fingerprint_delete_all_summary">Eliminar todas las claves de cifrado relacionadas con el reconocimiento de huellas digitales</string>
<string name="fingerprint_delete_all_warning">¿Está seguro de que desea borrar todas las claves relacionadas con las huellas digitales?</string>
<string name="advanced_unlock">Huella digital</string>
<string name="biometric_unlock_enable_title">Monitoreando Huella digital</string>
<string name="biometric_unlock_enable_summary">Habilitar la apertura de base de datos por huella digital</string>
<string name="biometric_delete_all_key_title">Eliminar claves de cifrado</string>
<string name="biometric_delete_all_key_summary">Eliminar todas las claves de cifrado relacionadas con el reconocimiento de huellas digitales</string>
<string name="biometric_delete_all_key_warning">¿Está seguro de que desea borrar todas las claves relacionadas con las huellas digitales?</string>
<string name="unavailable_feature_text">No se puede iniciar esta característica.</string>
<string name="unavailable_feature_version">Su versión de Android %1$s no es la versión mínima, se requiere %2$s.</string>
<string name="unavailable_feature_hardware">El hardware no es detectado.</string>

View File

@@ -104,9 +104,9 @@
<string name="maskpass_title">Pasahitza estali</string>
<string name="maskpass_summary">Pasahitza estali modu lehenetsian</string>
<string name="menu_about">Honi buruz</string>
<string name="menu_change_key">Gako Maisua Aldatu</string>
<string name="menu_change_key_settings">Gako Maisua Aldatu</string>
<string name="settings">Ezarpenak</string>
<string name="menu_db_settings">Datubasearen ezarpenak</string>
<string name="menu_database_settings">Datubasearen ezarpenak</string>
<string name="menu_delete">Ezabatu</string>
<string name="menu_donate">Dirua eman</string>
<string name="menu_edit">Editatu</string>

View File

@@ -103,9 +103,9 @@
<string name="maskpass_title">Piilota salasaan</string>
<string name="maskpass_summary">Piilota salasanat oletuksena</string>
<string name="menu_about">Tietoa</string>
<string name="menu_change_key">Vaihda pääsalasanaa</string>
<string name="menu_change_key_settings">Vaihda pääsalasanaa</string>
<string name="settings">Asetukset</string>
<string name="menu_db_settings">Salasanatietokannan asetukset</string>
<string name="menu_database_settings">Salasanatietokannan asetukset</string>
<string name="menu_delete">Poista</string>
<string name="menu_donate">Lahjoita</string>
<string name="menu_edit">Muokkaa</string>

View File

@@ -109,10 +109,10 @@
<string name="maskpass_title">Masquer les mots de passe</string>
<string name="maskpass_summary">Masquer les mots de passe (***) par défaut</string>
<string name="menu_about">À propos</string>
<string name="menu_change_key">Modifier la clé maîtresse</string>
<string name="menu_change_key_settings">Modifier la clé maîtresse</string>
<string name="copy_field">%1$s copié</string>
<string name="settings">Paramètres</string>
<string name="menu_db_settings">Paramètres de la base de données</string>
<string name="menu_database_settings">Paramètres de la base de données</string>
<string name="menu_delete">Supprimer</string>
<string name="menu_donate">Faire un don</string>
<string name="menu_edit">Modifier</string>
@@ -121,7 +121,7 @@
<string name="menu_open">Ouvrir</string>
<string name="menu_search">Rechercher</string>
<string name="menu_showpass">Afficher le mot de passe</string>
<string name="menu_fingerprint_remove_key">Supprimer lempreinte digitale enregistrée</string>
<string name="menu_biometric_remove_key">Supprimer lempreinte digitale enregistrée</string>
<string name="menu_url">Ouvrir lURL</string>
<string name="minus">Moins</string>
<string name="never">Jamais</string>
@@ -178,16 +178,16 @@
<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>
<string name="version_label">Version %1$s</string>
<string name="configure_fingerprint">La reconnaissance dempreinte digitale est prise en charge mais pas configurée.</string>
<string name="scanning_fingerprint">Reconnaissance dempreinte digitale</string>
<string name="configure_biometric">La reconnaissance dempreinte digitale est prise en charge mais pas configurée.</string>
<string name="open_biometric_prompt_unlock_database">Reconnaissance dempreinte digitale</string>
<string name="encrypted_value_stored">Mot de passe chiffré stocké</string>
<string name="fingerprint_invalid_key">Impossible de lire la clé de lempreinte digitale. Restaurer votre mot de passe.</string>
<string name="biometric_invalid_key">Impossible de lire la clé de lempreinte digitale. Restaurer votre mot de passe.</string>
<string name="fingerprint_not_recognized">Impossible de reconnaître lempreinte digitale</string>
<string name="fingerprint_error">Problème dempreinte digitale : %1$s</string>
<string name="store_with_fingerprint">Utiliser lempreinte digitale pour stocker ce mot de passe</string>
<string name="no_password_stored">Cette base de données na pas encore de mot de passe.</string>
<string name="biometric_scanning_error">Problème dempreinte digitale : %1$s</string>
<string name="open_biometric_prompt_store_credential">Utiliser lempreinte digitale pour stocker ce mot de passe</string>
<string name="no_credentials_stored">Cette base de données na pas encore de mot de passe.</string>
<string name="history">Historique</string>
<string name="appearance">Apparence</string>
<string name="menu_appearance_settings">Apparence</string>
<string name="general">Général</string>
<string name="autofill">Remplissage automatique</string>
<string name="autofill_service_name">Remplissage automatique des formulaires KeePass DX</string>
@@ -205,19 +205,19 @@
<string name="lock">Verrouiller</string>
<string name="lock_database_screen_off_title">Verrouillage décran</string>
<string name="lock_database_screen_off_summary">Verrouiller la base de données lorsque lécran est éteint</string>
<string name="fingerprint_quick_unlock_title">Comment configurer la reconaissance de lempreinte digitale pour un déverrouillage rapide\?</string>
<string name="fingerprint_advanced_unlock_title">Comment configurer la reconaissance de lempreinte digitale pour un déverrouillage rapide\?</string>
<string name="fingerprint_setting_text">Enregistrer votre empreinte digitale pour votre appareil dans</string>
<string name="fingerprint_setting_way_text">«Paramètres» → «Sécurité» → «Empreinte digitale»</string>
<string name="fingerprint_type_password_text">Saisir le mot de passe de verrouillage de la base de données</string>
<string name="fingerprint_setting_link_text">«Paramètres» → «Sécurité» → «Empreinte digitale»</string>
<string name="fingerprint_type_credentials_text">Saisir le mot de passe de verrouillage de la base de données</string>
<string name="fingerprint_scan_to_store">Numériser votre empreinte digitale pour stocker le mot de passe de verrouillage de votre base de données en sécurité.</string>
<string name="fingerprint_scan_to_open">Numériser votre empreinte digitale pour ouvrir la base de données lorsque le mot de passe est désactivé.</string>
<string name="usage">Utilisation</string>
<string name="fingerprint">Empreinte digitale</string>
<string name="fingerprint_enable_title">Reconnaissance dempreinte digitale</string>
<string name="fingerprint_enable_summary">Vous permet de numériser votre empreinte digitale pour ouvrir la base de données</string>
<string name="fingerprint_delete_all_title">Supprimer les clés de chiffrement</string>
<string name="fingerprint_delete_all_summary">Supprimer toutes les clés de chiffrement liées à la reconnaissance dempreinte digitale</string>
<string name="fingerprint_delete_all_warning">Êtes-vous sûr de vouloir supprimer toutes les clés liées à la reconnaissance dempreinte digitale\?</string>
<string name="advanced_unlock">Empreinte digitale</string>
<string name="biometric_unlock_enable_title">Reconnaissance dempreinte digitale</string>
<string name="biometric_unlock_enable_summary">Vous permet de numériser votre empreinte digitale pour ouvrir la base de données</string>
<string name="biometric_delete_all_key_title">Supprimer les clés de chiffrement</string>
<string name="biometric_delete_all_key_summary">Supprimer toutes les clés de chiffrement liées à la reconnaissance dempreinte digitale</string>
<string name="biometric_delete_all_key_warning">Êtes-vous sûr de vouloir supprimer toutes les clés liées à la reconnaissance dempreinte digitale\?</string>
<string name="unavailable_feature_text">Impossible de démarrer cette fonctionnalité.</string>
<string name="unavailable_feature_version">Votre version Android %1$s est inférieure à la version minimale %2$s requise.</string>
<string name="unavailable_feature_hardware">Impossible de trouver le matériel correspondant.</string>
@@ -343,8 +343,7 @@
<string name="magic_keyboard_preference_title">Paramètres du Magikeyboard</string>
<string name="magic_keyboard_configure_title">Configurer le clavier pour le remplissage automatique des formulaires en sécurité.</string>
<string name="magic_keyboard_activate_setting_text">Activer le «Magikeyboard» dans les paramètres de lappareil.</string>
<string name="magic_keyboard_activate_setting_path_1_text">«Paramètres» → «Langues et saisie» → «Clavier actuel» et en choisir un.</string>
<string name="magic_keyboard_activate_setting_path_2_text">(Ou «Paramètres» → «Langues et saisie» → «Clavier virtuel» et en choisir un.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">«Paramètres» → «Langues et saisie» → «Clavier actuel» et en choisir un.</string>
<string name="keyboards_choose_magikeyboard_text">Choisir le Magikeyboard lorsque vous avez besoin de remplir un formulaire.</string>
<string name="keyboards_swicth_magikeyboard_text">Basculer de clavier en appuyant longuement sur la barre despace de votre clavier ou, si ce nest pas disponible, avec :</string>
<string name="keyboard_select_entry_text">Sélectionner votre entrée avec la clé.</string>

View File

@@ -99,9 +99,9 @@
<string name="maskpass_title">Jelszavak elrejtése</string>
<string name="maskpass_summary">Jelszavak alapértelmezett elrejtése (***)</string>
<string name="menu_about">Névjegy</string>
<string name="menu_change_key">Mesterkulcs cseréje</string>
<string name="menu_change_key_settings">Mesterkulcs cseréje</string>
<string name="settings">Beállítások</string>
<string name="menu_db_settings">Adatbázis-beállítások</string>
<string name="menu_database_settings">Adatbázis-beállítások</string>
<string name="menu_delete">Törlés</string>
<string name="menu_donate">Támogatás</string>
<string name="menu_edit">Szerkesztés</string>
@@ -149,13 +149,13 @@
<string name="warning_password_encoding">Kerülje a Latin-1 karakterkészlettől eltérő jelszókaraktereket a .kbd fájlokban, mert ugyanarra a betűre lesznek átalakítva.</string>
<string name="warning_unmounted">Csatolja az SD kártyát, hogy adatbázist hozzon létre vagy töltsön be.</string>
<string name="version_label">Verzió: %1$s</string>
<string name="configure_fingerprint">Az ujjlenyomat-leolvasás támogatott, de nincs beállítva.</string>
<string name="scanning_fingerprint">Ujjlenyomat-leolvasás</string>
<string name="configure_biometric">Az ujjlenyomat-leolvasás támogatott, de nincs beállítva.</string>
<string name="open_biometric_prompt_unlock_database">Ujjlenyomat-leolvasás</string>
<string name="encrypted_value_stored">Titkosított jelszó tárolva</string>
<string name="fingerprint_invalid_key">Az ujjlenyomat kulcs nem olvasható. Állítsa vissza a jelszavát.</string>
<string name="fingerprint_error">Ujjlenyomat probléma: %1$s</string>
<string name="store_with_fingerprint">Használjon ujjlenyomatot a jelszó tárolásához</string>
<string name="no_password_stored">Az adatbázisnak még nincs jelszava.</string>
<string name="biometric_invalid_key">Az ujjlenyomat kulcs nem olvasható. Állítsa vissza a jelszavát.</string>
<string name="biometric_scanning_error">Ujjlenyomat probléma: %1$s</string>
<string name="open_biometric_prompt_store_credential">Használjon ujjlenyomatot a jelszó tárolásához</string>
<string name="no_credentials_stored">Az adatbázisnak még nincs jelszava.</string>
<string name="education_unlock_summary">Adja meg a jelszót és/vagy a kulcsfájlt, hogy kinyithassa az adatbázist.
\n
@@ -195,7 +195,7 @@
<string name="menu_move">Áthelyezés</string>
<string name="menu_paste">Beillesztés</string>
<string name="menu_cancel">Mégse</string>
<string name="menu_fingerprint_remove_key">Mentett ujjlenyomat törlése</string>
<string name="menu_biometric_remove_key">Mentett ujjlenyomat törlése</string>
<string name="menu_file_selection_read_only">Írásvédett</string>
<string name="menu_open_file_read_and_write">Módosítható</string>
<string name="create_keepass_file">Új adatbázis létrehozása</string>
@@ -220,7 +220,7 @@
<string name="build_label">Összeállítás: %1$s</string>
<string name="fingerprint_not_recognized">Az ujjlenyomat nem ismerhető fel</string>
<string name="history">Előzmények</string>
<string name="appearance">Megjelenés</string>
<string name="menu_appearance_settings">Megjelenés</string>
<string name="general">Általános</string>
<string name="autofill">Automatikus kitöltés</string>
<string name="autofill_service_name">KeePass DX űrlapkitöltés</string>
@@ -238,19 +238,19 @@
<string name="lock">Zárolás</string>
<string name="lock_database_screen_off_title">Képernyőzár</string>
<string name="lock_database_screen_off_summary">Az adatbázis zárolása, ha a képernyő kikapcsol</string>
<string name="fingerprint_quick_unlock_title">Hogyan állítsa be az ujjlenyomat-olvasást a gyors feloldáshoz\?</string>
<string name="fingerprint_advanced_unlock_title">Hogyan állítsa be az ujjlenyomat-olvasást a gyors feloldáshoz\?</string>
<string name="fingerprint_setting_text">Mentse a leolvasott ujjlenyomatát az eszközén a</string>
<string name="fingerprint_setting_way_text">„Beállítások” → „Biztonság” → „Ujjlenyomat” menüpontban</string>
<string name="fingerprint_type_password_text">Adja meg az adatbázis zárolási jelszavát</string>
<string name="fingerprint_setting_link_text">„Beállítások” → „Biztonság” → „Ujjlenyomat” menüpontban</string>
<string name="fingerprint_type_credentials_text">Adja meg az adatbázis zárolási jelszavát</string>
<string name="fingerprint_scan_to_store">Olvassa le az ujjlenyomatát, hogy biztonságosan tárolja az adatbázist zároló jelszót.</string>
<string name="fingerprint_scan_to_open">Olvassa le az ujjlenyomatát, hogy kinyissa az adatbázist, ha a jelszó ki van kapcsolva.</string>
<string name="usage">Használat</string>
<string name="fingerprint">Ujjlenyomat</string>
<string name="fingerprint_enable_title">Ujjlenyomat-leolvasás</string>
<string name="fingerprint_enable_summary">Lehetővé teszi, hogy leolvassa az ujjlenyomatát az adatbázis feloldásához</string>
<string name="fingerprint_delete_all_title">Titkosítási kulcsok törlése</string>
<string name="fingerprint_delete_all_summary">Az összes ujjlenyomat-felismeréssel kapcsolatos titkosítási kulcs törlése</string>
<string name="fingerprint_delete_all_warning">Biztos, hogy törli az összes ujjlenyomat-felismeréssel kapcsolatos titkosítási kulcsot\?</string>
<string name="advanced_unlock">Ujjlenyomat</string>
<string name="biometric_unlock_enable_title">Ujjlenyomat-leolvasás</string>
<string name="biometric_unlock_enable_summary">Lehetővé teszi, hogy leolvassa az ujjlenyomatát az adatbázis feloldásához</string>
<string name="biometric_delete_all_key_title">Titkosítási kulcsok törlése</string>
<string name="biometric_delete_all_key_summary">Az összes ujjlenyomat-felismeréssel kapcsolatos titkosítási kulcs törlése</string>
<string name="biometric_delete_all_key_warning">Biztos, hogy törli az összes ujjlenyomat-felismeréssel kapcsolatos titkosítási kulcsot\?</string>
<string name="unavailable_feature_text">A funkciót nem sikerült elindítani.</string>
<string name="unavailable_feature_version">Az Android verziója (%1$s) nem éri el a minimálisan szükséges verziót (%2$s).</string>
<string name="unavailable_feature_hardware">Nem található a megfelelő hardver.</string>
@@ -282,8 +282,7 @@
<string name="magic_keyboard_preference_title">Mágikus billentyűzet beállításai</string>
<string name="magic_keyboard_configure_title">Billentyűzet beállítása az űrlapok biztonságos automatikus kitöltéséhez.</string>
<string name="magic_keyboard_activate_setting_text">Aktiválja a „Mágikus billentyűzetet” az eszközbeállításokban.</string>
<string name="magic_keyboard_activate_setting_path_1_text">„Beállítások” → „Nyelvek és bevitel” → „Jelenlegi billentyűzet” és válasszon egyet.</string>
<string name="magic_keyboard_activate_setting_path_2_text">vagy („Beállítások” → „Nyelv és bevitel” → „Virtuális billentyűzet” és válasszon egyet.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">„Beállítások” → „Nyelvek és bevitel” → „Jelenlegi billentyűzet” és válasszon egyet.</string>
<string name="keyboards_choose_magikeyboard_text">Válassza a Mágikus billentyűzetet, ha egy űrlapot kell kitöltenie.</string>
<string name="keyboards_swicth_magikeyboard_text">Válasszon a a billentyűzetek közt a billentyűzet szóközének hosszú nyomásával, vagy ha nem érhető el, akkor így:</string>
<string name="keyboard_select_entry_text">Válassza ki a bejegyzést a gombbal.</string>

View File

@@ -104,9 +104,9 @@
<string name="maskpass_title">Nascondi le password</string>
<string name="maskpass_summary">Maschera le password (***) in modo predefinito</string>
<string name="menu_about">Informazioni</string>
<string name="menu_change_key">Modifica chiave principale</string>
<string name="menu_change_key_settings">Modifica chiave principale</string>
<string name="settings">Impostazioni</string>
<string name="menu_db_settings">Impostazioni database</string>
<string name="menu_database_settings">Impostazioni database</string>
<string name="menu_delete">Elimina</string>
<string name="menu_donate">Dona</string>
<string name="menu_edit">Modifica</string>
@@ -153,13 +153,13 @@
<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_fingerprint">La scansione di impronte è supportata ma non impostata.</string>
<string name="scanning_fingerprint">Scansione impronte</string>
<string name="configure_biometric">La scansione di impronte è supportata ma non impostata.</string>
<string name="open_biometric_prompt_unlock_database">Scansione impronte</string>
<string name="encrypted_value_stored">Password criptata salvata</string>
<string name="fingerprint_invalid_key">Lettura dell\'impronta fallita. Ripristina la tua password.</string>
<string name="fingerprint_error">Problema impronta: %1$s</string>
<string name="store_with_fingerprint">Usa l\'impronta per salvare questa password</string>
<string name="no_password_stored">Questo database non ha ancora alcuna password.</string>
<string name="biometric_invalid_key">Lettura dell\'impronta fallita. Ripristina la tua password.</string>
<string name="biometric_scanning_error">Problema impronta: %1$s</string>
<string name="open_biometric_prompt_store_credential">Usa l\'impronta per salvare questa password</string>
<string name="no_credentials_stored">Questo database non ha ancora alcuna password.</string>
<string name="education_unlock_summary">Inserisci una password e/o file chiave per sbloccare il database.
\n
\nRicorda di salvare una copia del tuo file .kdbx in un luogo sicuro dopo ogni modifica.</string>
@@ -194,7 +194,7 @@
<string name="menu_move">Sposta</string>
<string name="menu_paste">Incolla</string>
<string name="menu_cancel">Annulla</string>
<string name="menu_fingerprint_remove_key">Elimina l\'impronta digitale salvata</string>
<string name="menu_biometric_remove_key">Elimina l\'impronta digitale salvata</string>
<string name="menu_file_selection_read_only">Sola lettura</string>
<string name="menu_open_file_read_and_write">Modificabile</string>
<string name="encryption_explanation">Algoritmo di cifratura del database usato per tutti i dati.</string>
@@ -216,7 +216,7 @@
<string name="warning_no_encryption_key">Sei sicuro di non volere usare una chiave di cifratura?</string>
<string name="fingerprint_not_recognized">Impronta non riconosciuta</string>
<string name="history">Cronologia</string>
<string name="appearance">Aspetto</string>
<string name="menu_appearance_settings">Aspetto</string>
<string name="general">Generale</string>
<string name="autofill">Autocompletamento</string>
<string name="autofill_service_name">Autocompletamento di KeePass DX</string>
@@ -233,19 +233,19 @@
<string name="lock">Blocca</string>
<string name="lock_database_screen_off_title">Blocco schermo</string>
<string name="lock_database_screen_off_summary">Blocca il database quando lo schermo è spento</string>
<string name="fingerprint_quick_unlock_title">Come impostare la scansione di impronte per sbloccare velocemente\?</string>
<string name="fingerprint_advanced_unlock_title">Come impostare la scansione di impronte per sbloccare velocemente\?</string>
<string name="fingerprint_setting_text">Salva la tua impronta per il dispositivo in</string>
<string name="fingerprint_setting_way_text">\"Impostazioni\" → \"Sicurezza\" → \"Impronta\"</string>
<string name="fingerprint_type_password_text">Digita la password di blocco database</string>
<string name="fingerprint_setting_link_text">\"Impostazioni\" → \"Sicurezza\" → \"Impronta\"</string>
<string name="fingerprint_type_credentials_text">Digita la password di blocco database</string>
<string name="fingerprint_scan_to_store">Scansiona la tua impronta per salvare la password di blocco database in modo sicuro.</string>
<string name="fingerprint_scan_to_open">Scansiona la tua impronta per aprire il database quando la password è disattivata.</string>
<string name="usage">Utilizzo</string>
<string name="fingerprint">Impronta</string>
<string name="fingerprint_enable_title">Scansione di impronte</string>
<string name="fingerprint_enable_summary">Consente la scansione di impronte per aprire il database</string>
<string name="fingerprint_delete_all_title">Elimina chiavi di cifratura</string>
<string name="fingerprint_delete_all_summary">Elimina tutte le chiavi di cifratura relative al riconoscimento dell\'impronta</string>
<string name="fingerprint_delete_all_warning">Sei sicuro di volere eliminare tutte le chiavi relative alle impronte?</string>
<string name="advanced_unlock">Impronta</string>
<string name="biometric_unlock_enable_title">Scansione di impronte</string>
<string name="biometric_unlock_enable_summary">Consente la scansione di impronte per aprire il database</string>
<string name="biometric_delete_all_key_title">Elimina chiavi di cifratura</string>
<string name="biometric_delete_all_key_summary">Elimina tutte le chiavi di cifratura relative al riconoscimento dell\'impronta</string>
<string name="biometric_delete_all_key_warning">Sei sicuro di volere eliminare tutte le chiavi relative alle impronte?</string>
<string name="unavailable_feature_text">Impossibile avviare questa funzione.</string>
<string name="unavailable_feature_version">La tua versione di Android %1$s non è la minima %2$s richiesta.</string>
<string name="unavailable_feature_hardware">L\'hardware relativo non è stato trovato.</string>
@@ -278,8 +278,7 @@
<string name="magic_keyboard_preference_title">Impostazioni Magitastiera</string>
<string name="magic_keyboard_configure_title">Imposta la tastiera per un\'autocompletamento sicuro dei moduli.</string>
<string name="magic_keyboard_activate_setting_text">Attiva la \"Magitastiera\" nelle impostazioni del dispositivo.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Impostazioni\" → \"Lingue e immissione\" → \"Tastiera attuale\" e scegline una.</string>
<string name="magic_keyboard_activate_setting_path_2_text">o (\"Impostazioni\" → \"Lingue e immissione\" → \"Tastiera virtuale\" e scegline una.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Impostazioni\" → \"Lingue e immissione\" → \"Tastiera attuale\" e scegline una.</string>
<string name="keyboards_choose_magikeyboard_text">Scegli la Magitastiera quando devi compilare un modulo.</string>
<string name="keyboards_swicth_magikeyboard_text">Cambia tastiera premendo a lungo la barra spaziatrice, oppure, se non disponibile, con:</string>
<string name="keyboard_lock_database_text">Blocca il database.</string>

View File

@@ -100,9 +100,9 @@
<string name="maskpass_title">מסיכת הסיסמה</string>
<string name="maskpass_summary">הסתר סיסמאות כברירת מחדל</string>
<string name="menu_about">אודות</string>
<string name="menu_change_key">שנה מפתח ראשי</string>
<string name="menu_change_key_settings">שנה מפתח ראשי</string>
<string name="settings">העדפות</string>
<string name="menu_db_settings">הגדרות מסד נתונים</string>
<string name="menu_database_settings">הגדרות מסד נתונים</string>
<string name="menu_delete">מחק</string>
<string name="menu_donate">תרום</string>
<string name="menu_edit">ערוך</string>

View File

@@ -91,9 +91,9 @@
<string name="maskpass_title">パスワードを隠す</string>
<string name="maskpass_summary">パスワード欄をアスタリスクで表示します</string>
<string name="menu_about">About</string>
<string name="menu_change_key">マスターキーを変更</string>
<string name="menu_change_key_settings">マスターキーを変更</string>
<string name="settings">設定</string>
<string name="menu_db_settings">データベース設定</string>
<string name="menu_database_settings">データベース設定</string>
<string name="menu_delete">削除</string>
<string name="menu_donate">寄付</string>
<string name="menu_edit">編集</string>
@@ -179,7 +179,7 @@
<string name="menu_move">移動</string>
<string name="menu_paste">貼り付け</string>
<string name="menu_cancel">キャンセル</string>
<string name="menu_fingerprint_remove_key">保存された指紋を削除</string>
<string name="menu_biometric_remove_key">保存された指紋を削除</string>
<string name="menu_file_selection_read_only">書き込み保護</string>
<string name="menu_open_file_read_and_write">変更可能</string>
<string name="create_keepass_file">新しいデータベースを作成</string>

View File

@@ -96,12 +96,12 @@
<string name="maskpass_title">비밀번호 숨기기</string>
<string name="maskpass_summary">기본 비밀번호를 (***) 로 가리기</string>
<string name="menu_about">정보</string>
<string name="menu_change_key">마스터 키 바꾸기</string>
<string name="menu_change_key_settings">마스터 키 바꾸기</string>
<string name="copy_field">%1$s 복사됨</string>
<string name="settings">설정</string>
<string name="menu_app_settings">앱 설정</string>
<string name="menu_form_filling_settings">폼 채우기</string>
<string name="menu_db_settings">데이터베이스 설정</string>
<string name="menu_database_settings">데이터베이스 설정</string>
<string name="menu_donate">기부</string>
<string name="menu_edit">수정</string>
<string name="menu_copy">복사</string>
@@ -114,7 +114,7 @@
<string name="menu_open">열기</string>
<string name="menu_search">검색</string>
<string name="menu_showpass">비밀번호 보이기</string>
<string name="menu_fingerprint_remove_key">저장된 지문 삭제됨</string>
<string name="menu_biometric_remove_key">저장된 지문 삭제됨</string>
<string name="menu_url">링크로 가기</string>
<string name="menu_file_selection_read_only">쓰기 보호됨</string>
<string name="menu_open_file_read_and_write">수정 가능</string>

View File

@@ -44,7 +44,7 @@
<string name="list_size_title">Grupės sąrašo dydis</string>
<string name="menu_about">Apie</string>
<string name="settings">Nustatymai</string>
<string name="menu_db_settings">Duomenų bazės nustatymai</string>
<string name="menu_database_settings">Duomenų bazės nustatymai</string>
<string name="menu_delete">Išrinti</string>
<string name="menu_donate">Aukoti</string>
<string name="menu_edit">Keisti</string>
@@ -84,7 +84,7 @@
<string name="keyfile_does_not_exist">Rakto failas neegzistuoja.</string>
<string name="entry_keyfile">Rakto failas</string>
<string name="search">Įrašo pavadinimas/aprašymas</string>
<string name="menu_change_key">Pakeisti master raktą</string>
<string name="menu_change_key_settings">Pakeisti master raktą</string>
<string name="entry_accessed">Naudota:</string>
<string name="maskpass_title">Maskuoti slaptažodį</string>
<string name="space">Tarpas</string>

View File

@@ -83,9 +83,9 @@
<string name="maskpass_title">Sēpt paroles</string>
<string name="maskpass_summary">Sēpt paroles *****</string>
<string name="menu_about">Par</string>
<string name="menu_change_key">Mainīt galveno paroli</string>
<string name="menu_change_key_settings">Mainīt galveno paroli</string>
<string name="settings">Iestatījumi</string>
<string name="menu_db_settings">Datu bāzes iestatījumi</string>
<string name="menu_database_settings">Datu bāzes iestatījumi</string>
<string name="menu_delete">Dzēst</string>
<string name="menu_donate">Ziedot</string>
<string name="menu_edit">Rediģēt</string>

View File

@@ -96,12 +96,12 @@
<string name="maskpass_title">Masker passord</string>
<string name="maskpass_summary">Skjul passord som forvalg</string>
<string name="menu_about">Om</string>
<string name="menu_change_key">Endre hovednøkkel</string>
<string name="menu_change_key_settings">Endre hovednøkkel</string>
<string name="copy_field">Kopierte %1$s</string>
<string name="settings">Innstillinger</string>
<string name="menu_app_settings">Programinnstillinger</string>
<string name="menu_form_filling_settings">Skjemautfylling</string>
<string name="menu_db_settings">Databaseinnstillinger</string>
<string name="menu_database_settings">Databaseinnstillinger</string>
<string name="menu_donate">Doner</string>
<string name="menu_edit">Rediger</string>
<string name="menu_copy">Kopier</string>
@@ -114,7 +114,7 @@
<string name="menu_open">Åpne</string>
<string name="menu_search">Søk</string>
<string name="menu_showpass">Vis passord</string>
<string name="menu_fingerprint_remove_key">Fjern fingeravtrykksnøkkelen</string>
<string name="menu_biometric_remove_key">Fjern fingeravtrykksnøkkelen</string>
<string name="menu_url">Gå til nettadresse</string>
<string name="menu_file_selection_read_only">Skrivebeskyttet</string>
<string name="menu_open_file_read_and_write">Les og skriv</string>
@@ -173,16 +173,16 @@
<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>
<string name="version_label">Versjon %1$s</string>
<string name="configure_fingerprint">Fingeravtrykket er satt støttet, men ikke satt opp på denne enheten.</string>
<string name="scanning_fingerprint">Venter på fingeravtrykk</string>
<string name="configure_biometric">Fingeravtrykket er satt støttet, men ikke satt opp på denne enheten.</string>
<string name="open_biometric_prompt_unlock_database">Venter på fingeravtrykk</string>
<string name="encrypted_value_stored">Kryptert passord lagret</string>
<string name="fingerprint_invalid_key">Ugyldig fingeravtrykksnøkkelproblem. Gjenopprett passordet ditt.</string>
<string name="biometric_invalid_key">Ugyldig fingeravtrykksnøkkelproblem. Gjenopprett passordet ditt.</string>
<string name="fingerprint_not_recognized">Fremmed fingeravtrykk</string>
<string name="fingerprint_error">Fingeravtrykksproblem: %1$s</string>
<string name="store_with_fingerprint">Bruk fingeravtrykk til å lagre dette passordet</string>
<string name="no_password_stored">Denne databasen har ikke et passord enda.</string>
<string name="biometric_scanning_error">Fingeravtrykksproblem: %1$s</string>
<string name="open_biometric_prompt_store_credential">Bruk fingeravtrykk til å lagre dette passordet</string>
<string name="no_credentials_stored">Denne databasen har ikke et passord enda.</string>
<string name="history">Historikk</string>
<string name="appearance">Utseende</string>
<string name="menu_appearance_settings">Utseende</string>
<string name="general">Generelt</string>
<string name="autofill">Autofyll</string>
<string name="autofill_service_name">KeePass DX autofyll-tjeneste</string>
@@ -200,19 +200,19 @@
<string name="lock">Lås</string>
<string name="lock_database_screen_off_title">Skjermlås</string>
<string name="lock_database_screen_off_summary">Lås databasen når skjermen er av</string>
<string name="fingerprint_quick_unlock_title">Hvordan sette opp fingeravtrykk for rask opplåsing?</string>
<string name="fingerprint_advanced_unlock_title">Hvordan sette opp fingeravtrykk for rask opplåsing?</string>
<string name="fingerprint_setting_text">Sett ditt personlige fingeravtrykk for din enhet i</string>
<string name="fingerprint_setting_way_text">\"Innstillinger\" → \"Sikkerhet\" → \"Fingeravtrykk\"</string>
<string name="fingerprint_type_password_text">Skriv passordet ditt i KeePass DX</string>
<string name="fingerprint_setting_link_text">\"Innstillinger\" → \"Sikkerhet\" → \"Fingeravtrykk\"</string>
<string name="fingerprint_type_credentials_text">Skriv passordet ditt i KeePass DX</string>
<string name="fingerprint_scan_to_store">Skann ditt fingeravtrykk for å lagre hovedpassordet ditt sikkert.</string>
<string name="fingerprint_scan_to_open">Skann fingeravtrykket ditt for å åpne databasen når passord er avskrudd.</string>
<string name="usage">Bruk</string>
<string name="fingerprint">Fingeravtrykk</string>
<string name="fingerprint_enable_title">Skanner etter fingeravtrykk</string>
<string name="fingerprint_enable_summary">Skru på fingeravtrykksåpning av database</string>
<string name="fingerprint_delete_all_title">Slett krypteringsnøkler</string>
<string name="fingerprint_delete_all_summary">Slett alle fingeravtrykksnøkler som har med fingeravtrykksgjenkjennelse å gjøre</string>
<string name="fingerprint_delete_all_warning">Er du sikker på at du vil slette alle nøklene som har med fingeravtrykk å gjøre?</string>
<string name="advanced_unlock">Fingeravtrykk</string>
<string name="biometric_unlock_enable_title">Skanner etter fingeravtrykk</string>
<string name="biometric_unlock_enable_summary">Skru på fingeravtrykksåpning av database</string>
<string name="biometric_delete_all_key_title">Slett krypteringsnøkler</string>
<string name="biometric_delete_all_key_summary">Slett alle fingeravtrykksnøkler som har med fingeravtrykksgjenkjennelse å gjøre</string>
<string name="biometric_delete_all_key_warning">Er du sikker på at du vil slette alle nøklene som har med fingeravtrykk å gjøre?</string>
<string name="unavailable_feature_text">Kunne ikke starte denne funksjonen.</string>
<string name="unavailable_feature_version">Din Androidversjon %1$s oppfyller ikke minimumskravet, %2$s kreves.</string>
<string name="unavailable_feature_hardware">Fant ikke maskinvaren.</string>
@@ -245,8 +245,7 @@
<string name="magic_keyboard_preference_title">Magikeyboard-innstillinger</string>
<string name="magic_keyboard_configure_title">Sett opp tastaturet for sikker skjemautfylling.</string>
<string name="magic_keyboard_activate_setting_text">Aktiver Magikeyboard i enhetsinnstillingene.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Innstillinger\" → \"Språk og inndata\" → \"Nåværende tastatur\" og velg ett.</string>
<string name="magic_keyboard_activate_setting_path_2_text">eller (\"Innstillinger\" → \"Språk og inndata\" → \"Virtuelt tastatur\" og velg ett.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Innstillinger\" → \"Språk og inndata\" → \"Nåværende tastatur\" og velg ett.</string>
<string name="keyboards_choose_magikeyboard_text">Velg Magikeyboard når du trenger å fylle inn et skjema.</string>
<string name="keyboards_swicth_magikeyboard_text">Du kan enkelt bytte fra ditt hovedtastatur til Magikeyboard med språkknappen på tastaturet ditt, et langt trykk på ditt tastaturs mellomromstast, eller, hvis det ikke er tilgjengelig, med:</string>
<string name="keyboard_select_entry_text">Velg din oppføring med nøkkelen.</string>

View File

@@ -94,9 +94,9 @@
<string name="maskpass_title">Wachtwoord verbergen</string>
<string name="maskpass_summary">Wachtwoorden standaard afschermen (***)</string>
<string name="menu_about">Over</string>
<string name="menu_change_key">Hoofdsleutel wijzigen</string>
<string name="menu_change_key_settings">Hoofdsleutel wijzigen</string>
<string name="settings">Instellingen</string>
<string name="menu_db_settings">Databank-instellingen</string>
<string name="menu_database_settings">Databank-instellingen</string>
<string name="menu_delete">Verwijderen</string>
<string name="menu_donate">Doneren</string>
<string name="menu_edit">Bewerken</string>
@@ -186,7 +186,7 @@
<string name="menu_move">Verplaatsen</string>
<string name="menu_paste">Plakken</string>
<string name="menu_cancel">Annuleren</string>
<string name="menu_fingerprint_remove_key">Opgeslagen vingerafdruk verwijderen</string>
<string name="menu_biometric_remove_key">Opgeslagen vingerafdruk verwijderen</string>
<string name="menu_file_selection_read_only">Alleen-lezen</string>
<string name="menu_open_file_read_and_write">Lezen en schrijven</string>
<string name="protection">Beveiliging</string>
@@ -215,16 +215,16 @@
<string name="warning_password_encoding">Vermijd letters bevatten die niet ondersteund worden door de Latin-1-tekenset van .kdb-bestanden; ze worden allemaal omgezet naar dezelfde letter.</string>
<string name="warning_empty_password">Weet je zeker dat je geen wachtwoordontgrendelbescherming wilt\?</string>
<string name="warning_no_encryption_key">Weet je zeker dat je geen sleutel wilt koppelen aan je versleuteling?</string>
<string name="configure_fingerprint">Vingerafdruk wordt ondersteund, maar is niet ingesteld.</string>
<string name="scanning_fingerprint">Vingerafdrukscanning</string>
<string name="configure_biometric">Vingerafdruk wordt ondersteund, maar is niet ingesteld.</string>
<string name="open_biometric_prompt_unlock_database">Vingerafdrukscanning</string>
<string name="encrypted_value_stored">Versleuteld wachtwoord is opgeslagen</string>
<string name="fingerprint_invalid_key">Kan vingerafdruksleutel niet lezen; herstel je wachtwoord.</string>
<string name="biometric_invalid_key">Kan vingerafdruksleutel niet lezen; herstel je wachtwoord.</string>
<string name="fingerprint_not_recognized">Vingerafdruk niet herkend</string>
<string name="fingerprint_error">Vingerafdrukprobleem: %1$s</string>
<string name="store_with_fingerprint">Vingerafdruk gebruiken om dit wachtwoord op te slaan</string>
<string name="no_password_stored">Deze databank heeft nog geen wachtwoord.</string>
<string name="biometric_scanning_error">Vingerafdrukprobleem: %1$s</string>
<string name="open_biometric_prompt_store_credential">Vingerafdruk gebruiken om dit wachtwoord op te slaan</string>
<string name="no_credentials_stored">Deze databank heeft nog geen wachtwoord.</string>
<string name="history">Geschiedenis</string>
<string name="appearance">Uiterlijk</string>
<string name="menu_appearance_settings">Uiterlijk</string>
<string name="general">Algemeen</string>
<string name="autofill">Auto-aanvullen</string>
<string name="autofill_service_name">KeePass DX auto-aanvullendienst</string>
@@ -242,19 +242,19 @@
<string name="lock">Vergrendelen</string>
<string name="lock_database_screen_off_title">Schermvergrendeling</string>
<string name="lock_database_screen_off_summary">Databank vergrendelen als het scherm uitgaat</string>
<string name="fingerprint_quick_unlock_title">Hoe stel ik mijn vingerafdruk in voor snelle ontgrendeling?</string>
<string name="fingerprint_advanced_unlock_title">Hoe stel ik mijn vingerafdruk in voor snelle ontgrendeling?</string>
<string name="fingerprint_setting_text">Stel je persoonlijke vingerafdruk voor je apparaat in via</string>
<string name="fingerprint_setting_way_text">\"Instellingen\" → \"Beveiliging\" → \"Vingerafdruk\"</string>
<string name="fingerprint_type_password_text">Voer het databankwachtwoord in</string>
<string name="fingerprint_setting_link_text">\"Instellingen\" → \"Beveiliging\" → \"Vingerafdruk\"</string>
<string name="fingerprint_type_credentials_text">Voer het databankwachtwoord in</string>
<string name="fingerprint_scan_to_store">Scan je vingerafdruk om je databankwachtwoord veilig op te slaan.</string>
<string name="fingerprint_scan_to_open">Scan je vingerafdruk om de databank te ontgrendelen als er geen vinkje staat bij wachtwoord</string>
<string name="usage">Gebruik</string>
<string name="fingerprint">Vingerafdruk</string>
<string name="fingerprint_enable_title">Bezig met vingerafdrukherkenning</string>
<string name="fingerprint_enable_summary">Databank openen met vingerafdruk</string>
<string name="fingerprint_delete_all_title">Sleutels voor versleuteling verwijderen</string>
<string name="fingerprint_delete_all_summary">Alle aan vingerafdrukherkenning gerelateerde sleutels wilt verwijderen</string>
<string name="fingerprint_delete_all_warning">Weet je zeker dat je alle aan vingerafdrukherkenning gerelateerde sleutels wilt verwijderen?</string>
<string name="advanced_unlock">Vingerafdruk</string>
<string name="biometric_unlock_enable_title">Bezig met vingerafdrukherkenning</string>
<string name="biometric_unlock_enable_summary">Databank openen met vingerafdruk</string>
<string name="biometric_delete_all_key_title">Sleutels voor versleuteling verwijderen</string>
<string name="biometric_delete_all_key_summary">Alle aan vingerafdrukherkenning gerelateerde sleutels wilt verwijderen</string>
<string name="biometric_delete_all_key_warning">Weet je zeker dat je alle aan vingerafdrukherkenning gerelateerde sleutels wilt verwijderen?</string>
<string name="unavailable_feature_text">Kan deze functie niet starten.</string>
<string name="unavailable_feature_version">Je Android-versie, %1$s, voldoet niet aan de minimumvereiste %2$s.</string>
<string name="unavailable_feature_hardware">De hardware wordt niet herkend.</string>
@@ -288,8 +288,7 @@
<string name="magic_keyboard_preference_title">Magikeyboard-instellingen</string>
<string name="magic_keyboard_configure_title">Hoe stel ik het toetsenbord in voor het veilig invullen van formulieren?</string>
<string name="magic_keyboard_activate_setting_text">Activeer Magikeyboard in de apparaatinstellingen.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Instellingen\" → \"Taal en invoer\" → \"Huidig toetsenbord\" en kies er een.</string>
<string name="magic_keyboard_activate_setting_path_2_text">of (\"Instellingen\" → \"Taal en invoer\" → \"Virtueel toetsenbord\")</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Instellingen\" → \"Taal en invoer\" → \"Huidig toetsenbord\" en kies er een.</string>
<string name="keyboards_choose_magikeyboard_text">Kies Magikeyboard als je een formulier moet invullen.</string>
<string name="keyboards_swicth_magikeyboard_text">Je kunt eenvoudig schakelen tussen je gebruikelijke toetsenbord en Magikeyboard middels de taalknop op je toetsenbord of door de spatiebalk lang ingedrukt te houden. Indien niet beschikbaar kan het ook met:</string>
<string name="keyboard_select_entry_text">Kies je iteminvoer met de toets.</string>

View File

@@ -92,9 +92,9 @@
<string name="maskpass_title">Masker passord</string>
<string name="maskpass_summary">Gøym passorda (standardval)</string>
<string name="menu_about">Om</string>
<string name="menu_change_key">Endra hovudnøkkelen</string>
<string name="menu_change_key_settings">Endra hovudnøkkelen</string>
<string name="settings">Innstillingar</string>
<string name="menu_db_settings">Databaseinnstillingar</string>
<string name="menu_database_settings">Databaseinnstillingar</string>
<string name="menu_delete">Slett</string>
<string name="menu_donate">Doner</string>
<string name="menu_edit">Endra</string>

View File

@@ -89,9 +89,9 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="maskpass_title">Ukryj hasła</string>
<string name="maskpass_summary">Maskuj hasła (***) domyślnie</string>
<string name="menu_about">O programie</string>
<string name="menu_change_key">Zmień klucz główny</string>
<string name="menu_change_key_settings">Zmień klucz główny</string>
<string name="settings">Ustawienia</string>
<string name="menu_db_settings">Ustawienia bazy danych</string>
<string name="menu_database_settings">Ustawienia bazy danych</string>
<string name="menu_delete">Usuń</string>
<string name="menu_donate">Dotuj</string>
<string name="menu_edit">Edytuj</string>
@@ -182,7 +182,7 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="menu_move">Przenieś</string>
<string name="menu_paste">Wklej</string>
<string name="menu_cancel">Anuluj</string>
<string name="menu_fingerprint_remove_key">Usuń zapisany klucz linii papilarnych</string>
<string name="menu_biometric_remove_key">Usuń zapisany klucz linii papilarnych</string>
<string name="menu_file_selection_read_only">Chroniony przed zapisem</string>
<string name="menu_open_file_read_and_write">Modyfikowalne</string>
<string name="protection">Ochrona</string>
@@ -209,17 +209,17 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="warning_empty_password">Czy naprawdę nie chcesz ochrony przed odblokowaniem hasła\?</string>
<string name="warning_no_encryption_key">Czy na pewno nie chcesz używać żadnego klucza szyfrowania?</string>
<string name="version_label">Wersja %1$s</string>
<string name="configure_fingerprint">Skanowanie odcisków palców jest obsługiwane, ale nie skonfigurowane.</string>
<string name="configure_biometric">Skanowanie odcisków palców jest obsługiwane, ale nie skonfigurowane.</string>
<string name="encrypted_value_stored">"Przechowywane hasło zaszyfrowane "</string>
<string name="sort_groups_before">Grupy poprzednie</string>
<string name="scanning_fingerprint">Skanowanie odcisków palców</string>
<string name="fingerprint_invalid_key">Nie można odczytać klucza linii papilarnych. Przywróć swoje hasło.</string>
<string name="open_biometric_prompt_unlock_database">Skanowanie odcisków palców</string>
<string name="biometric_invalid_key">Nie można odczytać klucza linii papilarnych. Przywróć swoje hasło.</string>
<string name="fingerprint_not_recognized">Nie można rozpoznać odcisku palca</string>
<string name="fingerprint_error">Problem z odciskiem palca: %1$s</string>
<string name="store_with_fingerprint">Użyj odcisku palca, aby zapisać to hasło</string>
<string name="no_password_stored">Baza danych nie ma jeszcze hasła.</string>
<string name="biometric_scanning_error">Problem z odciskiem palca: %1$s</string>
<string name="open_biometric_prompt_store_credential">Użyj odcisku palca, aby zapisać to hasło</string>
<string name="no_credentials_stored">Baza danych nie ma jeszcze hasła.</string>
<string name="history">Historia</string>
<string name="appearance">Wygląd</string>
<string name="menu_appearance_settings">Wygląd</string>
<string name="general">Ogólne</string>
<string name="autofill">Wypełnij automatycznie</string>
<string name="autofill_service_name">Autouzupełnianie formularzy KeePass DX</string>
@@ -237,19 +237,19 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="lock">Blokada</string>
<string name="lock_database_screen_off_title">Blokada ekranu</string>
<string name="lock_database_screen_off_summary">Zablokuj bazę danych, gdy ekran jest wyłączony</string>
<string name="fingerprint_quick_unlock_title">Jak skonfigurować skanowanie linii papilarnych do szybkiego odblokowania\?</string>
<string name="fingerprint_advanced_unlock_title">Jak skonfigurować skanowanie linii papilarnych do szybkiego odblokowania\?</string>
<string name="fingerprint_setting_text">Zapisz zeskanowany odcisk palca w urządzeniu</string>
<string name="fingerprint_setting_way_text">\"Ustawienia\" → \"Bezpieczeństwo\" → \"Odcisk palca\"</string>
<string name="fingerprint_type_password_text">Wprowadź hasło blokady bazy danych</string>
<string name="fingerprint_setting_link_text">\"Ustawienia\" → \"Bezpieczeństwo\" → \"Odcisk palca\"</string>
<string name="fingerprint_type_credentials_text">Wprowadź hasło blokady bazy danych</string>
<string name="fingerprint_scan_to_store">Zeskanuj swój odcisk palca, aby bezpiecznie zapisać hasło blokady bazy danych.</string>
<string name="fingerprint_scan_to_open">Zeskanuj swój odcisk palca, aby otworzyć bazę danych po wyłączeniu hasła.</string>
<string name="usage">Użycie</string>
<string name="fingerprint">Odcisk palca</string>
<string name="fingerprint_enable_title">Skanowanie odcisków palców</string>
<string name="fingerprint_enable_summary">Umożliwia skanowanie odcisku palca w celu otwarcia bazy danych</string>
<string name="fingerprint_delete_all_title">Usuń klucze szyfrowania</string>
<string name="fingerprint_delete_all_summary">Usuń wszystkie klucze szyfrowania związane z rozpoznawaniem linii papilarnych</string>
<string name="fingerprint_delete_all_warning">Czy na pewno chcesz usunąć wszystkie klucze związane z rozpoznawaniem linii papilarnych\?</string>
<string name="advanced_unlock">Odcisk palca</string>
<string name="biometric_unlock_enable_title">Skanowanie odcisków palców</string>
<string name="biometric_unlock_enable_summary">Umożliwia skanowanie odcisku palca w celu otwarcia bazy danych</string>
<string name="biometric_delete_all_key_title">Usuń klucze szyfrowania</string>
<string name="biometric_delete_all_key_summary">Usuń wszystkie klucze szyfrowania związane z rozpoznawaniem linii papilarnych</string>
<string name="biometric_delete_all_key_warning">Czy na pewno chcesz usunąć wszystkie klucze związane z rozpoznawaniem linii papilarnych\?</string>
<string name="unavailable_feature_text">Nie można uruchomić tej funkcji.</string>
<string name="unavailable_feature_version">Twoja wersja Androida %1$s nie spełnia wymaganej minimalnej wersji %2$s.</string>
<string name="unavailable_feature_hardware">Nie można znaleźć odpowiedniego sprzętu.</string>
@@ -282,8 +282,7 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="magic_keyboard_preference_title">Ustawienia Magikeyboard</string>
<string name="magic_keyboard_configure_title">Skonfiguruj klawiaturę, aby bezpiecznie wypełniać formularze.</string>
<string name="magic_keyboard_activate_setting_text">Aktywuj \"Magikeyboard\" w ustawieniach urządzenia.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Ustawienia\" → \"Język i wprowadzanie\" → \"Aktualna klawiatura\" i wybierz jedną.</string>
<string name="magic_keyboard_activate_setting_path_2_text">lub (\"Ustawienia\" → \"Język i wprowadzanie danych\" → \"Klawiatura wirtualna\" i wybierz jedną.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Ustawienia\" → \"Język i wprowadzanie\" → \"Aktualna klawiatura\" i wybierz jedną.</string>
<string name="keyboards_choose_magikeyboard_text">Wybierz Magikeyboard, gdy potrzebujesz wypełnić formularz.</string>
<string name="keyboards_swicth_magikeyboard_text">Przełącz klawiaturę naciskając klawisz spacji na klawiaturze lub, jeśli nie jest dostępny, z:</string>
<string name="keyboard_select_entry_text">Wybierz wpis za pomocą klawisza.</string>

View File

@@ -94,9 +94,9 @@
<string name="maskpass_title">Esconder senhas</string>
<string name="maskpass_summary">Mascarar senhas (***) por padrão</string>
<string name="menu_about">Sobre</string>
<string name="menu_change_key">Modificar senha mestre</string>
<string name="menu_change_key_settings">Modificar senha mestre</string>
<string name="settings">Configurações</string>
<string name="menu_db_settings">Configurações do banco de dados</string>
<string name="menu_database_settings">Configurações do banco de dados</string>
<string name="menu_delete">Deletar</string>
<string name="menu_donate">Doaçoes</string>
<string name="menu_edit">Editar</string>
@@ -179,7 +179,7 @@
<string name="menu_move">Mover</string>
<string name="menu_paste">Colar</string>
<string name="menu_cancel">Cancelar</string>
<string name="menu_fingerprint_remove_key">Deletar impressão digital salva</string>
<string name="menu_biometric_remove_key">Deletar impressão digital salva</string>
<string name="menu_file_selection_read_only">Apenas leitura</string>
<string name="menu_open_file_read_and_write">Leitura e escrita</string>
<string name="protection">Proteção</string>
@@ -208,16 +208,16 @@
<string name="warning_password_encoding">Evite caracteres fora do formato de codificação do arquivo do banco (todos os caracteres não reconhecidos são convertidos para a mesma letra).</string>
<string name="warning_empty_password">Você realmente não quer proteção por senha\?</string>
<string name="warning_no_encryption_key">Você tem certeza de que não quer usar uma chave de encriptação\?</string>
<string name="configure_fingerprint">Impressão digital é suportada, mas não está configurada.</string>
<string name="scanning_fingerprint">Escaneamento de impressão digital</string>
<string name="configure_biometric">Impressão digital é suportada, mas não está configurada.</string>
<string name="open_biometric_prompt_unlock_database">Escaneamento de impressão digital</string>
<string name="encrypted_value_stored">Senha encriptada armazenada</string>
<string name="fingerprint_invalid_key">Não pôde ler chave de impressão digital. Recupere sua senha.</string>
<string name="biometric_invalid_key">Não pôde ler chave de impressão digital. Recupere sua senha.</string>
<string name="fingerprint_not_recognized">Não pôde reconhecer impressão digital</string>
<string name="fingerprint_error">Problema de Impressão digital: %1$s</string>
<string name="store_with_fingerprint">Use Impressão digital para armazenar esta senha</string>
<string name="no_password_stored">Ainda não há nenhuma senha armazenada nesse banco de dados.</string>
<string name="biometric_scanning_error">Problema de Impressão digital: %1$s</string>
<string name="open_biometric_prompt_store_credential">Use Impressão digital para armazenar esta senha</string>
<string name="no_credentials_stored">Ainda não há nenhuma senha armazenada nesse banco de dados.</string>
<string name="history">Histórico</string>
<string name="appearance">Aparência</string>
<string name="menu_appearance_settings">Aparência</string>
<string name="general">Geral</string>
<string name="autofill">Preenchimento automático</string>
<string name="autofill_service_name">Preenchimento Automático KeePass DX</string>
@@ -234,19 +234,19 @@
<string name="lock">Bloquear</string>
<string name="lock_database_screen_off_title">Bloqueio de tela</string>
<string name="lock_database_screen_off_summary">Bloqueie o banco de dados quando a tela estiver desligada</string>
<string name="fingerprint_quick_unlock_title">Como configurar impressões digitais para desbloqueio rápido?</string>
<string name="fingerprint_advanced_unlock_title">Como configurar impressões digitais para desbloqueio rápido?</string>
<string name="fingerprint_setting_text">Salvar sua impressão digital esconeada para seu dispositivo em</string>
<string name="fingerprint_setting_way_text">\"Configurações\" → \"Segurança\" → \"Impressão Digital\"</string>
<string name="fingerprint_type_password_text">Entre com sua senha no banco</string>
<string name="fingerprint_setting_link_text">\"Configurações\" → \"Segurança\" → \"Impressão Digital\"</string>
<string name="fingerprint_type_credentials_text">Entre com sua senha no banco</string>
<string name="fingerprint_scan_to_store">Escaneie sua impressão digital para armazenar sua senha da base com segurança.</string>
<string name="fingerprint_scan_to_open">Escaneie sua impressão digital para abrir o banco de dados quando a senha estiber desativada.</string>
<string name="usage">Uso</string>
<string name="fingerprint">Impressão Digital</string>
<string name="fingerprint_enable_title">Escaneamento de impressão digital</string>
<string name="fingerprint_enable_summary">Permite que você escaneie sua impressão digital para a abertura do banco de dados</string>
<string name="fingerprint_delete_all_title">Apague chaves de encriptação</string>
<string name="fingerprint_delete_all_summary">Apague todas as chaves de encriptação relacionadas ao reconhecimento de Impressões digitais</string>
<string name="fingerprint_delete_all_warning">Tem certeza que você quer apagar todas as chaves relacionadas ao reconhecimento de Impressões digitais\?</string>
<string name="advanced_unlock">Impressão Digital</string>
<string name="biometric_unlock_enable_title">Escaneamento de impressão digital</string>
<string name="biometric_unlock_enable_summary">Permite que você escaneie sua impressão digital para a abertura do banco de dados</string>
<string name="biometric_delete_all_key_title">Apague chaves de encriptação</string>
<string name="biometric_delete_all_key_summary">Apague todas as chaves de encriptação relacionadas ao reconhecimento de Impressões digitais</string>
<string name="biometric_delete_all_key_warning">Tem certeza que você quer apagar todas as chaves relacionadas ao reconhecimento de Impressões digitais\?</string>
<string name="unavailable_feature_text">Não foi possível iniciar esse recurso.</string>
<string name="unavailable_feature_version">Sua versão do Android %1$s não corresponde a versão mínima %2$s necessária.</string>
<string name="unavailable_feature_hardware">Não foi possível encontrar o hardware correspondente.</string>
@@ -279,8 +279,7 @@
<string name="magic_keyboard_preference_title">Configurações do Magikeyboard</string>
<string name="magic_keyboard_configure_title">Configure o teclado para automaticamente preencher formulários seguramente.</string>
<string name="magic_keyboard_activate_setting_text">Ative \"Magikeyboard\" nas configurações do dispositivo.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Configurações\" → \"Idioma e Entrada\" → \"Teclado Atual\" → \"Selecionar Teclado\" e escolha um.</string>
<string name="magic_keyboard_activate_setting_path_2_text">ou (\"Configurações\" → \"Sistema → Idioma e Entrada\" → \"Teclado Virtual\" → \"Gerenciar Teclados\")</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Configurações\" → \"Idioma e Entrada\" → \"Teclado Atual\" → \"Selecionar Teclado\" e escolha um.</string>
<string name="keyboards_choose_magikeyboard_text">Escolha o Magikeyboard quando precisar preencher um formulário.</string>
<string name="keyboards_swicth_magikeyboard_text">Troque teclados ao pressionar e segurar a barra de espaço de seu teclado, ou, se não estiver disponível, com:</string>
<string name="keyboard_select_entry_text">Selecione uma entrada com a chave.</string>

View File

@@ -103,9 +103,9 @@
<string name="maskpass_title">Mascarar palavra-passe</string>
<string name="maskpass_summary">Ocultar as palavras-passe por predefinição</string>
<string name="menu_about">Sobre</string>
<string name="menu_change_key">Alterar chave mestre</string>
<string name="menu_change_key_settings">Alterar chave mestre</string>
<string name="settings">Definições</string>
<string name="menu_db_settings">Definições da base de dados</string>
<string name="menu_database_settings">Definições da base de dados</string>
<string name="menu_delete">Eliminar</string>
<string name="menu_donate">Fazer donativo</string>
<string name="menu_edit">Editar</string>
@@ -182,7 +182,7 @@
<string name="menu_move">Mover</string>
<string name="menu_paste">Colar</string>
<string name="menu_cancel">Cancelar</string>
<string name="menu_fingerprint_remove_key">Apagar de impressão digital gravada</string>
<string name="menu_biometric_remove_key">Apagar de impressão digital gravada</string>
<string name="menu_file_selection_read_only">Protegido contra escrita</string>
<string name="menu_open_file_read_and_write">Pode ser modificado</string>
<string name="create_keepass_file">Criar nova base de dados</string>
@@ -203,14 +203,14 @@
<string name="warning_empty_password">Quer realmente usar uma palavra-chave vazia\?</string>
<string name="warning_no_encryption_key">Tem a certeza que não quer usar uma chave de encriptação\?</string>
<string name="build_label">Construir %1$s</string>
<string name="configure_fingerprint">Impressão digital suportada, mas não configurada para dispositivo.</string>
<string name="configure_biometric">Impressão digital suportada, mas não configurada para dispositivo.</string>
<string name="encrypted_value_stored">Palavra-chave encriptada armazenada</string>
<string name="fingerprint_not_recognized">Impressão digital não reconhecida</string>
<string name="fingerprint_error">Problema da Impressão digital: %1$s</string>
<string name="store_with_fingerprint">Use a impressão digital para armazenar esta palavra-chave</string>
<string name="no_password_stored">Ainda não há nenhuma palavra-chave armazenada nesta base de dados.</string>
<string name="biometric_scanning_error">Problema da Impressão digital: %1$s</string>
<string name="open_biometric_prompt_store_credential">Use a impressão digital para armazenar esta palavra-chave</string>
<string name="no_credentials_stored">Ainda não há nenhuma palavra-chave armazenada nesta base de dados.</string>
<string name="history">Histórico</string>
<string name="appearance">Aparência</string>
<string name="menu_appearance_settings">Aparência</string>
<string name="general">Geral</string>
<string name="autofill">Preenchimento automático</string>
<string name="autofill_service_name">Serviço de Preenchimento Automático do KeePass DX</string>

View File

@@ -103,9 +103,9 @@
<string name="maskpass_title">Скрыть пароли</string>
<string name="maskpass_summary">Скрывать пароли по умолчанию</string>
<string name="menu_about">Сведения</string>
<string name="menu_change_key">Изменить мастер-ключ</string>
<string name="menu_change_key_settings">Изменить мастер-ключ</string>
<string name="settings">Настройки</string>
<string name="menu_db_settings">Настройки базы</string>
<string name="menu_database_settings">Настройки базы</string>
<string name="menu_delete">Удалить</string>
<string name="menu_donate">Помочь</string>
<string name="menu_edit">Правка</string>
@@ -154,13 +154,13 @@
<string name="warning_read_only">Карта помять в режиме только для чтения. Изменения не будут сохранены.</string>
<string name="warning_unmounted">Карта памяти не подключена. Работа с базой невозможна.</string>
<string name="version_label">Версия %1$s</string>
<string name="configure_fingerprint">Отпечатки пальцев поддерживаются, но не настроены.</string>
<string name="scanning_fingerprint">Ожидание отпечатка пальца</string>
<string name="configure_biometric">Отпечатки пальцев поддерживаются, но не настроены.</string>
<string name="open_biometric_prompt_unlock_database">Ожидание отпечатка пальца</string>
<string name="encrypted_value_stored">Зашифрованный пароль сохранён</string>
<string name="fingerprint_invalid_key">Неверный ключ отпечатка пальца. Восстановите пароль.</string>
<string name="fingerprint_error">Проблема с отпечатком пальца : %1$s</string>
<string name="store_with_fingerprint">Используйте отпечаток пальца, чтобы сохранить пароль</string>
<string name="no_password_stored">Для этой базы пароль ещё не сохранён</string>
<string name="biometric_invalid_key">Неверный ключ отпечатка пальца. Восстановите пароль.</string>
<string name="biometric_scanning_error">Проблема с отпечатком пальца : %1$s</string>
<string name="open_biometric_prompt_store_credential">Используйте отпечаток пальца, чтобы сохранить пароль</string>
<string name="no_credentials_stored">Для этой базы пароль ещё не сохранён</string>
<string name="education_unlock_summary">Введите пароль и/или файл ключа, чтобы разблокировать базу.
\n
\nНе забудьте сохранить копию .kdbx файла в безопасном месте после каждого изменения.</string>
@@ -210,7 +210,7 @@
<string name="menu_move">Переместить</string>
<string name="menu_paste">Вставить</string>
<string name="menu_cancel">Отмена</string>
<string name="menu_fingerprint_remove_key">Удалить отпечаток</string>
<string name="menu_biometric_remove_key">Удалить отпечаток</string>
<string name="menu_file_selection_read_only">Только чтение</string>
<string name="menu_open_file_read_and_write">Чтение и запись</string>
<string name="sort_groups_before">Сначала группы</string>
@@ -220,7 +220,7 @@
<string name="warning_no_encryption_key">Вы действительно не хотите использовать ключ шифрования?</string>
<string name="fingerprint_not_recognized">Отпечаток пальца не распознан</string>
<string name="history">История</string>
<string name="appearance">Внешний вид</string>
<string name="menu_appearance_settings">Внешний вид</string>
<string name="general">Общие</string>
<string name="autofill">Автозаполнение</string>
<string name="autofill_service_name">Сервис автозаполнения KeePass DX</string>
@@ -238,19 +238,19 @@
<string name="lock">Блокировка</string>
<string name="lock_database_screen_off_title">Блокировка экрана</string>
<string name="lock_database_screen_off_summary">Блокировать базу при отключении экрана</string>
<string name="fingerprint_quick_unlock_title">Как настроить отпечаток пальца для быстрой разблокировки?</string>
<string name="fingerprint_advanced_unlock_title">Как настроить отпечаток пальца для быстрой разблокировки?</string>
<string name="fingerprint_setting_text">Установите ваш личный отпечаток пальца для вашего устройства</string>
<string name="fingerprint_setting_way_text">\"Настройки\" → \"Безопасность\" → \"Отпечаток пальца\"</string>
<string name="fingerprint_type_password_text">Введите ваш пароль в Keepass DX</string>
<string name="fingerprint_setting_link_text">\"Настройки\" → \"Безопасность\" → \"Отпечаток пальца\"</string>
<string name="fingerprint_type_credentials_text">Введите ваш пароль в Keepass DX</string>
<string name="fingerprint_scan_to_store">Сканируйте ваш отпечаток пальца для безопасного хранения вашего мастер-пароля</string>
<string name="fingerprint_scan_to_open">Сканируйте ваш отпечаток пальца, когда поле \"Пароль\" не отмечено, для разблокировки базы</string>
<string name="usage">Использование</string>
<string name="fingerprint">Отпечаток пальца</string>
<string name="fingerprint_enable_title">Сканирование отпечатка пальца</string>
<string name="fingerprint_enable_summary">Включить разблокировку базы с помощью отпечатка пальца</string>
<string name="fingerprint_delete_all_title">Удалить ключи шифрования</string>
<string name="fingerprint_delete_all_summary">Удалить все ключи шифрования, связанные с распознаванием отпечатка пальца</string>
<string name="fingerprint_delete_all_warning">Вы уверены, что хотите удалить все ключи, связанные с отпечатком пальца?</string>
<string name="advanced_unlock">Отпечаток пальца</string>
<string name="biometric_unlock_enable_title">Сканирование отпечатка пальца</string>
<string name="biometric_unlock_enable_summary">Включить разблокировку базы с помощью отпечатка пальца</string>
<string name="biometric_delete_all_key_title">Удалить ключи шифрования</string>
<string name="biometric_delete_all_key_summary">Удалить все ключи шифрования, связанные с распознаванием отпечатка пальца</string>
<string name="biometric_delete_all_key_warning">Вы уверены, что хотите удалить все ключи, связанные с отпечатком пальца?</string>
<string name="unavailable_feature_text">Невозможно запустить эту функцию.</string>
<string name="unavailable_feature_version">Ваша версия Android %1$s ниже минимально необходимой %2$s.</string>
<string name="unavailable_feature_hardware">Оборудование не найдено.</string>
@@ -283,8 +283,7 @@
<string name="magic_keyboard_preference_title">Настройки Magikeyboard</string>
<string name="magic_keyboard_configure_title">Как настроить клавиатуру для безопасного заполнения форм?</string>
<string name="magic_keyboard_activate_setting_text">Активировать Magikeyboard в настройках устройства.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Настройки\" → \"Язык и ввод\" → \"Текущая клавиатура\" и выбрать.</string>
<string name="magic_keyboard_activate_setting_path_2_text">или (\"Настройки\" → \"Язык и ввод\" → \"Виртуальная клавиатура\" и выбрать.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Настройки\" → \"Язык и ввод\" → \"Текущая клавиатура\" и выбрать.</string>
<string name="keyboards_choose_magikeyboard_text">Выбрать Magikeyboard, когда вам необходимо заполнить форму.</string>
<string name="keyboards_swicth_magikeyboard_text">Вы можете легко переключаться с основной клавиатуры на Magikeyboard с помощью кнопки языка клавиатуры, длительного нажатия на пробел клавиатуры или, если она недоступна, с помощью:</string>
<string name="keyboard_select_entry_text">Выберите запись с помощью кнопки.</string>

View File

@@ -91,9 +91,9 @@
<string name="maskpass_title">Skryť heslo</string>
<string name="maskpass_summary">Skryť heslá štandardne</string>
<string name="menu_about">O Programe</string>
<string name="menu_change_key">Zmeniť hlavný Kľúč</string>
<string name="menu_change_key_settings">Zmeniť hlavný Kľúč</string>
<string name="settings">Nastavenia</string>
<string name="menu_db_settings">Nastavenia Databázy</string>
<string name="menu_database_settings">Nastavenia Databázy</string>
<string name="menu_delete">Zmazať</string>
<string name="menu_donate">Darovať</string>
<string name="menu_edit">Upraviť</string>

View File

@@ -103,9 +103,9 @@
<string name="maskpass_title">Maskera lösenord</string>
<string name="maskpass_summary">Döljer lösenord som standard</string>
<string name="menu_about">Om</string>
<string name="menu_change_key">Byt nyckelfil</string>
<string name="menu_change_key_settings">Byt nyckelfil</string>
<string name="settings">Inställningar</string>
<string name="menu_db_settings">Databasinställningar</string>
<string name="menu_database_settings">Databasinställningar</string>
<string name="menu_delete">Radera</string>
<string name="menu_donate">Donera</string>
<string name="menu_edit">Redigera</string>

View File

@@ -96,12 +96,12 @@
<string name="maskpass_title">"Parolaları gizle "</string>
<string name="maskpass_summary">Parola maskesi. Varsayılan (***)</string>
<string name="menu_about">Hakkında</string>
<string name="menu_change_key">Ana anahtarı değitir</string>
<string name="menu_change_key_settings">Ana anahtarı değitir</string>
<string name="copy_field">%1$s kopyalandı</string>
<string name="settings">Ayarlar</string>
<string name="menu_app_settings">Uygulama ayarları</string>
<string name="menu_form_filling_settings">Form doldurma</string>
<string name="menu_db_settings">Veritabanı ayarları</string>
<string name="menu_database_settings">Veritabanı ayarları</string>
<string name="menu_donate">Bağış Yap</string>
<string name="menu_edit">Düzen</string>
<string name="menu_copy">Kopyala</string>
@@ -114,7 +114,7 @@
<string name="menu_open"></string>
<string name="menu_search">Ara</string>
<string name="menu_showpass">Parolayı göster</string>
<string name="menu_fingerprint_remove_key">Kaydedilen parmak izini silin</string>
<string name="menu_biometric_remove_key">Kaydedilen parmak izini silin</string>
<string name="menu_url">URL\'a git</string>
<string name="menu_file_selection_read_only">Yazma korumalı</string>
<string name="menu_open_file_read_and_write">Değiştirilebilir</string>
@@ -176,16 +176,16 @@
<string name="warning_no_encryption_key">Herhangi bir şifreleme anahtarı kullanmak istemediğinize emin misiniz\?</string>
<string name="version_label">Sürüm %1$s</string>
<string name="build_label">Yapı %1$s</string>
<string name="configure_fingerprint">Parmak izi taraması desteklenir, ancak kurulmaz.</string>
<string name="scanning_fingerprint">Parmak izi tarama</string>
<string name="configure_biometric">Parmak izi taraması desteklenir, ancak kurulmaz.</string>
<string name="open_biometric_prompt_unlock_database">Parmak izi tarama</string>
<string name="encrypted_value_stored">Şifreli parola saklandı</string>
<string name="fingerprint_invalid_key">Parmak izi anahtarı okunamadı. Şifreni geri yükle.</string>
<string name="biometric_invalid_key">Parmak izi anahtarı okunamadı. Şifreni geri yükle.</string>
<string name="fingerprint_not_recognized">Parmak izi tanınamadı</string>
<string name="fingerprint_error">Parmak izi sorunu: %1$s</string>
<string name="store_with_fingerprint">Bu şifreyi saklamak için parmak izini kullanın</string>
<string name="no_password_stored">Bu veritabanının henüz bir parolası yok.</string>
<string name="biometric_scanning_error">Parmak izi sorunu: %1$s</string>
<string name="open_biometric_prompt_store_credential">Bu şifreyi saklamak için parmak izini kullanın</string>
<string name="no_credentials_stored">Bu veritabanının henüz bir parolası yok.</string>
<string name="history">Geçmiş</string>
<string name="appearance">Görünüm</string>
<string name="menu_appearance_settings">Görünüm</string>
<string name="general">Genel</string>
<string name="autofill">Otomatik Doldurma</string>
<string name="autofill_service_name">KeePass DX formu otomatik doldurma</string>
@@ -203,19 +203,19 @@
<string name="lock">Kilit</string>
<string name="lock_database_screen_off_title">Ekran kilidi</string>
<string name="lock_database_screen_off_summary">Ekran kapalıyken veritabanını kilitle</string>
<string name="fingerprint_quick_unlock_title">Hızlı kilit açmak için parmak izi taraması nasıl ayarlanır\?</string>
<string name="fingerprint_advanced_unlock_title">Hızlı kilit açmak için parmak izi taraması nasıl ayarlanır\?</string>
<string name="fingerprint_setting_text">Cihazınız için taranmış parmak izinizi kaydet</string>
<string name="fingerprint_setting_way_text">\"Ayarlar\" → \"Güvenlik\" → \"Parmak İzi\"</string>
<string name="fingerprint_type_password_text">Veritabanı kilitleme parolasını girin</string>
<string name="fingerprint_setting_link_text">\"Ayarlar\" → \"Güvenlik\" → \"Parmak İzi\"</string>
<string name="fingerprint_type_credentials_text">Veritabanı kilitleme parolasını girin</string>
<string name="fingerprint_scan_to_store">Veritabanı kilit parolanızı güvenli bir şekilde saklamak için parmak izinizi tarayın.</string>
<string name="fingerprint_scan_to_open">Parola kapatıldığında veritabanını açmak için parmak izinizi tarayın.</string>
<string name="usage">Kullanım</string>
<string name="fingerprint">Parmakizi</string>
<string name="fingerprint_enable_title">Parmak izi tarama</string>
<string name="fingerprint_enable_summary">Veritabanını açmak için parmak izinizi taramanızı sağlar</string>
<string name="fingerprint_delete_all_title">Şifreleme anahtarlarını silin</string>
<string name="fingerprint_delete_all_summary">Parmak izi tanıma ile ilgili tüm şifreleme anahtarlarını silin</string>
<string name="fingerprint_delete_all_warning">Parmak izi tanıma ile ilgili tüm tuşları silmek istediğinizden emin misiniz\?</string>
<string name="advanced_unlock">Parmakizi</string>
<string name="biometric_unlock_enable_title">Parmak izi tarama</string>
<string name="biometric_unlock_enable_summary">Veritabanını açmak için parmak izinizi taramanızı sağlar</string>
<string name="biometric_delete_all_key_title">Şifreleme anahtarlarını silin</string>
<string name="biometric_delete_all_key_summary">Parmak izi tanıma ile ilgili tüm şifreleme anahtarlarını silin</string>
<string name="biometric_delete_all_key_warning">Parmak izi tanıma ile ilgili tüm tuşları silmek istediğinizden emin misiniz\?</string>
<string name="unavailable_feature_text">Bu özellik başlatılamadı.</string>
<string name="unavailable_feature_version">Android sürümünüz %1$s, gerekli minimum %2$s sürümünü karşılamıyor.</string>
<string name="unavailable_feature_hardware">İlgili donanım bulunamadı.</string>
@@ -247,8 +247,7 @@
<string name="magic_keyboard_preference_title">Magikeyboard ayarları</string>
<string name="magic_keyboard_configure_title">Formları güvenli bir şekilde otomatik doldurmak için klavyeyi ayarlayın.</string>
<string name="magic_keyboard_activate_setting_text">Cihaz ayarlarında \"Magikeyboard\"u etkinleştirin.</string>
<string name="magic_keyboard_activate_setting_path_1_text">\"Ayarlar\" → \"Dil &amp; giriş\" → \"Geçerli Klavye\" ve birini seçin.</string>
<string name="magic_keyboard_activate_setting_path_2_text">veya (\"Ayarlar\" → \"Dil &amp; giriş\" → \"Sanal klavye\" ve birini seçin.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">\"Ayarlar\" → \"Dil &amp; giriş\" → \"Geçerli Klavye\" ve birini seçin.</string>
<string name="keyboards_choose_magikeyboard_text">Bir formu doldurmanız gerektiğinde Magikeyboard\'u seçin.</string>
<string name="keyboards_swicth_magikeyboard_text">Klavyenizdeki boşluk çubuğuna uzun basarak veya mevcut değilse şunu yaparak klavyeleri değiştirin:</string>
<string name="keyboard_select_entry_text">Anahtarlı girişinizi seçin.</string>

View File

@@ -92,9 +92,9 @@
<string name="maskpass_title">Маска пароля</string>
<string name="maskpass_summary">Приховати паролі за замовчуванням</string>
<string name="menu_about">Про</string>
<string name="menu_change_key">Змінити головний ключ</string>
<string name="menu_change_key_settings">Змінити головний ключ</string>
<string name="settings">Налаштування</string>
<string name="menu_db_settings">Налаштування бази даних</string>
<string name="menu_database_settings">Налаштування бази даних</string>
<string name="menu_delete">Вилучити</string>
<string name="menu_donate">Пожертвувати</string>
<string name="menu_edit">Редагувати</string>

View File

@@ -18,5 +18,5 @@
along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
-->
<resources>
<bool name="fingerprint_enable_default" translatable="true">true</bool>
<bool name="biometric_unlock_enable_default" translatable="true">true</bool>
</resources>

View File

@@ -91,9 +91,9 @@
<string name="maskpass_title">隐藏密码</string>
<string name="maskpass_summary">默认使用星号 (***) 隐藏密码</string>
<string name="menu_about">关于</string>
<string name="menu_change_key">更改主密钥</string>
<string name="menu_change_key_settings">更改主密钥</string>
<string name="settings">设置</string>
<string name="menu_db_settings">数据库设置</string>
<string name="menu_database_settings">数据库设置</string>
<string name="menu_delete">删除</string>
<string name="menu_donate">捐赠</string>
<string name="menu_edit">编辑</string>
@@ -181,7 +181,7 @@
<string name="menu_paste">粘贴</string>
<string name="menu_cancel">取消</string>
<string name="menu_showpass">显示密码</string>
<string name="menu_fingerprint_remove_key">删除保存的指纹</string>
<string name="menu_biometric_remove_key">删除保存的指纹</string>
<string name="menu_file_selection_read_only">只读</string>
<string name="menu_open_file_read_and_write">可修改</string>
<string name="omitbackup_title">搜索时忽略备份条目</string>
@@ -207,9 +207,9 @@
<string name="search_results">搜索结果</string>
<string name="warning">警告</string>
<string name="version_label">版本 %1$s</string>
<string name="store_with_fingerprint">使用指纹保存此密码</string>
<string name="open_biometric_prompt_store_credential">使用指纹保存此密码</string>
<string name="history">历史</string>
<string name="appearance">外观</string>
<string name="menu_appearance_settings">外观</string>
<string name="general">通用</string>
<string name="autofill">自动填充</string>
<string name="autofill_service_name">KeePass DX 表单自动填充</string>
@@ -217,7 +217,7 @@
<string name="clipboard">剪贴板</string>
<string name="clipboard_notifications_title">剪贴板通知</string>
<string name="lock">锁定</string>
<string name="fingerprint">指纹</string>
<string name="advanced_unlock">指纹</string>
<string name="file_name">文件名</string>
<string name="path">路径</string>
<string name="create_keepass_file">创建新数据库</string>
@@ -249,13 +249,13 @@
<string name="warning_empty_password">你真的不需要密码解锁的保护吗?</string>
<string name="warning_no_encryption_key">你确认不使用任何的密钥吗?</string>
<string name="build_label">版本 %1$s</string>
<string name="configure_fingerprint">指纹解锁功能支持,但没有配置使用。</string>
<string name="scanning_fingerprint">指纹扫描</string>
<string name="configure_biometric">指纹解锁功能支持,但没有配置使用。</string>
<string name="open_biometric_prompt_unlock_database">指纹扫描</string>
<string name="encrypted_value_stored">加密密码存储</string>
<string name="fingerprint_invalid_key">不能读取指纹密钥,请重置你的密码。</string>
<string name="biometric_invalid_key">不能读取指纹密钥,请重置你的密码。</string>
<string name="fingerprint_not_recognized">未能识别的指纹</string>
<string name="fingerprint_error">指纹识别问题:%1$s</string>
<string name="no_password_stored">当前数据库没有任何密码。</string>
<string name="biometric_scanning_error">指纹识别问题:%1$s</string>
<string name="no_credentials_stored">当前数据库没有任何密码。</string>
<string name="set_autofill_service_title">配置自动填充服务</string>
<string name="set_autofill_service_summary">打开自动填充功能,以便快速的在其他应用中填写信息</string>
<string name="password_size_title">密码生成长度</string>
@@ -266,18 +266,18 @@
<string name="clipboard_warning">如果剪切板自动删除记录失败,则手动删除历史记录。</string>
<string name="lock_database_screen_off_title">屏幕锁定</string>
<string name="lock_database_screen_off_summary">当屏幕熄灭时锁定数据库</string>
<string name="fingerprint_quick_unlock_title">如何设置指纹扫描以快速解锁?</string>
<string name="fingerprint_advanced_unlock_title">如何设置指纹扫描以快速解锁?</string>
<string name="fingerprint_setting_text">通过您设备的安全设置保存您的指纹:</string>
<string name="fingerprint_setting_way_text">\"设置\" → \"安全\" → \"指纹\"</string>
<string name="fingerprint_type_password_text">输入数据库密码</string>
<string name="fingerprint_setting_link_text">\"设置\" → \"安全\" → \"指纹\"</string>
<string name="fingerprint_type_credentials_text">输入数据库密码</string>
<string name="fingerprint_scan_to_store">扫描你的指纹,以便安全的存储数据库密码。</string>
<string name="fingerprint_scan_to_open">当数据库密码功能关闭的时候,使用指纹扫描解锁数据库。</string>
<string name="usage">使用指纹解锁</string>
<string name="fingerprint_enable_title">指纹扫描</string>
<string name="fingerprint_enable_summary">通过指纹扫描解锁数据库</string>
<string name="fingerprint_delete_all_title">删除加密密钥</string>
<string name="fingerprint_delete_all_summary">删除所有与指纹解锁相关的加密密钥</string>
<string name="fingerprint_delete_all_warning">确认要删除所有与指纹识别相关的密钥吗?</string>
<string name="biometric_unlock_enable_title">指纹扫描</string>
<string name="biometric_unlock_enable_summary">通过指纹扫描解锁数据库</string>
<string name="biometric_delete_all_key_title">删除加密密钥</string>
<string name="biometric_delete_all_key_summary">删除所有与指纹解锁相关的加密密钥</string>
<string name="biometric_delete_all_key_warning">确认要删除所有与指纹识别相关的密钥吗?</string>
<string name="unavailable_feature_text">无法启动此功能。</string>
<string name="unavailable_feature_version">你的安卓版本 %1$s 不能满足软件对最低系统版本 %2$s 的要求。</string>
<string name="unavailable_feature_hardware">找不到所需的硬件。</string>
@@ -294,8 +294,7 @@
<string name="magic_keyboard_summary">激活自定义键盘,填充密码和所有标识字段</string>
<string name="magic_keyboard_configure_title">选择“Magikeyboard键盘”以安全地自动填充表单。</string>
<string name="magic_keyboard_activate_setting_text">在设备设置中激活“Magikeyboard键盘”。</string>
<string name="magic_keyboard_activate_setting_path_1_text">“设置”→“语言和输入”→“当前键盘”,并选择所需要用于输入的键盘。</string>
<string name="magic_keyboard_activate_setting_path_2_text">或(“设置”→“语言和输入”→“虚拟键盘”,并选择所需要用于输入的键盘)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">“设置”→“语言和输入”→“当前键盘”,并选择所需要用于输入的键盘。</string>
<string name="keyboards_choose_magikeyboard_text">当填写表单时请选择“Magikeyboard”键盘。</string>
<string name="allow_copy_password_title">剪切板权限</string>
<string name="keyboards_swicth_magikeyboard_text">通过长时间按住“空格键”以切换键盘,如果“空格键”不可用,则:</string>

View File

@@ -91,9 +91,9 @@
<string name="maskpass_title">密碼遮罩</string>
<string name="maskpass_summary">預設隱藏密碼</string>
<string name="menu_about">關於</string>
<string name="menu_change_key">變更主密鑰</string>
<string name="menu_change_key_settings">變更主密鑰</string>
<string name="settings">設定</string>
<string name="menu_db_settings">資料庫設定</string>
<string name="menu_database_settings">資料庫設定</string>
<string name="menu_delete">刪除</string>
<string name="menu_donate">贊助</string>
<string name="menu_edit">編輯</string>
@@ -163,7 +163,7 @@
<string name="menu_paste">貼上</string>
<string name="menu_cancel">取消</string>
<string name="menu_showpass">顯示密碼</string>
<string name="menu_fingerprint_remove_key">移除指紋密鑰</string>
<string name="menu_biometric_remove_key">移除指紋密鑰</string>
<string name="menu_file_selection_read_only">唯讀</string>
<string name="menu_open_file_read_and_write">讀寫</string>
<string name="omitbackup_title">不要搜尋備份的項目</string>

View File

@@ -65,7 +65,7 @@
-->
<!-- App Settings -->
<string name="app_key" translatable="false">app</string>
<string name="settings_app_key" translatable="false">settings_app_key</string>
<string name="allow_no_password_key" translatable="false">allow_no_password_key</string>
<bool name="allow_no_password_default" translatable="false">false</bool>
@@ -92,9 +92,11 @@
<bool name="keyfile_default" translatable="false">true</bool>
<string name="auto_open_file_uri_key" translatable="false">auto_open_file_uri_key</string>
<bool name="auto_open_file_uri_default" translatable="false">true</bool>
<string name="fingerprint_enable_key" translatable="false">fingerprint_enable_key</string>
<bool name="fingerprint_enable_default" translatable="false">false</bool>
<string name="fingerprint_delete_all_key" translatable="false">fingerprint_delete_all_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>
<string name="biometric_auto_open_prompt_key" translatable="false">biometric_auto_open_prompt_key</string>
<bool name="biometric_auto_open_prompt_default" translatable="false">false</bool>
<string name="biometric_delete_all_key_key" translatable="false">biometric_delete_all_key_key</string>
<!-- Form Filling Settings -->
<string name="settings_form_filling_key" translatable="false">settings_form_filling_key</string>
@@ -123,6 +125,9 @@
<string name="keyboard_key_sound_key" translatable="false">keyboard_key_sound_key</string>
<bool name="keyboard_key_sound_default" translatable="false">false</bool>
<!-- Advanced Unlock Settings -->
<string name="settings_advanced_unlock_key" translatable="false">settings_advanced_unlock_key</string>
<!-- Appearance Settings -->
<string name="settings_appearance_key" translatable="false">settings_appearance_key</string>
@@ -142,8 +147,8 @@
<string name="reset_education_screens_key" translatable="false">relaunch_education_screens_key</string>
<!-- Database Settings -->
<string name="database_main_menu_key" translatable="false">database_main_menu_key</string>
<string name="database_change_master_key_key" translatable="false">database_change_master_key_key</string>
<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_name_key" translatable="false">database_name_key</string>

View File

@@ -144,12 +144,13 @@
<string name="maskpass_title">Hide passwords</string>
<string name="maskpass_summary">Mask passwords (***) by default</string>
<string name="menu_about">About</string>
<string name="menu_change_key">Change master key</string>
<string name="menu_change_key_settings">Change master key</string>
<string name="copy_field">Copy of %1$s</string>
<string name="settings">Settings</string>
<string name="menu_app_settings">App settings</string>
<string name="menu_form_filling_settings">Form filling</string>
<string name="menu_db_settings">Database settings</string>
<string name="menu_advanced_unlock_settings">Advanced unlock</string>
<string name="menu_database_settings">Database settings</string>
<string name="menu_donate">Donate</string>
<string name="menu_edit">Edit</string>
<string name="menu_copy">Copy</string>
@@ -162,7 +163,7 @@
<string name="menu_open">Open</string>
<string name="menu_search">Search</string>
<string name="menu_showpass">Show password</string>
<string name="menu_fingerprint_remove_key">Delete saved fingerprint</string>
<string name="menu_biometric_remove_key">Delete saved biometric key</string>
<string name="menu_url">Go to URL</string>
<string name="menu_file_selection_read_only">Write-protected</string>
<string name="menu_open_file_read_and_write">Modifiable</string>
@@ -225,17 +226,22 @@
<string name="warning_no_encryption_key">Are you sure you do not want to use any encryption key?</string>
<string name="version_label">Version %1$s</string>
<string name="build_label">Build %1$s</string>
<string name="configure_fingerprint">Fingerprint scanning is supported but not set up.</string>
<string name="scanning_fingerprint">Fingerprint Scanning</string>
<string name="configure_biometric">Biometric prompt is supported but not set up.</string>
<string name="open_biometric_prompt_unlock_database">Open the biometric prompt to unlock the database</string>
<string name="open_biometric_prompt_store_credential">Open the biometric prompt to store credentials</string>
<string name="biometric_prompt_store_credential_title">Save biometric recognition</string>
<string name="biometric_prompt_store_credential_message">Store database credentials with biometric data</string>
<string name="biometric_prompt_extract_credential_title">Open database with biometric recognition</string>
<string name="biometric_prompt_extract_credential_message">Extract database credential with biometric data</string>
<string name="encrypted_value_stored">Encrypted password stored</string>
<string name="fingerprint_invalid_key">Could not read fingerprint key. Restore your password.</string>
<string name="biometric_invalid_key">Could not read biometric key. Restore your credential.</string>
<string name="fingerprint_not_recognized">Could not recognize fingerprint</string>
<!--This problem could be with scanning, or something else.-->
<string name="fingerprint_error">Fingerprinting problem: %1$s</string>
<string name="store_with_fingerprint">Use fingerprint to store this password</string>
<string name="no_password_stored">This database does not have a password yet.</string>
<string name="biometric_scanning_error">Biometric error: %1$s</string>
<string name="no_credentials_stored">This database does not have stored credential yet.</string>
<string name="history">History</string>
<string name="appearance">Appearance</string>
<string name="menu_appearance_settings">Appearance</string>
<string name="biometric">Biometric</string>
<string name="general">General</string>
<string name="autofill">Autofill</string>
<string name="autofill_service_name">KeePass DX form autofilling</string>
@@ -255,20 +261,23 @@
<string name="lock_database_screen_off_summary">Lock the database when the screen is off</string>
<string name="lock_database_back_root_title">Press Back on root to lock</string>
<string name="lock_database_back_root_summary">Lock the database when the user clicks the back button on the root screen</string>
<string name="fingerprint_quick_unlock_title">How to set up fingerprint scanning for quick unlocking?</string>
<string name="fingerprint_setting_text">Save your scanned fingerprint for your device in </string>
<!-- Use ← for LTR languages -->
<string name="fingerprint_setting_way_text">\"Settings\" → \"Security\" → \"Fingerprint\"</string>
<string name="fingerprint_type_password_text">Enter database lock password</string>
<string name="fingerprint_advanced_unlock_title">How to set up fingerprint scanning for advanced unlocking?</string>
<string name="fingerprint_setting_text">Save your scanned fingerprint for your device in device settings.</string>
<string name="fingerprint_setting_link_text">Device Fingerprint Settings</string>
<string name="fingerprint_type_credentials_text">Enter database lock credentials</string>
<string name="fingerprint_open_biometric_prompt">Open the biometric prompt by clicking on biometric button.</string>
<string name="fingerprint_scan_to_store">Scan your fingerprint to store your database lock password securely.</string>
<string name="fingerprint_scan_to_open">Scan your fingerprint to open the database when password is turned off.</string>
<string name="fingerprint_auto_open_biometric_prompt">You can change the preference to quickly open the biometric prompt to not repeat step 1.</string>
<string name="usage">Usage</string>
<string name="fingerprint">Fingerprint</string>
<string name="fingerprint_enable_title">Fingerprint scanning</string>
<string name="fingerprint_enable_summary">Lets you scan your fingerprint to open the database</string>
<string name="fingerprint_delete_all_title">Delete encryption keys</string>
<string name="fingerprint_delete_all_summary">Delete all encryption keys related to fingerprint recognition</string>
<string name="fingerprint_delete_all_warning">Are you sure you want to delete all keys related to fingerprint recognition?</string>
<string name="advanced_unlock">Advanced unlock</string>
<string name="biometric_unlock_enable_title">Biometric unlocking</string>
<string name="biometric_unlock_enable_summary">Lets you scan your fingerprint or other biometric to open the database</string>
<string name="biometric_auto_open_prompt_title">Auto open biometric prompt</string>
<string name="biometric_auto_open_prompt_summary">Automatically open biometric prompt when a biometric key is defined for a database</string>
<string name="biometric_delete_all_key_title">Delete encryption keys</string>
<string name="biometric_delete_all_key_summary">Delete all encryption keys related to biometric recognition</string>
<string name="biometric_delete_all_key_warning">Are you sure you want to delete all keys related to biometric recognition?</string>
<string name="unavailable_feature_text">Could not start this feature.</string>
<string name="unavailable_feature_version">Your Android version %1$s does not meet the minimum version %2$s required.</string>
<string name="unavailable_feature_hardware">Could not find the corresponding hardware.</string>
@@ -305,10 +314,7 @@
<string name="magic_keyboard_preference_title">Magikeyboard settings</string>
<string name="magic_keyboard_configure_title">Set up the keyboard to autofill forms securely.</string>
<string name="magic_keyboard_activate_setting_text">Activate \"Magikeyboard\" in the device settings.</string>
<!--Use ← for LTR languages-->
<string name="magic_keyboard_activate_setting_path_1_text">\"Settings\" → \"Language &amp; input\" → \"Current Keyboard\" and pick one.</string>
<!--Use ← for LTR languages-->
<string name="magic_keyboard_activate_setting_path_2_text">or (\"Settings\" → \"Language &amp; input\" → \"Virtual keyboard\" and pick one.)</string>
<string name="magic_keyboard_activate_device_keyboard_setting">Device Keyboard Settings</string>
<string name="keyboards_choose_magikeyboard_text">Choose the Magikeyboard when you need to fill a form.</string>
<string name="keyboards_swicth_magikeyboard_text">Switch keybaords by long pressing the spacebar of your keyboard, or, if it is not available, with: </string>
<string name="keyboard_select_entry_text">Select your entry with the key.</string>

View File

@@ -226,6 +226,7 @@
<item name="android:textColor">?attr/textColorInverse</item>
</style>
<style name="KeepassDXStyle.TextAppearance.Secondary.TextOnPrimary" parent="KeepassDXStyle.TextAppearance.Default.TextOnPrimary">
<item name="android:textColor">?android:attr/textColorHintInverse</item>
<item name="android:textSize">14sp</item>
<item name="android:textStyle">italic</item>
</style>

View File

@@ -22,7 +22,7 @@
<PreferenceCategory
android:title="@string/application">
<Preference
android:key="@string/app_key"
android:key="@string/settings_app_key"
android:title="@string/menu_app_settings"
android:icon="@drawable/prefs_phone_android_24dp"
android:persistent="false" />
@@ -31,9 +31,14 @@
android:title="@string/menu_form_filling_settings"
android:icon="@drawable/prefs_content_paste_24dp"
android:persistent="false" />
<Preference
android:key="@string/settings_advanced_unlock_key"
android:title="@string/menu_advanced_unlock_settings"
android:icon="@drawable/prefs_fingerprint_24dp"
android:persistent="false" />
<Preference
android:key="@string/settings_appearance_key"
android:title="@string/appearance"
android:title="@string/menu_appearance_settings"
android:icon="@drawable/prefs_color_lens_24dp"
android:persistent="false" />
</PreferenceCategory>
@@ -41,15 +46,15 @@
<PreferenceCategory
android:title="@string/database">
<Preference
android:key="@string/database_main_menu_key"
android:title="@string/menu_db_settings"
android:key="@string/settings_database_key"
android:title="@string/menu_database_settings"
android:icon="@drawable/prefs_data_usage_24dp"
android:persistent="false" />
<Preference
android:key="@string/database_change_master_key_key"
android:title="@string/menu_change_key"
android:key="@string/settings_database_change_credentials_key"
android:title="@string/menu_change_key_settings"
android:icon="@drawable/prefs_key_white_24dp"
android:dependency="@string/database_main_menu_key"
android:dependency="@string/settings_database_key"
android:persistent="false" />
</PreferenceCategory>

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 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/>.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/biometric">
<SwitchPreference
android:key="@string/biometric_unlock_enable_key"
android:title="@string/biometric_unlock_enable_title"
android:summary="@string/biometric_unlock_enable_summary"
android:defaultValue="@bool/biometric_unlock_enable_default"/>
<SwitchPreference
android:key="@string/biometric_auto_open_prompt_key"
android:title="@string/biometric_auto_open_prompt_title"
android:summary="@string/biometric_auto_open_prompt_summary"
android:defaultValue="@bool/biometric_auto_open_prompt_default"/>
<Preference
android:key="@string/biometric_delete_all_key_key"
android:title="@string/biometric_delete_all_key_title"
android:summary="@string/biometric_delete_all_key_summary" />
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -134,19 +134,4 @@
</PreferenceCategory>
<PreferenceCategory
android:title="@string/fingerprint">
<SwitchPreference
android:key="@string/fingerprint_enable_key"
android:title="@string/fingerprint_enable_title"
android:summary="@string/fingerprint_enable_summary"
android:defaultValue="@bool/fingerprint_enable_default"/>
<Preference
android:key="@string/fingerprint_delete_all_key"
android:title="@string/fingerprint_delete_all_title"
android:summary="@string/fingerprint_delete_all_summary" />
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
id="svg4830"
version="1.1"
inkscape:version="0.92.1 r15371"
inkscape:export-filename="/home/joker/Project/Scratcheck/TestExport.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:docname="ic_fingerprint_remove.svg">
<defs
id="defs4832" />
<sodipodi:namedview
id="base"
pagecolor="#acacac"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="5.1117679"
inkscape:cy="8.7569429"
inkscape:current-layer="g4770"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1920"
inkscape:window-height="1043"
inkscape:window-x="0"
inkscape:window-y="47"
inkscape:window-maximized="1">
<sodipodi:guide
position="0.99999471,22.999999"
orientation="22,0"
id="guide2987"
inkscape:locked="false" />
<sodipodi:guide
position="0.99999471,0.99999888"
orientation="0,22"
id="guide2989"
inkscape:locked="false" />
<sodipodi:guide
position="22.999995,0.99999888"
orientation="-22,0"
id="guide2991"
inkscape:locked="false" />
<sodipodi:guide
position="22.999995,22.999999"
orientation="0,-22"
id="guide2993"
inkscape:locked="false" />
<inkscape:grid
type="xygrid"
id="grid2989" />
</sodipodi:namedview>
<metadata
id="metadata4835">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-8)">
<g
id="g4770"
transform="matrix(1.7777778,0,0,1.7777778,-205.48441,-31.997877)">
<g
id="Layer_1"
transform="matrix(-0.00397893,0,0,0.00397893,125.58386,23.674135)" />
<path
style="stroke-width:1;fill:#f5f0f0;fill-opacity:1"
d="M 12.099609 2 C 9.9496186 2 7.9107813 2.5192969 6.0507812 3.5292969 C 5.8107813 3.6592969 5.7196538 3.9709375 5.8496094 4.2109375 C 5.9896094 4.4509375 6.2892969 4.5401474 6.5292969 4.4101562 C 8.239288 3.4701563 10.119609 3 12.099609 3 C 13.817565 3 15.298631 3.3380125 16.904297 4.0605469 L 17.658203 3.3066406 C 15.801889 2.4224054 14.062357 2 12.099609 2 z M 20.630859 2.7929688 C 20.353595 2.7923499 20.076963 2.8957023 19.869141 3.1035156 L 3.6054688 19.367188 C 3.1898243 19.782837 3.1898065 20.478878 3.6054688 20.894531 C 4.0211132 21.310172 4.7171681 21.310181 5.1328125 20.894531 L 21.396484 4.6308594 C 21.812129 4.2152078 21.809482 3.5211096 21.394531 3.1054688 C 21.1867 2.8976421 20.908124 2.7935876 20.630859 2.7929688 z M 12.082031 4.4394531 C 10.290782 4.4419476 8.4996875 4.8501572 6.9296875 5.6601562 C 5.4296875 6.4301563 4.1696964 7.5296875 3.1796875 8.9296875 C 3.0196875 9.1596875 3.0707902 9.4708594 3.3007812 9.6308594 C 3.3907901 9.6908772 3.4897549 9.7207031 3.5898438 9.7207031 C 3.7498437 9.7207031 3.9004687 9.6497656 3.9804688 9.5097656 C 4.8804687 8.2497656 6.0208594 7.2507813 7.3808594 6.5507812 C 9.702879 5.3492128 12.551839 5.1405673 15.080078 5.8847656 L 15.886719 5.078125 C 14.672134 4.6548553 13.378189 4.4376481 12.082031 4.4394531 z M 12.050781 6.8203125 C 8.8207726 6.8203125 5.8690714 8.6299217 4.5390625 11.419922 C 4.0890714 12.369922 3.859375 13.460156 3.859375 14.660156 C 3.859375 15.410156 3.9419325 16.143623 4.0917969 16.873047 L 4.9453125 16.019531 C 4.8716574 15.480855 4.8496094 15.017564 4.8496094 14.660156 C 4.8496094 13.620156 5.049462 12.669375 5.4394531 11.859375 C 6.609462 9.409375 9.2107815 7.8300781 12.050781 7.8300781 C 12.394543 7.8300781 12.729451 7.8605876 13.060547 7.9042969 L 13.931641 7.0332031 C 13.326222 6.8985547 12.698935 6.8203125 12.050781 6.8203125 z M 20.158203 7.8769531 L 19.451172 8.5859375 C 19.705703 8.8667188 19.944922 9.1654687 20.169922 9.4804688 C 20.329922 9.7104775 20.639132 9.7596094 20.869141 9.5996094 C 21.099185 9.4396094 21.150234 9.1203906 20.990234 8.9003906 C 20.732029 8.5378633 20.452607 8.1983122 20.158203 7.8769531 z M 11.673828 9.2910156 C 8.7939582 9.4920753 6.5090655 11.751686 6.4375 14.527344 L 7.6914062 13.273438 C 8.128702 12.047606 9.1093977 11.060938 10.378906 10.585938 L 11.673828 9.2910156 z M 18.388672 9.6464844 L 17.675781 10.359375 C 18.68916 11.534094 19.300781 13.029838 19.300781 14.660156 C 19.300781 15.730156 18.370712 16.599609 17.220703 16.599609 C 16.070712 16.599609 15.140625 15.730156 15.140625 14.660156 C 15.140625 14.156975 14.994276 13.690121 14.759766 13.275391 L 14.017578 14.017578 C 14.091568 14.216693 14.140625 14.427975 14.140625 14.650391 C 14.140625 16.270391 15.520703 17.589844 17.220703 17.589844 C 18.920703 17.589844 20.300781 16.270391 20.300781 14.650391 C 20.300781 12.747816 19.580533 11.0042 18.388672 9.6464844 z M 16.607422 11.427734 L 15.894531 12.140625 C 16.429255 12.855101 16.75 13.721687 16.75 14.660156 C 16.75 14.940156 16.97 15.160156 17.25 15.160156 C 17.53 15.160156 17.75 14.940156 17.75 14.660156 C 17.75 13.447471 17.320928 12.329733 16.607422 11.427734 z M 12.609375 15.425781 L 11.791016 16.244141 C 12.154172 17.361118 12.886314 18.356772 13.910156 19.050781 C 14.770156 19.640781 15.819757 19.939453 17.009766 19.939453 C 17.149766 19.939453 17.650712 19.930321 18.220703 19.820312 C 18.500756 19.770313 18.680815 19.510234 18.630859 19.240234 C 18.58085 18.960243 18.320772 18.780087 18.050781 18.830078 C 17.650781 18.900087 17.249766 18.929687 17.009766 18.929688 C 16.009766 18.929688 15.180694 18.700703 14.470703 18.220703 C 13.475364 17.551704 12.819631 16.540198 12.609375 15.425781 z M 10.615234 17.419922 L 9.8652344 18.169922 C 10.203152 18.79111 10.634087 19.368244 11.150391 19.880859 C 12.240382 20.950859 13.279132 21.540469 14.869141 21.980469 C 14.909141 21.990513 14.96 22 15 22 C 15.210009 22 15.420748 21.849141 15.470703 21.619141 C 15.540694 21.359141 15.38915 21.079757 15.119141 21.009766 C 13.709149 20.619766 12.7996 20.100156 11.849609 19.160156 C 11.332157 18.646984 10.922915 18.056717 10.615234 17.419922 z M 8.796875 19.238281 L 8.0703125 19.964844 C 8.484727 20.580638 8.8928845 21.043281 9.4902344 21.640625 C 9.5802255 21.740643 9.7098882 21.789062 9.8398438 21.789062 C 9.9698525 21.789062 10.100893 21.740625 10.210938 21.640625 C 10.400928 21.440625 10.400928 21.129687 10.210938 20.929688 C 9.6271185 20.338294 9.2322832 19.910321 8.796875 19.238281 z "
transform="matrix(0.56249999,0,0,0.56249999,115.58498,22.498806)"
id="path9385" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -1,2 +1,3 @@
* New, more secure database creation workflow
* Add alias for history files (WARNING: history is erased)
* Add alias for history files (WARNING: history is erased)
* New Biometric unlock (Fingerprint with new API)

View File

@@ -1,2 +1,3 @@
* Nouveau workflow de création de base de données plus sécurisé
* Ajout d'un alias pour les fichiers d'historiques (ATTENTION: l'historique est effacé)
* Ajout d'un alias pour les fichiers d'historiques (ATTENTION: l'historique est effacé)
* Nouveau déblocage par biométrique (Empreinte digitale avec nouvelle API)