From f4f5e869790065a967f0e93dcb93c3dda536220d Mon Sep 17 00:00:00 2001 From: Clay Perry Date: Tue, 8 Jul 2025 12:52:14 -0400 Subject: [PATCH 01/88] Updated Minimum SDK to 16 --- app/build.gradle | 2 +- crypto/build.gradle | 2 +- database/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3d9c1502c..b288d1c9c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { defaultConfig { applicationId "com.kunzisoft.keepass" - minSdkVersion 15 + minSdkVersion 16 targetSdkVersion 34 versionCode = 134 versionName = "4.1.2" diff --git a/crypto/build.gradle b/crypto/build.gradle index adbe03f94..c29556613 100644 --- a/crypto/build.gradle +++ b/crypto/build.gradle @@ -9,7 +9,7 @@ android { ndkVersion "21.4.7075529" defaultConfig { - minSdkVersion 15 + minSdkVersion 16 targetSdkVersion 34 multiDexEnabled true diff --git a/database/build.gradle b/database/build.gradle index 6e4d46938..2ae6ab36b 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -6,7 +6,7 @@ android { compileSdkVersion 34 defaultConfig { - minSdkVersion 15 + minSdkVersion 16 targetSdk 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 09dc1d6baa4c1bc62f8ac0ae8a430fba708f39ff Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 09:57:23 -0400 Subject: [PATCH 02/88] Removed sdk checks on TextFieldView.kt Removed SDK checks that will always resolve to true now. Since we are updating min sdk to 19, these checks are no longer necessary. --- .../kunzisoft/keepass/view/TextFieldView.kt | 49 ++++++++----------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt index 6077aa7e5..d9fbf49fa 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt @@ -63,13 +63,12 @@ open class TextFieldView @JvmOverloads constructor(context: Context, 4f, resources.displayMetrics ).toInt() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.marginStart = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - 4f, - resources.displayMetrics - ).toInt() - } + it.marginStart = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + 4f, + resources.displayMetrics + ).toInt() + } } protected val valueView = AppCompatTextView(context).apply { @@ -88,13 +87,11 @@ open class TextFieldView @JvmOverloads constructor(context: Context, 8f, resources.displayMetrics ).toInt() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.marginStart = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - 8f, - resources.displayMetrics - ).toInt() - } + it.marginStart = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + 8f, + resources.displayMetrics + ).toInt() } setTextIsSelectable(true) } @@ -128,9 +125,7 @@ open class TextFieldView @JvmOverloads constructor(context: Context, id = copyButtonId layoutParams = (layoutParams as LayoutParams?)?.also { it.addRule(ALIGN_PARENT_RIGHT) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(ALIGN_PARENT_END) - } + it.addRule(ALIGN_PARENT_END) } } showButton.apply { @@ -138,14 +133,14 @@ open class TextFieldView @JvmOverloads constructor(context: Context, layoutParams = (layoutParams as LayoutParams?)?.also { if (copyButton.isVisible) { it.addRule(LEFT_OF, copyButtonId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(START_OF, copyButtonId) - } + + it.addRule(START_OF, copyButtonId) + } else { it.addRule(ALIGN_PARENT_RIGHT) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(ALIGN_PARENT_END) - } + + it.addRule(ALIGN_PARENT_END) + } } } @@ -153,18 +148,14 @@ open class TextFieldView @JvmOverloads constructor(context: Context, id = labelViewId layoutParams = (layoutParams as LayoutParams?)?.also { it.addRule(LEFT_OF, showButtonId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(START_OF, showButtonId) - } + it.addRule(START_OF, showButtonId) } } valueView.apply { id = valueViewId layoutParams = (layoutParams as LayoutParams?)?.also { it.addRule(LEFT_OF, showButtonId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(START_OF, showButtonId) - } + it.addRule(START_OF, showButtonId) it.addRule(BELOW, labelViewId) } } From d88882f439b9eaf36a0d555ba72631584f526791 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:15:36 -0400 Subject: [PATCH 03/88] Removed PRNGFixes App.kt --- app/src/main/java/com/kunzisoft/keepass/app/App.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/app/App.kt b/app/src/main/java/com/kunzisoft/keepass/app/App.kt index b3dcca2f9..0486a9f22 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/App.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/App.kt @@ -28,6 +28,5 @@ class App : MultiDexApplication() { super.onCreate() Stylish.load(this) - PRNGFixes.apply() } } From 26b8a616be377055ec045e14d6120dda16ad51b0 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:19:54 -0400 Subject: [PATCH 04/88] Update AboutActivity.kt Removed old SDK Check --- .../java/com/kunzisoft/keepass/activities/AboutActivity.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt index e86e8f690..105810a1d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt @@ -78,9 +78,8 @@ class AboutActivity : StylishActivity() { movementMethod = LinkMovementMethod.getInstance() text = HtmlCompat.fromHtml(getString(R.string.html_about_licence, DateTime().year), HtmlCompat.FROM_HTML_MODE_LEGACY) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - textDirection = View.TEXT_DIRECTION_ANY_RTL - } + textDirection = View.TEXT_DIRECTION_ANY_RTL + } findViewById(R.id.activity_about_privacy_text).apply { From fd7f0fceb262841e16bc532efd2326a661f0f6c7 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:21:55 -0400 Subject: [PATCH 05/88] Update UriUtil.kt Removed Old SDK Check --- .../java/com/kunzisoft/keepass/utils/UriUtil.kt | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt index 0ddf1e257..db32ab627 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt @@ -167,15 +167,13 @@ object UriUtil { fun Intent.getUri(key: String): Uri? { try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - val clipData = this.clipData - if (clipData != null) { - if (clipData.description.label == key) { - if (clipData.itemCount == 1) { - val clipItem = clipData.getItemAt(0) - if (clipItem != null) { - return clipItem.uri - } + val clipData = this.clipData + if (clipData != null) { + if (clipData.description.label == key) { + if (clipData.itemCount == 1) { + val clipItem = clipData.getItemAt(0) + if (clipItem != null) { + return clipItem.uri } } } From 6c1c401a714caf0c7ff75391d69ac2b14e3d0e1e Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:23:44 -0400 Subject: [PATCH 06/88] Update NodesAdapter.kt Removed old SDK check --- .../main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt index 7c2efbdc6..b58005093 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt @@ -530,9 +530,8 @@ class NodesAdapter ( holder?.otpToken?.apply { text = otpElement?.tokenString setTextSize(mTextSizeUnit, mOtpTokenTextDefaultDimension, mPrefSizeMultiplier) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - textDirection = View.TEXT_DIRECTION_LTR - } + textDirection = View.TEXT_DIRECTION_LTR + } holder?.otpContainer?.setOnClickListener { otpElement?.token?.let { token -> From daeee10de904e5635c60d4ca3d0db9269ed9eac9 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:25:15 -0400 Subject: [PATCH 07/88] Update TemplateEditView.kt Removed old SDK check --- .../com/kunzisoft/keepass/view/TemplateEditView.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt index c6909237c..8963534ba 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt @@ -123,13 +123,11 @@ class TemplateEditView @JvmOverloads constructor(context: Context, setMaxChars(templateAttribute.options.getNumberChars()) setMaxLines(templateAttribute.options.getNumberLines()) setActionClick(templateAttribute, field, this) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - if (field.protectedValue.isProtected) { - textDirection = TEXT_DIRECTION_LTR - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO - } + if (field.protectedValue.isProtected) { + textDirection = TEXT_DIRECTION_LTR + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO } } } From 90c8cb34559559647b0ee9c025fcd76f58cb1d39 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:26:12 -0400 Subject: [PATCH 08/88] Update ViewUtil.kt Removed SDK check --- app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt index 3838cff8d..1ada1c3b9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt @@ -234,11 +234,7 @@ fun View.updateLockPaddingStart() { R.dimen.hidden_lock_button_size } ).let { lockPadding -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - updatePaddingRelative(lockPadding) - } else { - updatePadding(lockPadding) - } + updatePaddingRelative(lockPadding) } } From daae535fa18e1882b7e6ec2d50bf8c170f5c7f53 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:28:27 -0400 Subject: [PATCH 09/88] Update TemplateView.kt Removed old SDK checks --- .../main/java/com/kunzisoft/keepass/view/TemplateView.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt index d14cc137d..92e4b0140 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt @@ -63,9 +63,7 @@ class TemplateView @JvmOverloads constructor(context: Context, // Here the value is often empty if (field.protectedValue.isProtected) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - textDirection = TEXT_DIRECTION_LTR - } + textDirection = TEXT_DIRECTION_LTR if (mFirstTimeAskAllowCopyProtectedFields) { setCopyButtonState(TextFieldView.ButtonState.DEACTIVATE) setCopyButtonClickListener { _, _ -> @@ -179,9 +177,7 @@ class TemplateView @JvmOverloads constructor(context: Context, otpElement.type.name, ProtectedString(false, otpElement.token))) } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - textDirection = TEXT_DIRECTION_LTR - } + textDirection = TEXT_DIRECTION_LTR mLastOtpTokenView = this mOtpRunnable = Runnable { if (otpElement.shouldRefreshToken()) { From 05fc6f87ec77c6f4d5b1d2a3880a5cea3312bd98 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:39:34 -0400 Subject: [PATCH 10/88] Update build.gradle changed minsdk to 19 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b288d1c9c..5263418d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { defaultConfig { applicationId "com.kunzisoft.keepass" - minSdkVersion 16 + minSdkVersion 19 targetSdkVersion 34 versionCode = 134 versionName = "4.1.2" From 43f7e0854831b04476be9da6db1d7e8548d6c296 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:40:13 -0400 Subject: [PATCH 11/88] Update build.gradle changed minsdk to 19 --- crypto/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/build.gradle b/crypto/build.gradle index c29556613..265a6bb8a 100644 --- a/crypto/build.gradle +++ b/crypto/build.gradle @@ -9,7 +9,7 @@ android { ndkVersion "21.4.7075529" defaultConfig { - minSdkVersion 16 + minSdkVersion 19 targetSdkVersion 34 multiDexEnabled true From b5dc8d9adf47f09aeb8e1520a4be4d55eae7585e Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:40:38 -0400 Subject: [PATCH 12/88] Update build.gradle changed minsdk to 19 --- database/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/build.gradle b/database/build.gradle index 2ae6ab36b..f0d7adb9b 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -6,7 +6,7 @@ android { compileSdkVersion 34 defaultConfig { - minSdkVersion 16 + minSdkVersion 19 targetSdk 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 1f4e59cbdc751e51d4851c742d672a7a0ffda1e2 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:44:21 -0400 Subject: [PATCH 13/88] Update fragment_set_otp.xml Removed sdk target checks for jelly_bean --- app/src/main/res/layout/fragment_set_otp.xml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/layout/fragment_set_otp.xml b/app/src/main/res/layout/fragment_set_otp.xml index 14da1e1b0..872073917 100644 --- a/app/src/main/res/layout/fragment_set_otp.xml +++ b/app/src/main/res/layout/fragment_set_otp.xml @@ -122,8 +122,7 @@ android:inputType="textPassword" android:importantForAccessibility="no" android:importantForAutofill="no" - android:hint="@string/otp_secret" - tools:targetApi="jelly_bean" /> + android:hint="@string/otp_secret" /> @@ -178,8 +177,7 @@ tools:text="30" android:maxLength="3" android:digits="0123456789" - android:imeOptions="actionNext" - tools:targetApi="jelly_bean" /> + android:imeOptions="actionNext" /> + android:imeOptions="actionNext" /> + android:imeOptions="actionNext" /> @@ -237,4 +233,4 @@ - \ No newline at end of file + From 1fc4f150bfb45a3729534c56c6c6981aa751d25e Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 10:45:16 -0400 Subject: [PATCH 14/88] Update item_breadcrumb.xml Removed jelly_bean target check --- app/src/main/res/layout/item_breadcrumb.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/layout/item_breadcrumb.xml b/app/src/main/res/layout/item_breadcrumb.xml index 3fd284c8e..9ca31eeea 100644 --- a/app/src/main/res/layout/item_breadcrumb.xml +++ b/app/src/main/res/layout/item_breadcrumb.xml @@ -65,7 +65,6 @@ android:layout_height="wrap_content" android:src="@drawable/ic_arrow_right_white_24dp" app:tint="?attr/colorOnSurface" - android:importantForAccessibility="no" - tools:targetApi="jelly_bean" /> + android:importantForAccessibility="no" /> From a88f6b968a2a23b098b9de97bc27ac36b1b53d68 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:04:12 -0400 Subject: [PATCH 15/88] Update UriUtil.kt Removed KitKat sdk check --- .../com/kunzisoft/keepass/utils/UriUtil.kt | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt index db32ab627..61af75836 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt @@ -67,55 +67,53 @@ object UriUtil { readOnly: Boolean) { try { // try to persist read and write permissions - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - contentResolver?.apply { - var readPermissionAllowed = false - var writePermissionAllowed = false - // Check current permissions allowed - persistedUriPermissions.find { uriPermission -> - uriPermission.uri == uri - }?.let { uriPermission -> - Log.d(TAG, "Check URI permission : $uriPermission") - if (uriPermission.isReadPermission) { - readPermissionAllowed = true - } - if (uriPermission.isWritePermission) { - writePermissionAllowed = true - } + contentResolver?.apply { + var readPermissionAllowed = false + var writePermissionAllowed = false + // Check current permissions allowed + persistedUriPermissions.find { uriPermission -> + uriPermission.uri == uri + }?.let { uriPermission -> + Log.d(TAG, "Check URI permission : $uriPermission") + if (uriPermission.isReadPermission) { + readPermissionAllowed = true } - - // Release permission - if (release) { - if (writePermissionAllowed) { - Log.d(TAG, "Release write permission : $uri") - val removeFlags: Int = Intent.FLAG_GRANT_WRITE_URI_PERMISSION - releasePersistableUriPermission(uri, removeFlags) - } - if (readPermissionAllowed) { - Log.d(TAG, "Release read permission $uri") - val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION - releasePersistableUriPermission(uri, takeFlags) - } + if (uriPermission.isWritePermission) { + writePermissionAllowed = true } + } - // Take missing permission - if (!readPermissionAllowed) { - Log.d(TAG, "Take read permission $uri") + // Release permission + if (release) { + if (writePermissionAllowed) { + Log.d(TAG, "Release write permission : $uri") + val removeFlags: Int = Intent.FLAG_GRANT_WRITE_URI_PERMISSION + releasePersistableUriPermission(uri, removeFlags) + } + if (readPermissionAllowed) { + Log.d(TAG, "Release read permission $uri") val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION - takePersistableUriPermission(uri, takeFlags) + releasePersistableUriPermission(uri, takeFlags) } - if (readOnly) { - if (writePermissionAllowed) { - Log.d(TAG, "Release write permission $uri") - val removeFlags: Int = Intent.FLAG_GRANT_WRITE_URI_PERMISSION - releasePersistableUriPermission(uri, removeFlags) - } - } else { - if (!writePermissionAllowed) { - Log.d(TAG, "Take write permission $uri") - val takeFlags: Int = Intent.FLAG_GRANT_WRITE_URI_PERMISSION - takePersistableUriPermission(uri, takeFlags) - } + } + + // Take missing permission + if (!readPermissionAllowed) { + Log.d(TAG, "Take read permission $uri") + val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION + takePersistableUriPermission(uri, takeFlags) + } + if (readOnly) { + if (writePermissionAllowed) { + Log.d(TAG, "Release write permission $uri") + val removeFlags: Int = Intent.FLAG_GRANT_WRITE_URI_PERMISSION + releasePersistableUriPermission(uri, removeFlags) + } + } else { + if (!writePermissionAllowed) { + Log.d(TAG, "Take write permission $uri") + val takeFlags: Int = Intent.FLAG_GRANT_WRITE_URI_PERMISSION + takePersistableUriPermission(uri, takeFlags) } } } From 3b054504a1beb8dab46ea646f838318d9252ec1d Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:05:01 -0400 Subject: [PATCH 16/88] Update UriUtil.kt removed another kitkat check --- .../com/kunzisoft/keepass/utils/UriUtil.kt | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt index 61af75836..c53a29e7d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt @@ -138,27 +138,25 @@ object UriUtil { } fun Context.releaseAllUnnecessaryPermissionUris() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - applicationContext?.let { appContext -> - val fileDatabaseHistoryAction = FileDatabaseHistoryAction.getInstance(appContext) - fileDatabaseHistoryAction.getDatabaseFileList { databaseFileList -> - val listToNotRemove = mutableListOf() - databaseFileList.forEach { - it.databaseUri?.let { databaseUri -> - listToNotRemove.add(databaseUri) - } - it.keyFileUri?.let { keyFileUri -> - listToNotRemove.add(keyFileUri) - } + applicationContext?.let { appContext -> + val fileDatabaseHistoryAction = FileDatabaseHistoryAction.getInstance(appContext) + fileDatabaseHistoryAction.getDatabaseFileList { databaseFileList -> + val listToNotRemove = mutableListOf() + databaseFileList.forEach { + it.databaseUri?.let { databaseUri -> + listToNotRemove.add(databaseUri) } - // Remove URI permission for not database files - val resolver = appContext.contentResolver - resolver.persistedUriPermissions.forEach { uriPermission -> - val uri = uriPermission.uri - if (!listToNotRemove.contains(uri)) - resolver.releaseUriPermission(uri) + it.keyFileUri?.let { keyFileUri -> + listToNotRemove.add(keyFileUri) } } + // Remove URI permission for not database files + val resolver = appContext.contentResolver + resolver.persistedUriPermissions.forEach { uriPermission -> + val uri = uriPermission.uri + if (!listToNotRemove.contains(uri)) + resolver.releaseUriPermission(uri) + } } } } From 87be2f4b9e988cf58d6c8e456bed1d9a0cf4b75f Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:09:44 -0400 Subject: [PATCH 17/88] Update UriHelper.kt removed PackageManager.allowCreateDocumentByStorageAccessFramework() it will always eval to true with sdk update --- .../com/kunzisoft/keepass/utils/UriHelper.kt | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/UriHelper.kt b/database/src/main/java/com/kunzisoft/keepass/utils/UriHelper.kt index 11e9389bb..28868038f 100644 --- a/database/src/main/java/com/kunzisoft/keepass/utils/UriHelper.kt +++ b/database/src/main/java/com/kunzisoft/keepass/utils/UriHelper.kt @@ -148,23 +148,6 @@ fun PackageManager.getPackageInfoCompat(packageName: String, flags: Int = 0): Pa @Suppress("DEPRECATION") getPackageInfo(packageName, flags) } -@SuppressLint("InlinedApi") -fun PackageManager.allowCreateDocumentByStorageAccessFramework(): Boolean { - return when { - // To check if a custom file manager can manage the ACTION_CREATE_DOCUMENT - // queries filter is in Manifest - Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT -> { - queryIntentActivitiesCompat( - Intent(Intent.ACTION_CREATE_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "application/octet-stream" - }, PackageManager.MATCH_DEFAULT_ONLY - ).isNotEmpty() - } - else -> true - } -} - @SuppressLint("QueryPermissionsNeeded") private fun PackageManager.queryIntentActivitiesCompat(intent: Intent, flags: Int): List { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { From 6eae0f02d374e85c7fdbdfade72b2131560a04c2 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:11:53 -0400 Subject: [PATCH 18/88] Update FileDatabaseSelectActivity.kt removed PackageManager.allowCreateDocumentByStorageAccessFramework() --- .../keepass/activities/FileDatabaseSelectActivity.kt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt index cfafd0853..7e752e4f7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -70,7 +70,6 @@ import com.kunzisoft.keepass.utils.MagikeyboardUtil import com.kunzisoft.keepass.utils.MenuUtil import com.kunzisoft.keepass.utils.UriUtil.isContributingUser import com.kunzisoft.keepass.utils.UriUtil.openUrl -import com.kunzisoft.keepass.utils.allowCreateDocumentByStorageAccessFramework import com.kunzisoft.keepass.utils.getParcelableCompat import com.kunzisoft.keepass.view.asError import com.kunzisoft.keepass.view.showActionErrorIfNeeded @@ -329,13 +328,7 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(), // Show open and create button or special mode when (mSpecialMode) { SpecialMode.DEFAULT -> { - if (packageManager.allowCreateDocumentByStorageAccessFramework()) { - // There is an activity which can handle this intent. - createDatabaseButtonView?.visibility = View.VISIBLE - } else{ - // No Activity found that can handle this intent. - createDatabaseButtonView?.visibility = View.GONE - } + createDatabaseButtonView?.visibility = View.VISIBLE } else -> { // Disable create button if in selection mode or request for autofill From 3035f9b6860ade559601dea6800f249658995448 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:14:18 -0400 Subject: [PATCH 19/88] Update TimeoutHelper.kt Removed old SDK check --- .../keepass/timeout/TimeoutHelper.kt | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt b/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt index 2042e315a..a32081606 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt @@ -65,27 +65,19 @@ object TimeoutHelper { (context.applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> val triggerTime = System.currentTimeMillis() + timeout Log.d(TAG, "TimeoutHelper start") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S - && !alarmManager.canScheduleExactAlarms()) { - alarmManager.set( - AlarmManager.RTC, - triggerTime, - getLockPendingIntent(context) - ) - } else { - alarmManager.setExact( - AlarmManager.RTC, - triggerTime, - getLockPendingIntent(context) - ) - } - } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + && !alarmManager.canScheduleExactAlarms()) { alarmManager.set( AlarmManager.RTC, triggerTime, getLockPendingIntent(context) ) + } else { + alarmManager.setExact( + AlarmManager.RTC, + triggerTime, + getLockPendingIntent(context) + ) } } } From 600d548fcefc09d371010adf66b93f7dbd9efc6a Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:15:46 -0400 Subject: [PATCH 20/88] Update BroadcastAction.kt removed old SDK check --- .../keepass/utils/BroadcastAction.kt | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt index 8d42310fa..b7f4d6c50 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt @@ -76,27 +76,19 @@ class LockReceiver(private var lockAction: () -> Unit) : BroadcastReceiver() { // Launch the effective action after a small time val first: Long = System.currentTimeMillis() + context.getString(R.string.timeout_screen_off).toLong() (context.getSystemService(ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S - && !alarmManager.canScheduleExactAlarms()) { - alarmManager.set( - AlarmManager.RTC_WAKEUP, - first, - lockPendingIntent - ) - } else { - alarmManager.setExact( - AlarmManager.RTC_WAKEUP, - first, - lockPendingIntent - ) - } - } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + && !alarmManager.canScheduleExactAlarms()) { alarmManager.set( AlarmManager.RTC_WAKEUP, first, lockPendingIntent ) + } else { + alarmManager.setExact( + AlarmManager.RTC_WAKEUP, + first, + lockPendingIntent + ) } } } else { From 082c839639a39ee45c49d94e4614a5dc7e09fc97 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:18:59 -0400 Subject: [PATCH 21/88] Update EntryEditActivity.kt removed old sdk checks --- .../com/kunzisoft/keepass/activities/EntryEditActivity.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt index ce9a54fd0..49f6544c6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -604,16 +604,12 @@ class EntryEditActivity : DatabaseLockActivity(), isVisible = isEnabled } menu?.findItem(R.id.menu_add_attachment)?.apply { - // Attachment not compatible below KitKat isEnabled = !mIsTemplate - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT isVisible = isEnabled } menu?.findItem(R.id.menu_add_otp)?.apply { - // OTP not compatible below KitKat isEnabled = mAllowOTP && !mIsTemplate - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT isVisible = isEnabled } return super.onPrepareOptionsMenu(menu) From 1f678fc975cfa101702792e97dc76c5dd7a0d5f0 Mon Sep 17 00:00:00 2001 From: Dev-ClayP Date: Wed, 9 Jul 2025 11:24:30 -0400 Subject: [PATCH 22/88] Update Loupe.kt removed old sdk checks --- .../main/java/com/igreenwood/loupe/Loupe.kt | 276 ++++++------------ 1 file changed, 89 insertions(+), 187 deletions(-) diff --git a/app/src/main/java/com/igreenwood/loupe/Loupe.kt b/app/src/main/java/com/igreenwood/loupe/Loupe.kt index a6f36bb45..de9f45242 100644 --- a/app/src/main/java/com/igreenwood/loupe/Loupe.kt +++ b/app/src/main/java/com/igreenwood/loupe/Loupe.kt @@ -358,78 +358,41 @@ class Loupe(imageView: ImageView, container: ViewGroup) : View.OnTouchListener, val imageView = imageViewRef.get() ?: return isViewTranslateAnimationRunning = true - - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - imageView.run { - val translationY = if (velY > 0) { - originalViewBounds.top + height - top - } else { - originalViewBounds.top - height - top - } - animate() - .setDuration(dismissAnimationDuration) - .setInterpolator(dismissAnimationInterpolator) - .translationY(translationY.toFloat()) - .setUpdateListener { - val amount = calcTranslationAmount() - changeBackgroundAlpha(amount) - onViewTranslateListener?.onViewTranslate(imageView, amount) - } - .setListener(object : Animator.AnimatorListener { - override fun onAnimationStart(p0: Animator) { - - } - - override fun onAnimationEnd(p0: Animator) { - isViewTranslateAnimationRunning = false - onViewTranslateListener?.onDismiss(imageView) - cleanup() - } - - override fun onAnimationCancel(p0: Animator) { - isViewTranslateAnimationRunning = false - } - - override fun onAnimationRepeat(p0: Animator) { - // no op - } - }) - } - } else { - ObjectAnimator.ofFloat(imageView, View.TRANSLATION_Y, if (velY > 0) { - originalViewBounds.top + imageView.height - imageView.top + + imageView.run { + val translationY = if (velY > 0) { + originalViewBounds.top + height - top } else { - originalViewBounds.top - imageView.height - imageView.top - }.toFloat()).apply { - duration = dismissAnimationDuration - interpolator = dismissAnimationInterpolator - addUpdateListener { - val amount = calcTranslationAmount() - changeBackgroundAlpha(amount) - onViewTranslateListener?.onViewTranslate(imageView, amount) - } - addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(p0: Animator) { - // no op - } - - override fun onAnimationEnd(p0: Animator) { - isViewTranslateAnimationRunning = false - onViewTranslateListener?.onDismiss(imageView) - cleanup() - } - - override fun onAnimationCancel(p0: Animator) { - isViewTranslateAnimationRunning = false - } - - override fun onAnimationRepeat(p0: Animator) { - // no op - } - }) - start() + originalViewBounds.top - height - top } + animate() + .setDuration(dismissAnimationDuration) + .setInterpolator(dismissAnimationInterpolator) + .translationY(translationY.toFloat()) + .setUpdateListener { + val amount = calcTranslationAmount() + changeBackgroundAlpha(amount) + onViewTranslateListener?.onViewTranslate(imageView, amount) + } + .setListener(object : Animator.AnimatorListener { + override fun onAnimationStart(p0: Animator) { + + } + + override fun onAnimationEnd(p0: Animator) { + isViewTranslateAnimationRunning = false + onViewTranslateListener?.onDismiss(imageView) + cleanup() + } + + override fun onAnimationCancel(p0: Animator) { + isViewTranslateAnimationRunning = false + } + + override fun onAnimationRepeat(p0: Animator) { + // no op + } + }) } } @@ -657,137 +620,76 @@ class Loupe(imageView: ImageView, container: ViewGroup) : View.OnTouchListener, private fun restoreViewTransform() { val imageView = imageViewRef.get() ?: return - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - imageView.run { - animate() - .setDuration(restoreAnimationDuration) - .setInterpolator(restoreAnimationInterpolator) - .translationY((originalViewBounds.top - top).toFloat()) - .setUpdateListener { - val amount = calcTranslationAmount() - changeBackgroundAlpha(amount) - onViewTranslateListener?.onViewTranslate(this, amount) + imageView.run { + animate() + .setDuration(restoreAnimationDuration) + .setInterpolator(restoreAnimationInterpolator) + .translationY((originalViewBounds.top - top).toFloat()) + .setUpdateListener { + val amount = calcTranslationAmount() + changeBackgroundAlpha(amount) + onViewTranslateListener?.onViewTranslate(this, amount) + } + .setListener(object : Animator.AnimatorListener { + override fun onAnimationStart(p0: Animator) { + // no op } - .setListener(object : Animator.AnimatorListener { - override fun onAnimationStart(p0: Animator) { - // no op - } - override fun onAnimationEnd(p0: Animator) { - onViewTranslateListener?.onRestore(imageView) - } + override fun onAnimationEnd(p0: Animator) { + onViewTranslateListener?.onRestore(imageView) + } - override fun onAnimationCancel(p0: Animator) { - // no op - } + override fun onAnimationCancel(p0: Animator) { + // no op + } - override fun onAnimationRepeat(p0: Animator) { - // no op - } - }) - } - } else { - ObjectAnimator.ofFloat(imageView, View.TRANSLATION_Y, (originalViewBounds.top - imageView.top).toFloat()).apply { - duration = restoreAnimationDuration - interpolator = restoreAnimationInterpolator - addUpdateListener { - val amount = calcTranslationAmount() - changeBackgroundAlpha(amount) - onViewTranslateListener?.onViewTranslate(imageView, amount) - } - addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(p0: Animator) { - // no op - } - - override fun onAnimationEnd(p0: Animator) { - onViewTranslateListener?.onRestore(imageView) - } - - override fun onAnimationCancel(p0: Animator) { - // no op - } - - override fun onAnimationRepeat(p0: Animator) { - // no op - } - }) - start() - } + override fun onAnimationRepeat(p0: Animator) { + // no op + } + }) } + } private fun startDragToDismissAnimation() { val imageView = imageViewRef.get() ?: return - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - imageView.run { - val translationY = if (y - initialY > 0) { - originalViewBounds.top + height - top - } else { - originalViewBounds.top - height - top - } - animate() - .setDuration(dismissAnimationDuration) - .setInterpolator(AccelerateDecelerateInterpolator()) - .translationY(translationY.toFloat()) - .setUpdateListener { - val amount = calcTranslationAmount() - changeBackgroundAlpha(amount) - onViewTranslateListener?.onViewTranslate(this, amount) + + imageView.run { + val translationY = if (y - initialY > 0) { + originalViewBounds.top + height - top + } else { + originalViewBounds.top - height - top + } + animate() + .setDuration(dismissAnimationDuration) + .setInterpolator(AccelerateDecelerateInterpolator()) + .translationY(translationY.toFloat()) + .setUpdateListener { + val amount = calcTranslationAmount() + changeBackgroundAlpha(amount) + onViewTranslateListener?.onViewTranslate(this, amount) + } + .setListener(object : Animator.AnimatorListener { + override fun onAnimationStart(p0: Animator) { + isViewTranslateAnimationRunning = true } - .setListener(object : Animator.AnimatorListener { - override fun onAnimationStart(p0: Animator) { - isViewTranslateAnimationRunning = true - } - override fun onAnimationEnd(p0: Animator) { - isViewTranslateAnimationRunning = false - onViewTranslateListener?.onDismiss(imageView) - cleanup() - } + override fun onAnimationEnd(p0: Animator) { + isViewTranslateAnimationRunning = false + onViewTranslateListener?.onDismiss(imageView) + cleanup() + } - override fun onAnimationCancel(p0: Animator) { - isViewTranslateAnimationRunning = false - } + override fun onAnimationCancel(p0: Animator) { + isViewTranslateAnimationRunning = false + } - override fun onAnimationRepeat(p0: Animator) { - // no op - } - }) - } - } else { - ObjectAnimator.ofFloat(imageView, View.TRANSLATION_Y, imageView.translationY).apply { - duration = dismissAnimationDuration - interpolator = AccelerateDecelerateInterpolator() - addUpdateListener { - val amount = calcTranslationAmount() - changeBackgroundAlpha(amount) - onViewTranslateListener?.onViewTranslate(imageView, amount) - } - addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(p0: Animator) { - isViewTranslateAnimationRunning = true - } - - override fun onAnimationEnd(p0: Animator) { - isViewTranslateAnimationRunning = false - onViewTranslateListener?.onDismiss(imageView) - cleanup() - } - - override fun onAnimationCancel(p0: Animator) { - isViewTranslateAnimationRunning = false - } - - override fun onAnimationRepeat(p0: Animator) { - // no op - } - }) - start() - } + override fun onAnimationRepeat(p0: Animator) { + // no op + } + }) } + } private fun processFlingToDismiss(velocityY: Float) { From 933d34ff1d14f46fe648dde396942bbb5f33f12c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 18 Aug 2025 23:14:55 +0200 Subject: [PATCH 23/88] Translated using Weblate (Romanian) Currently translated at 100.0% (667 of 667 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ro/ --- app/src/main/res/values-ro/strings.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 881c43b16..84e8b824b 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -99,7 +99,7 @@ Nu s-a putut citi baza de date. Asigurați-vă că calea este corectă. Secret OTP nevalid. - Introduce un nume. + Introduceți un nume. Alege un fisier cheie. Nicio memorie pentru a încărca întreaga dvs. bază de date. Nu s-a putut încărca baza de date. @@ -107,7 +107,7 @@ Trebuie selectat cel puțin un tip de generare a parolei. Trebuie să setați cel puțin o credențială. Parolele nu se potrivesc. - \"Transformările rotunde\" prea sus. Setarea la 2147483648. + Prea multe runde de transformare. Setare la 2147483648. Fiecare șir trebuie să aibă un nume de câmp. Introduceți un număr întreg pozitiv în câmpul \"Lungime\". Nu s-a putut activa serviciul de completare automată. @@ -178,7 +178,7 @@ Mai puțin Niciodată Nu există rezultate de căutare - KeePassDX © %1$d Kunzisoft este <strong>open source</strong> și <strong>fără reclame</strong>. \n\nEste furnizat ca atare, sub licență <strong>GPLv3</strong>, fără nicio garanție. + KeePassDX © %1$d Kunzisoft este open source și fără reclame. \nEste furnizat ca atare, sub licență GPLv3, fără nicio garanție. Pentru a ne <strong>păstra libertatea</strong>, <strong>pentru a remedia erori</strong>, <strong>pentru a adăuga funcții</strong> și <strong>pentru a fi mereu activi</strong>, ne bazăm pe <strong>contribuția</strong> dvs. Ascundeți parolele Mascați parolele (***) în mod implicit @@ -383,7 +383,7 @@ Spre deosebire de multe aplicații de gestionare a parolelor, aceasta este <strong>fără reclame</strong>, <strong>software liber cu copyleft</strong> și nu colectează date personale pe serverele sale, indiferent de versiunea pe care o utilizați. Prin cumpărarea versiunii pro, veți avea acces la acest lucru <strong>stil vizual</strong> și veți ajuta în special la <strong>realizarea proiectelor comunitare.</strong> Acest <strong> stil vizual </strong> este disponibil datorită generozității tale. - strong>Contribuind</strong> la proiect <i>(financiar, cod, traducere)</i>, îl veți ajuta să continue să trăiască și să prospere și veți fi, de asemenea, eligibil pentru procedura de deblocare a <strong>temei</strong>. + Contribuind la proiect (financiar, cod, traducere), îl veți ajuta să continue să trăiască și să prospere și veți fi, de asemenea, eligibil pentru procedura de deblocare a temelor. Această caracteristică este <strong> în curs de dezvoltare</strong> și necesită ca <strong>contribuția</strong> dvs. să fie disponibilă în curând. Cumpărând versiunea <strong> pro </strong>, Prin <strong> contribuție </strong>, @@ -462,7 +462,7 @@ Date personalizate Etichete Tipul de OTP existent nu este recunoscut de acest formular, este posibil ca validarea acestuia să nu mai genereze corect token-ul. - Nu poți muta grupul aici. + Nu puteți muta un grup aici. Acest text nu se potrivește cu articolul solicitat. Salvarea unui element nou nu este permisă într-o bază de date numai pentru citire. Numele câmpului există deja. @@ -702,4 +702,5 @@ Nu este recomandat să adăugați un fișier cheie mare, acest lucru poate împiedica deschiderea bazei de date. Ascundeți șabloanele Șabloanele nu sunt afișate - \ No newline at end of file + Cheia secretă trebuie să conțină cel puțin %1$d caractere. + From 0d93e867cf47582ad7b63876def4e5575b98c6d0 Mon Sep 17 00:00:00 2001 From: Nara Huang Date: Wed, 20 Aug 2025 05:03:10 +0200 Subject: [PATCH 24/88] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hant/ --- app/src/main/res/values-zh-rTW/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e20c8db4a..999a80e0e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -280,7 +280,7 @@ 必須至少選擇一個密碼生成類型。 密碼不正確。 無法正確地重建列表。 - 唯讀資料庫不允許儲存新項目 + 唯讀資料庫不允許儲存新項目。 刪除檔案資料時發生了一個錯誤。 次數太多,最大設置到 2147483648。 無法儲存資料庫。 @@ -699,4 +699,5 @@ 節點 遞歸計算群組中的項目數 不建議增加較大的密鑰檔案,這可能會阻止資料庫開啟。 + 密鑰必須包含至少%1$d個字元。 From 4034a2bfc4a610580ed0add32338fc803dd78eea Mon Sep 17 00:00:00 2001 From: Random Date: Tue, 19 Aug 2025 14:34:21 +0200 Subject: [PATCH 25/88] Translated using Weblate (Italian) Currently translated at 100.0% (3 of 3 strings) Translation: KeePassDX/Metadata Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/it/ --- .../android/it-IT/full_description.txt | 23 +++++++++++++++++++ .../android/it-IT/short_description.txt | 1 + fastlane/metadata/android/it-IT/title.txt | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/it-IT/full_description.txt create mode 100644 fastlane/metadata/android/it-IT/short_description.txt diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt new file mode 100644 index 000000000..8e9548f30 --- /dev/null +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -0,0 +1,23 @@ +KeePassDX è un gestore di password che permette di modificare dati crittografati in un unico file nel formato aperto KeePass e di compilare moduli in modo sicuro, non richiede alcuna connessione a internet e integra gli standard di progettazione Android. L'app è open source, senza pubblicità. + +Caratteristiche + +- Crea file / voci e gruppi di database. +- Supporto ai file .kdb e .kdbx (versione da 1 a 4) con algoritmi AES - Twofish - ChaCha20 - Argon2. +- Compatibile con la maggior parte dei programmi alternativi (KeePass, KeePassXC, KeeWeb, …). +- Consente di aprire e copiare i campi URI / URL rapidamente. +- Riconoscimento biometrico per lo sblocco rapido (impronta digitale / sblocco facciale / …). +- Gestione di password una tantum (HOTP / TOTP) per l'autenticazione a due fattori (2FA). +- Material design con temi. +- Autocompletamento e integrazione. +- Tastiera con riempimento campi. +- Modelli dinamici. +- Cronologia di ogni voce. +- Gestione precisa delle impostazioni. +- Codice scritto in lingue native (Kotlin / Java / JNI / C). + +È possibile donare o acquistare la versione pro per un servizio migliore e uno sviluppo rapido di funzionalità desiderate: https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro + +Il progetto è in continua evoluzione. Non esitate a controllare lo stato di sviluppo dei prossimi aggiornamenti: https://github.com/Kunzisoft/KeePassDX/projects + +Inviare problemi a: https://github.com/Kunzisoft/KeePassDX/issues diff --git a/fastlane/metadata/android/it-IT/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt new file mode 100644 index 000000000..c91e2af44 --- /dev/null +++ b/fastlane/metadata/android/it-IT/short_description.txt @@ -0,0 +1 @@ +Gestore di password sicuro e open-source diff --git a/fastlane/metadata/android/it-IT/title.txt b/fastlane/metadata/android/it-IT/title.txt index e45428c18..775fe685d 100644 --- a/fastlane/metadata/android/it-IT/title.txt +++ b/fastlane/metadata/android/it-IT/title.txt @@ -1 +1 @@ -KeePassDX - FOSS Password Safe +KeePassDX - gestore password From 2befa68c9368d25d5758f40caaee0ec053b08f3c Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Thu, 21 Aug 2025 10:28:06 +0200 Subject: [PATCH 26/88] Translated using Weblate (Japanese) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ja/ --- app/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e98e1cb96..2881981de 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -445,7 +445,7 @@ 多くのパスワード管理アプリとは異なり、このアプリは<strong>広告なし</strong>かつ<strong>コピーレフトの自由ソフトウェア</strong>です。どのバージョンを使っても、サーバー上で個人情報が収集されることはありません。 Pro バージョンを購入すると、この<strong>ビジュアル スタイル</strong>にアクセスできるようになり、また<strong>コミュニティ プロジェクトの実現</strong>を特に支援できます。 この<strong>ビジュアル スタイル</strong>はあなたの厚意により利用可能となります。 - <strong>プロジェクトに貢献</strong>することによって(お金、コード、翻訳など)、プロジェクトは継続して成長することができ、さらに<strong>テーマ</strong>のアンロック手続きにも参加できるようになります。 + プロジェクトに貢献することによって (お金、コード、翻訳など)、プロジェクトは継続して成長することができ、さらにテーマのアンロック手続きにも参加できるようになります。 この機能は<strong>開発中</strong>であり、早期に提供するにはあなたの<strong>貢献</strong>が必要です。 <strong>pro</strong> バージョンを購入することによる、 <strong>貢献</strong>による、 From d143605a405fe0b70f860f6e67f41b1cbabed64a Mon Sep 17 00:00:00 2001 From: Telaneo Date: Mon, 25 Aug 2025 12:59:10 +0200 Subject: [PATCH 27/88] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/ --- app/src/main/res/values-nb/strings.xml | 45 ++++++++++++++------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index e1f2b28a0..5f8f7aca4 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -90,7 +90,7 @@ Lengde Passord Passord - Kunne ikke lese legitimasjonen. + Kunne ikke lese autentiseringsopplysningene. Ugyldig algoritme. Fremmed databaseformat. Nøkkelfilen er tom. @@ -168,7 +168,7 @@ Ønsker du å fortsette uten en krypteringsnøkkel\? Versjon %1$s Kryptert passord lagret - Denne databasen har ikke et passord enda. + Utilgjengelig Historikk Utseende Generelt @@ -200,8 +200,8 @@ Sti Tildel en hovednøkkel Opprett nytt hvelv - Papirkurv bruk - Flytter grupper og oppføringer til \"Papirkurv\"-gruppen før sletting + Papirkurvbruk + Flytter grupper og oppføringer til «Papirkurv»-gruppen før sletting Felt-skrift Endre skriften brukt i felter for bedre tegngjengivelse Kopi av passord @@ -246,14 +246,9 @@ \n \nHusk å lagre en kopi av din .kdbx-fil på et trygt sted etter hver endring. Skrivebeskytt databasen din - Endre åpningsmodus for økten. -\n -\nI skrivebeskyttet modus, kan du forhindre utilsiktede endringer i databasen. -\n -\nI skrivemodus, kan du legge til, slette eller endre alle elementene. + Endre åpningsmodus for sesjonen. \n \n«Skrivebeskyttet» hindrer utilsiktede endringer i databasen. \n«Modifiserbar» lar deg endre, slette eller modifisere alle elementene etter eget ønske. Kopier et felt - Kopier et felt for å lime det inn der du ønsker. -\nBruk den skjemautfyllingsmetoden du foretrekker. + Kopierte felt kan limes inn hvorsomhelst.\n\nBruk den utfyllingsmetoden du foretrekker. Lås databasen Lås din database raskt. Du kan sette opp programmet slik at det låser den etter en stund, og når skjermen slår seg av. Sorter elementer @@ -263,7 +258,7 @@ I motsetning til mange passordadministrasjons-apper er denne <strong>annonsefri</strong>, <strong>copylefted libre-programvare</strong> og samler ikke inn personlige data på serverne, uansett hvilken versjon du bruker. Ved kjøp av pro-versjonen, vil du få tilgang til denne <strong>visuelle funksjonen</strong> og du vil bidra med støtte til <strong> realisering av fellesskaps prosjekter.</strong> Denne <strong>visuelle stilen</strong> er tilgjengelig takket være din generøsitet. - For å beholde vår frihet og alltid være aktive, stoler vi på dine <strong>bidrag.</strong> + Ved å bidra til prosjektet (med penger, kode eller oversettelser), bidrar du til å holde prosjektet gående og trivende, og du vil også kunne få mulighet til å låse opp drakter. Denne funksjonen er <strong>under utvikling</strong> og krever <strong>bidrag</strong> for å bli tilgjengelig snart. Ved å kjøpe <strong>pro</strong>-versjonen, Ved å <strong>bidra</strong>, @@ -334,7 +329,7 @@ Historikk Sett opp engangspassord OTP-type - Hemmelig + Hemmelighet Periode (sekunder) Teller Siffer @@ -345,7 +340,7 @@ Periode må være mellom %1$d og %2$d sekunder. Database åpnet Lagre data - Passord avkrysningsrute + Passordsavkryssningsboks Avkrysningsrute for nøkkelfil Biometrisk Minst én identitetsdetalj må angis. @@ -355,7 +350,7 @@ %1$s med samme UUID %2$s finnes allerede. Oppretter database… Sikkerhetsinnstillinger - Hovednøkkel innstillinger + Innstillinger for hovednøkkel Databasen inneholder dupliserte UUID-er. Datakomprimering Datakomprimering reduserer databasens størrelse @@ -411,7 +406,7 @@ Lagringsmodus Søkemodus Feltnavnet finnes allerede. - Legg til element + Legg til ny Opplåsing av enhetsdatabase B Viser UUID-en som er tilknyttet en oppføring eller en gruppe @@ -445,7 +440,7 @@ Gjenta for å skifte passordsynlighet Egendefinert Forvalg - Velg et lyst eller mørkt tema + Velg en lys eller mørk drakt Draktlysstyrke Rettetast Lagre delt info @@ -520,7 +515,7 @@ Sikkehetsnotis Standard SWIFT/BIC - Å lagre et nytt element tillates ikke i skrivebeskyttet database. + Å lagre et nytt element tillates ikke i en skrivebeskyttet database. Database-URI kan ikke innhentes. Kunne ikke gjenoppbygge listen på riktig måte. En feil inntraff under opplasting av fildataen. @@ -617,7 +612,7 @@ Utløpt Maskinvarenøkkel Velg en maskinvarenøkkel. - Kan ikke slå sammen fra en V1 database. + Kan ikke slå sammen med en kdb-databasefil. Databaseplasseringen er ukjent, databasehandlingen kan ikke utføres. Holder styr på maskinvarenøklene som brukes Ekskluder tvetydige tegn @@ -670,7 +665,7 @@ Spør Sammenslåingen er fullført Konfigurer - Temaer, farger, attributter + Drakter, farger, attributter Skjermbilde-modus Vurder karakterer Entropi: Beregn… @@ -685,7 +680,7 @@ Entropi: Høy små bokstaver STORE BOKSTAVER - Divine + Gudommelig Classic Enkel Moon @@ -695,4 +690,12 @@ Følg systemet Lyst Mørkt + Den hemmelige nøkkelen må være minst %1$d tegn. + Generer nøkkelfil + Noder + Rekursivt antall oppføringer + Regner ut antallet oppføringer i en gruppe rekursivt + Det anbefales ikke å legge til en stor nøkkelfil, siden dette kan hindre databasen i å åpnes. + Skjul maler + Maler vises ikke From a28d77ba32ef18df401be75ed83fbd52bc6aa059 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Sat, 26 Jul 2025 17:42:39 -0700 Subject: [PATCH 28/88] feat: Remember the last read-only state of each database The app has supported a global setting for opening (all) databases in read-only mode. But that's not particularly flexible for the use case where you have one database that should be read-only and one that should be read-write. Previously, to handle this use case you could open one database in read-only mode, but the next time you attempted to open the same database, it would "forget" that, so you would have to toggle it to read-only mode again manually. This commit changes that behavior so that if you toggle a database to read-only mode, it'll be remembered the next time you open the database. (You can still toggle it back to read-write if you change your mind, and that, too, will be remembered the next time you open the database.) --- .../3.json | 96 +++++++++++++++++++ .../activities/MainCredentialActivity.kt | 14 +++ .../keepass/app/database/AppDatabase.kt | 5 +- .../app/database/FileDatabaseHistoryAction.kt | 6 ++ .../app/database/FileDatabaseHistoryEntity.kt | 3 + .../kunzisoft/keepass/model/DatabaseFile.kt | 1 + 6 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/3.json diff --git a/app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/3.json b/app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/3.json new file mode 100644 index 000000000..f9b3b72ef --- /dev/null +++ b/app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/3.json @@ -0,0 +1,96 @@ +{ + "formatVersion": 1, + "database": { + "version": 3, + "identityHash": "a20aec7cf09664b1102ec659fa51160a", + "entities": [ + { + "tableName": "file_database_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`database_uri` TEXT NOT NULL, `database_alias` TEXT NOT NULL, `keyfile_uri` TEXT, `hardware_key` TEXT, `read_only` INTEGER, `updated` INTEGER NOT NULL, PRIMARY KEY(`database_uri`))", + "fields": [ + { + "fieldPath": "databaseUri", + "columnName": "database_uri", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "databaseAlias", + "columnName": "database_alias", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "keyFileUri", + "columnName": "keyfile_uri", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "hardwareKey", + "columnName": "hardware_key", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "readOnly", + "columnName": "read_only", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "updated", + "columnName": "updated", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "database_uri" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "cipher_database", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`database_uri` TEXT NOT NULL, `encrypted_value` TEXT NOT NULL, `specs_parameters` TEXT NOT NULL, PRIMARY KEY(`database_uri`))", + "fields": [ + { + "fieldPath": "databaseUri", + "columnName": "database_uri", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "encryptedValue", + "columnName": "encrypted_value", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "specParameters", + "columnName": "specs_parameters", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "database_uri" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a20aec7cf09664b1102ec659fa51160a')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt index de0991f5e..8077c9b19 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt @@ -52,6 +52,7 @@ import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper import com.kunzisoft.keepass.activities.helpers.SpecialMode import com.kunzisoft.keepass.activities.legacy.DatabaseModeActivity +import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.autofill.AutofillComponent import com.kunzisoft.keepass.autofill.AutofillHelper import com.kunzisoft.keepass.biometric.DeviceUnlockFragment @@ -203,6 +204,13 @@ class MainCredentialActivity : DatabaseModeActivity() { } mForceReadOnly = databaseFileNotExists + // Restore read-only state from database file if not forced + if (!mForceReadOnly) { + databaseFile?.readOnly?.let { savedReadOnlyState -> + mReadOnly = savedReadOnlyState + } + } + invalidateOptionsMenu() // Post init uri with KeyFile only if needed @@ -702,6 +710,12 @@ class MainCredentialActivity : DatabaseModeActivity() { R.id.menu_open_file_read_mode_key -> { mReadOnly = !mReadOnly changeOpenFileReadIcon(item) + // Save the read-only state to database + mDatabaseFileUri?.let { databaseUri -> + FileDatabaseHistoryAction.getInstance(applicationContext).addOrUpdateDatabaseFile( + DatabaseFile(databaseUri = databaseUri, readOnly = mReadOnly) + ) + } } else -> MenuUtil.onDefaultMenuOptionsItemSelected(this, item) } diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt index 16d1a190c..117e8b67a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt @@ -26,10 +26,11 @@ import android.content.Context import androidx.room.AutoMigration @Database( - version = 2, + version = 3, entities = [FileDatabaseHistoryEntity::class, CipherDatabaseEntity::class], autoMigrations = [ - AutoMigration (from = 1, to = 2) + AutoMigration (from = 1, to = 2), + AutoMigration (from = 2, to = 3) ] ) abstract class AppDatabase : RoomDatabase() { diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryAction.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryAction.kt index 1818f8f6e..6f649f362 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryAction.kt @@ -49,6 +49,7 @@ class FileDatabaseHistoryAction(private val applicationContext: Context) { databaseUri, fileDatabaseHistoryEntity?.keyFileUri?.parseUri(), HardwareKey.getHardwareKeyFromString(fileDatabaseHistoryEntity?.hardwareKey), + fileDatabaseHistoryEntity?.readOnly, fileDatabaseHistoryEntity?.databaseUri?.decodeUri(), fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistoryEntity?.databaseAlias ?: ""), @@ -99,6 +100,7 @@ class FileDatabaseHistoryAction(private val applicationContext: Context) { fileDatabaseHistoryEntity.databaseUri.parseUri(), fileDatabaseHistoryEntity.keyFileUri?.parseUri(), HardwareKey.getHardwareKeyFromString(fileDatabaseHistoryEntity.hardwareKey), + fileDatabaseHistoryEntity.readOnly, fileDatabaseHistoryEntity.databaseUri.decodeUri(), fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistoryEntity.databaseAlias), fileDatabaseInfo.exists, @@ -147,6 +149,8 @@ class FileDatabaseHistoryAction(private val applicationContext: Context) { ?: "", databaseFileToAddOrUpdate.keyFileUri?.toString(), databaseFileToAddOrUpdate.hardwareKey?.value, + databaseFileToAddOrUpdate.readOnly + ?: fileDatabaseHistoryRetrieve?.readOnly, System.currentTimeMillis() ) @@ -168,6 +172,7 @@ class FileDatabaseHistoryAction(private val applicationContext: Context) { fileDatabaseHistory.databaseUri.parseUri(), fileDatabaseHistory.keyFileUri?.parseUri(), HardwareKey.getHardwareKeyFromString(fileDatabaseHistory.hardwareKey), + fileDatabaseHistory.readOnly, fileDatabaseHistory.databaseUri.decodeUri(), fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistory.databaseAlias), fileDatabaseInfo.exists, @@ -195,6 +200,7 @@ class FileDatabaseHistoryAction(private val applicationContext: Context) { fileDatabaseHistory.databaseUri.parseUri(), fileDatabaseHistory.keyFileUri?.parseUri(), HardwareKey.getHardwareKeyFromString(fileDatabaseHistory.hardwareKey), + fileDatabaseHistory.readOnly, fileDatabaseHistory.databaseUri.decodeUri(), databaseFileToDelete.databaseAlias ) diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt index 96fd5df08..c406a7468 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt @@ -38,6 +38,9 @@ data class FileDatabaseHistoryEntity( @ColumnInfo(name = "hardware_key") var hardwareKey: String?, + @ColumnInfo(name = "read_only") + var readOnly: Boolean?, + @ColumnInfo(name = "updated") val updated: Long ) { diff --git a/database/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt b/database/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt index 92470c2fe..fa2320fe9 100644 --- a/database/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt @@ -6,6 +6,7 @@ import com.kunzisoft.keepass.hardware.HardwareKey data class DatabaseFile(var databaseUri: Uri? = null, var keyFileUri: Uri? = null, var hardwareKey: HardwareKey? = null, + var readOnly: Boolean? = null, var databaseDecodedPath: String? = null, var databaseAlias: String? = null, var databaseFileExists: Boolean = false, From e9d20a51a578144fa2f2e5b636903568d4e12064 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 1 Aug 2025 10:05:24 -0700 Subject: [PATCH 29/88] Remove global "Write-protected" setting This addresses J-Jamet's feedback that keeping the global setting would potentially lead to confusion, so it should be removed now that we are remembering each database's read-only state. --- .../keepass/activities/FileDatabaseSelectActivity.kt | 2 +- .../kunzisoft/keepass/activities/MainCredentialActivity.kt | 2 +- .../java/com/kunzisoft/keepass/settings/PreferencesUtil.kt | 7 ------- app/src/main/res/xml/preferences_application.xml | 5 ----- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt index 2ba2638d3..12597efc8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -263,7 +263,7 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(), GroupActivity.launch( this@FileDatabaseSelectActivity, database, - PreferencesUtil.enableReadOnlyDatabase(this@FileDatabaseSelectActivity) + false ) } ACTION_DATABASE_LOAD_TASK -> { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt index 8077c9b19..42ae3882a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt @@ -148,7 +148,7 @@ class MainCredentialActivity : DatabaseModeActivity() { mReadOnly = if (savedInstanceState != null && savedInstanceState.containsKey(KEY_READ_ONLY)) { savedInstanceState.getBoolean(KEY_READ_ONLY) } else { - PreferencesUtil.enableReadOnlyDatabase(this) + false } mRememberKeyFile = PreferencesUtil.rememberKeyFileLocations(this) mRememberHardwareKey = PreferencesUtil.rememberHardwareKey(this) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt index 741b390dd..9bc6ae1c6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt @@ -618,12 +618,6 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.allow_no_password_default)) } - fun enableReadOnlyDatabase(context: Context): Boolean { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return prefs.getBoolean(context.getString(R.string.enable_read_only_key), - context.resources.getBoolean(R.bool.enable_read_only_default)) - } - fun deletePasswordAfterConnexionAttempt(context: Context): Boolean { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getBoolean(context.getString(R.string.delete_entered_password_key), @@ -804,7 +798,6 @@ object PreferencesUtil { when (name) { context.getString(R.string.allow_no_password_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.delete_entered_password_key) -> editor.putBoolean(name, value.toBoolean()) - context.getString(R.string.enable_read_only_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.enable_auto_save_database_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.enable_keep_screen_on_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.auto_focus_search_key) -> editor.putBoolean(name, value.toBoolean()) diff --git a/app/src/main/res/xml/preferences_application.xml b/app/src/main/res/xml/preferences_application.xml index 8ee384ec5..41b2930b5 100644 --- a/app/src/main/res/xml/preferences_application.xml +++ b/app/src/main/res/xml/preferences_application.xml @@ -32,11 +32,6 @@ android:title="@string/delete_entered_password_title" android:summary="@string/delete_entered_password_summary" android:defaultValue="@bool/delete_entered_password_default"/> - Date: Fri, 1 Aug 2025 10:05:42 -0700 Subject: [PATCH 30/88] Remove no-longer-needed `enable_read_only_*` string resources (We just removed the usages of these strings) --- app/src/main/res/values-ar/strings.xml | 2 -- app/src/main/res/values-az/strings.xml | 2 -- app/src/main/res/values-bg/strings.xml | 2 -- app/src/main/res/values-ca/strings.xml | 2 -- app/src/main/res/values-cs/strings.xml | 2 -- app/src/main/res/values-da/strings.xml | 2 -- app/src/main/res/values-de/strings.xml | 2 -- app/src/main/res/values-el/strings.xml | 2 -- app/src/main/res/values-es/strings.xml | 2 -- app/src/main/res/values-et/strings.xml | 2 -- app/src/main/res/values-eu/strings.xml | 2 -- app/src/main/res/values-fr/strings.xml | 2 -- app/src/main/res/values-gl/strings.xml | 2 -- app/src/main/res/values-hr/strings.xml | 2 -- app/src/main/res/values-hu/strings.xml | 2 -- app/src/main/res/values-in/strings.xml | 2 -- app/src/main/res/values-it/strings.xml | 2 -- app/src/main/res/values-iw/strings.xml | 2 -- app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values-nb/strings.xml | 2 -- app/src/main/res/values-nl/strings.xml | 2 -- app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 2 -- app/src/main/res/values-pt-rBR/strings.xml | 2 -- app/src/main/res/values-pt-rPT/strings.xml | 2 -- app/src/main/res/values-pt/strings.xml | 2 -- app/src/main/res/values-ro/strings.xml | 2 -- app/src/main/res/values-ru/strings.xml | 2 -- app/src/main/res/values-sk/strings.xml | 2 -- app/src/main/res/values-sq/strings.xml | 2 -- app/src/main/res/values-sv/strings.xml | 2 -- app/src/main/res/values-ta/strings.xml | 2 -- app/src/main/res/values-th/strings.xml | 2 -- app/src/main/res/values-tr/strings.xml | 2 -- app/src/main/res/values-uk/strings.xml | 2 -- app/src/main/res/values-vi/strings.xml | 2 -- app/src/main/res/values-zh-rCN/strings.xml | 2 -- app/src/main/res/values-zh-rTW/strings.xml | 2 -- app/src/main/res/values/donottranslate.xml | 2 -- app/src/main/res/values/strings.xml | 2 -- 40 files changed, 79 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 1cb256a24..494875b23 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -213,8 +213,6 @@ إهتزاز عند اللمس صوت عند اللمس اسمح بدون المفتاح الرئيسي - محمي من التعديل - افتح قاعدة البيانات في وضع القراءة افتراضيا تلميحات تعليمية أعد عرض كل المعلومات التعليمية إعادة تعيين الشاشات التلميحات diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index b48c8a1c3..6ee009306 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -349,7 +349,6 @@ Axtarış məlumatlarını yadda saxla Avtomatik doldurma təklifləri əlavə edildi. Ana açar olmamasına icazə ver - Məlumat bazasını standart olaraq yazma-qorumalı (dəyişməz) aç Məlumat bazasını avtomatik olaraq yadda saxla Bütün təlim məlumatlarını yenidən göstər Təlim ipuclarını sıfırlamaq @@ -572,7 +571,6 @@ Əgər şəxsiyyəti təsdiq edən məlumatlar seçilməyibsə, \"Aç\" düyməsinin sıxılmasına icazə ver Şifrəni sil Məlumat bazasına bağlantı cəhdindən sonra daxil edilmiş şifrəni sil - Yazma qorumalı Hər önəmli prossesdən sonra məlumat bazasını yadda saxla (\"Modifikasiya edilə bilən\" modda keçərlidir) Ekranı açıq saxla Şifrəyə baxarkən və ya redaktə edərkən ekranı açıq saxla diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 41cb7e4ad..2091a718a 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -352,7 +352,6 @@ Настройки на Magikeyboard Избор на записи Разрешаване без главна парола - Само за четене %1$s Записът %1$s е достъпен в Magikeyboard Запис @@ -402,7 +401,6 @@ Бутон за заключване Включете услугата за попълване на формуляри в други приложения Свойства - По подразбиране отваря хранилището само за четене Не забравяйте да потвърдите записа и да го запазите в хранилището. \n \nАко се задейства автоматичното заключване, а сте направили промени, рискувате загуба на данни. diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index fa2887728..3a9c202d5 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -471,8 +471,6 @@ Metadades, paperera de reciclatge, plantilles, historial Algorisme de xifratge de la base de dades utilitzat per a totes les dades Suprimeix la contrasenya introduïda després d\'un intent de connexió a una base de dades - Protegit contra l\'escriptura - Obre la base de dades en mode només de lectura per defecte Permet que les aplicacions de tercers gravin o facin captures de pantalla de l\'aplicació Ressalta els elements per saber com funciona l\'aplicació Reinicia els consells educatius diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 91bb6d430..bf764789e 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -224,8 +224,6 @@ Aktivovat vlastní klávesnici, která snadno vyplní hesla a další položky identity Umožnit bez hlavního klíče Povolit klepnutí na \"Otevřít\", i když není vybráno žádné heslo - Chráněno před zápisem - Ve výchozím stavu otevřít databázi pouze pro čtení Vzdělávací nápovědy Zvýraznit prvky k pochopení práce s aplikací Nastavit vzdělávací nápovědy do výchozího stavu diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 0639d64a5..64fbac849 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -223,8 +223,6 @@ Aktiver et brugerdefineret tastatur, der udfylder adgangskoder og alle identitetsfelter Tillad ingen hovednøgle Tillader at trykke på knappen \"Åbn\", hvis der ikke er valgt nogen legitimationsoplysninger - Skrivebeskyttet - Åbn som standard databasen skrivebeskyttet Praktiske tips Fremhæv elementer for at lære, hvordan appen fungerer Nulstil praktiske tips diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 360035ae6..b98393928 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -277,9 +277,7 @@ Bedienelemente hervorheben, um die Funktionsweise der App zu lernen Änderbar Schreibgeschützt - Schreibgeschützt Datenbank-Schreibschutz aktivieren - Datenbank standardmäßig schreibgeschützt öffnen Den Öffnungsmodus für die Sitzung ändern. \n \n„Schreibgeschützt“ verhindert unbeabsichtigte Änderungen an der Datenbank. \nMit „Änderbar“ lässt sich jedes Element frei bearbeiten, hinzufügen oder löschen. Eintrag bearbeiten Die Datenbank konnte nicht geladen werden. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 999e287d3..f585bfe61 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -259,8 +259,6 @@ Επισήμανση στοιχείων για να μάθετε πώς λειτουργεί η εφαρμογή Προστασία εγγραφής Τροποποιήσιμο - Προστασία Εγγραφής - Ανοίξτε τη βάση δεδομένων μόνο για ανάγνωση από προεπιλογή Προστασία Εγγραφής της βάσης δεδομένων σας Αλλάξτε τη λειτουργία ανοίγματος για το session. \n diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c6ce8639d..992ccb923 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -271,8 +271,6 @@ Permite pulsar el botón \"Abrir\" si no son seleccionadas las credenciales Consejos educativos Destaca los elementos para aprender cómo funciona la aplicación - Protegida contra escritura - Abre la base de datos como solo lectura por defecto Proteja la base de datos contra escritura Magikeyboard Magikeyboard (KeePassDX) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index de8e12b02..bc89cded7 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -531,7 +531,6 @@ Automaattäite soovitused on lisatud. Kui andmebaas on avatud ainult lugemiseks, siis andmete salvestamine pole võimalik. Kustutab salasõna, mis oli kasutusel andmebaasiga ühenduse loomise ajal - Vaikimisi ava andmebaas vaid lugemiseks Luba teistel rakendusel teha sellest rakendusest ekraanitõmmist või salvestada tema ekraanivaadet Sulge andmebaas Peale automaattäite kasutamist sulega andmebaas @@ -547,7 +546,6 @@ Ära kasuta peavõtit Kui kasutajanimi või salasõna pole valitud, siis võimaldab klõpsida „Ava“ nuppu Kustuta salasõna - Kirjutuskaitstud Ekraanitõmmiste lubamine Koolitusvihjed Õppimaks, kuidas rakendus toimib, tõsta esile kasutajaliidese elemente diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index a7440d78e..2cad4c545 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -397,7 +397,6 @@ Gakoaren eratorpen funtzioak erabiliko duen memoria kopurua. Datuak gordetzeko eskatu formulario bat betetzean Ireki zure aurreko datu-base fitxategia zure fitxategi kudeatzailetik erabiltzen jarraitzeko. - Idazketaren aurka babestuta Aplikazioen blokeo zerrenda Tekla automatikoaren akzioa Aldatu automatikoki aurreko teklatura datu-basearen kredentzialen pantailan @@ -478,7 +477,6 @@ Zifraketa algoritmorako gakoa sortzeko, gako nagusia itxuraldatu egiten da eratorpen funtzio eta ausazko gatz baten bidez. Bilaketa pantaila Erabiltzaileari datu-baseko sarrera hautatzeko aukera erakutsi - Lehenetsi irakurketa soilerako datu-basea irekitzea Berrezarri hezkuntza-pistak Sarrerek zure identitate digitalak administratzen laguntzen dute. \n diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1f9ac47f0..4d0aefe9c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -283,8 +283,6 @@ Autorise l’appui du bouton \"Ouvrir\" si aucun identifiant n’est sélectionné Protéger en écriture Modifiable - Protéger en écriture - Ouvre la base de données en lecture seule par défaut Protégez en écriture votre base de données Changez le mode d’ouverture pour la session. \n diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 13c39327f..9802a2569 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -556,7 +556,6 @@ Gardar base de datos automaticamente Manter a pantalla acesa Permitir pulsar o botón \"Abrir\" se non seleccionar ningunha credencial - Só lectura Destacar elementos para saber como funciona a aplicación Suxestións educativas restabelecidas Crear o teu arquivo de base de datos @@ -593,7 +592,6 @@ Engadir campos personalizados Completado de formularios %1$s dispoñíbel no Magikeyboard - Abrir a base de datos en modo de só lectura por defecto Configure a xestión do contrasinal dun só uso (HOTP / TOTP) para xerar un token solicitado para a autenticación de dous factores (2FA). Desbloquee a súa base de datos Eliminar contrasinal diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 7cb8ce296..5d537d245 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -310,8 +310,6 @@ Dozvoljava dodir gumba „Otvori”, ako nisu odabrani nikoji podaci za prijavu Izbriši lozinku Briše upisanu lozinku nakon pokušaja povezivanja s bazom podataka - Zaštićeno od pisanja - Standardno otvori bazu podataka u zaštićenom stanju Automatski spremi bazu podataka Automatski spremi bazu podataka nakon svake važne radnje (samo u modusu „Promjenjivo”) Edukativne poruke diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 609d381f5..d51d2a978 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -245,8 +245,6 @@ Hang gombnyomáskor Mesterkulcs elhagyásának engedélyezése A „Megnyitás” gomb engedélyezése, ha nincsenek hitelesítő adatok kiválasztva - Írásvédett - Az adatbázis megnyitása alapértelmezetten írásvédett módban Oktatóképernyők Elemek kiemelése, hogy megtudja hogyan működik az alkalmazás Oktatóképernyők visszaállítása diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 7b0c15dc4..e4f226d30 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -554,7 +554,6 @@ Izinkan tidak ada kunci utama Memungkinkan mengetuk tombol \"Buka\" jika tidak ada kredensial yang dipilih Menghapus kata sandi yang dimasukkan setelah upaya koneksi ke basis data - Buka basis data baca-saja secara baku Biarkan layar nyala Sorot elemen untuk mempelajari cara kerja aplikasi Buat file pengelola kata sandi pertama Anda. @@ -618,7 +617,6 @@ \nPeriksa kompatibilitas dan keamanan KeyStore dengan produsen perangkat Anda dan pembuat ROM yang Anda gunakan. Lindungi basis data Anda dari penulisan Coba simpan informasi terbagi ketika membuat sebuah pilihan entri manual untuk penggunaan mudah di waktu mendatang - Terlindungi-tulis Jaga layar tetap menyala saat melihat atau menyunting sebuah entri Kotak centang kunci perangkat keras Menunggu untuk permintaan tantangan… diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 58ef0c4dd..37ef2ad12 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -222,8 +222,6 @@ Attiva una tastiera personale che inserisce le tue password e i campi di identità Non consentire chiavi principali Permetti di toccare il pulsante \"Apri\" se non sono selezionate credenziali - Protetto da scrittura - Apri il database in sola lettura in modo predefinito Suggerimenti educativi Evidenzia gli elementi per imparare come funziona l\'app Ripristina i suggerimenti educativi diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 54320e9cd..aef987119 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -334,7 +334,6 @@ אזהרה: לוח ההעתקה משותף לכל היישומים. אם מידע רגיש יועתק, תוכנות אחרות עשויות לשחזר אותו. השבת Magikeyboard (KeePassDX) - מוגן מפני כתיבה נקה בסגירה רשומה %1$s זמין ב־Magikeyboard @@ -469,7 +468,6 @@ פעולת מקש אוטומטית אפשר עבודה ללא מפתח ראשי מאפשר הקשה על הכפתור \"פתח\" אם לא נבחרו אישורים - פתח את מסד הנתונים לקריאה בלבד כברירת מחדל מחק סיסמה מוחק את הסיסמה שהוזנה לאחר ניסיון התחברות למסד נתונים הראה שוב את כל המידע הלימודי diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e7c2d0cf9..768ea7262 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -400,8 +400,6 @@ 認証情報が選択されていない場合でも、[開く] ボタンのタップを許可します パスワードの削除 入力されたパスワードをデータベースへの接続試行後に削除します - 書き込み禁止 - デフォルトでデータベースを読み取り専用として開きます データベースの自動保存 重要なアクションを起こすたびにデータベースを保存します( [変更可能] モードのとき) 教育的なヒント diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 4c72a6d63..24233be04 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -218,8 +218,6 @@ Aktiver et egendefinert tastatur som fyller inn passordene og alle identitetsfelter Tillat ingen hovednøkkel Tillater å trykke på \"Åpne\"-knappen hvis ingen legitimasjon er valgt - Skrivebeskyttet - Åpne databasen skrivebeskyttet som standard Lærerike tips Fremhev elementer for å finne ut hvordan appen fungerer Tilbakestill lærerike tips diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f80f31bca..b4e7cbb1f 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -230,8 +230,6 @@ Activeer een aangepast toetsenbord dat je wachtwoorden en identiteitsvelden vult Geen hoofdwachtwoord toestaan Schakel de knop \"Openen\" in als er geen referenties zijn geselecteerd - Alleen-lezen - Open de database standaard alleen-lezen Informatieve tips Markeer elementen om te leren hoe de app werkt Informatieve tips opnieuw instellen diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 7c36ba666..6a2079916 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -331,7 +331,6 @@ ਐਂਟਰੀ ਐਂਟਰੀ ਡਾਟਾਬੇਸ ਬੰਦ ਕਰੋ - ਲਿਖਣ ਤੋਂ ਸੁਰੱਖਿਅਤ ਐਂਟਰੀਆਂ ਵਿੱਚੋਂ ਲੱਭੋ ਐਂਟਰੀ ਨੂੰ ਸੋਧੋ ਅਟੈਚਮੈਂਟ ਜੋੜੋ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f1bea4812..0764caae3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -225,8 +225,6 @@ Aktywuj niestandardową klawiaturę wypełniającą hasła i wszystkie pola tożsamości Zezwalaj na brak klucza głównego Umożliwia naciśnięcie przycisku \"Otwórz\", jeśli nie wybrano żadnych poświadczeń - Ochrona przed zapisem - Domyślnie otwarte bazy danych są tylko do odczytu Wskazówki edukacyjne Podświetl elementy, aby dowiedzieć się, jak działa aplikacja Zresetuj wskazówki edukacyjne diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 45ee1be04..92d234c07 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -222,8 +222,6 @@ Ative um teclado customizado, populando suas senhas e todos os campos de identidade Permitir chave-mestra vazia Permite tocar no botão \"Abrir\" mesmo se nenhuma credencial for selecionada - Somente leitura - Abre o banco de dados no modo somente leitura por padrão Dicas educacionais Destaque os elementos para aprender como o aplicativo funciona Reiniciar telas educacionais diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index efc8ffab2..11ebb1a23 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -269,8 +269,6 @@ Permite tocar no botão \"Abrir\" se não estiverem selecionadas nenhumas credenciais Dicas educacionais Destacar elementos para saber como a aplicação funciona - Apenas leitura - Abrir a base de dados com permissão de apenas leitura por predefinição Proteger a base de dados contra alterações Altere o modo de abertura para a sessão. \n diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 276616a33..8016ca296 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,7 +1,5 @@ - Abrir a base de dados com permissão de apenas leitura por predefinição - Apenas leitura Alterável Apenas leitura Destacar elementos para saber como a aplicação funciona diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index a98a7546f..623deb078 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -336,8 +336,6 @@ Permite apăsarea butonului \"Deschidere\" în cazul în care nu sunt selectate credențiale Ștergere parolă Șterge parola introdusă după o încercare de conectare la o bază de date - Protejat la scriere - Deschideți baza de date numai în citire în mod implicit Salvare automată a bazei de date Salvați baza de date după fiecare acțiune importantă (în modul \"Modificabil\") Sugestii educaționale diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0bdc680eb..23b40a62f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -226,8 +226,6 @@ Активируйте пользовательскую клавиатуру для простого заполнения паролей и любых идентификаторов Разрешить без главного пароля Разрешить нажимать кнопку \"Открыть\", если главный пароль не указан - Только чтение - По умолчанию открывать базу только для чтения Обучающие подсказки Выделять элементы, чтобы показать, как работает приложение Вернуть обучающие подсказки diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 054e31f8d..4decad49c 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -620,8 +620,6 @@ Umožňuje klepnúť na tlačidlo „Otvoriť“, ak nie sú vybraté žiadne poverenia Vymazať heslo Odstráni heslo zadané po pokuse o pripojenie k databáze - Ochrana proti zápisu - V predvolenom nastavení otvorte databázu len na čítanie Nechajte obrazovku zapnutú Pri sledovaní alebo úprave záznamu ponechať obrazovku zapnutú Režim snímky obrazovky diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index bb39889c1..6d56c71c0 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -555,7 +555,6 @@ Shtypje tastesh me dridhje Ruaj hollësi kërkimi Listë bllokimesh që pengon vetëplotësim përkatësish web - Mbrojtur nga shkrimi Mbaje ekranin ndezur Ndihmëza edukative Jepni titull, emër përdoruesi, ose lëndë fushash të tjera, për të marrë fjalëkalimet tuaja. @@ -610,7 +609,6 @@ Shfaq mundësi për ta lënë përdoruesin të përzgjedhë zë baze të dhënash Provo të ruash informacion, kur bëhet një përzgjedhje dorazi e zërit, për përdorim më të kollajtë në të ardhmen S’lejohet ruajtje të dhënash për një bazë të dhënash të hapur vetëm-për-lexim. - Si parazgjedhje, bazën e të dhënave hape si vetëm-për-lexim Ruaje bazën e të dhënave pas çdo veprimi të rëndësishëm (nën mënyrën “E ndryshueshme”) Mbaje hapur ekranin, kur shihet ose përpunohet një zë Lejo aplikacione palësh të treta të regjistrojnë, ose bëjnë foto ekrani të aplikacionit diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3342ad6b5..666254906 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -279,8 +279,6 @@ Markerar element för att lära dig hur appen fungerar Skrivskyddad Modifierbar - Skrivskyddad - Öppna databasen i skrivskyddat läge som standard Skrivskydda din databas Ändra öppningsläge för sessionen. \n diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 970ebc979..946f50536 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -647,8 +647,6 @@ வலை களங்களை தானாக நிரப்புவதைத் தடுக்கும் பிளாக்லிச்ட் படிக்க மட்டும் திறக்கப்பட்ட தரவுத்தளத்திற்கு தரவு சேமிப்பு அனுமதிக்கப்படவில்லை. ஆட்டோஃபில் பரிந்துரைகள் சேர்க்கப்பட்டன. - எழுது பாதுகாக்கப்பட்ட - இயல்பாகவே தரவுத்தளத்தை படிக்க மட்டுமே திறக்கவும் உங்கள் டிசிட்டல் அடையாளங்களை நிர்வகிக்க உள்ளீடுகள் உதவுகின்றன.\n\n குழுக்கள் (~ கோப்புறைகள்) உங்கள் தரவுத்தளத்தில் உள்ளீடுகளை ஒழுங்கமைக்கின்றன. உள்ளீடுகள் மூலம் தேடுங்கள் உங்கள் நுழைவுடன் தொடர்புபடுத்த ஒரு வலுவான கடவுச்சொல்லை உருவாக்குங்கள், படிவத்தின் அளவுகோல்களின்படி அதை எளிதாக வரையறுக்கவும், பாதுகாப்பான கடவுச்சொல்லை மறந்துவிடாதீர்கள். diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 195344a31..9f2cdfbc8 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -416,7 +416,6 @@ การแนะนำแบบอินไลน์ ถามเพื่อบันทึกข้อมูล บล็อกการกรอกอัตโนมัติ - ป้องกันการเขียน รีเซ็ทคำแนะนำการใช้งาน แสดงคำแนะนำการใช้งานอีกครั้ง โดยการ<strong>ร่วมแก้ไข</strong> @@ -620,7 +619,6 @@ อนุญาตให้ไม่มีรหัสผ่านหลัก อนุญาตให้แตะปุ่ม \"เปิด\" เมื่อไม่มีข้อมูลประจำตัวถูกเลือก ลบรหัสผ่านที่ป้อนแล้วหลังจากพยายามเชื่อมต่อที่ฐานข้อมูล - เปิดฐานข้อมูลแบบอ่านอย่างเดียวเป็นค่าเรื่มต้น คำแนะนำการใช้งานถูกรีเซ็ทแล้ว ชุดไอคอน บันทึกฐานข้อมูลหลังจากการกระทำที่สำคัญ(ในโหมด\"แก้ไขได้\") diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cafe7823b..28b5aa6b8 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -236,8 +236,6 @@ Tuşa basıldığında ses çıkar Ana anahtar olmamasına izin ver Seçili kimlik bilgisi yoksa \"Aç\" düğmesine dokunmaya izin verir - Yazma korumalı - Veri tabanını öntanımlı olarak salt okunur aç Eğitim ipuçları Uygulamanın nasıl çalıştığını öğrenmek için ögeleri vurgulayın Eğitici ipuçlarını sıfırla diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5c08cfcb6..7e2dca9e4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -314,8 +314,6 @@ Виділяти елементи, щоб дізнатися, як працює застосунок Навчальні підказки Автозбереження бази даних - Типово відкривати базу даних лише для читання - Захист від запису Видаляти пароль, введений після спроби з\'єднання з базою даних Видаляти пароль Дозволяє натискання «Відкрити», якщо не вибрано головний пароль diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index b2c1205a7..19f93744c 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -568,8 +568,6 @@ Cho phép nhấn vào nút \"Mở\" nếu không có thông tin xác thực nào được chọn Xóa mật khẩu Xóa mật khẩu đã nhập sau khi cố gắng kết nối với cơ sở dữ liệu - Bảo vệ chống ghi - Mở cơ sở dữ liệu ở chế độ chỉ đọc theo mặc định Tự động lưu cơ sở dữ liệu Lưu cơ sở dữ liệu sau mỗi hành động quan trọng (ở chế độ \"Có thể sửa đổi\") Giữ màn hình luôn bật diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a53d4b5e0..d6d8858b9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -190,8 +190,6 @@ 其他 键盘 魔法键盘 - 写入保护(只读模式) - 默认以只读方式打开数据库 下载 贡献 应用中使用的主题 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 51dfa818b..3ea1a9310 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -218,8 +218,6 @@ 自動儲存資料庫 高亮界面元素來學習本應用工作方式 教學提示 - 預設以唯讀方式開啟資料庫 - 寫入保護(唯讀模式) 已儲存加密密碼 加密 加密演算法 diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 394e1dee0..f563e16ad 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -67,8 +67,6 @@ false delete_entered_password_key true - enable_read_only_key - false enable_auto_save_database_key true enable_keep_screen_on_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8fe153bda..0ec99e00d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -575,8 +575,6 @@ Allows tapping the \"Open\" button if no credentials are selected Delete password Deletes the password entered after a connection attempt to a database - Write-protected - Open the database read-only by default Autosave database Save the database after every important action (in \"Modifiable\" mode) Keep screen on From 8fbbaae05b499710ec411c3ffec4652300f96809 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:54 +0200 Subject: [PATCH 31/88] Translated using Weblate (English) Currently translated at 99.8% (665 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/en/ --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a49a08cee..ba1c4a918 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,7 +22,7 @@ Contribution Feedback Homepage - Android implementation of the KeePass password manager + Android implementation of the KeePass password manager. Accept Add entry Edit entry @@ -738,4 +738,4 @@ Expired entries are not shown Hide templates Templates are not shown - \ No newline at end of file + From dfd18e3c7f5a9b351956235c57f3f1058af0c87d Mon Sep 17 00:00:00 2001 From: Masowick Date: Thu, 28 Aug 2025 18:15:35 +0200 Subject: [PATCH 32/88] Translated using Weblate (German) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/ --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 56ee759a9..f70cea3ab 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -25,7 +25,7 @@ Beiträge Feedback Webseite - Android-Implementierung des Passwortmanagers KeePass + Android-Implementierung des Passwortmanagers KeePass. Akzeptieren Eintrag hinzufügen Gruppe hinzufügen From 98e15a77174c75b2d3497438cdb7fb3ac9a4ff6a Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Fri, 29 Aug 2025 02:58:02 +0200 Subject: [PATCH 33/88] Translated using Weblate (Japanese) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ja/ --- app/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2881981de..c389eebcf 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -21,7 +21,7 @@ 貢献 フィードバック ホームページ - KeePass パスワード マネージャーの Android 実装 + KeePassパスワードマネージャーのAndroid実装版。 承認 エントリーを追加 エントリーを編集 From 1916b79df1ab665eb0e12470aa8554691d11b356 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 34/88] Translated using Weblate (Lithuanian) Currently translated at 60.2% (401 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/lt/ --- app/src/main/res/values-lt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 5f1a45faf..076f357a2 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -434,4 +434,4 @@ Įrenginio atrakinimo atpažinimas Rodyti užrakto mygtuką Turinys - \ No newline at end of file + From 4ff483a8d21c847767377c7efa2e2500b55aa740 Mon Sep 17 00:00:00 2001 From: Stephan Paternotte Date: Thu, 28 Aug 2025 19:24:31 +0200 Subject: [PATCH 35/88] Translated using Weblate (Dutch) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nl/ --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4cd1cbaa6..3ba36cb11 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -21,7 +21,7 @@ --> Feedback Startpagina - Android-implementatie van KeePass-wachtwoordmanager + Android-implementatie van de KeePass-wachtwoordmanager. Accepteren Item toevoegen Groep toevoegen From a9e139ff7e81196b7a38630dde1df430f6f1d1b7 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 36/88] Translated using Weblate (Norwegian Nynorsk) Currently translated at 42.6% (284 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nn/ --- app/src/main/res/values-nn/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 2a2f2f390..d546cc659 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -331,4 +331,4 @@ Viser forgrunns- og bakgrunnsfargar for ei oppføring Vel ein ikonpakke Endre programmets ikonpakke - \ No newline at end of file + From 4f7afd7c97b7c0813c9a633f3a306db1e2736dcf Mon Sep 17 00:00:00 2001 From: Matthaiks Date: Thu, 28 Aug 2025 17:04:46 +0200 Subject: [PATCH 37/88] Translated using Weblate (Polish) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/ --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 04c8bab15..980c7fe89 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -19,7 +19,7 @@ --> Zgłoś błąd lub sugestię Strona główna - Implementacja menedżera haseł KeePass w systemie Android + Implementacja menedżera haseł KeePass w systemie Android. Akceptuj Dodaj wpis Dodaj grupę From 98314c466f44def6d4cfb9e200cc2af198cbbe71 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 38/88] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.6% (664 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ab5ca2122..981890f9f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -707,4 +707,4 @@ Não é recomendável adicionar um arquivo-chave grande, pois isso pode impedir a abertura do banco de dados. Ocultar modelos Os modelos não são exibidos - \ No newline at end of file + From 5d002f5128fcd5d082a2e55d2c76f2e719d8b14d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Fri, 29 Aug 2025 05:41:16 +0200 Subject: [PATCH 39/88] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 962e34115..416b4b2b2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -19,7 +19,7 @@ --> 反馈 主页 - Android 平台上基于 KeePass 实现的密码管理器 + Android 平台 KeePass 密码管理器实现。 接受 添加条目 添加分组 From 6b1d8d24dd557af5ad945f8303f906e52feb27f4 Mon Sep 17 00:00:00 2001 From: Telaneo Date: Fri, 29 Aug 2025 02:52:57 +0200 Subject: [PATCH 40/88] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/ --- app/src/main/res/values-nb/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 5f8f7aca4..618182f4b 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -19,7 +19,7 @@ --> Tilbakemelding Hjemmeside - Android-implementasjon av KeePass-passordsbehandleren + Android-implementasjon av KeePass-passordsbehandleren. Godta Legg til oppføring Rediger oppføring From fd25d21c72a68bb917d157f13ce5992b91d817a0 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 41/88] Translated using Weblate (Hindi) Currently translated at 21.9% (146 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hi/ --- app/src/main/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index d92e6dd67..c7f263b46 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -167,4 +167,4 @@ फ़ाइल डेटा को अपलोड करते समय एक त्रुटि हुई। फ़ाइल डेटा पहले से उपलब्ध है। जानकारी - \ No newline at end of file + From 01b1b74c6ac32ff13c2b22fd1854fcb26d992c01 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 42/88] Translated using Weblate (Bengali (Bangladesh)) Currently translated at 13.3% (89 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/bn_BD/ --- app/src/main/res/values-bn-rBD/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index dd388e5a1..3817af94d 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -90,4 +90,4 @@ নিম্নরেখা প্রবেশ অনুসন্ধান - \ No newline at end of file + From 7a295c254183e5c83b00649977975abced85ef72 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 43/88] Translated using Weblate (Punjabi) Currently translated at 48.4% (323 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pa/ --- app/src/main/res/values-pa/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index c09c72d82..23438c2a5 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -346,4 +346,4 @@ <strong>ਹਿੱਸਾ ਪਾ ਕੇ</strong>, ਤੁਹਾਡੇ ਹਿੱਸਾ ਪਾਉਣ ਲਈ ਬਹੁਤ ਧੰਨਵਾਦ ਹੈ। UUID ਵੇਖਾਓ - \ No newline at end of file + From c3bc8906655d6a915fb6dd79223b9f2f358499da Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 44/88] Translated using Weblate (Malayalam) Currently translated at 56.4% (376 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ml/ --- app/src/main/res/values-ml/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 6f9b1e174..5a5c85665 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -405,4 +405,4 @@ സിവിവി നമ്പർ ടെബിറ്റ്/ ക്രെഡിറ്റ് കാർഡ് - \ No newline at end of file + From 17c98f7fea917d0a8bb54d58657a62b91aff00ce Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 45/88] Translated using Weblate (Indonesian) Currently translated at 99.6% (664 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/id/ --- app/src/main/res/values-in/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 9252f367e..105d085af 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -685,4 +685,4 @@ Jumlah entri rekursif Tidak disarankan menambahkan berkas kunci yang besar, ini dapat mencegah pembukaan basis data. Sembunyikan templat - \ No newline at end of file + From a9a5047949cec3accaf22a2c197c7e4f84cc6075 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 46/88] Translated using Weblate (Persian) Currently translated at 43.8% (292 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fa/ --- app/src/main/res/values-fa/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index f8156896f..9008cd00e 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -318,4 +318,4 @@ الگو ها اطلاعات رمز یکبار مصرف اطلاعات اعتبار نامه - \ No newline at end of file + From 2da8552a53f828e5f3702ee6a6cfbaa453b421c9 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 47/88] Translated using Weblate (Javanese) Currently translated at 3.6% (24 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/jv/ --- app/src/main/res/values-jv/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index fbd5c6ef0..2c3dbd7db 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -27,4 +27,4 @@ Ngarep Urun Rembuk Nomer Hape - \ No newline at end of file + From 35e224d2277ebbe446a48c56998542426477986d Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 48/88] Translated using Weblate (Portuguese) Currently translated at 99.6% (664 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt/ --- app/src/main/res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 6d6e62b19..1bff5ed96 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -685,4 +685,4 @@ Não é recomendado adicionar um arquivo-chave grande, pois isso pode impedir a abertura do banco de dados. Ocultar modelos Os modelos não são mostrados - \ No newline at end of file + From 69ac6e669816d92695de1128fc7fa8393f0e5491 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 49/88] Translated using Weblate (Serbian (Latin script)) Currently translated at 59.0% (393 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sr_Latn/ --- app/src/main/res/values-b+sr+Latn/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 299931ba0..595ce47e8 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -413,4 +413,4 @@ Paralelizam Stepen paralelizma (tj. broj niti) koji koristi funkcija izvođenja ključa. Čuvanje baze podataka… - \ No newline at end of file + From fd98dbeebeecc34a61dd2399eccca2a3e76fc36e Mon Sep 17 00:00:00 2001 From: 109247019824 <109247019824@users.noreply.hosted.weblate.org> Date: Fri, 29 Aug 2025 06:54:01 +0200 Subject: [PATCH 50/88] Translated using Weblate (Bulgarian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/bg/ --- app/src/main/res/values-bg/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 0b11d4b5e..a0e11b89b 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -22,7 +22,7 @@ Продължителност на съхранение в клипборда (ако се поддържа от вашето устройство) Някои устройства не позволяват на приложенията да използват клипборда. Заглавие - Версия за Андроид на приложението за управление на пароли KeePass + Разработка за Андроид на приложението за управление на пароли KeePass. Запазване Потвърждаване на парола Функция за извличане на ключ From c0f32254bb82304e0659d12f6b25dc5e5b48594e Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 51/88] Translated using Weblate (Esperanto) Currently translated at 21.1% (141 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/eo/ --- app/src/main/res/values-eo/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index e2fbb65f3..4c3e117dc 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -153,4 +153,4 @@ Por krei, malfermi kaj konservi datumbazaj dosieroj necesiĝas dosier-manipulilo, kiu akceptas intenco-agojn ACTION_CREATE_DOCUMENT kaj ACTION_OPEN_DOCUMENT. Periodo de malaktiveco antaŭ ŝlosado de datumbazo Etendita ASCII - \ No newline at end of file + From 994f174300659f9cfc4a0a0312d3a59c479d3ab4 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:55 +0200 Subject: [PATCH 52/88] Translated using Weblate (Marathi) Currently translated at 1.2% (8 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/mr/ --- app/src/main/res/values-mr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 51cd01a6d..0611f4bcf 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -9,4 +9,4 @@ राणी चावी गट जोडा सुरक्षा - \ No newline at end of file + From 3a72b32b4a6f98cf0da6a50cd8903f455404e7dc Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 53/88] Translated using Weblate (Slovenian) Currently translated at 9.7% (65 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sl/ --- app/src/main/res/values-sl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index a84ca1d1b..fc6238358 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -66,4 +66,4 @@ Zadnji dostop Kopiraj Doniraj - \ No newline at end of file + From 041b1fbf539ef3d261bdd0bf9fd0584709159555 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 54/88] Translated using Weblate (Burmese) Currently translated at 6.4% (43 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/my/ --- app/src/main/res/values-my/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 6fdd37b48..dd4233c6d 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -44,4 +44,4 @@ Password စစ်ဆေးရန် ဟက်ဝဲလ် ကီး စစ်ဆေးရန် ပစ္စည်း ရှေ့မျက်နှာစာ အရောင် - \ No newline at end of file + From 71739de91a532bdf621195458a0a365cab27775f Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 55/88] Translated using Weblate (Cantonese (Traditional Han script)) Currently translated at 19.9% (133 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/yue_Hant/ --- app/src/main/res/values-b+yue+Hant/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-b+yue+Hant/strings.xml b/app/src/main/res/values-b+yue+Hant/strings.xml index da7afd41f..8f0a4ff22 100644 --- a/app/src/main/res/values-b+yue+Hant/strings.xml +++ b/app/src/main/res/values-b+yue+Hant/strings.xml @@ -139,4 +139,4 @@ 銀行名稱 網址 用戶名 - \ No newline at end of file + From fdfd124fee7f1f3dea6d89121225b5bad602ea42 Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 56/88] Translated using Weblate (Serbian) Currently translated at 50.3% (335 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sr/ --- app/src/main/res/values-sr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 3f65c63b8..1abf559e2 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -343,4 +343,4 @@ Чување базе података… Извршавање команде… Сортирај - \ No newline at end of file + From a57043f49664bac03d1e528fcbc438d3144397ac Mon Sep 17 00:00:00 2001 From: weblator Date: Thu, 28 Aug 2025 16:56:56 +0200 Subject: [PATCH 57/88] Translated using Weblate (Azerbaijani) Currently translated at 96.8% (645 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/az/ --- app/src/main/res/values-az/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 0a0be5328..03bb1f751 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -658,4 +658,4 @@ Məlumat bazasını kilidlədikdən sonra avtomatik olaraq əvvəlki klaviaturaya geri dön Özəl sahələr (bölmə) Əvvəlki klaviaturaya geri dön - \ No newline at end of file + From 3021ed158b1899582a617420adb0f79d404861e5 Mon Sep 17 00:00:00 2001 From: XiveZ Date: Fri, 29 Aug 2025 07:02:51 +0200 Subject: [PATCH 58/88] Added translation using Weblate (Belarusian) --- app/src/main/res/values-be/strings.xml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 app/src/main/res/values-be/strings.xml diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml new file mode 100644 index 000000000..55344e519 --- /dev/null +++ b/app/src/main/res/values-be/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file From ef8685f0e781fd02895e9c4bc01cad5d0dab7168 Mon Sep 17 00:00:00 2001 From: jonnysemon Date: Fri, 29 Aug 2025 07:11:24 +0200 Subject: [PATCH 59/88] Translated using Weblate (Arabic) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/ --- app/src/main/res/values-ar/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 05050c03b..6ec22a154 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -105,7 +105,7 @@ انسخ حقل اقفل قاعدة البيانات أرسل انطباعاتك - \"KeePassDX\" هو تطبيق أندرويد لمدير كلمات السر كي باس \"KeePass\" + تطبيق أندرويد لمدير كلمات السر KeePass. أضف مدخل عدّل مدخل وظيفة اشتقاق المفتاح From ef6aeceb20cbdb2f548e5718e92051ba43868908 Mon Sep 17 00:00:00 2001 From: XiveZ Date: Fri, 29 Aug 2025 07:18:09 +0200 Subject: [PATCH 60/88] Translated using Weblate (Belarusian) Currently translated at 5.2% (35 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/be/ --- app/src/main/res/values-be/strings.xml | 37 +++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 55344e519..ec7b06537 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,3 +1,38 @@ - \ No newline at end of file + Сувязь + Інфармацыя + Ахвяраваць + Зваротная сувязь + Хатняя старонка + Рэалізацыя менеджара пароляў KeePass для Android. + Ухваліць + Дадаць запіс + Рэдагаваць запіс + Дадаць групу + Галоўны ключ + Бяспека + Шыфраванне + Алгарытм шыфравання + Функцыя вываду ключа + Таймаўт + Час прастою перад блакіроўкай базы дадзеных + Праграма + Пашыраны ASCII + Для стварэння, адкрыцця і захавання файлаў базы дадзеных патрабуецца файлавы менеджар, які прымае дзеянні ACTION_CREATE_DOCUMENT і ACTION_OPEN_DOCUMENT. + Дазволіць + Буфер абмену ачышчаны + Памылка буфера абмену + Некаторыя прылады не дазваляюць праграмам выкарыстоўваць буфер абмену. + Не атрымалася ачысціць буфер абмену + Час чакання буфера абмену + Працягласць захоўвання ў буферы абмену (калі падтрымліваецца вашай прыладай) + Адкрыць файл + Дадаць вузел + Дадаць запіс + Дадаць групу + Дадаць элемент + Інфармацыя пра файл + Інфармацыя аб паўнамоцтвах + One-time password info + From 90b68fd972e197b0ef984ddc0bef7da968980c17 Mon Sep 17 00:00:00 2001 From: Ghost of Sparta Date: Fri, 29 Aug 2025 18:24:46 +0200 Subject: [PATCH 61/88] Translated using Weblate (Hungarian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hu/ --- app/src/main/res/values-hu/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 9026ac20c..24fac74bb 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -19,7 +19,7 @@ --> Visszajelzés Honlap - A KeePass jelszókezelő androidos megvalósítása + A KeePass jelszókezelő androidos megvalósítása. Elfogadás Bejegyzés hozzáadása Csoport hozzáadása From 90c43acfbf9ea40d01bb0cf40a343055206e75af Mon Sep 17 00:00:00 2001 From: XiveZ Date: Fri, 29 Aug 2025 07:56:04 +0200 Subject: [PATCH 62/88] Translated using Weblate (Belarusian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/be/ --- app/src/main/res/values-be/strings.xml | 659 ++++++++++++++++++++++++- 1 file changed, 645 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index ec7b06537..f99687527 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,12 +1,12 @@ - Сувязь - Інфармацыя - Ахвяраваць + Кантакт + Iнфа + Унёсак Зваротная сувязь Хатняя старонка - Рэалізацыя менеджара пароляў KeePass для Android. - Ухваліць + Android рэалізацыя мэнэджара пароляў KeePass. + Прыняць Дадаць запіс Рэдагаваць запіс Дадаць групу @@ -14,25 +14,656 @@ Бяспека Шыфраванне Алгарытм шыфравання - Функцыя вываду ключа - Таймаўт - Час прастою перад блакіроўкай базы дадзеных + Функцыя вывядзення ключа + Тайм-аўт + Час бяздзейнасці перад блакаваннем базы дадзеных Праграма Пашыраны ASCII - Для стварэння, адкрыцця і захавання файлаў базы дадзеных патрабуецца файлавы менеджар, які прымае дзеянні ACTION_CREATE_DOCUMENT і ACTION_OPEN_DOCUMENT. + Каб ствараць, адкрываць і захоўваць файлы базы дадзеных, патрабуецца файлавы мэнэджар, які прымае дзеянні ACTION_CREATE_DOCUMENT і ACTION_OPEN_DOCUMENT. Дазволіць Буфер абмену ачышчаны Памылка буфера абмену Некаторыя прылады не дазваляюць праграмам выкарыстоўваць буфер абмену. - Не атрымалася ачысціць буфер абмену - Час чакання буфера абмену - Працягласць захоўвання ў буферы абмену (калі падтрымліваецца вашай прыладай) + Не ўдалося ачысціць буфер абмену + Тайм-аўт буфера абмену + Працягласць захоўвання ў буферы абмену (калі падтрымліваецца прыладай) Адкрыць файл Дадаць вузел Дадаць запіс Дадаць групу Дадаць элемент Інфармацыя пра файл - Інфармацыя аб паўнамоцтвах - One-time password info + Інфармацыя пра ўліковыя дадзеныя + Інфармацыя пра аднаразовы пароль + Дужкі + Фон + Даччыныя вузлы + Сцяжок пароля + Сцяжок файла ключа + Сцяжок апаратнага ключа + Паўтарыць пераключэнне бачнасці пароля + Значок запісу + Колер базы дадзеных + Колер пярэдняга плану запісу + Колер фону запісу + Загаловак навігацыі + Навігацыйны скрыню адкрыты + Навігацыйны скрыню зачынены + Праверыць + Адхіліць змены? + Адхіліць + Генератар пароляў + Даўжыня пароля + Колькасць слоў парольнай фразы + Дадаць поле + Дадаць укладанне + Выдаліць поле + Абнавіць + Сцерці + Закрыць палі + Выберыце, каб скапіяваць %1$s у буфер абмену + Атрыманне ключа базы дадзеных… + Чаканне запыту выкліку… + Чаканне адказу на выклік… + База дадзеных + Шаблоны + Расшыфроўка змесціва базы дадзеных… + Выкарыстоўваць як базу дадзеных па змаўчанні + Лічбы + KeePassDX © %1$d Kunzisoft з\'яўляецца праграмай з адкрытым зыходным кодам і без рэкламы. \nПрадастаўляецца «як ёсць», па ліцэнзіі GPLv3, без якіх-небудзь гарантый. + Карыстальніцкія дадзеныя не атрымліваюцца, гэтая праграма не падключаецца да сервераў, працуе толькі лакальна і цалкам паважае прыватнасць карыстальнікаў. + Каб захаваць нашу свабоду, выпраўляць памылкі, дадаваць функцыі і заўсёды быць актыўнымі, мы разлічваем на ваш уклад. + Доступ + Адмена + Заўвагі + Пацвердзіць пароль + Створаны + Тэрмін дзеяння + Скончыўся + UUID + Гісторыя + Укладанні + Файл ключа + Апаратны ключ + Зменены + Магчымасць пошуку + Успадкаваць + Аўта-ўвод + Паслядоўнасць аўта-ўводу + Не ўдалося знайсці дадзеныя запісу. + Пароль + Тэгі + Карыстальніцкія дадзеныя + Захаваць + Назва + Наладзіць аднаразовы пароль + Тып OTP + Сакрэт + Перыяд (секунды) + Лічыльнік + Лічбы + Фільтры пошуку + Алгарытм + Цяперашняя група + З улікам рэгістра + Рэгулярны выраз + Дэбетавая / Крэдытная карта + Уладальнік + Нумар + CVV + PIN + Пасведчанне асобы + Назва + Месца выдачы + Дата выдачы + Электронная пошта + Адрас электроннай пошты + Wi-Fi + SSID + Тып + Крыптавалютны кашалёк + Токен + Адкрыты ключ + Закрыты ключ + Насенне + Рахунак + Банк + Назва банка + SWIFT / BIC + IBAN + Бяспечная нататка + Членства + Стандартны + Шаблон + Версія + OTP + URL + Імя карыстальніка + Патокавы шыфр Arcfour не падтрымліваецца. + Не ўдалося апрацаваць гэты URI ў KeePassDX. + Не ўдалося стварыць файл. + Не ўдалося прачытаць базу дадзеных. + Пераканайцеся, што шлях правільны. + Няправільны сакрэт OTP. + Увядзіце імя. + Гэтае слова зарэзервавана і не можа быць выкарыстана. + Выберыце файл ключа. + Выберыце апаратны ключ. + Не хапае памяці для загрузкі ўсёй базы дадзеных. + XML мае няправільны фармат. + Не ўдалося загрузіць базу дадзеных. + Не ўдалося загрузіць ключ. Паспрабуйце знізіць Выкарыстанне памяці KDF. + Павінен быць абраны хаця б адзін тып генерацыі пароляў. + Павінен быць усталяваны хаця б адзін набор уліковых дадзеных. + Паролі не супадаюць. + Колькасць цыклаў пераўтварэння занадта высокая. Устаноўка 2147483648. + Кожны радок павінен мець назву поля. + Гэтая метка ўжо існуе. + Увядзіце станоўчае цэлае лік у полі Даўжыня. + Не ўдалося ўключыць службу аўтазапаўнення. + Вы не можаце перамясціць групу сюды. + Вы не можаце перамясціць запіс сюды. + Вы не можаце скапіяваць запіс сюды. + Вы не можаце скапіяваць групу сюды. + Немагчыма стварыць файл базы дадзеных. + Немагчыма стварыць базу дадзеных з гэтым паролем і файлам ключа. + Не ўдалося захаваць базу дадзеных. + Сакрэтны ключ павінен быць у фармаце Base32. + Даўжыня сакрэтнага ключа павінна быць не менш за %1$d сімвалаў. + Лічыльнік павінен быць паміж %1$d і %2$d. + Перыяд павінен быць ад %1$d да %2$d секунд. + Токен павінен утрымоўваць ад %1$d да %2$d лічбаў. + Існуючы тып OTP не распазнаецца гэтай формай, яго праверка можа больш не генераваць токен правільна. + Гэты тэкст не супадае з запытаным элементам. + Захаванне новага элемента недапушчальна ў базе дадзеных, адкрытай толькі для чытання. + Назва поля ўжо існуе. + Немагчыма атрымаць URI базы дадзеных. + Не ўдалося правільна аднавіць спіс. + Файл, які вы спрабуеце загрузіць, занадта вялікі. + Адбылася памылка пры загрузцы дадзеных файла. + Дадзеныя файла ўжо існуюць. + Адбылася памылка пры выдаленні дадзеных файла. + Адбылася памылка пры выкананні дзеянняў з базай дадзеных. + Выклік ужо запытаны. + Адказнае дзеянне ўжо выканана. + Немагчыма атрымаць адказ на выклік. + Скасавана карыстальнікам. + Патрабуецца драйвер для %1$s. + Немагчыма аб\'яднаць з файламі базы дадзеных kdb. + Месцазнаходжанне базы дадзеных невядома, дзеянне з базай дадзеных не можа быць выканана. + Апаратны ключ не падтрымліваецца. + Ключ не можа быць пустым. + Назва поля + Значэнне поля + Не ўдалося знайсці файл. Паспрабуйце зноў адкрыць яго з файлавага мэнэджара. + Пашкоджаны файл. + Файлавы мэнэджар + Стварыць пароль + Стварыць файл ключа + Пацвердзіць пароль + Згенераваны пароль + Назва групы + Назва значка + Файл ключа + Даўжыня + Пароль + Пароль + Парольная фраза + Не ўдалося прачытаць уліковыя дадзеныя. + Няправільны алгарытм. + %1$s з такім жа UUID %2$s ужо існуе. + Не ўдалося распазнаць фармат базы дадзеных. + Файл ключа пусты. + Даўжыня + Вузлы + Схаваць паролі + Маскіраваць паролі (***) па змаўчанні + Размаляваць паролі + Размаляваць сімвалы пароля па тыпу + Паказаць імёны карыстальнікаў + Адлюстроўвае імёны карыстальнікаў у спісах запісаў + Паказаць колькасць запісаў + Адлюстроўвае колькасць запісаў у групе + Рэкурсіўная колькасць запісаў + Рэкурсіўна падлічвае колькасць запісаў у групе + Паказаць токен OTP + Адлюстроўвае токены OTP у спісе запісаў + Паказаць UUID + Адлюстроўвае UUID, прывязаны да запісу або групы + Памер элементаў спісу + Памер тэксту ў спісе элементаў + Стварэнне базы дадзеных… + Загрузка базы дадзеных… + Ніжні рэгістр + Аб праграме + Змяніць галоўны ключ + Копія %1$s + Налады + Налады праграмы + Пошук, блакаванне, гісторыя, уласцівасці + Запаўненне формы + Клавіятура, аўтазапаўненне, буфер абмену + Разблакіроўка прылады + Біяметрыя, уліковыя дадзеныя прылады + Налады базы дадзеных + Метададзеныя, смеццевая скрыня, шаблоны, гісторыя + Налады бяспекі + Шыфраванне, функцыя вывядзення ключа + Налады галоўнага ключа + Змена, аднаўленне + Ахвяраваць + Рэдагаваць + Капіяваць + Перамясціць + Уставіць + Выдаліць + Адмена + Схаваць пароль + Заблакаваць базу дадзеных + Захаваць дадзеныя + Аб\'яднаць дадзеныя + Перазагрузіць дадзеныя + Аб\'яднаць з… + Захаваць копію ў… + Адкрыць + Пошук + Паказаць пароль + Выдаліць ключ разблакіроўкі прылады + Перайсці па URL + Абаронены ад запісу + З магчымасцю змены + Ачысціць смеццевую скрыню + Аднавіць гісторыю + Выдаліць гісторыю + Знешні значок + Мінус + Ніколі + Няма вынікаў пошуку + Усталюйце вэб-браўзер, каб адкрыць гэты URL. + Адкрыць існуючае сховішча + Стварыць новае сховішча + Хуткі пошук + Запытаць пошук пры адкрыцці базы дадзеных + Пошук па паддаменах + Пошук вэб-даменаў з абмежаваннямі паддаменаў + Стварэнне новай базы дадзеных… + Працую… + Абарона + Абаронены ад запісу + У залежнасці ад вашага файлавага мэнэджара, KeePassDX можа не мець дазволу на запіс у сховішча. + База дадзеных змяшчае дублікаты UUID. + Вырашыць праблему шляхам генерацыі новых UUID для дублікатаў, каб працягнуць? + Рэжым пошуку + Рэжым захавання + Рэжым выбару + Рэжым рэгістрацыі + Запамінаць размяшчэнне баз дадзеных + Адсочвае, дзе захоўваюцца базы дадзеных + Запамінаць размяшчэнне файлаў ключоў + Адсочвае, дзе захоўваюцца файлы ключоў + Запамінаць апаратныя ключы + Адсочвае выкарыстаныя апаратныя ключы + Паказваць апошнія файлы + Паказваць размяшчэнне нядаўніх баз дадзеных + Схаваць зламаныя спасылкі на базы дадзеных + Схаваць зламаныя спасылкі ў спісе нядаўніх баз дадзеных + Імпартаваць налады праграмы + Выберыце файл для імпарту налад праграмы + Экспартаваць налады праграмы + Стварыць файл для экспарту налад праграмы + Уласцівасці KeePassDX для кіравання наладамі праграмы + Налады праграмы імпартаваны + Памылка падчас імпарту налад праграмы. + Налады праграмы экспартаваны + Памылка падчас экспарту налад праграмы. + Корань + Алгарытм шыфравання базы дадзеных, які выкарыстоўваецца для ўсіх дадзеных + Каб стварыць ключ для алгарытму шыфравання, галоўны ключ пераўтворыцца з дапамогай выпадкова саленай функцыі вывядзення ключа. + Цыклы пераўтварэння + Дадатковыя цыклы шыфравання забяспечваюць больш высокую абарону ад нападаў грубай сілы, але могуць моцна запаволіць загрузку і захаванне. + Выкарыстанне памяці + Аб\'ём памяці, які будзе выкарыстоўвацца функцыяй вывядзення ключа. + Паралелізм + Ступень паралелізму (г.зн. колькасць патокаў), выкарыстоўваных функцыяй вывядзення ключа. + Захаванне базы дадзеных… + Выкананне каманды… + Не зачыняйце праграму… + Прабел + Фільтр + Сартаваць + Спачатку ніжэйшыя ↓ + Групы спачатку + Смеццевая скрыня ўнізе + Натуральны парадак + Назва + Імя карыстальніка + Стварэнне + Змена + Доступ + Спецыяльныя + Пошук + Падкрэсліванне + Непадтрымліваемая версія базы дадзеных. + ВЕРХНІ РЭГІСТР + Папярэджанне + Пазбягайце сімвалаў пароляў па-за межамі фармату кадоўкі тэксту ў файле базы дадзеных (нераспазнаныя сімвалы пераўтвараюцца ў адну і тую ж літару). + Дайце дазвол на запіс у файл, каб захаваць змены ў базе дадзеных + Доступ да файла скасаваны файлавым мэнэджарам + База дадзеных ужо адкрыта, спачатку зачыніце яе, каб адкрыць новую + Працягнуць без абароны блакаваннем паролем? + Працягнуць без ключа шыфравання? + Беззваротна выдаліць выбраныя вузлы? + Беззваротна выдаліць усе вузлы са смеццевай скрыні? + База дадзеных KeePass павінна ўтрымліваць толькі невялікія службовыя файлы (напрыклад, файлы PGP-ключа).\n\nВаша база дадзеных можа стаць вельмі вялікай і знізіць прадукцыйнасць пасля гэтай загрузкі. + Загрузка гэтага файла заменіць існуючы. + Усё роўна дадаць файл? + Выдаленне незвязаных дадзеных можа паменшыць памер вашай базы дадзеных, але таксама можа выдаліць дадзеныя, якія выкарыстоўваюцца для плагінаў KeePass. + Усё роўна выдаліць гэтыя дадзеныя? + Не рэкамендуецца дадаваць пусты файл ключа. + Не рэкамендуецца дадаваць вялікі файл ключа, гэта можа перашкодзіць адкрыццю базы дадзеных. + Змесціва файла ключа ніколі не павінна змяняцца, і ў лепшым выпадку, павінна ўтрымліваць выпадкова згенераваныя дадзеныя. + Інфармацыя, якая змяшчаецца ў файле базы дадзеных, была зменена па-за межамі праграмы. + Аб\'яднаць дадзеныя, захаваць базу дадзеных з перазапісам знешніх мадыфікацый або перазагрузіць яе з апошнімі зменамі. + Перазагрузіць базу дадзеных з апошнімі зменамі. + Перазагрузка базы дадзеных выдаліць лакальна змененыя дадзеныя. + Доступ да файла скасаваны файлавым мэнэджарам, зачыніце базу дадзеных і зноў адкрыйце яе з яе месцазнаходжання. + Вы не дазволілі праграме выкарыстоўваць дакладны таймер. У выніку функцыі, якія патрабуюць таймера, не будуць выкананы з дакладным часам. + Цэласнасць файла не гарантуецца, бо Android можа змяняць яго дадзеныя на хаду. Зменіце пашырэнне файла на .bin для правільнай цэласнасці. + Дазвол на апавяшчэнні дазваляе адлюстроўваць статус базы дадзеных і блакаваць яе з дапамогай лёгкадаступнай кнопкі.\n\nКалі вы не актывуеце гэты дазвол, база дадзеных, адкрытая ў фонавым рэжыме, не будзе бачная, калі на пярэднім плане знаходзіцца іншая праграма. + Дазвол на апавяшчэнні неабходны для выкарыстання функцыі апавяшчэння аб буферы абмену. + Пазней + Спытаць + Аб\'яднанне паспяхова завершана + Дазвол + Версія %1$s + Зборка %1$s + Наладзіць + Біяметрычныя або ўліковыя дадзеныя прылады не зарэгістраваны. + Патрабуецца абнаўленне біяметрычнай бяспекі. + Сховішча ключоў неналежным чынам ініцыялізавана. + Спасылка на разблакіроўку прылады + Спасылка на разблакіроўку прылады + Вам усё роўна трэба памятаць асноўныя ўліковыя дадзеныя сховішча, калі вы выкарыстоўваеце распазнаванне разблакіроўкі прылады. + Распазнаванне разблакіроўкі прылады + Выняць уліковыя дадзеныя базы дадзеных з дапамогай дадзеных разблакіроўкі прылады + Зашыфраваны пароль захаваны + Немагчыма прачытаць ключ разблакіроўкі прылады. Выдаліце яго і паўтарыце працэдуру распазнавання разблакіроўкі. + Не ўдалося распазнаць адбітак разблакіроўкі прылады + Недаступна + Немагчыма ініцыялізаваць запыт разблакіроўкі прылады. + Увядзіце пароль, а затым націсніце гэтую кнопку. + Гісторыя + Уласцівасці + Знешні выгляд + Тэмы, колеры, атрыбуты + Біяметрычны + Уліковыя дадзеныя прылады + Агульнае + Аўтазапаўненне + Аўтазапаўненне формы KeePassDX + Увайсці з дапамогай KeePassDX + Уключыце аўтазапаўненне, каб хутка запаўняць формы ў іншых праграмах + Выбраць запіс… + Усталяваць службу аўтазапаўнення па змаўчанні + Налады аўтазапаўнення + Памер згенераванага пароля + Усталёўвае памер згенераваных пароляў па змаўчанні + Сімвалы пароля + Усталяваць дазволеныя сімвалы генератара пароляў + База дадзеных адкрыта + Буфер абмену + Капіюйце палі запісу, выкарыстоўваючы буфер абмену вашай прылады + Апавяшчэнні буфера абмену + Паказваць апавяшчэнні буфера абмену, каб капіяваць палі пры праглядзе запісу + Калі аўтаматычнае выдаленне з буфера абмену не ўдаецца, выдаліце яго гісторыю ўручную. + Блакаванне + Блакаванне экрана + Блакаваць базу дадзеных праз некалькі секунд пасля выключэння экрана + Націснуць «Назад», каб заблакаваць + Блакаваць базу дадзеных, калі карыстальнік націскае кнопку «Назад» на галоўным экране + Паказаць кнопку блакавання + Адлюстроўвае кнопку блакавання ў карыстальніцкім інтэрфейсе + Змесціва + Разблакіраваць + Разблакіроўка прылады + Націсніце, каб выдаліць ключы разблакіроўкі прылады + Выкарыстоўвайце разблакіроўку прылады, каб лягчэй адкрываць базу дадзеных + Біяметрычная разблакіроўка + Дазваляе сканаваць біяметрыю для адкрыцця базы дадзеных + Разблакіроўка з дапамогай уліковых дадзеных прылады + Дазваляе выкарыстоўваць уліковыя дадзеныя прылады для адкрыцця базы дадзеных + Запыт на аўтаматычнае адкрыццё + Аўтаматычна запытваць разблакіроўку прылады, калі база дадзеных наладжана на яе выкарыстанне + Часовая разблакіроўка прылады + Не захоўваць зашыфраванае змесціва для выкарыстання разблакіроўкі прылады + Тэрмін дзеяння разблакіроўкі прылады + Працягласць выкарыстання разблакіроўкі прылады перад выдаленнем яе змесціва + Тайм-аўт разблакіроўкі прылады + Выдаліць ключы шыфравання + Выдаліць усе ключы шыфравання, звязаныя з распазнаваннем разблакіроўкі прылады + Выдаліць усе ключы шыфравання, звязаныя з распазнаваннем разблакіроўкі прылады? + Гэтая функцыя будзе захоўваць зашыфраваныя дадзеныя ўліковых дадзеных у бяспечным Keystore вашай прылады.\n\nУ залежнасці ад рэалізацыі натыўнага API аперацыйнай сістэмы, яна можа быць не цалкам функцыянальнай.\n\nПраверце сумяшчальнасць і бяспеку Keystore з вытворцам вашай прылады і стваральнікам ПЗ, якое вы выкарыстоўваеце. + Не ўдалося запусціць гэтую функцыю. + Прылада працуе на Android %1$s, але патрабуецца %2$s або больш позняя версія. + Не ўдалося знайсці адпаведнае апаратнае забеспячэнне. + Імя файла + Шлях + Прызначыць галоўны ключ + Дадзеныя + Сцісканне дадзеных + Сцісканне дадзеных памяншае памер базы дадзеных + Выдаліць незвязаныя дадзеныя + Выдаляе ўкладанні, якія змяшчаюцца ў базе дадзеных, але не звязаны з запісам + Выкарыстанне смеццевай скрыні + Перамяшчае групы і запісы ў групу Смеццевая скрыня перад выдаленнем + Група смеццевай скрыні + Выкарыстанне шаблонаў + Выкарыстоўвайце дынамічныя шаблоны для запаўнення палёў запісу + Група шаблонаў + Максімальная колькасць + Абмежаваць колькасць элементаў гісторыі на запіс + Максімальны памер + Абмежаваць памер гісторыі на запіс + Рэкамендаваць абнаўленне + Рэкамендаваць змену галоўнага ключа (дні) + Прымусовае абнаўленне + Патрабаваць змены галоўнага ключа (дні) + Прымусовае абнаўленне наступным разам + Патрабаваць змены галоўнага ключа ў наступны раз (адзін раз) + Шрыфт поля + Змяніць шрыфт, які выкарыстоўваецца ў палях, для лепшай бачнасці сімвалаў + Давер буфера абмену + Дазволіць капіяванне пароля запісу і абароненых палёў у буфер абмену + Папярэджанне: Буфер абмену выкарыстоўваецца ўсімі праграмамі. Калі капіююцца канфідэнцыйныя дадзеныя, іншае праграмнае забеспячэнне можа аднавіць іх. + Уключыць + Адключыць + Апавяшчэнне + Ачысціць пры закрыцці + Блакаваць базу дадзеных пасля заканчэння тэрміну дзеяння буфера абмену або закрыцця апавяшчэння пасля пачатку выкарыстання + Назва базы дадзеных + Апісанне базы дадзеных + Імя карыстальніка па змаўчанні + Карыстальніцкі колер базы дадзеных + Версія базы дадзеных + Тэкст + Інтэрфейс + Іншае + Сцісканне + Няма + Gzip + Смеццевая скрыня + Шаблоны + Клавіятура + Магічная клавіятура + Актываваць карыстальніцкую клавіятуру, якая запаўняе вашыя паролі і ўсе палі ідэнтычнасці + Налады клавіятуры прылады + Магічная клавіятура + Магічная клавіятура (KeePassDX) + Налады магічнай клавіятуры + Запіс + Выбар запісу + Пры праглядзе запісу ў KeePassDX, запоўніце магічную клавіятуру гэтым запісам + Інфармацыя аб апавяшчэннях + Паказваць апавяшчэнне, калі запіс даступны + Захаваць агульную інфармацыю + Паспрабаваць захаваць агульную інфармацыю пры ручным выбары запісу для палягчэння будучага выкарыстання + Ачысціць пры закрыцці + Зачыніць базу дадзеных пры закрыцці апавяшчэння + Тайм-аўт + Тайм-аўт для ачысткі запісу клавіятуры + Запіс + %1$s даступны на магічнай клавіятуры + %1$s + Знешні выгляд + Тэма клавіятуры + Клавішы + Аўтаматычнае дзеянне клавішы + Дзеянне клавішы Go пасля націску на клавішу Поле + Вібрацыйныя націскі клавіш + Гукавыя націскі клавіш + Змяніць клавіятуру + Экран уліковых дадзеных базы дадзеных + Аўтаматычна пераключацца назад на папярэднюю клавіятуру на экране ўліковых дадзеных базы дадзеных + Экран пошуку + Аўтаматычна пераключацца назад на папярэднюю клавіятуру на экране пошуку + Пераключыцца назад + Аўтаматычна пераключацца назад на папярэднюю клавіятуру пасля выканання Аўтаматычнага дзеяння клавішы + Заблакаваць базу дадзеных + Аўтаматычна пераключацца назад на папярэднюю клавіятуру пасля блакавання базы дадзеных + Карыстальніцкія палі + Вярнуцца да папярэдняй клавіятуры + Выбраць запіс + Backspace + Enter + Зачыніць базу дадзеных + Зачыніць базу дадзеных пасля выбару аўтазапаўнення + Убудаваныя прапановы + Спрабаваць адлюстраваць прапановы аўтазапаўнення непасрэдна з сумяшчальнай клавіятуры + Ручной выбар + Адлюстраваць опцыю, каб дазволіць карыстальніку выбраць запіс базы дадзеных + Захаваць інфармацыю пошуку + Спрабаваць захаваць інфармацыю пошуку пры ручным выбары запісу для палягчэння будучага выкарыстання + Спытаць пра захаванне дадзеных + Спытаць пра захаванне дадзеных пасля завяршэння запаўнення формы + Чорны спіс праграм + Чорны спіс, які перашкаджае аўтазапаўненню праграм + Чорны спіс вэб-даменаў + Чорны спіс, які перашкаджае аўтазапаўненню вэб-даменаў + Заблакаваць аўтазапаўненне + Перазапусціце праграму, якая змяшчае форму, каб актываваць блакаванне. + Захаванне дадзеных недапушчальна для базы дадзеных, адкрытай толькі для чытання. + Прапановы аўтазапаўнення дададзены. + Дазволіць без галоўнага ключа + Дазваляе націснуць кнопку Адкрыць, калі не выбраны ўліковыя дадзеныя + Выдаліць пароль + Выдаляе ўведзены пароль пасля спробы падключэння да базы дадзеных + Абаронены ад запісу + Адкрываць базу дадзеных толькі для чытання па змаўчанні + Аўтазахаванне базы дадзеных + Захоўваць базу дадзеных пасля кожнага важнага дзеяння (у рэжыме З магчымасцю змены) + Трымаць экран уключаным + Трымаць экран уключаным пры праглядзе або рэдагаванні запісу + Рэжым скрыншота + Дазволіць староннім праграмам запісваць або рабіць скрыншоты праграмы + Навучальныя падказкі + Вылучыць элементы, каб даведацца, як працуе праграма + Скінуць навучальныя падказкі + Паказаць усю навучальную інфармацыю зноўку + Навучальныя падказкі скінуты + Стварыце свой файл базы дадзеных + Стварыце свой першы файл кіравання паролямі. + Адкрыць існуючую базу дадзеных + Адкрыйце свой папярэдні файл базы дадзеных з файлавага браўзера, каб працягнуць выкарыстоўваць яго. + Дадаць элементы ў вашу базу дадзеных + Запісы дапамагаюць кіраваць лічбавымі ідэнтыфікацыйнымі дадзенымі.\n\nГрупы (~тэчкі) арганізуюць запісы ў вашай базе дадзеных. + Пошук па запісах + Увядзіце назву, імя карыстальніка або змесціва іншых палёў, каб знайсці свае паролі. + Разблакіроўка базы дадзеных прылады + Прывяжыце свой пароль да адсканаванай біяметрыі або ўліковых дадзеных прылады, каб хутка разблакаваць базу дадзеных. + Рэдагаваць гэты запіс + Рэдагуйце свой запіс з дапамогай карыстальніцкіх палёў. Дадзеныя пула могуць спасылацца паміж рознымі палямі запісаў. + Стварыць надзейны пароль + Стварыце надзейны пароль, каб звязаць яго са сваім запісам, лёгка вызначыце яго ў адпаведнасці з крытэрыямі формы і не забудзьцеся пра бяспечны пароль. + Праверыць запіс + Не забудзьцеся праверыць свой запіс і захаваць базу дадзеных.\n\nКалі актывавана аўтаматычнае блакаванне і вы забыліся, што рабілі змены, вы рызыкуеце страціць свае дадзеныя. + Дадаць карыстальніцкія палі + Зарэгіструйце дадатковае поле, дадайце значэнне і пры жаданні абароніце яго. + Дадаць укладанне + Загрузіце ўкладанне ў свой запіс, каб захаваць важныя знешнія дадзеныя. + Наладзіць OTP + Наладзьце кіраванне аднаразовым паролем (HOTP / TOTP) для стварэння токена, які запытваецца для двухфактарнай аўтэнтыфікацыі (2FA). + Разблакаваць вашу базу дадзеных + Увядзіце пароль і/або файл ключа, каб разблакаваць базу дадзеных.\n\nСтварыце рэзервовую копію файла базы дадзеных у бяспечным месцы пасля кожнай змены. + Абараніць вашу базу дадзеных ад запісу + Змяніць рэжым адкрыцця для сеансу.\n\n\"Абаронены ад запісу\"- прадухіляе ненаўмысныя змены ў базе дадзеных.\n\"Мадыкафаны\"- дазваляе вам дадаваць, выдаляць або змяняць усе элементы, як пажадаеце. + Скапіяваць поле + Скапіяваныя палі можна ўставіць у любым месцы.\n\nВыкарыстоўвайце метад запаўнення формы, які вам больш падабаецца. + Заблакаваць базу дадзеных + Хутка заблакаваць базу дадзеных, вы можаце наладзіць праграму, каб яна блакавалася праз некаторы час і калі экран выключаецца. + Сартаванне элементаў + Выберыце, як сартаваць запісы і групы. + Удзельнічаць + Дапамажыце павысіць стабільнасць, бяспеку і дадаць больш функцый. + У адрозненне ад многіх праграм для кіравання паролямі, гэтая без рэкламы, копілефтнае свабоднае праграмнае забеспячэнне і не збірае персанальныя дадзеныя на сваіх серверах, незалежна ад версіі, якой вы карыстаецеся. + Купляючы pro-версію, вы атрымаеце доступ да гэтага візуальнага стылю і асабліва дапаможаце рэалізацыі грамадскіх праектаў. + Гэты візуальны стыль даступны дзякуючы вашай шчодрасці. + Унёсшы ўклад у праект (матэрыяльна, кодам, перакладам), вы дапаможаце яму працягваць жыць і развівацца, а таксама будзеце мець права на працэдуру разблакіроўкі тэмы. + Гэтая функцыя знаходзіцца ў стадыі распрацоўкі і патрабуе вашага ўкладу, каб неўзабаве стаць даступнай. + Купляючы pro-версію, + Унёсшы ўклад, + вы заахвочваеце распрацоўшчыкаў ствараць новыя функцыі і выпраўляць памылкі ў адпаведнасці з вашымі заўвагамі. + Вялікі дзякуй за ваш уклад. + Мы прыкладаем усе намаганні, каб хутка выпусціць гэтую функцыю. + Не забудзьцеся абнаўляць праграму, усталёўваючы новыя версіі. + Спампаваць + Унесці ўклад + Спампаваць %1$s + Загрузіць %1$s + Ініцыялізацыя… + Выконваецца: %1$d%% + Завяршэнне… + Гатова! + Скасавана! + Б + КіБ + МіБ + ГіБ + Энтрапія: %1$s біт + Энтрапія: Высокая + Энтрапія: Разлік… + Хаця б адзін сімвал з кожнай + Выключыць неадназначныя сімвалы + Разглядаць сімвалы + Падзяляльнік слоў + Ігнараваць сімвалы + ніжні рэгістр + ВЕРХНІ РЭГІСТР + Рэгістр загалоўкаў + Колькасць сімвалаў: %1$d + Рэжым скрыншота + Тэма праграмы + Тэма, якая выкарыстоўваецца ў праграме + Лес + Боскі + Класічны + Просты + Месяц + Сонца + Адказ + Кунцыт + Па сістэме + Яркасць тэмы + Выбраць светлыя або цёмныя тэмы + Светлая + Цёмная + Стандартны + Карыстальніцкі + Пакет значкоў + Пакет значкоў, які выкарыстоўваецца ў праграме + Колеры запісаў + Адлюстроўвае колеры пярэдняга плану і фону для запісу + Схаваць запісы з мінулым тэрмінам дзеяння + Запісы з мінулым тэрмінам дзеяння не паказваюцца + Схаваць шаблоны + Шаблоны не паказваюцца From 2e3ade1b4a1ec0df96aa12f074e84fb58e1c0a73 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sat, 30 Aug 2025 14:49:23 +0200 Subject: [PATCH 63/88] Translated using Weblate (Czech) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/cs/ --- app/src/main/res/values-cs/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c6ea23927..7d378ccdc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -19,7 +19,7 @@ Czech translation by Jan Vaněk --> Domovská stránka - Implementace správce hesel KeePass pro Android + Implementace správce hesel KeePass pro Android. Přijmout Přidat záznam Přidat skupinu From 1395af88d1f374d5fe5708e3f925d624d1f61f3d Mon Sep 17 00:00:00 2001 From: leap123 <76893443+leap0x7b@users.noreply.github.com> Date: Sat, 30 Aug 2025 18:15:56 +0200 Subject: [PATCH 64/88] Translated using Weblate (Indonesian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/id/ --- app/src/main/res/values-in/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 105d085af..105f26cf0 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -170,7 +170,7 @@ Rubah Entri Tambahkan Entri Terima - Implementasi Android dari pengelola kata sandi KeePass + Implementasi Android dari pengelola kata sandi KeePass. Beranda Umpan Balik Kontribusi @@ -515,7 +515,7 @@ Bantu meningkatkan stabilitas, keamanan, dan menambahkan lebih banyak fitur. Tidak seperti banyak aplikasi pengelola kata sandi, ini <strong>bebas iklan</strong>, <strong>perangkat lunak libre copyleft</strong>, dan tidak mengumpulkan data pribadi di peladennya, tidak peduli versi apa yang Anda gunakan. <strong>Gaya visual</strong> ini tersedia berkat kemurahan hati Anda. - Dengan <strong>berkontribusi<strong> kepada proyek <i>(dalam bentuk uang, kode, penerjemahan)<i>, Anda akan membantu proyek tersebut supaya terus hidup dan berkembang, dan Anda juga akan memenuhi syarat untuk prosedur pembukaan kunci <strong>tema<strong>. + Dengan berkontribusi kepada proyek (dalam bentuk uang, kode, penerjemahan), Anda akan membantu proyek tersebut supaya terus hidup dan berkembang, dan Anda juga akan memenuhi syarat untuk prosedur pembukaan kunci tema. Fitur ini <strong>sedang dalam pengembangan</strong> dan memerlukan <strong>kontribusi</strong> Anda untuk bisa tersedia segera. Tampilkan Token OTP Teks @@ -685,4 +685,5 @@ Jumlah entri rekursif Tidak disarankan menambahkan berkas kunci yang besar, ini dapat mencegah pembukaan basis data. Sembunyikan templat + Kunci rahasia minimal harus %1$d karakter. From 0053726d0b5f202feb8c686030ea81924ed36799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sat, 30 Aug 2025 08:30:53 +0200 Subject: [PATCH 65/88] Translated using Weblate (Estonian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/ --- app/src/main/res/values-et/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 9b5a56d03..7ea7712c6 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -1,7 +1,7 @@ Meie veebisait - KeePassi salasõnahalduri Androidi variant + KeePassi salasõnahalduri variant Androidile. Meie kontaktid Teave Nõustu @@ -84,7 +84,7 @@ Füüsilise võtme märkruut Mandaatide info Navigatsiooni päis - Laadime andmebaasi võtme… + Laadin andmebaasi võtit… Sõnu salafraasis Kasuta vaikeandmebaasina Viimati kasutatud @@ -128,7 +128,7 @@ Vali võtmefail. Salasõnad ei klapi. Andmebaasifaili loomine ei õnnestunud. - URL + Võrguaadress Faili loomine ei õnnestunud. Ühekordne salasõna Lõikelauale kopeeritud andmete hoidmise aeg (kui sinu seade sellist võimalust toetab) @@ -245,7 +245,7 @@ Loendite suurus Teksti suurus loendites Loome salasõnade andmebaasi… - Laadime salasõnade andmebaasi… + Laadin salasõnade andmebaasi… väiketähed Rakenduse teave Muuda peavõtit From c6b0ee27dfd22e7fd896a88d0c0a0ec5a85e1ac6 Mon Sep 17 00:00:00 2001 From: leap123 <76893443+leap0x7b@users.noreply.github.com> Date: Sat, 30 Aug 2025 18:24:13 +0200 Subject: [PATCH 66/88] Translated using Weblate (Indonesian) Currently translated at 100.0% (3 of 3 strings) Translation: KeePassDX/Metadata Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/id/ --- .../metadata/android/id/full_description.txt | 23 +++++++++++++++++++ .../metadata/android/id/short_description.txt | 1 + fastlane/metadata/android/id/title.txt | 1 + 3 files changed, 25 insertions(+) create mode 100644 fastlane/metadata/android/id/full_description.txt create mode 100644 fastlane/metadata/android/id/short_description.txt create mode 100644 fastlane/metadata/android/id/title.txt diff --git a/fastlane/metadata/android/id/full_description.txt b/fastlane/metadata/android/id/full_description.txt new file mode 100644 index 000000000..a61178a85 --- /dev/null +++ b/fastlane/metadata/android/id/full_description.txt @@ -0,0 +1,23 @@ +KeePassDX adalah pengaman dan pengelola kata sandi yang memungkinkan pengeditan data terenkripsi dalam satu berkas dalam format KeePass terbuka dan pengisian formulir dengan cara yang aman, tidak memerlukan koneksi internet, dan mengintegrasikan standar desain Android. Aplikasi ini sumber terbuka, tanpa iklan. + +Fitur + +- Membuat berkas/entri dan grup basis data. +- Mendukung berkas .kdb dan .kdbx (versi 1 hingga 4) dengan algoritma AES - Twofish - ChaCha20 - Argon2. +- Kompatibel dengan sebagian besar program alternatif (KeePass, KeePassXC, KeeWeb, dll.). +- Memungkinkan pembukaan dan penyalinan kolom URI/URL dengan cepat. +- Pengenalan biometrik untuk pembukaan kunci cepat (sidik jari/pembuka kunci wajah/ dll.). +- Manajemen kata sandi satu kali (HOTP/TOTP) untuk autentikasi dua faktor (2FA). +- Desain Material dengan tema. +- Isi-Otomatis dan integrasi. +- Papan ketik untuk mengisi kolom. +- Templat dinamis. +- Riwayat setiap entri. +- Manajemen pengaturan yang presisi. +- Kode ditulis dalam bahasa asli (Kotlin/Java/JNI/C). + +Anda dapat berdonasi atau membeli versi pro untuk layanan yang lebih baik dan pengembangan fitur yang Anda inginkan dengan cepat: https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro + +Proyek ini terus berkembang. Jangan ragu untuk memeriksa status pengembangan pembaruan berikutnya: https://github.com/Kunzisoft/KeePassDX/projects + +Kirimkan masalah ke: https://github.com/Kunzisoft/KeePassDX/issues diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt new file mode 100644 index 000000000..523255e6a --- /dev/null +++ b/fastlane/metadata/android/id/short_description.txt @@ -0,0 +1 @@ +Pengaman dan pengelola kata sandi yang aman dan sumber terbuka diff --git a/fastlane/metadata/android/id/title.txt b/fastlane/metadata/android/id/title.txt new file mode 100644 index 000000000..00694681a --- /dev/null +++ b/fastlane/metadata/android/id/title.txt @@ -0,0 +1 @@ +KeePassDX – Pengaman Sandi FOSS From daf717becd2aa566a7c1ccb9ffe734f3e1670804 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 1 Sep 2025 18:15:00 +0200 Subject: [PATCH 67/88] fix: Remove JELLY_BEAN_MR1 conditions and unused PRNGFixes --- .../com/kunzisoft/keepass/app/PRNGFixes.java | 399 ------------------ .../keepass/view/PasswordTextEditFieldView.kt | 9 +- .../keepass/view/TextEditFieldView.kt | 16 +- .../keepass/view/TextSelectFieldView.kt | 37 +- 4 files changed, 23 insertions(+), 438 deletions(-) delete mode 100644 app/src/main/java/com/kunzisoft/keepass/app/PRNGFixes.java diff --git a/app/src/main/java/com/kunzisoft/keepass/app/PRNGFixes.java b/app/src/main/java/com/kunzisoft/keepass/app/PRNGFixes.java deleted file mode 100644 index 6e168417e..000000000 --- a/app/src/main/java/com/kunzisoft/keepass/app/PRNGFixes.java +++ /dev/null @@ -1,399 +0,0 @@ -package com.kunzisoft.keepass.app; - -/* - * This software is provided 'as-is', without any express or implied - * warranty. In no event will Google be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, as long as the origin is not misrepresented. - */ - -import android.os.Build; -import android.os.Process; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.security.NoSuchAlgorithmException; -import java.security.Provider; -import java.security.SecureRandom; -import java.security.SecureRandomSpi; -import java.security.Security; -import java.util.Locale; - -/** - * Fixes for the output of the default PRNG having low entropy. - * - * The fixes need to be applied via {@link #apply()} before any use of Java - * Cryptography Architecture primitives. A good place to invoke them is in the - * application's {@code onCreate}. - */ -public final class PRNGFixes { - - private static final byte[] BUILD_FINGERPRINT_AND_DEVICE_SERIAL = - getBuildFingerprintAndDeviceSerial(); - - /** Hidden constructor to prevent instantiation. */ - private PRNGFixes() {} - - /** - * Applies all fixes. - * - * @throws SecurityException if a fix is needed but could not be applied. - */ - public static void apply() { - try { - if (supportedOnThisDevice()) { - applyOpenSSLFix(); - installLinuxPRNGSecureRandom(); - } - } catch (Exception e) { - // Do nothing, do the best we can to implement the workaround - } - } - - private static boolean supportedOnThisDevice() { - // Blacklist on samsung devices - if (Build.MANUFACTURER.toLowerCase(Locale.ENGLISH).contains("samsung")) { - return false; - } - - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { - return false; - } - - if (onSELinuxEnforce()) { - return false; - } - - File urandom = new File("/dev/urandom"); - - // Test permissions - if ( !(urandom.canRead() && urandom.canWrite()) ) { - return false; - } - - - // Test actually writing to urandom - try { - FileOutputStream fos = new FileOutputStream(urandom); - fos.write(0); - } catch (Exception e) { - return false; - } - - return true; - - } - - private static boolean onSELinuxEnforce() { - try { - ProcessBuilder builder = new ProcessBuilder("getenforce"); - builder.redirectErrorStream(true); - java.lang.Process process = builder.start(); - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - process.waitFor(); - - String output = reader.readLine(); - - if (output == null) { - return false; - } - - return output.toLowerCase(Locale.US).startsWith("enforcing"); - } catch (Exception e) { - return false; - } - } - - /** - * Applies the fix for OpenSSL PRNG having low entropy. Does nothing if the - * fix is not needed. - * - * @throws SecurityException if the fix is needed but could not be applied. - */ - private static void applyOpenSSLFix() throws SecurityException { - if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) - || (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2)) { - // No need to apply the fix - return; - } - - try { - // Mix in the device- and invocation-specific seed. - Class.forName("org.apache.harmony.xnet.provider.jsse.NativeCrypto") - .getMethod("RAND_seed", byte[].class) - .invoke(null, generateSeed()); - - // Mix output of Linux PRNG into OpenSSL's PRNG - int bytesRead = (Integer) Class.forName( - "org.apache.harmony.xnet.provider.jsse.NativeCrypto") - .getMethod("RAND_load_file", String.class, long.class) - .invoke(null, "/dev/urandom", 1024); - if (bytesRead != 1024) { - throw new IOException( - "Unexpected number of bytes read from Linux PRNG: " - + bytesRead); - } - } catch (Exception e) { - throw new SecurityException("Failed to seed OpenSSL PRNG", e); - } - } - - /** - * Installs a Linux PRNG-backed {@code SecureRandom} implementation as the - * default. Does nothing if the implementation is already the default or if - * there is not need to install the implementation. - * - * @throws SecurityException if the fix is needed but could not be applied. - */ - private static void installLinuxPRNGSecureRandom() - throws SecurityException { - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { - // No need to apply the fix - return; - } - - // Install a Linux PRNG-based SecureRandom implementation as the - // default, if not yet installed. - Provider[] secureRandomProviders = - Security.getProviders("SecureRandom.SHA1PRNG"); - if ((secureRandomProviders == null) - || (secureRandomProviders.length < 1) - || (!LinuxPRNGSecureRandomProvider.class.equals( - secureRandomProviders[0].getClass()))) { - Security.insertProviderAt(new LinuxPRNGSecureRandomProvider(), 1); - } - - // Assert that new SecureRandom() and - // SecureRandom.getInstance("SHA1PRNG") return a SecureRandom backed - // by the Linux PRNG-based SecureRandom implementation. - SecureRandom rng1 = new SecureRandom(); - if (!LinuxPRNGSecureRandomProvider.class.equals( - rng1.getProvider().getClass())) { - throw new SecurityException( - "new SecureRandom() backed by wrong Provider: " - + rng1.getProvider().getClass()); - } - - SecureRandom rng2; - try { - rng2 = SecureRandom.getInstance("SHA1PRNG"); - } catch (NoSuchAlgorithmException e) { - throw new SecurityException("SHA1PRNG not available", e); - } - if (!LinuxPRNGSecureRandomProvider.class.equals( - rng2.getProvider().getClass())) { - throw new SecurityException( - "SecureRandom.getInstance(\"SHA1PRNG\") backed by wrong" - + " Provider: " + rng2.getProvider().getClass()); - } - } - - /** - * {@code Provider} of {@code SecureRandom} engines which pass through - * all requests to the Linux PRNG. - */ - private static class LinuxPRNGSecureRandomProvider extends Provider { - - public LinuxPRNGSecureRandomProvider() { - super("LinuxPRNG", - 1.0, - "A Linux-specific random number provider that uses" - + " /dev/urandom"); - // Although /dev/urandom is not a SHA-1 PRNG, some apps - // explicitly request a SHA1PRNG SecureRandom and we thus need to - // prevent them from getting the default implementation whose output - // may have low entropy. - put("SecureRandom.SHA1PRNG", LinuxPRNGSecureRandom.class.getName()); - put("SecureRandom.SHA1PRNG ImplementedIn", "Software"); - } - } - - /** - * {@link SecureRandomSpi} which passes all requests to the Linux PRNG - * ({@code /dev/urandom}). - */ - public static class LinuxPRNGSecureRandom extends SecureRandomSpi { - - /* - * IMPLEMENTATION NOTE: Requests to generate bytes and to mix in a seed - * are passed through to the Linux PRNG (/dev/urandom). Instances of - * this class seed themselves by mixing in the current time, PID, UID, - * build fingerprint, and hardware serial number (where available) into - * Linux PRNG. - * - * Concurrency: Read requests to the underlying Linux PRNG are - * serialized (on sLock) to ensure that multiple threads do not get - * duplicated PRNG output. - */ - - private static final File URANDOM_FILE = new File("/dev/urandom"); - - - private static final Object sLock = new Object(); - - /** - * Input stream for reading from Linux PRNG or {@code null} if not yet - * opened. - * - * @GuardedBy("sLock") - */ - private static DataInputStream sUrandomIn; - - /** - * Output stream for writing to Linux PRNG or {@code null} if not yet - * opened. - * - * @GuardedBy("sLock") - */ - private static OutputStream sUrandomOut; - - /** - * Whether this engine instance has been seeded. This is needed because - * each instance needs to seed itself if the client does not explicitly - * seed it. - */ - private boolean mSeeded; - - @Override - protected void engineSetSeed(byte[] bytes) { - try { - OutputStream out; - synchronized (sLock) { - out = getUrandomOutputStream(); - } - out.write(bytes); - out.flush(); - mSeeded = true; - } catch (IOException e) { - throw new SecurityException( - "Failed to mix seed into " + URANDOM_FILE, e); - } - } - - @Override - protected void engineNextBytes(byte[] bytes) { - if (!mSeeded) { - // Mix in the device- and invocation-specific seed. - engineSetSeed(generateSeed()); - } - - try { - DataInputStream in; - synchronized (sLock) { - in = getUrandomInputStream(); - } - synchronized (in) { - in.readFully(bytes); - } - } catch (IOException e) { - throw new SecurityException( - "Failed to read from " + URANDOM_FILE, e); - } - } - - @Override - protected byte[] engineGenerateSeed(int size) { - byte[] seed = new byte[size]; - engineNextBytes(seed); - return seed; - } - - private DataInputStream getUrandomInputStream() { - synchronized (sLock) { - if (sUrandomIn == null) { - // NOTE: Consider inserting a BufferedInputStream between - // DataInputStream and FileInputStream if you need higher - // PRNG output performance and can live with future PRNG - // output being pulled into this process prematurely. - try { - sUrandomIn = new DataInputStream( - new FileInputStream(URANDOM_FILE)); - } catch (IOException e) { - throw new SecurityException("Failed to open " - + URANDOM_FILE + " for reading", e); - } - } - return sUrandomIn; - } - } - - private OutputStream getUrandomOutputStream() { - synchronized (sLock) { - if (sUrandomOut == null) { - try { - sUrandomOut = new FileOutputStream(URANDOM_FILE); - } catch (IOException e) { - throw new SecurityException("Failed to open " - + URANDOM_FILE + " for writing", e); - } - } - return sUrandomOut; - } - } - } - - /** - * Generates a device- and invocation-specific seed to be mixed into the - * Linux PRNG. - */ - private static byte[] generateSeed() { - try { - ByteArrayOutputStream seedBuffer = new ByteArrayOutputStream(); - DataOutputStream seedBufferOut = - new DataOutputStream(seedBuffer); - seedBufferOut.writeLong(System.currentTimeMillis()); - seedBufferOut.writeLong(System.nanoTime()); - seedBufferOut.writeInt(Process.myPid()); - seedBufferOut.writeInt(Process.myUid()); - seedBufferOut.write(BUILD_FINGERPRINT_AND_DEVICE_SERIAL); - seedBufferOut.close(); - return seedBuffer.toByteArray(); - } catch (IOException e) { - throw new SecurityException("Failed to generate seed", e); - } - } - - /** - * Gets the hardware serial number of this device. - * - * @return serial number or {@code null} if not available. - */ - private static String getDeviceSerialNumber() { - // We're using the Reflection API because Build.SERIAL is only available - // since API Level 9 (Gingerbread, Android 2.3). - try { - return (String) Build.class.getField("SERIAL").get(null); - } catch (Exception ignored) { - return null; - } - } - - private static byte[] getBuildFingerprintAndDeviceSerial() { - StringBuilder result = new StringBuilder(); - String fingerprint = Build.FINGERPRINT; - if (fingerprint != null) { - result.append(fingerprint); - } - String serial = getDeviceSerialNumber(); - if (serial != null) { - result.append(serial); - } - try { - return result.toString().getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("UTF-8 encoding not supported"); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt index 0b6b26ae3..ba0394eca 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/PasswordTextEditFieldView.kt @@ -20,7 +20,6 @@ package com.kunzisoft.keepass.view import android.content.Context -import android.os.Build import android.text.Spannable import android.util.AttributeSet import android.util.TypedValue @@ -104,18 +103,14 @@ class PasswordTextEditFieldView @JvmOverloads constructor(context: Context, id = passwordProgressViewId layoutParams = (layoutParams as LayoutParams?)?.also { it.addRule(LEFT_OF, actionImageButtonId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(START_OF, actionImageButtonId) - } + it.addRule(START_OF, actionImageButtonId) } } mPasswordEntropyView.apply { id = passwordEntropyViewId layoutParams = (layoutParams as LayoutParams?)?.also { it.addRule(ALIGN_RIGHT, passwordProgressViewId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(ALIGN_END, passwordProgressViewId) - } + it.addRule(ALIGN_END, passwordProgressViewId) } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt index ae5a09e50..486c75b99 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt @@ -51,9 +51,7 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, imeOptions = EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING importantForAutofill = IMPORTANT_FOR_AUTOFILL_NO } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO - } + importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO maxLines = 1 } private var actionImageButton = AppCompatImageButton( @@ -70,11 +68,9 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, resources.displayMetrics ).toInt() it.addRule(ALIGN_PARENT_RIGHT) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(ALIGN_PARENT_END) - } + it.addRule(ALIGN_PARENT_END) } - visibility = View.GONE + visibility = GONE contentDescription = context.getString(R.string.menu_edit) } @@ -91,9 +87,7 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, id = labelViewId layoutParams = (layoutParams as LayoutParams?)?.also { it.addRule(LEFT_OF, actionImageButtonId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(START_OF, actionImageButtonId) - } + it.addRule(START_OF, actionImageButtonId) } } valueView.apply { @@ -192,7 +186,7 @@ open class TextEditFieldView @JvmOverloads constructor(context: Context, actionImageButton.setImageDrawable(ContextCompat.getDrawable(context, it)) } actionImageButton.setOnClickListener(onActionClickListener) - actionImageButton.visibility = if (onActionClickListener == null) View.GONE else View.VISIBLE + actionImageButton.visibility = if (onActionClickListener == null) GONE else VISIBLE } override var isFieldVisible: Boolean diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TextSelectFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TextSelectFieldView.kt index 781c5dda6..24dbd9ff0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TextSelectFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TextSelectFieldView.kt @@ -10,7 +10,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo -import android.widget.* +import android.widget.AdapterView +import android.widget.BaseAdapter +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.Spinner +import android.widget.TextView import androidx.annotation.DrawableRes import androidx.appcompat.widget.AppCompatImageButton import androidx.core.content.ContextCompat @@ -51,9 +56,7 @@ class TextSelectFieldView @JvmOverloads constructor(context: Context, imeOptions = EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING importantForAutofill = IMPORTANT_FOR_AUTOFILL_NO } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO - } + importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO val drawable = ContextCompat.getDrawable(context, R.drawable.ic_arrow_down_white_24dp) ?.apply { mutate().colorFilter = BlendModeColorFilterCompat @@ -65,14 +68,12 @@ class TextSelectFieldView @JvmOverloads constructor(context: Context, drawable, null ) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - setCompoundDrawablesRelativeWithIntrinsicBounds( - null, - null, - drawable, - null - ) - } + setCompoundDrawablesRelativeWithIntrinsicBounds( + null, + null, + drawable, + null + ) isFocusable = false inputType = InputType.TYPE_NULL maxLines = 1 @@ -94,9 +95,7 @@ class TextSelectFieldView @JvmOverloads constructor(context: Context, resources.displayMetrics ).toInt() it.addRule(ALIGN_PARENT_RIGHT) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it.addRule(ALIGN_PARENT_END) - } + it.addRule(ALIGN_PARENT_END) } visibility = View.GONE contentDescription = context.getString(R.string.menu_edit) @@ -132,18 +131,14 @@ class TextSelectFieldView @JvmOverloads constructor(context: Context, id = labelViewId layoutParams = (layoutParams as LayoutParams?).also { it?.addRule(LEFT_OF, actionImageButtonId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it?.addRule(START_OF, actionImageButtonId) - } + it?.addRule(START_OF, actionImageButtonId) } } valueSpinnerView.apply { id = valueViewId layoutParams = (layoutParams as LayoutParams?).also { it?.addRule(LEFT_OF, actionImageButtonId) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - it?.addRule(START_OF, actionImageButtonId) - } + it?.addRule(START_OF, actionImageButtonId) it?.addRule(BELOW, labelViewId) } } From c911b7c511b8bc668cc1d6c1486b2272da178577 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 1 Sep 2025 19:01:35 +0200 Subject: [PATCH 68/88] fix: Import DatabaseFile --- .../com/kunzisoft/keepass/activities/MainCredentialActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt index 42ae3882a..cd45b54a3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt @@ -67,6 +67,7 @@ import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.model.CipherDecryptDatabase import com.kunzisoft.keepass.model.CipherEncryptDatabase import com.kunzisoft.keepass.model.CredentialStorage +import com.kunzisoft.keepass.model.DatabaseFile import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_LOAD_TASK From d7a3e7fedd2b7539175f743378bd312c23c6c869 Mon Sep 17 00:00:00 2001 From: scollovati <20740642+scollovati@users.noreply.github.com> Date: Tue, 2 Sep 2025 10:11:05 +0200 Subject: [PATCH 69/88] Translated using Weblate (Italian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/ --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 689b805da..3b6f1474a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -21,7 +21,7 @@ --> Commenti Pagina web - Implementazione Android del gestore password KeePass + Implementazione Android del gestore password KeePass. Accetto Aggiungi elemento Aggiungi gruppo From a2c2a21dde3e618eb7a116d6e1b713e4d111dcc6 Mon Sep 17 00:00:00 2001 From: Artyom Rybakov Date: Mon, 1 Sep 2025 15:53:02 +0200 Subject: [PATCH 70/88] Translated using Weblate (Russian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 269df9f99..89f0a0ebb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -19,7 +19,7 @@ --> Отзыв Сайт - Android–версия менеджера паролей KeePass + Android–версия менеджера паролей KeePass. Принять Новая запись Новая группа From 0db2b7023e6c8596cc444b06302de3107df2cf4a Mon Sep 17 00:00:00 2001 From: Artyom Rybakov Date: Tue, 2 Sep 2025 08:36:43 +0200 Subject: [PATCH 71/88] Translated using Weblate (Russian) Currently translated at 100.0% (3 of 3 strings) Translation: KeePassDX/Metadata Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/ru/ --- fastlane/metadata/android/ru-RU/full_description.txt | 2 ++ fastlane/metadata/android/ru-RU/short_description.txt | 2 +- fastlane/metadata/android/ru-RU/title.txt | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt index 9b81b638b..9a57c7dd3 100644 --- a/fastlane/metadata/android/ru-RU/full_description.txt +++ b/fastlane/metadata/android/ru-RU/full_description.txt @@ -19,3 +19,5 @@ KeePassDX имеет открытый исходный код и бе Вы можете пожертвовать или купить профессиональную версию чтобы улучшить обслуживание и ускорить разработку нужных вам возможностей: KeePass Pro Проект постоянно развивается. Не стесняйтесь проверять статус разработки и следующих обновлений тут: github.com/Kunzisoft/KeePassDX/projects + +Сообщить о проблеме:https://github.com/Kunzisoft/KeePassDX/issues diff --git a/fastlane/metadata/android/ru-RU/short_description.txt b/fastlane/metadata/android/ru-RU/short_description.txt index cc6d11c4b..a11d6f821 100644 --- a/fastlane/metadata/android/ru-RU/short_description.txt +++ b/fastlane/metadata/android/ru-RU/short_description.txt @@ -1 +1 @@ -Безопасный и свободный менеджер паролей, совместимый с файлами KeePass \ No newline at end of file +Безопасный и свободный менеджер паролей, совместимый с файлами KeePass diff --git a/fastlane/metadata/android/ru-RU/title.txt b/fastlane/metadata/android/ru-RU/title.txt index 75991a802..92196bff3 100644 --- a/fastlane/metadata/android/ru-RU/title.txt +++ b/fastlane/metadata/android/ru-RU/title.txt @@ -1 +1 @@ -KeePassDX - Менеджер паролей \ No newline at end of file +KeePassDX - Менеджер паролей From 5f41177a1f1ec812fee3be4dd83acfb31272f395 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 5 Sep 2025 13:04:52 +0200 Subject: [PATCH 72/88] Translated using Weblate (Ukrainian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/uk/ --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f007a5a36..bc882d180 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -19,7 +19,7 @@ --> Відгук Домівка - KeePassDX є Android-версією менеджера паролів KeePass + KeePassDX — Android-версія менеджера паролів KeePass. Прийняти Додати запис Додати групу From db8b0100de9e3ae3bfe1ccf0d53ff4742df1ff05 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Sun, 7 Sep 2025 15:50:51 +0200 Subject: [PATCH 73/88] Translated using Weblate (Croatian) Currently translated at 100.0% (666 of 666 strings) Translation: KeePassDX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hr/ --- app/src/main/res/values-hr/strings.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 9e1d116c0..9ec20cd6c 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with KeePassDX. If not, see . --> - Android implementacija KeePass upravljača lozinki + Android implementacija KeePass upravljača lozinki. Prihvati Dodaj unos Uredi unos @@ -187,7 +187,7 @@ Ako automatsko brisanje međuspremnika ne uspije, izbriši njegovu povijest ručno. Zaključaj bazu podataka nakon par sekundi kad se ekran ugasi Pritisni \'Natrag\' za zaključavanje - Otključavanje uređaja + Otključaj uređaj Koristi otključavanje uređaja za jednostavnije otvaranje baze podataka Biometrijsko otključavanje Otvaranje baze podataka skeniranjem biometrike @@ -385,7 +385,7 @@ Zaključaj bazu podataka brzo, aplikaciju možeš postaviti tako da bazu nakon nekog vremena zaključa i kad se ekran isključi. Prikaži mjesto nedavnih baza podataka Za brzo otključavanje baze podataka, poveži lozinku sa skeniranom biometrijom ili podacima za prijavu uređaja. - Kako bismo zadržali našu slobodu i uvijek bili aktivni, računamo na tvoj<strong>doprinos.</strong> + Doprinosom projektu (novčano, kodom, prijevodom) pomažeš mu da živi i napreduje, a također stječeš pravo na postupak otključavanja tema. Za stvaranje ključa za algoritam šifriranja, glavni ključ se transformira pomoću funkcije za generiranje ključeva koja sadrži slučajnu komponentu. Zaključaj bazu podataka kad korisnik pritisne gumb za natrag na glavnom ekranu Sakrij pokvarene poveznice baze podataka @@ -700,4 +700,7 @@ Rekurzivno izračunava broj unosa u grupi Sakrij predloške Predlošci se ne prikazuju + Tajni ključ mora sadržati barem %1$d znakova. + Generiraj datoteku ključeva + Ne preporučuje se dodavanje velike datoteke ključeva, jer to može spriječiti otvaranje baze podataka. From d5ecaeb331ac225585c9b3e73c55cd7eff9c5ff8 Mon Sep 17 00:00:00 2001 From: Milo Ivir <43657314+milotype@users.noreply.github.com> Date: Sun, 7 Sep 2025 16:29:42 +0200 Subject: [PATCH 74/88] Add Croatian translation --- .../metadata/android/hr/full_description.txt | 23 +++++++++++++++++++ .../metadata/android/hr/short_description.txt | 1 + fastlane/metadata/android/hr/title.txt | 1 + 3 files changed, 25 insertions(+) create mode 100644 fastlane/metadata/android/hr/full_description.txt create mode 100644 fastlane/metadata/android/hr/short_description.txt create mode 100644 fastlane/metadata/android/hr/title.txt diff --git a/fastlane/metadata/android/hr/full_description.txt b/fastlane/metadata/android/hr/full_description.txt new file mode 100644 index 000000000..6fc26bd2d --- /dev/null +++ b/fastlane/metadata/android/hr/full_description.txt @@ -0,0 +1,23 @@ +KeePassDX je trezor i upravljač za lozinke koji omogućuje uređivanje šifriranih podataka u jednoj datoteci u otvorenom KeePass formatu i sigurno automatsko ispunjavanje obrazaca, ne zahtijeva internetsku vezu i pridržava se Android dizajnerskih smjernica. Aplikacija je otvorenog koda i bez oglasa. + +Funkcije + +- Stvaranje baza podataka, unosa i grupa. +- Podrška za .kdb i .kdbx datoteke (verzije 1 do 4) uz algoritme AES – Twofish – ChaCha20 – Argon2. +- Kompatibilnost s većinom alternativnih programa (KeePass, KeePassXC, KeeWeb, …). +- Brzo otvaranje i kopiranje URI / URL polja. +- Biometrijsko prepoznavanje za brzo otključavanje (otisak prsta / prepoznavanje lica / …). +- Upravljanje jednokratnim lozinkama (HOTP / TOTP) za dvofaktorsku autentifikaciju (2FA). +- Material dizajn s temama. +- Automatsko ispunjavanje i integracija. +- Tipkovnica za ispunjavanje polja. +- Dinamički predlošci. +- Povijest svakog unosa. +- Precizno upravljanje postavkama. +- Kod napisan u izvornim jezicima (Kotlin / Java / JNI / C). + +Doniraj ili kupi Pro verziju za bolju uslugu i brži razvoj željenih funkcija: https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro + +Projekt se neprestano razvija. Slobodno provjeri stanje razvoja sljedećih verzija: https://github.com/Kunzisoft/KeePassDX/projects + +Prijavi probleme na: https://github.com/Kunzisoft/KeePassDX/issues \ No newline at end of file diff --git a/fastlane/metadata/android/hr/short_description.txt b/fastlane/metadata/android/hr/short_description.txt new file mode 100644 index 000000000..31adbdb8e --- /dev/null +++ b/fastlane/metadata/android/hr/short_description.txt @@ -0,0 +1 @@ +Siguran trezor i upravljač za lozinke otvorenog koda \ No newline at end of file diff --git a/fastlane/metadata/android/hr/title.txt b/fastlane/metadata/android/hr/title.txt new file mode 100644 index 000000000..56c33275e --- /dev/null +++ b/fastlane/metadata/android/hr/title.txt @@ -0,0 +1 @@ +KeePassDX – FOSS trezor za lozinke \ No newline at end of file From 1f600d60e3f76670e9e25ee33ad74873a2bae1a4 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Sun, 7 Sep 2025 16:26:53 +0200 Subject: [PATCH 75/88] Translated using Weblate (Croatian) Currently translated at 100.0% (3 of 3 strings) Translation: KeePassDX/Metadata Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/hr/ --- .../metadata/android/hr/full_description.txt | 23 +++++++++++++++++++ .../metadata/android/hr/short_description.txt | 1 + fastlane/metadata/android/hr/title.txt | 1 + 3 files changed, 25 insertions(+) create mode 100644 fastlane/metadata/android/hr/full_description.txt create mode 100644 fastlane/metadata/android/hr/short_description.txt create mode 100644 fastlane/metadata/android/hr/title.txt diff --git a/fastlane/metadata/android/hr/full_description.txt b/fastlane/metadata/android/hr/full_description.txt new file mode 100644 index 000000000..5bb6e151e --- /dev/null +++ b/fastlane/metadata/android/hr/full_description.txt @@ -0,0 +1,23 @@ +KeePassDX je trezor i upravljač za lozinke koji omogućuje uređivanje šifriranih podataka u jednoj datoteci u otvorenom KeePass formatu i sigurno automatsko ispunjavanje obrazaca, ne zahtijeva internetsku vezu i pridržava se Android dizajnerskih smjernica. Aplikacija je otvorenog koda i bez oglasa. + +Funkcije + +- Stvaranje baza podataka, unosa i grupa. +- Podrška za .kdb i .kdbx datoteke (verzije 1 do 4) uz algoritme AES – Twofish – ChaCha20 – Argon2. +- Kompatibilnost s većinom alternativnih programa (KeePass, KeePassXC, KeeWeb, …). +- Brzo otvaranje i kopiranje URI / URL polja. +- Biometrijsko prepoznavanje za brzo otključavanje (otisak prsta / prepoznavanje lica / …). +- Upravljanje jednokratnim lozinkama (HOTP / TOTP) za dvofaktorsku autentifikaciju (2FA). +- Material dizajn s temama. +- Automatsko ispunjavanje i integracija. +- Tipkovnica za ispunjavanje polja. +- Dinamički predlošci. +- Povijest svakog unosa. +- Precizno upravljanje postavkama. +- Kod napisan u izvornim jezicima (Kotlin / Java / JNI / C). + +Doniraj ili kupi Pro verziju za bolju uslugu i brži razvoj željenih funkcija: https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro + +Projekt se neprestano razvija. Slobodno provjeri stanje razvoja sljedećih verzija: https://github.com/Kunzisoft/KeePassDX/projects + +Prijavi probleme na: https://github.com/Kunzisoft/KeePassDX/issues diff --git a/fastlane/metadata/android/hr/short_description.txt b/fastlane/metadata/android/hr/short_description.txt new file mode 100644 index 000000000..b52093483 --- /dev/null +++ b/fastlane/metadata/android/hr/short_description.txt @@ -0,0 +1 @@ +Siguran trezor i upravljač za lozinke otvorenog koda diff --git a/fastlane/metadata/android/hr/title.txt b/fastlane/metadata/android/hr/title.txt new file mode 100644 index 000000000..1c4f55356 --- /dev/null +++ b/fastlane/metadata/android/hr/title.txt @@ -0,0 +1 @@ +KeePassDX – FOSS trezor za lozinke From ac347db2d180b8935556283182ece1ff3a4d297c Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 8 Sep 2025 12:43:06 +0200 Subject: [PATCH 76/88] fix: Translations --- app/src/main/res/values-be/strings.xml | 68 +++++++++++++------------- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-nb/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 4 +- 5 files changed, 38 insertions(+), 40 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index f99687527..1d8597574 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -70,9 +70,9 @@ Расшыфроўка змесціва базы дадзеных… Выкарыстоўваць як базу дадзеных па змаўчанні Лічбы - KeePassDX © %1$d Kunzisoft з\'яўляецца праграмай з адкрытым зыходным кодам і без рэкламы. \nПрадастаўляецца «як ёсць», па ліцэнзіі GPLv3, без якіх-небудзь гарантый. - Карыстальніцкія дадзеныя не атрымліваюцца, гэтая праграма не падключаецца да сервераў, працуе толькі лакальна і цалкам паважае прыватнасць карыстальнікаў. - Каб захаваць нашу свабоду, выпраўляць памылкі, дадаваць функцыі і заўсёды быць актыўнымі, мы разлічваем на ваш уклад. + KeePassDX © %1$d Kunzisoft з\'яўляецца <strong>праграмай з адкрытым зыходным кодам</strong> і <strong>без рэкламы</strong>. \nПрадастаўляецца «як ёсць», па ліцэнзіі <strong>GPLv3</strong>, без якіх-небудзь гарантый. + <strong>Карыстальніцкія дадзеныя не атрымліваюцца</strong>, гэтая праграма не падключаецца да сервераў, працуе толькі лакальна і цалкам паважае прыватнасць карыстальнікаў. + Каб <strong>захаваць нашу свабоду</strong>, <strong>выпраўляць памылкі</strong>, <strong>дадаваць функцыі</strong> і <strong>заўсёды быць актыўнымі</strong>, мы разлічваем на ваш <strong>уклад</strong>. Доступ Адмена Заўвагі @@ -243,8 +243,8 @@ Пошук, блакаванне, гісторыя, уласцівасці Запаўненне формы Клавіятура, аўтазапаўненне, буфер абмену - Разблакіроўка прылады - Біяметрыя, уліковыя дадзеныя прылады + Разблакіроўка прылады + Біяметрыя, уліковыя дадзеныя прылады Налады базы дадзеных Метададзеныя, смеццевая скрыня, шаблоны, гісторыя Налады бяспекі @@ -382,16 +382,16 @@ Патрабуецца абнаўленне біяметрычнай бяспекі. Сховішча ключоў неналежным чынам ініцыялізавана. Спасылка на разблакіроўку прылады - Спасылка на разблакіроўку прылады - Вам усё роўна трэба памятаць асноўныя ўліковыя дадзеныя сховішча, калі вы выкарыстоўваеце распазнаванне разблакіроўкі прылады. - Распазнаванне разблакіроўкі прылады - Выняць уліковыя дадзеныя базы дадзеных з дапамогай дадзеных разблакіроўкі прылады + Спасылка на разблакіроўку прылады + Вам усё роўна трэба памятаць асноўныя ўліковыя дадзеныя сховішча, калі вы выкарыстоўваеце распазнаванне разблакіроўкі прылады. + Распазнаванне разблакіроўкі прылады + Выняць уліковыя дадзеныя базы дадзеных з дапамогай дадзеных разблакіроўкі прылады Зашыфраваны пароль захаваны - Немагчыма прачытаць ключ разблакіроўкі прылады. Выдаліце яго і паўтарыце працэдуру распазнавання разблакіроўкі. - Не ўдалося распазнаць адбітак разблакіроўкі прылады + Немагчыма прачытаць ключ разблакіроўкі прылады. Выдаліце яго і паўтарыце працэдуру распазнавання разблакіроўкі. + Не ўдалося распазнаць адбітак разблакіроўкі прылады Недаступна - Немагчыма ініцыялізаваць запыт разблакіроўкі прылады. - Увядзіце пароль, а затым націсніце гэтую кнопку. + Немагчыма ініцыялізаваць запыт разблакіроўкі прылады. + Увядзіце пароль, а затым націсніце гэтую кнопку. Гісторыя Уласцівасці Знешні выгляд @@ -425,24 +425,24 @@ Адлюстроўвае кнопку блакавання ў карыстальніцкім інтэрфейсе Змесціва Разблакіраваць - Разблакіроўка прылады - Націсніце, каб выдаліць ключы разблакіроўкі прылады - Выкарыстоўвайце разблакіроўку прылады, каб лягчэй адкрываць базу дадзеных + Разблакіроўка прылады + Націсніце, каб выдаліць ключы разблакіроўкі прылады + Выкарыстоўвайце разблакіроўку прылады, каб лягчэй адкрываць базу дадзеных Біяметрычная разблакіроўка Дазваляе сканаваць біяметрыю для адкрыцця базы дадзеных Разблакіроўка з дапамогай уліковых дадзеных прылады Дазваляе выкарыстоўваць уліковыя дадзеныя прылады для адкрыцця базы дадзеных Запыт на аўтаматычнае адкрыццё Аўтаматычна запытваць разблакіроўку прылады, калі база дадзеных наладжана на яе выкарыстанне - Часовая разблакіроўка прылады - Не захоўваць зашыфраванае змесціва для выкарыстання разблакіроўкі прылады - Тэрмін дзеяння разблакіроўкі прылады - Працягласць выкарыстання разблакіроўкі прылады перад выдаленнем яе змесціва - Тайм-аўт разблакіроўкі прылады + Часовая разблакіроўка прылады + Не захоўваць зашыфраванае змесціва для выкарыстання разблакіроўкі прылады + Тэрмін дзеяння разблакіроўкі прылады + Працягласць выкарыстання разблакіроўкі прылады перад выдаленнем яе змесціва + Тайм-аўт разблакіроўкі прылады Выдаліць ключы шыфравання Выдаліць усе ключы шыфравання, звязаныя з распазнаваннем разблакіроўкі прылады - Выдаліць усе ключы шыфравання, звязаныя з распазнаваннем разблакіроўкі прылады? - Гэтая функцыя будзе захоўваць зашыфраваныя дадзеныя ўліковых дадзеных у бяспечным Keystore вашай прылады.\n\nУ залежнасці ад рэалізацыі натыўнага API аперацыйнай сістэмы, яна можа быць не цалкам функцыянальнай.\n\nПраверце сумяшчальнасць і бяспеку Keystore з вытворцам вашай прылады і стваральнікам ПЗ, якое вы выкарыстоўваеце. + Выдаліць усе ключы шыфравання, звязаныя з распазнаваннем разблакіроўкі прылады? + Гэтая функцыя будзе захоўваць зашыфраваныя дадзеныя ўліковых дадзеных у бяспечным Keystore вашай прылады.\n\nУ залежнасці ад рэалізацыі натыўнага API аперацыйнай сістэмы, яна можа быць не цалкам функцыянальнай.\n\nПраверце сумяшчальнасць і бяспеку Keystore з вытворцам вашай прылады і стваральнікам ПЗ, якое вы выкарыстоўваеце. Не ўдалося запусціць гэтую функцыю. Прылада працуе на Android %1$s, але патрабуецца %2$s або больш позняя версія. Не ўдалося знайсці адпаведнае апаратнае забеспячэнне. @@ -557,8 +557,6 @@ Дазваляе націснуць кнопку Адкрыць, калі не выбраны ўліковыя дадзеныя Выдаліць пароль Выдаляе ўведзены пароль пасля спробы падключэння да базы дадзеных - Абаронены ад запісу - Адкрываць базу дадзеных толькі для чытання па змаўчанні Аўтазахаванне базы дадзеных Захоўваць базу дадзеных пасля кожнага важнага дзеяння (у рэжыме З магчымасцю змены) Трымаць экран уключаным @@ -578,8 +576,8 @@ Запісы дапамагаюць кіраваць лічбавымі ідэнтыфікацыйнымі дадзенымі.\n\nГрупы (~тэчкі) арганізуюць запісы ў вашай базе дадзеных. Пошук па запісах Увядзіце назву, імя карыстальніка або змесціва іншых палёў, каб знайсці свае паролі. - Разблакіроўка базы дадзеных прылады - Прывяжыце свой пароль да адсканаванай біяметрыі або ўліковых дадзеных прылады, каб хутка разблакаваць базу дадзеных. + Разблакіроўка базы дадзеных прылады + Прывяжыце свой пароль да адсканаванай біяметрыі або ўліковых дадзеных прылады, каб хутка разблакаваць базу дадзеных. Рэдагаваць гэты запіс Рэдагуйце свой запіс з дапамогай карыстальніцкіх палёў. Дадзеныя пула могуць спасылацца паміж рознымі палямі запісаў. Стварыць надзейны пароль @@ -604,14 +602,14 @@ Выберыце, як сартаваць запісы і групы. Удзельнічаць Дапамажыце павысіць стабільнасць, бяспеку і дадаць больш функцый. - У адрозненне ад многіх праграм для кіравання паролямі, гэтая без рэкламы, копілефтнае свабоднае праграмнае забеспячэнне і не збірае персанальныя дадзеныя на сваіх серверах, незалежна ад версіі, якой вы карыстаецеся. - Купляючы pro-версію, вы атрымаеце доступ да гэтага візуальнага стылю і асабліва дапаможаце рэалізацыі грамадскіх праектаў. - Гэты візуальны стыль даступны дзякуючы вашай шчодрасці. - Унёсшы ўклад у праект (матэрыяльна, кодам, перакладам), вы дапаможаце яму працягваць жыць і развівацца, а таксама будзеце мець права на працэдуру разблакіроўкі тэмы. - Гэтая функцыя знаходзіцца ў стадыі распрацоўкі і патрабуе вашага ўкладу, каб неўзабаве стаць даступнай. - Купляючы pro-версію, - Унёсшы ўклад, - вы заахвочваеце распрацоўшчыкаў ствараць новыя функцыі і выпраўляць памылкі ў адпаведнасці з вашымі заўвагамі. + У адрозненне ад многіх праграм для кіравання паролямі, гэтая <strong>без рэкламы</strong>, <strong>копілефтнае свабоднае праграмнае забеспячэнне</strong> і не збірае персанальныя дадзеныя на сваіх серверах, незалежна ад версіі, якой вы карыстаецеся. + Купляючы pro-версію, вы атрымаеце доступ да гэтага <strong>візуальнага стылю</strong> і асабліва дапаможаце <strong>рэалізацыі грамадскіх праектаў.</strong> + Гэты <strong>візуальны стыль</strong> даступны дзякуючы вашай шчодрасці. + <strong>Унёсшы ўклад</strong> у праект <i>(матэрыяльна, кодам, перакладам)</i>, вы дапаможаце яму працягваць жыць і развівацца, а таксама будзеце мець права на працэдуру разблакіроўкі <strong>тэмы</strong>. + Гэтая функцыя <strong>знаходзіцца ў стадыі распрацоўкі</strong> і патрабуе вашага <strong>ўкладу</strong>, каб неўзабаве стаць даступнай. + Купляючы <strong>pro-версію</strong>, + <strong>Унёсшы ўклад</strong>, + вы заахвочваеце распрацоўшчыкаў ствараць <strong>новыя функцыі</strong> і <strong>выпраўляць памылкі</strong> ў адпаведнасці з вашымі заўвагамі. Вялікі дзякуй за ваш уклад. Мы прыкладаем усе намаганні, каб хутка выпусціць гэтую функцыю. Не забудзьцеся абнаўляць праграму, усталёўваючы новыя версіі. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 93d5acb62..b0b64658b 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -515,7 +515,7 @@ Bantu meningkatkan stabilitas, keamanan, dan menambahkan lebih banyak fitur. Tidak seperti banyak aplikasi pengelola kata sandi, ini <strong>bebas iklan</strong>, <strong>perangkat lunak libre copyleft</strong>, dan tidak mengumpulkan data pribadi di peladennya, tidak peduli versi apa yang Anda gunakan. <strong>Gaya visual</strong> ini tersedia berkat kemurahan hati Anda. - Dengan berkontribusi kepada proyek (dalam bentuk uang, kode, penerjemahan), Anda akan membantu proyek tersebut supaya terus hidup dan berkembang, dan Anda juga akan memenuhi syarat untuk prosedur pembukaan kunci tema. + Dengan <strong>berkontribusi</strong> kepada proyek <i>(dalam bentuk uang, kode, penerjemahan)</i>, Anda akan membantu proyek tersebut supaya terus hidup dan berkembang, dan Anda juga akan memenuhi syarat untuk prosedur pembukaan kunci <strong>tema</strong>. Fitur ini <strong>sedang dalam pengembangan</strong> dan memerlukan <strong>kontribusi</strong> Anda untuk bisa tersedia segera. Tampilkan Token OTP Teks diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a3925b61c..2c720c866 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -443,7 +443,7 @@ 多くのパスワード管理アプリとは異なり、このアプリは<strong>広告なし</strong>かつ<strong>コピーレフトの自由ソフトウェア</strong>です。どのバージョンを使っても、サーバー上で個人情報が収集されることはありません。 Pro バージョンを購入すると、この<strong>ビジュアル スタイル</strong>にアクセスできるようになり、また<strong>コミュニティ プロジェクトの実現</strong>を特に支援できます。 この<strong>ビジュアル スタイル</strong>はあなたの厚意により利用可能となります。 - プロジェクトに貢献することによって (お金、コード、翻訳など)、プロジェクトは継続して成長することができ、さらにテーマのアンロック手続きにも参加できるようになります。 + <strong>プロジェクトに貢献</strong>することによって <i>(お金、コード、翻訳など)</i>、プロジェクトは継続して成長することができ、さらに<strong>テーマ</strong>のアンロック手続きにも参加できるようになります。 この機能は<strong>開発中</strong>であり、早期に提供するにはあなたの<strong>貢献</strong>が必要です。 <strong>pro</strong> バージョンを購入することによる、 <strong>貢献</strong>による、 diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 5afa325d5..ebdad3d16 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -256,7 +256,7 @@ I motsetning til mange passordadministrasjons-apper er denne <strong>annonsefri</strong>, <strong>copylefted libre-programvare</strong> og samler ikke inn personlige data på serverne, uansett hvilken versjon du bruker. Ved kjøp av pro-versjonen, vil du få tilgang til denne <strong>visuelle funksjonen</strong> og du vil bidra med støtte til <strong> realisering av fellesskaps prosjekter.</strong> Denne <strong>visuelle stilen</strong> er tilgjengelig takket være din generøsitet. - Ved å bidra til prosjektet (med penger, kode eller oversettelser), bidrar du til å holde prosjektet gående og trivende, og du vil også kunne få mulighet til å låse opp drakter. + Ved å <strong>bidra</strong> til prosjektet <i>(med penger, kode eller oversettelser)</i>, bidrar du til å holde prosjektet gående og trivende, og du vil også kunne få mulighet til å låse opp <strong>drakter</strong>. Denne funksjonen er <strong>under utvikling</strong> og krever <strong>bidrag</strong> for å bli tilgjengelig snart. Ved å kjøpe <strong>pro</strong>-versjonen, Ved å <strong>bidra</strong>, diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 089906bad..312e5f0fa 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -178,7 +178,7 @@ Mai puțin Niciodată Nu există rezultate de căutare - KeePassDX © %1$d Kunzisoft este open source și fără reclame. \nEste furnizat ca atare, sub licență GPLv3, fără nicio garanție. + KeePassDX © %1$d Kunzisoft este <strong>open source</strong> și <strong>fără reclame</strong>. \nEste furnizat ca atare, sub licență <strong>GPLv3</strong>, fără nicio garanție. Pentru a ne <strong>păstra libertatea</strong>, <strong>pentru a remedia erori</strong>, <strong>pentru a adăuga funcții</strong> și <strong>pentru a fi mereu activi</strong>, ne bazăm pe <strong>contribuția</strong> dvs. Ascundeți parolele Mascați parolele (***) în mod implicit @@ -381,7 +381,7 @@ Spre deosebire de multe aplicații de gestionare a parolelor, aceasta este <strong>fără reclame</strong>, <strong>software liber cu copyleft</strong> și nu colectează date personale pe serverele sale, indiferent de versiunea pe care o utilizați. Prin cumpărarea versiunii pro, veți avea acces la acest lucru <strong>stil vizual</strong> și veți ajuta în special la <strong>realizarea proiectelor comunitare.</strong> Acest <strong> stil vizual </strong> este disponibil datorită generozității tale. - Contribuind la proiect (financiar, cod, traducere), îl veți ajuta să continue să trăiască și să prospere și veți fi, de asemenea, eligibil pentru procedura de deblocare a temelor. + <strong>Contribuind</strong> la proiect <i>(financiar, cod, traducere)</i>, îl veți ajuta să continue să trăiască și să prospere și veți fi, de asemenea, eligibil pentru procedura de deblocare a <strong>temelor</strong>. Această caracteristică este <strong> în curs de dezvoltare</strong> și necesită ca <strong>contribuția</strong> dvs. să fie disponibilă în curând. Cumpărând versiunea <strong> pro </strong>, Prin <strong> contribuție </strong>, From 30dd7c567c15f34d8d15ff01feafd126aa07cf35 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 8 Sep 2025 15:17:09 +0200 Subject: [PATCH 77/88] fix: Autofill compatibility package --- app/src/main/res/xml/dataset_service.xml | 196 ++++++++++++----------- 1 file changed, 101 insertions(+), 95 deletions(-) diff --git a/app/src/main/res/xml/dataset_service.xml b/app/src/main/res/xml/dataset_service.xml index 870cf884a..94b60987b 100644 --- a/app/src/main/res/xml/dataset_service.xml +++ b/app/src/main/res/xml/dataset_service.xml @@ -28,269 +28,275 @@ Settings Activity. This is pointed to in the service's meta-data in the applicat tools:ignore="UnusedAttribute"> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="711900039" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="427912623" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> - - + android:maxLongVersionCode="711900039" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + + android:maxLongVersionCode="10000000000" /> + + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="2015836711" /> + android:maxLongVersionCode="2015849447" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> + android:maxLongVersionCode="10000000000" /> - + android:maxLongVersionCode="10000000000" /> From e8ec27dc38cc4f9f155f617c849ae74741a5434f Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 9 Sep 2025 11:45:30 +0200 Subject: [PATCH 78/88] fix: Upgrade to API 35 --- app/build.gradle | 4 ++-- .../kunzisoft/keepass/activities/AboutActivity.kt | 2 +- .../kunzisoft/keepass/activities/GroupActivity.kt | 3 ++- .../keepass/services/NotificationService.kt | 13 ++++++++++++- app/src/main/res/layout/activity_about.xml | 3 ++- app/src/main/res/layout/activity_file_selection.xml | 1 + app/src/main/res/layout/activity_icon_picker.xml | 5 +++-- app/src/main/res/layout/activity_key_generator.xml | 5 +++-- .../main/res/layout/activity_main_credential.xml | 1 + app/src/main/res/layout/activity_toolbar.xml | 1 + app/src/main/res/layout/keyboard_container.xml | 6 ++++-- crypto/build.gradle | 4 ++-- database/build.gradle | 4 ++-- icon-pack/build.gradle | 4 ++-- icon-pack/classic/build.gradle | 4 ++-- icon-pack/material/build.gradle | 4 ++-- 16 files changed, 42 insertions(+), 22 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3d2414fe0..4b5287f6a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,12 +5,12 @@ apply plugin: 'kotlin-kapt' android { namespace 'com.kunzisoft.keepass' - compileSdkVersion 34 + compileSdkVersion 36 defaultConfig { applicationId "com.kunzisoft.keepass" minSdkVersion 19 - targetSdkVersion 34 + targetSdkVersion 35 versionCode = 139 versionName = "4.1.7" multiDexEnabled true diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt index 105810a1d..d117418f4 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/AboutActivity.kt @@ -58,7 +58,7 @@ class AboutActivity : StylishActivity() { var version: String var build: String try { - version = packageManager.getPackageInfoCompat(packageName).versionName + version = packageManager.getPackageInfoCompat(packageName).versionName ?: "" build = BuildConfig.BUILD_VERSION } catch (e: NameNotFoundException) { Log.w(javaClass.simpleName, "Unable to get the app or the build version", e) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index 03aacc6f2..c0704dc0a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -1373,7 +1373,8 @@ class GroupActivity : DatabaseLockActivity(), } else -> { // Load the previous group - loadMainGroup(mPreviousGroupsIds.removeLast()) + loadMainGroup(mPreviousGroupsIds + .removeAt(mPreviousGroupsIds.lastIndex)) } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt index f116eaf60..4d7fae28c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/NotificationService.kt @@ -12,6 +12,7 @@ import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE import android.os.Build import android.os.IBinder +import android.util.Log import android.util.TypedValue import android.widget.Toast import androidx.core.app.NotificationCompat @@ -156,11 +157,21 @@ abstract class NotificationService : Service() { mReset = true } - override fun onDestroy() { + override fun onTimeout(startId: Int, fgsType: Int) { + super.onTimeout(startId, fgsType) + Log.e(javaClass::class.simpleName, "The service took too long to execute") + cancelNotification() + stopSelf() + } + + protected fun cancelNotification() { mTimerJob?.cancel() mTimerJob = null notificationManager?.cancel(notificationId) + } + override fun onDestroy() { + cancelNotification() super.onDestroy() } diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index d956bfc9d..b0211987e 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -19,10 +19,11 @@ --> + android:filterTouchesWhenObscured="true"> + android:filterTouchesWhenObscured="true"> . --> - Date: Tue, 9 Sep 2025 13:37:50 +0200 Subject: [PATCH 79/88] fix: Better biometric exception implementation --- .../keepass/biometric/DeviceUnlockManager.kt | 2 +- .../viewmodels/DeviceUnlockViewModel.kt | 90 ++++++++++--------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/biometric/DeviceUnlockManager.kt b/app/src/main/java/com/kunzisoft/keepass/biometric/DeviceUnlockManager.kt index fa487023c..57aa56ff7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/biometric/DeviceUnlockManager.kt +++ b/app/src/main/java/com/kunzisoft/keepass/biometric/DeviceUnlockManager.kt @@ -380,7 +380,7 @@ class DeviceUnlockManager(private var appContext: Context) { } } -fun deviceUnlockError(error: Exception, context: Context): String { +fun deviceUnlockError(error: Throwable, context: Context): String { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && (error is UnrecoverableKeyException || error is KeyPermanentlyInvalidatedException)) { diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt index 826debaa8..7a48401dd 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DeviceUnlockViewModel.kt @@ -20,11 +20,14 @@ import com.kunzisoft.keepass.model.CipherDecryptDatabase import com.kunzisoft.keepass.model.CipherEncryptDatabase import com.kunzisoft.keepass.model.CredentialStorage import com.kunzisoft.keepass.settings.PreferencesUtil +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.crypto.Cipher @@ -37,6 +40,8 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat private var deviceUnlockManager: DeviceUnlockManager? = null private var databaseUri: Uri? = null + private var mCipherJob: Job? = null + private var deviceUnlockMode = DeviceUnlockMode.BIOMETRIC_UNAVAILABLE var cryptoPrompt: DeviceUnlockCryptoPrompt? = null private set @@ -95,6 +100,18 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat cipherDatabaseAction.registerDatabaseListener(cipherDatabaseListener) } + private fun cancelAndLaunchCipherJob( + coroutineExceptionHandler: CoroutineExceptionHandler = CoroutineExceptionHandler { _, e -> + setException(e) + }, + block: suspend () -> Unit + ) { + mCipherJob?.cancel() + mCipherJob = viewModelScope.launch(coroutineExceptionHandler) { + block() + } + } + fun checkConditionToStoreCredential(condition: Boolean) { isConditionToStoreCredentialVerified = condition checkUnlockAvailability() @@ -153,12 +170,8 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat private fun changeMode(deviceUnlockMode: DeviceUnlockMode) { this.deviceUnlockMode = deviceUnlockMode when (deviceUnlockMode) { - DeviceUnlockMode.STORE_CREDENTIAL -> { - initEncryptData() - } - DeviceUnlockMode.EXTRACT_CREDENTIAL -> { - initDecryptData() - } + DeviceUnlockMode.STORE_CREDENTIAL -> initEncryptData() + DeviceUnlockMode.EXTRACT_CREDENTIAL -> initDecryptData() else -> {} } _uiState.update { currentState -> @@ -246,7 +259,7 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat credential: ByteArray, cipher: Cipher? ) { - try { + cancelAndLaunchCipherJob { deviceUnlockManager?.encryptData( value = credential, cipher = cipher, @@ -260,26 +273,23 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat this.specParameters = ivSpec } ) - } ?: setException(UnknownDatabaseLocationException()) + } ?: throw UnknownDatabaseLocationException() } ) - } catch (e: Exception) { - setException(e) - } finally { - // Reinit credential storage request - _uiState.update { currentState -> - currentState.copy( - credentialRequiredCipher = null - ) - } + } + // Reinit credential storage request + _uiState.update { currentState -> + currentState.copy( + credentialRequiredCipher = null + ) } } fun decryptCredential(cipher: Cipher?) { // retrieve the encrypted value from preferences - databaseUri?.let { databaseUri -> - cipherDatabase?.encryptedValue?.let { encryptedCredential -> - try { + cancelAndLaunchCipherJob { + databaseUri?.let { databaseUri -> + cipherDatabase?.encryptedValue?.let { encryptedCredential -> deviceUnlockManager?.decryptData( encryptedValue = encryptedCredential, cipher = cipher, @@ -295,12 +305,10 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat cipherDatabaseAction.resetCipherParameters(databaseUri) } ) - } catch (e: Exception) { - setException(e) - } - } ?: deleteEncryptedDatabaseKey() - } ?: run { - setException(UnknownDatabaseLocationException()) + } ?: deleteEncryptedDatabaseKey() + } ?: run { + throw UnknownDatabaseLocationException() + } } } @@ -368,7 +376,7 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat } } - fun setException(value: Exception?) { + fun setException(value: Throwable?) { _uiState.update { currentState -> currentState.copy( exception = value @@ -385,29 +393,25 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat } private fun initEncryptData() { - try { + cancelAndLaunchCipherJob { deviceUnlockManager = DeviceUnlockManager(getApplication()) deviceUnlockManager?.initEncryptData { cryptoPrompt -> onPromptRequested(cryptoPrompt) - } ?: setException(Exception("Device unlock manager not initialized")) - } catch (e: Exception) { - setException(e) + } ?: throw Exception("Device unlock manager not initialized") } } private fun initDecryptData() { - try { + cancelAndLaunchCipherJob { cipherDatabase?.let { cipherDb -> - deviceUnlockManager = DeviceUnlockManager(getApplication()) - deviceUnlockManager?.initDecryptData(cipherDb.specParameters) { cryptoPrompt -> - onPromptRequested( - cryptoPrompt, - autoOpen = isAutoOpenBiometricPromptAllowed - ) - } ?: setException(Exception("Device unlock manager not initialized")) - } ?: setException(Exception("Cipher database not initialized")) - } catch (e: Exception) { - setException(e) + deviceUnlockManager = DeviceUnlockManager(getApplication()) + deviceUnlockManager?.initDecryptData(cipherDb.specParameters) { cryptoPrompt -> + onPromptRequested( + cryptoPrompt, + autoOpen = isAutoOpenBiometricPromptAllowed + ) + } ?: throw Exception("Device unlock manager not initialized") + } ?: throw Exception("Cipher database not initialized") } } @@ -475,5 +479,5 @@ data class DeviceUnlockState( val cipherDecryptDatabase: CipherDecryptDatabase? = null, val cryptoPromptState: DeviceUnlockPromptMode = DeviceUnlockPromptMode.IDLE_CLOSE, val autoOpenPrompt: Boolean = false, - val exception: Exception? = null + val exception: Throwable? = null ) \ No newline at end of file From 28e4d929bb6879a2d2871c4a443764610f22c8df Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 9 Sep 2025 20:55:30 +0200 Subject: [PATCH 80/88] fix: Warnings --- .../keepass/services/DatabaseTaskNotificationService.kt | 2 +- app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index 9d6c0baf3..4cd6ee6da 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -218,7 +218,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress Log.i(TAG, "Database file modified " + "$previousDatabaseInfo != $lastFileDatabaseInfo ") // Call listener to indicate a change in database info - if (!mSaveState && previousDatabaseInfo != null) { + if (!mSaveState) { mDatabaseInfoListeners.forEach { listener -> listener.onDatabaseInfoChanged( previousDatabaseInfo, diff --git a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt index 1ada1c3b9..1768c3c49 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt @@ -304,6 +304,7 @@ fun CollapsingToolbarLayout.changeTitleColor(color: Int) { invalidate() } +@Suppress("DEPRECATION") fun Activity.setTransparentNavigationBar(applyToStatusBar: Boolean = false, applyWindowInsets: () -> Unit) { // Only in portrait if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 From 3ee4caa153f44860c08e9a2565e1ba1a77d5e9df Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 11 Sep 2025 14:53:41 +0200 Subject: [PATCH 81/88] fix: Warnings --- .../src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt b/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt index 15b172db3..a7676cf51 100644 --- a/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt +++ b/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt @@ -92,7 +92,7 @@ inline fun Parcel.readParcelableCompat(): T? = when { fun Parcel.readParcelableCompat(clazz: Class): T? = when { SDK_INT >= 33 -> readParcelable(clazz.classLoader, clazz) - else -> @Suppress("DEPRECATION") readParcelable(clazz.classLoader) as? T + else -> @Suppress("DEPRECATION", "UNCHECKED_CAST") (readParcelable(clazz.classLoader) as? T) } inline fun Parcel.readSerializableCompat(): T? = when { From 7212c73481edce4416c13338459e5eb2d041406d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 11 Sep 2025 14:55:37 +0200 Subject: [PATCH 82/88] fix: Warnings --- .../com/kunzisoft/keepass/utils/ParcelableUtil.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt b/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt index a7676cf51..fa49bf6ab 100644 --- a/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt +++ b/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt @@ -120,19 +120,19 @@ fun Parcel.writeParcelableMap(map: Map, f inline fun Parcel.readParcelableMap(): Map { val size = readInt() val map = HashMap(size) - for (i in 0 until size) { + (0 until size).forEach { i -> val key: K? = try { when { SDK_INT >= 33 -> readParcelable(K::class.java.classLoader, K::class.java) else -> @Suppress("DEPRECATION") readParcelable(K::class.java.classLoader) } - } catch (e: Exception) { null } + } catch (_: Exception) { null } val value: V? = try { when { SDK_INT >= 33 -> readParcelable(V::class.java.classLoader, V::class.java) else -> @Suppress("DEPRECATION") readParcelable(V::class.java.classLoader) } - } catch (e: Exception) { null } + } catch (_: Exception) { null } if (key != null && value != null) map[key] = value } @@ -152,14 +152,14 @@ fun Parcel.writeStringParcelableMap(map: HashMap, fl inline fun Parcel.readStringParcelableMap(): LinkedHashMap { val size = readInt() val map = LinkedHashMap(size) - for (i in 0 until size) { + (0 until size).forEach { i -> val key: String? = readString() val value: V? = try { when { SDK_INT >= 33 -> readParcelable(V::class.java.classLoader, V::class.java) else -> @Suppress("DEPRECATION") readParcelable(V::class.java.classLoader) } - } catch (e: Exception) { null } + } catch (_: Exception) { null } if (key != null && value != null) map[key] = value } @@ -179,7 +179,7 @@ fun Parcel.writeStringIntMap(map: LinkedHashMap) { fun Parcel.readStringIntMap(): LinkedHashMap { val size = readInt() val map = LinkedHashMap(size) - for (i in 0 until size) { + (0 until size).forEach { i -> val key: String? = readString() val value: Int = readInt() if (key != null) @@ -201,7 +201,7 @@ fun Parcel.writeStringStringMap(map: MutableMap) { fun Parcel.readStringStringMap(): LinkedHashMap { val size = readInt() val map = LinkedHashMap(size) - for (i in 0 until size) { + (0 until size).forEach { i -> val key: String? = readString() val value: String? = readString() if (key != null && value != null) From 39d9a74a737ebf6b0a7a0a92b1618a753151a4c5 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 11 Sep 2025 16:36:35 +0200 Subject: [PATCH 83/88] fix: Warnings --- .../keepass/services/DatabaseTaskNotificationService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index 4cd6ee6da..9d6c0baf3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -218,7 +218,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress Log.i(TAG, "Database file modified " + "$previousDatabaseInfo != $lastFileDatabaseInfo ") // Call listener to indicate a change in database info - if (!mSaveState) { + if (!mSaveState && previousDatabaseInfo != null) { mDatabaseInfoListeners.forEach { listener -> listener.onDatabaseInfoChanged( previousDatabaseInfo, From 69e7cdbc4715fa609ffa13d1c7396236b3c80f5f Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 11 Sep 2025 16:43:40 +0200 Subject: [PATCH 84/88] fix: Search with space #175 --- .../keepass/database/helper/SearchHelper.kt | 6 +++--- .../keepass/database/search/SearchHelper.kt | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt b/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt index c4a90cf3c..232b88e17 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt @@ -59,9 +59,9 @@ object SearchHelper { && !searchInfo.containsOnlyNullValues()) { // If search provide results database.createVirtualGroupFromSearchInfo( - searchInfo.toString(), - searchInfo.isASearchByDomain(), - MAX_SEARCH_ENTRY + searchInfoString = searchInfo.toString(), + searchInfoByDomain = searchInfo.isASearchByDomain(), + max = MAX_SEARCH_ENTRY )?.let { searchGroup -> if (searchGroup.numberOfChildEntries > 0) { searchWithoutUI = true diff --git a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt index f8f3da992..3be886cd1 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt @@ -151,7 +151,7 @@ class SearchHelper { if (searchParameters.searchByDomain) { try { stringToCheck.inTheSameDomainAs(word, sameSubDomain = true) - } catch (e: Exception) { + } catch (_: Exception) { false } } else null @@ -204,10 +204,18 @@ class SearchHelper { regex.matches(stringToCheck) } else { specialComparison?.invoke(stringToCheck, searchParameters.searchQuery) - ?: stringToCheck.contains( - searchParameters.searchQuery, - !searchParameters.caseSensitive - ) + ?: run { + // Search with space separator #175 + var searchFound = true + searchParameters.searchQuery.split(" ").forEach { word -> + searchFound = searchFound + && stringToCheck.contains( + word, + !searchParameters.caseSensitive + ) + } + searchFound + } } } } From 2fc2a9c7c132dbf861107e0b16f5dfc06b848337 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 11 Sep 2025 21:19:40 +0200 Subject: [PATCH 85/88] fix: Delete algo during merge #1516 --- .../database/merge/DatabaseKDBXMerger.kt | 131 ++++++++++++++---- 1 file changed, 107 insertions(+), 24 deletions(-) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt b/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt index 1f83169ee..19e18b9e6 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt @@ -22,6 +22,7 @@ package com.kunzisoft.keepass.database.merge import com.kunzisoft.keepass.database.element.Attachment import com.kunzisoft.keepass.database.element.CustomData import com.kunzisoft.keepass.database.element.DateInstant +import com.kunzisoft.keepass.database.element.DeletedObject import com.kunzisoft.keepass.database.element.database.DatabaseKDB import com.kunzisoft.keepass.database.element.database.DatabaseKDBX import com.kunzisoft.keepass.database.element.entry.EntryKDB @@ -32,9 +33,10 @@ import com.kunzisoft.keepass.database.element.node.NodeHandler import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.NodeIdInt import com.kunzisoft.keepass.database.element.node.NodeIdUUID +import com.kunzisoft.keepass.database.element.node.NodeVersioned import com.kunzisoft.keepass.utils.readAllBytes import java.io.IOException -import java.util.* +import java.util.UUID class DatabaseKDBXMerger(private var database: DatabaseKDBX) { @@ -180,7 +182,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { } /** - * Merge a KDB> database in a KDBX database, + * Merge a KDBX database in a KDBX database, * Try to take into account the modification date of each element * To make a merge as accurate as possible */ @@ -302,32 +304,113 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) { } // Manage deleted objects - databaseToMerge.deletedObjects.forEach { deletedObject -> - val deletedObjectId = deletedObject.uuid - val databaseEntry = database.getEntryById(deletedObjectId) - val databaseGroup = database.getGroupById(deletedObjectId) - val databaseIcon = database.iconsManager.getIcon(deletedObjectId) - val databaseIconModificationTime = databaseIcon?.lastModificationTime - if (databaseEntry != null - && deletedObject.deletionTime.isAfter(databaseEntry.lastModificationTime)) { - database.removeEntryFrom(databaseEntry, databaseEntry.parent) - } - if (databaseGroup != null - && deletedObject.deletionTime.isAfter(databaseGroup.lastModificationTime)) { - database.removeGroupFrom(databaseGroup, databaseGroup.parent) - } - if (databaseIcon != null - && ( - databaseIconModificationTime == null - || (deletedObject.deletionTime.isAfter(databaseIconModificationTime)) - ) - ) { - database.removeCustomIcon(deletedObjectId) - } + val deletedObjects = databaseToMerge.deletedObjects + deletedObjects.forEach { deletedObject -> + deleteEntry(deletedObject) + deleteGroup(deletedObject, deletedObjects) + deleteIcon(deletedObject) // Attachments are removed and optimized during the database save } } + /** + * Delete an entry from the database with the [deletedEntry] id + */ + private fun deleteEntry(deletedEntry: DeletedObject) { + val databaseEntry = database.getEntryById(deletedEntry.uuid) + if (databaseEntry != null + && deletedEntry.deletionTime.isAfter(databaseEntry.lastModificationTime)) { + database.removeEntryFrom(databaseEntry, databaseEntry.parent) + } + } + + /** + * Check whether a node is in the list of deleted objects + */ + private fun Set.containsNode(node: NodeVersioned): Boolean { + return this.any { it.uuid == node.nodeId.id } + } + + /** + * Check whether a node is not in the list of deleted objects + */ + private fun Set.notContainsNode(node: NodeVersioned): Boolean { + return !this.containsNode(node) + } + + /** + * Get the first parent not deleted + */ + private fun firstNotDeletedParent( + node: NodeVersioned, + deletedObjects: Set + ): GroupKDBX? { + var parent = node.parent + while (parent != null && deletedObjects.containsNode(parent)) { + parent = node.parent + } + return parent + } + + /** + * Delete a group from the database with the [deletedGroup] id + * Recursively check whether a group to be deleted contains a node not to be deleted with [deletedObjects] + * and move it to the first parent that has not been deleted. + */ + private fun deleteGroup(deletedGroup: DeletedObject, deletedObjects: Set) { + val databaseGroup = database.getGroupById(deletedGroup.uuid) + if (databaseGroup != null + && deletedGroup.deletionTime.isAfter(databaseGroup.lastModificationTime)) { + // Must be in dedicated list to prevent modification collision + val entriesToMove = mutableListOf() + databaseGroup.getChildEntries().forEach { child -> + // If the child entry is not a deleted object, + if (deletedObjects.notContainsNode(child)) { + entriesToMove.add(child) + } + } + val groupsToMove = mutableListOf() + databaseGroup.getChildGroups().forEach { child -> + // Move the group to the first parent not deleted + // the deleted objects will take care of remove it later + groupsToMove.add(child) + } + // For each node to move, move it + // try to move the child entry in the first parent not deleted + entriesToMove.forEach { child -> + database.removeEntryFrom(child, child.parent) + database.addEntryTo( + child, + firstNotDeletedParent(databaseGroup, deletedObjects) + ) + } + groupsToMove.forEach { child -> + database.removeGroupFrom(child, child.parent) + database.addGroupTo( + child, + firstNotDeletedParent(databaseGroup, deletedObjects) + ) + } + // Then delete the group + database.removeGroupFrom(databaseGroup, databaseGroup.parent) + } + } + + /** + * Delete an icon from the database with the [deletedIcon] id + */ + private fun deleteIcon(deletedIcon: DeletedObject) { + val deletedObjectId = deletedIcon.uuid + val databaseIcon = database.iconsManager.getIcon(deletedObjectId) + val databaseIconModificationTime = databaseIcon?.lastModificationTime + if (databaseIcon != null + && (databaseIconModificationTime == null + || (deletedIcon.deletionTime.isAfter(databaseIconModificationTime))) + ) { + database.removeCustomIcon(deletedObjectId) + } + } + /** * Merge [customDataToMerge] in [customData] */ From 56cb5953dde4ed3ce373b34ec152b8a857cb8a54 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 12 Sep 2025 13:00:56 +0200 Subject: [PATCH 86/88] fix: Deletable recycle bin #2163 --- .../activities/dialogs/SortDialogFragment.kt | 15 ++------ .../activities/fragments/GroupFragment.kt | 38 +++++++------------ 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SortDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SortDialogFragment.kt index 45cbb9db1..78972aa76 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SortDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SortDialogFragment.kt @@ -176,21 +176,14 @@ class SortDialogFragment : DatabaseDialogFragment() { return bundle } - fun getInstance(sortNodeEnum: SortNodeEnum, - ascending: Boolean, - groupsBefore: Boolean): SortDialogFragment { - val bundle = buildBundle(sortNodeEnum, ascending, groupsBefore) - val fragment = SortDialogFragment() - fragment.arguments = bundle - return fragment - } - fun getInstance(sortNodeEnum: SortNodeEnum, ascending: Boolean, groupsBefore: Boolean, - recycleBinBottom: Boolean): SortDialogFragment { + recycleBinBottom: Boolean?): SortDialogFragment { val bundle = buildBundle(sortNodeEnum, ascending, groupsBefore) - bundle.putBoolean(SORT_RECYCLE_BIN_BOTTOM_BUNDLE_KEY, recycleBinBottom) + recycleBinBottom?.let { + bundle.putBoolean(SORT_RECYCLE_BIN_BOTTOM_BUNDLE_KEY, recycleBinBottom) + } val fragment = SortDialogFragment() fragment.arguments = bundle return fragment diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt index 7a7cf5acf..f26cc3a70 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt @@ -76,9 +76,6 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen private var specialMode: SpecialMode = SpecialMode.DEFAULT - private var mRecycleBinEnable: Boolean = false - private var mRecycleBin: Group? = null - private var mRecycleViewScrollListener = object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) @@ -102,21 +99,14 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen R.id.menu_sort -> { context?.let { context -> val sortDialogFragment: SortDialogFragment = - if (mRecycleBinEnable) { - SortDialogFragment.getInstance( - PreferencesUtil.getListSort(context), - PreferencesUtil.getAscendingSort(context), - PreferencesUtil.getGroupsBeforeSort(context), + SortDialogFragment.getInstance( + PreferencesUtil.getListSort(context), + PreferencesUtil.getAscendingSort(context), + PreferencesUtil.getGroupsBeforeSort(context), + if (mDatabase?.isRecycleBinEnabled == true) { PreferencesUtil.getRecycleBinBottomSort(context) - ) - } else { - SortDialogFragment.getInstance( - PreferencesUtil.getListSort(context), - PreferencesUtil.getAscendingSort(context), - PreferencesUtil.getGroupsBeforeSort(context) - ) - } - + } else null + ) sortDialogFragment.show(childFragmentManager, "sortDialog") } true @@ -165,9 +155,6 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen } override fun onDatabaseRetrieved(database: ContextualDatabase?) { - mRecycleBinEnable = database?.isRecycleBinEnabled == true - mRecycleBin = database?.recycleBin - context?.let { context -> database?.let { database -> mAdapter = NodesAdapter(context, database).apply { @@ -312,6 +299,11 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen } } + private fun containsRecycleBin(nodes: List): Boolean { + return mDatabase?.isRecycleBinEnabled == true + && nodes.any { it == mDatabase?.recycleBin } + } + fun actionNodesCallback(database: ContextualDatabase, nodes: List, menuListener: NodesActionMenuListener?, @@ -336,8 +328,7 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen // Open and Edit for a single item if (nodes.size == 1) { // Edition - if (database.isReadOnly - || (mRecycleBinEnable && nodes[0] == mRecycleBin)) { + if (database.isReadOnly || containsRecycleBin(nodes)) { menu?.removeItem(R.id.menu_edit) } } else { @@ -357,8 +348,7 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen } // Deletion - if (database.isReadOnly - || (mRecycleBinEnable && nodes.any { it == mRecycleBin })) { + if (database.isReadOnly || containsRecycleBin(nodes)) { menu?.removeItem(R.id.menu_delete) } } From af068349e45733594a1b669b29489c60b2afb98d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 12 Sep 2025 14:14:06 +0200 Subject: [PATCH 87/88] fix: Upgrade to 4.1.8 --- CHANGELOG | 8 ++++++++ app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/141.txt | 6 ++++++ fastlane/metadata/android/fr-FR/changelogs/141.txt | 6 ++++++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/141.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/141.txt diff --git a/CHANGELOG b/CHANGELOG index 6acc3f201..23aeb1c88 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,11 @@ +KeePassDX(4.1.8) + * Updated to API 35 minimum SDK 19 #2073 #2138 #2067 #2133 #1687 (Thx @Dev-ClayP) + * Remember last read-only state #2099 #2100 (Thx @rmacklin) + * Fix merge deletion #1516 + * Fix space in search #175 + * Fix deletable recycle bin #2163 + * Small fixes + KeePassDX(4.1.7) * Fix CipherDatabase for biometric states #2119 diff --git a/app/build.gradle b/app/build.gradle index 4b5287f6a..090ae8234 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.kunzisoft.keepass" minSdkVersion 19 targetSdkVersion 35 - versionCode = 139 - versionName = "4.1.7" + versionCode = 141 + versionName = "4.1.8" multiDexEnabled true testApplicationId = "com.kunzisoft.keepass.tests" diff --git a/fastlane/metadata/android/en-US/changelogs/141.txt b/fastlane/metadata/android/en-US/changelogs/141.txt new file mode 100644 index 000000000..7316a4d1f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/141.txt @@ -0,0 +1,6 @@ + * Updated to API 35 minimum SDK 19 #2073 #2138 #2067 #2133 #1687 (Thx @Dev-ClayP) + * Remember last read-only state #2099 #2100 (Thx @rmacklin) + * Fix merge deletion #1516 + * Fix space in search #175 + * Fix deletable recycle bin #2163 + * Small fixes \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/141.txt b/fastlane/metadata/android/fr-FR/changelogs/141.txt new file mode 100644 index 000000000..c89f4045d --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/141.txt @@ -0,0 +1,6 @@ + * Mise à jour vers API 35 minimum SDK 19 #2073 #2138 #2067 #2133 #1687 (Thx @Dev-ClayP) + * Sauvegarde du dernier état lecture seule #2099 #2100 (Thx @rmacklin) + * Correction de la suppression lors d'un merge #1516 + * Correction des espaces dans la recherche #175 + * Correction de la poubelle supprimable #2163 + * Petites corrections \ No newline at end of file From da8ef9340cf4f96dda5f9277e2c22149576e259e Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 12 Sep 2025 15:23:32 +0200 Subject: [PATCH 88/88] fix: Loading ViewModel --- .../activities/MainCredentialActivity.kt | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt index cd45b54a3..4bca99154 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt @@ -43,6 +43,7 @@ import androidx.biometric.BiometricManager import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.fragment.app.commit import androidx.lifecycle.Lifecycle +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.snackbar.Snackbar @@ -75,8 +76,8 @@ import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion. import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.DATABASE_URI_KEY import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.MAIN_CREDENTIAL_KEY import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.READ_ONLY_KEY -import com.kunzisoft.keepass.settings.DeviceUnlockSettingsActivity import com.kunzisoft.keepass.settings.AppearanceSettingsActivity +import com.kunzisoft.keepass.settings.DeviceUnlockSettingsActivity import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.utils.BACK_PREVIOUS_KEYBOARD_ACTION @@ -107,7 +108,11 @@ class MainCredentialActivity : DatabaseModeActivity() { private var deviceUnlockFragment: DeviceUnlockFragment? = null private val mDatabaseFileViewModel: DatabaseFileViewModel by viewModels() - private val mDeviceUnlockViewModel: DeviceUnlockViewModel by viewModels() + private val mDeviceUnlockViewModel: DeviceUnlockViewModel? by lazy { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + ViewModelProvider(this)[DeviceUnlockViewModel::class.java] + } else null + } private val mPasswordActivityEducation = PasswordActivityEducation(this) @@ -177,7 +182,7 @@ class MainCredentialActivity : DatabaseModeActivity() { // Listen password checkbox to init advanced unlock and confirmation button mainCredentialView?.onConditionToStoreCredentialChanged = { _, verified -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mDeviceUnlockViewModel.checkConditionToStoreCredential( + mDeviceUnlockViewModel?.checkConditionToStoreCredential( condition = verified ) } @@ -242,29 +247,31 @@ class MainCredentialActivity : DatabaseModeActivity() { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mDeviceUnlockViewModel.uiState.collect { uiState -> - // New value received - uiState.credentialRequiredCipher?.let { cipher -> - mDeviceUnlockViewModel.encryptCredential( - credential = getCredentialForEncryption(), - cipher = cipher - ) - } - uiState.cipherEncryptDatabase?.let { cipherEncryptDatabase -> - onCredentialEncrypted(cipherEncryptDatabase) - mDeviceUnlockViewModel.consumeCredentialEncrypted() - } - uiState.cipherDecryptDatabase?.let { cipherDecryptDatabase -> - onCredentialDecrypted(cipherDecryptDatabase) - mDeviceUnlockViewModel.consumeCredentialDecrypted() - } - uiState.exception?.let { error -> - Snackbar.make( - coordinatorLayout, - deviceUnlockError(error, this@MainCredentialActivity), - Snackbar.LENGTH_LONG - ).asError().show() - mDeviceUnlockViewModel.exceptionShown() + mDeviceUnlockViewModel?.let { deviceUnlockViewModel -> + deviceUnlockViewModel.uiState.collect { uiState -> + // New value received + uiState.credentialRequiredCipher?.let { cipher -> + deviceUnlockViewModel.encryptCredential( + credential = getCredentialForEncryption(), + cipher = cipher + ) + } + uiState.cipherEncryptDatabase?.let { cipherEncryptDatabase -> + onCredentialEncrypted(cipherEncryptDatabase) + deviceUnlockViewModel.consumeCredentialEncrypted() + } + uiState.cipherDecryptDatabase?.let { cipherDecryptDatabase -> + onCredentialDecrypted(cipherDecryptDatabase) + deviceUnlockViewModel.consumeCredentialDecrypted() + } + uiState.exception?.let { error -> + Snackbar.make( + coordinatorLayout, + deviceUnlockError(error, this@MainCredentialActivity), + Snackbar.LENGTH_LONG + ).asError().show() + deviceUnlockViewModel.exceptionShown() + } } } } @@ -517,7 +524,7 @@ class MainCredentialActivity : DatabaseModeActivity() { } else { // Init Biometric elements if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mDeviceUnlockViewModel.connect(databaseFileUri) + mDeviceUnlockViewModel?.connect(databaseFileUri) } } @@ -661,7 +668,7 @@ class MainCredentialActivity : DatabaseModeActivity() { try { menu.findItem(R.id.menu_open_file_read_mode_key) } catch (e: Exception) { - Log.e(TAG, "Unable to find read mode menu") + Log.e(TAG, "Unable to find read mode menu", e) } performedNextEducation(menu) }, @@ -690,7 +697,7 @@ class MainCredentialActivity : DatabaseModeActivity() { }) } } - } catch (ignored: Exception) {} + } catch (_: Exception) {} } } @@ -727,7 +734,7 @@ class MainCredentialActivity : DatabaseModeActivity() { override fun onDestroy() { super.onDestroy() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mDeviceUnlockViewModel.disconnect() + mDeviceUnlockViewModel?.disconnect() } }