mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Merge branch 'feature/Biometric' into develop
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) { _, _ -> }
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 ?: ""))
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 |
@@ -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 |
12
app/src/main/res/drawable/background_image.xml
Normal file
12
app/src/main/res/drawable/background_image.xml
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
9
app/src/main/res/drawable/prefs_fingerprint_24dp.xml
Normal file
9
app/src/main/res/drawable/prefs_fingerprint_24dp.xml
Normal 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
55
app/src/main/res/layout-v23/view_advanced_unlock.xml
Normal file
55
app/src/main/res/layout-v23/view_advanced_unlock.xml
Normal 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>
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & input\" → \"Aktuelt tastatur\" og vælg et.</string>
|
||||
<string name="magic_keyboard_activate_setting_path_2_text">eller (\"Indstillinger\" → \"Sprog & input\" → \"Virtuelt tastatur\" og vælg et.)</string>
|
||||
<string name="magic_keyboard_activate_device_keyboard_setting">\"Indstillinger\" → \"Sprog & 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>
|
||||
|
||||
@@ -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 & Eingabe“ → „Aktuelle Tastatur“ und auswählen.</string>
|
||||
<string name="magic_keyboard_activate_setting_path_2_text">oder („Einstellungen“ → „Sprache & Eingabe“ → „Bildschirmtastatur“ und auswählen.)</string>
|
||||
<string name="magic_keyboard_activate_device_keyboard_setting">„Einstellungen“ → „Sprache & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 -> Seguridad -> 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 -> Seguridad -> 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 l’empreinte digitale enregistrée</string>
|
||||
<string name="menu_biometric_remove_key">Supprimer l’empreinte digitale enregistrée</string>
|
||||
<string name="menu_url">Ouvrir l’URL</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 d’empreinte digitale est prise en charge mais pas configurée.</string>
|
||||
<string name="scanning_fingerprint">Reconnaissance d’empreinte digitale</string>
|
||||
<string name="configure_biometric">La reconnaissance d’empreinte digitale est prise en charge mais pas configurée.</string>
|
||||
<string name="open_biometric_prompt_unlock_database">Reconnaissance d’empreinte digitale</string>
|
||||
<string name="encrypted_value_stored">Mot de passe chiffré stocké</string>
|
||||
<string name="fingerprint_invalid_key">Impossible de lire la clé de l’empreinte digitale. Restaurer votre mot de passe.</string>
|
||||
<string name="biometric_invalid_key">Impossible de lire la clé de l’empreinte digitale. Restaurer votre mot de passe.</string>
|
||||
<string name="fingerprint_not_recognized">Impossible de reconnaître l’empreinte digitale</string>
|
||||
<string name="fingerprint_error">Problème d’empreinte digitale : %1$s</string>
|
||||
<string name="store_with_fingerprint">Utiliser l’empreinte digitale pour stocker ce mot de passe</string>
|
||||
<string name="no_password_stored">Cette base de données n’a pas encore de mot de passe.</string>
|
||||
<string name="biometric_scanning_error">Problème d’empreinte digitale : %1$s</string>
|
||||
<string name="open_biometric_prompt_store_credential">Utiliser l’empreinte digitale pour stocker ce mot de passe</string>
|
||||
<string name="no_credentials_stored">Cette base de données n’a 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 l’empreinte digitale pour un déverrouillage rapide \?</string>
|
||||
<string name="fingerprint_advanced_unlock_title">Comment configurer la reconaissance de l’empreinte 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 d’empreinte 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 d’empreinte digitale</string>
|
||||
<string name="fingerprint_delete_all_warning">Êtes-vous sûr de vouloir supprimer toutes les clés liées à la reconnaissance d’empreinte digitale \?</string>
|
||||
<string name="advanced_unlock">Empreinte digitale</string>
|
||||
<string name="biometric_unlock_enable_title">Reconnaissance d’empreinte 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 d’empreinte digitale</string>
|
||||
<string name="biometric_delete_all_key_warning">Êtes-vous sûr de vouloir supprimer toutes les clés liées à la reconnaissance d’empreinte 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 l’appareil.</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 d’espace de votre clavier ou, si ce n’est pas disponible, avec :</string>
|
||||
<string name="keyboard_select_entry_text">Sélectionner votre entrée avec la clé.</string>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">Aç</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 & giriş\" → \"Geçerli Klavye\" ve birini seçin.</string>
|
||||
<string name="magic_keyboard_activate_setting_path_2_text">veya (\"Ayarlar\" → \"Dil & giriş\" → \"Sanal klavye\" ve birini seçin.)</string>
|
||||
<string name="magic_keyboard_activate_device_keyboard_setting">\"Ayarlar\" → \"Dil & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & input\" → \"Current Keyboard\" and pick one.</string>
|
||||
<!--Use ← for LTR languages-->
|
||||
<string name="magic_keyboard_activate_setting_path_2_text">or (\"Settings\" → \"Language & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
40
app/src/main/res/xml/preferences_advanced_unlock.xml
Normal file
40
app/src/main/res/xml/preferences_advanced_unlock.xml
Normal 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>
|
||||
@@ -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>
|
||||
96
art/ic_fingerprint_remove.svg
Normal file
96
art/ic_fingerprint_remove.svg
Normal 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 |
@@ -1,2 +1,3 @@
|
||||
* New, more secure database creation workflow
|
||||
* Add alias for history files (WARNING: history is erased)
|
||||
* New Biometric unlock (Fingerprint with new API)
|
||||
@@ -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é)
|
||||
* Nouveau déblocage par biométrique (Empreinte digitale avec nouvelle API)
|
||||
Reference in New Issue
Block a user