diff --git a/CHANGELOG b/CHANGELOG index 5d95bcb85..0fdaf8a2d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,10 @@ -KeePassDX(3.5.0) +KeePassDX(3.4.5) + * Fix custom data in group (fix KeeShare) #1335 + * Fix device credential unlocking #1344 + * New clipboard manager #1343 * Keep screen on by default when viewing an entry + * Change the order of the search filters + * Fix searchable selection KeePassDX(3.4.4) * Fix crash in New Android 13 #1321 diff --git a/app/build.gradle b/app/build.gradle index a3a69b7fe..952b7da32 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,16 +4,16 @@ apply plugin: 'kotlin-parcelize' apply plugin: 'kotlin-kapt' android { - compileSdkVersion 31 - buildToolsVersion "31.0.0" + compileSdkVersion 32 + buildToolsVersion "32.0.0" ndkVersion "21.4.7075529" defaultConfig { applicationId "com.kunzisoft.keepass" minSdkVersion 15 - targetSdkVersion 31 + targetSdkVersion 32 versionCode = 114 - versionName = "3.5.0" + versionName = "3.4.5" multiDexEnabled true testApplicationId = "com.kunzisoft.keepass.tests" @@ -93,7 +93,7 @@ android { } } -def room_version = "2.4.2" +def room_version = "2.4.3" dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" @@ -101,14 +101,14 @@ dependencies { implementation "androidx.appcompat:appcompat:$android_appcompat_version" implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01' implementation 'androidx.documentfile:documentfile:1.0.1' implementation 'androidx.biometric:biometric:1.1.0' implementation 'androidx.media:media:1.6.0' // Lifecycle - LiveData - ViewModel - Coroutines implementation "androidx.core:core-ktx:$android_core_version" - implementation 'androidx.fragment:fragment-ktx:1.4.1' + implementation 'androidx.fragment:fragment-ktx:1.5.1' implementation "com.google.android.material:material:$android_material_version" // Token auto complete // From sources until https://github.com/splitwise/TokenAutoComplete/pull/422 fixed diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt index e8279a2ac..c9e5b16e7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt @@ -27,7 +27,6 @@ import com.kunzisoft.keepass.view.TemplateView import com.kunzisoft.keepass.view.hideByFading import com.kunzisoft.keepass.view.showByFading import com.kunzisoft.keepass.viewmodels.EntryViewModel -import java.util.* class EntryFragment: DatabaseFragment() { @@ -158,11 +157,9 @@ class EntryFragment: DatabaseFragment() { setOnCopyActionClickListener { field -> mClipboardHelper?.timeoutCopyToClipboard( + TemplateField.getLocalizedName(context, field.name), field.protectedValue.stringValue, - getString( - R.string.copy_field, - TemplateField.getLocalizedName(context, field.name) - ) + field.protectedValue.isProtected ) } } @@ -251,8 +248,7 @@ class EntryFragment: DatabaseFragment() { fun launchEntryCopyEducationAction() { val appNameString = getString(R.string.app_name) - mClipboardHelper?.timeoutCopyToClipboard(appNameString, - getString(R.string.copy_field, appNameString)) + mClipboardHelper?.timeoutCopyToClipboard(appNameString, appNameString) } companion object { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt index 887049b13..2a4973042 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PassphraseGeneratorFragment.kt @@ -78,9 +78,11 @@ class PassphraseGeneratorFragment : DatabaseFragment() { View.VISIBLE else View.GONE val clipboardHelper = ClipboardHelper(context) passphraseCopyView?.setOnClickListener { - clipboardHelper.timeoutCopyToClipboard(passKeyView.passwordString, - getString(R.string.copy_field, - getString(R.string.entry_password))) + clipboardHelper.timeoutCopyToClipboard( + getString(R.string.passphrase), + passKeyView.passwordString, + true + ) } wordCaseAdapter = ArrayAdapter(context, diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt index d74231efd..88c2bb495 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/PasswordGeneratorFragment.kt @@ -99,9 +99,11 @@ class PasswordGeneratorFragment : DatabaseFragment() { View.VISIBLE else View.GONE val clipboardHelper = ClipboardHelper(context) passwordCopyView?.setOnClickListener { - clipboardHelper.timeoutCopyToClipboard(passKeyView.passwordString, - getString(R.string.copy_field, - getString(R.string.entry_password))) + clipboardHelper.timeoutCopyToClipboard( + getString(R.string.password), + passKeyView.passwordString, + true + ) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/helpers/ExternalFileHelper.kt b/app/src/main/java/com/kunzisoft/keepass/activities/helpers/ExternalFileHelper.kt index cc12c2347..2a4ae25cf 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/helpers/ExternalFileHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/helpers/ExternalFileHelper.kt @@ -56,7 +56,7 @@ class ExternalFileHelper { fun buildOpenDocument(onFileSelected: ((uri: Uri?) -> Unit)?) { - val resultCallback = ActivityResultCallback { result -> + val resultCallback = ActivityResultCallback { result -> result?.let { uri -> UriUtil.takeUriPermission(activity?.contentResolver, uri) onFileSelected?.invoke(uri) @@ -91,7 +91,7 @@ class ExternalFileHelper { fun buildCreateDocument(typeString: String = "application/octet-stream", onFileCreated: (fileCreated: Uri?)->Unit) { - val resultCallback = ActivityResultCallback { result -> + val resultCallback = ActivityResultCallback { result -> onFileCreated.invoke(result) } @@ -150,7 +150,7 @@ class ExternalFileHelper { class OpenDocument : ActivityResultContracts.OpenDocument() { @SuppressLint("InlinedApi") - override fun createIntent(context: Context, input: Array): Intent { + override fun createIntent(context: Context, input: Array): Intent { return super.createIntent(context, input).apply { addCategory(Intent.CATEGORY_OPENABLE) addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) @@ -178,11 +178,10 @@ class ExternalFileHelper { } } - class CreateDocument(private val typeString: String) : ActivityResultContracts.CreateDocument() { + class CreateDocument(typeString: String) : ActivityResultContracts.CreateDocument(typeString) { override fun createIntent(context: Context, input: String): Intent { return super.createIntent(context, input).apply { addCategory(Intent.CATEGORY_OPENABLE) - type = typeString } } } 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 352e2eedc..12c1ff3a5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt @@ -21,13 +21,13 @@ package com.kunzisoft.keepass.adapters import android.content.Context import android.graphics.Color +import android.util.Log import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView -import android.widget.Toast import androidx.annotation.ColorInt import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.SortedList @@ -521,13 +521,14 @@ class NodesAdapter (private val context: Context, } holder?.otpContainer?.setOnClickListener { otpElement?.token?.let { token -> - Toast.makeText( - context, - context.getString(R.string.copy_field, - TemplateField.getLocalizedName(context, TemplateField.LABEL_TOKEN)), - Toast.LENGTH_LONG - ).show() - mClipboardHelper.copyToClipboard(token) + try { + mClipboardHelper.copyToClipboard( + TemplateField.getLocalizedName(context, TemplateField.LABEL_TOKEN), + token + ) + } catch (e: Exception) { + Log.e(TAG, "Unable to copy the OTP token", e) + } } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockManager.kt b/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockManager.kt index fdb16f8d1..764396dde 100644 --- a/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockManager.kt +++ b/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockManager.kt @@ -403,13 +403,11 @@ class AdvancedUnlockManager(private var retrieveContext: () -> FragmentActivity) } } - @RequiresApi(api = Build.VERSION_CODES.M) fun isDeviceSecure(context: Context): Boolean { - val keyguardManager = ContextCompat.getSystemService(context, KeyguardManager::class.java) - return keyguardManager?.isDeviceSecure ?: false + return ContextCompat.getSystemService(context, KeyguardManager::class.java) + ?.isDeviceSecure ?: false } - @RequiresApi(api = Build.VERSION_CODES.M) fun biometricUnlockSupported(context: Context): Boolean { val biometricCanAuthenticate = try { BiometricManager.from(context).canAuthenticate(BIOMETRIC_STRONG) @@ -430,28 +428,23 @@ class AdvancedUnlockManager(private var retrieveContext: () -> FragmentActivity) ) } - @RequiresApi(api = Build.VERSION_CODES.M) fun deviceCredentialUnlockSupported(context: Context): Boolean { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val biometricCanAuthenticate = BiometricManager.from(context).canAuthenticate(DEVICE_CREDENTIAL) - return (biometricCanAuthenticate == BiometricManager.BIOMETRIC_SUCCESS + (biometricCanAuthenticate == BiometricManager.BIOMETRIC_SUCCESS || biometricCanAuthenticate == BiometricManager.BIOMETRIC_STATUS_UNKNOWN || biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE || biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED || biometricCanAuthenticate == BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED ) - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - ContextCompat.getSystemService(context, KeyguardManager::class.java)?.apply { - return isDeviceSecure - } + } else { + true } - return false } /** * Remove entry key in keystore */ - @RequiresApi(api = Build.VERSION_CODES.M) fun deleteEntryKeyInKeystoreForBiometric(fragmentActivity: FragmentActivity, advancedCallback: AdvancedUnlockErrorCallback) { AdvancedUnlockManager{ fragmentActivity }.apply { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt index 7402fc529..5440faf64 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt @@ -798,10 +798,6 @@ class DatabaseKDBX : DatabaseVersioned { mFieldReferenceEngine.clear() } - fun containsPublicCustomData(): Boolean { - return publicCustomData.size() > 0 - } - fun buildNewBinaryAttachment(smallSize: Boolean, compression: Boolean, protection: Boolean, diff --git a/app/src/main/java/com/kunzisoft/keepass/database/exception/ClipboardException.kt b/app/src/main/java/com/kunzisoft/keepass/database/exception/ClipboardException.kt deleted file mode 100644 index 5968f87d0..000000000 --- a/app/src/main/java/com/kunzisoft/keepass/database/exception/ClipboardException.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ -package com.kunzisoft.keepass.database.exception - -class ClipboardException(e: Exception) : Exception(e) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt index d9c8f4dae..106a22d33 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt @@ -92,7 +92,7 @@ constructor(private val databaseKDBX: DatabaseKDBX, writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.InnerRandomStreamID, uIntTo4Bytes(header.innerRandomStream!!.id)) } - if (databaseKDBX.containsPublicCustomData()) { + if (databaseKDBX.publicCustomData.size() > 0) { val bos = ByteArrayOutputStream() VariantDictionary.serialize(databaseKDBX.publicCustomData, bos) writeHeaderField(DatabaseHeaderKDBX.PwDbHeaderV4Fields.PublicCustomData, bos.toByteArray()) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt index 5ef840bd5..66e6afa16 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt @@ -353,6 +353,7 @@ class DatabaseOutputKDBX(private val mDatabaseKDBX: DatabaseKDBX) writeBoolean(DatabaseKDBXXML.ElemEnableAutoType, group.enableAutoType) writeBoolean(DatabaseKDBXXML.ElemEnableSearching, group.enableSearching) writeUuid(DatabaseKDBXXML.ElemLastTopVisibleEntry, group.lastTopVisibleEntry) + writeCustomData(group.customData) } @Throws(IllegalArgumentException::class, IllegalStateException::class, IOException::class) diff --git a/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationField.kt b/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationField.kt index 2521db4af..c7b7fe080 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationField.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationField.kt @@ -33,6 +33,10 @@ class ClipboardEntryNotificationField : Parcelable { private var id: NotificationFieldId = NotificationFieldId.UNKNOWN var label: String = "" + val isSensitive: Boolean + get() { + return id == NotificationFieldId.PASSWORD + } val actionKey: String get() = getActionKey(id) diff --git a/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt index 9372ab85b..e88de373a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/ClipboardEntryNotificationService.kt @@ -31,7 +31,6 @@ import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.ClipboardHelper import com.kunzisoft.keepass.timeout.TimeoutHelper.NEVER import com.kunzisoft.keepass.utils.LOCK_ACTION -import java.util.* class ClipboardEntryNotificationService : LockNotificationService() { @@ -75,7 +74,7 @@ class ClipboardEntryNotificationService : LockNotificationService() { } ACTION_CLEAN_CLIPBOARD == intent.action -> { mTimerJob?.cancel() - cleanClipboard() + clipboardHelper?.cleanClipboard() stopNotificationAndSendLockIfNeeded() } else -> for (actionKey in ClipboardEntryNotificationField.allActionKeys) { @@ -153,7 +152,11 @@ class ClipboardEntryNotificationService : LockNotificationService() { try { var generatedValue = fieldToCopy.getGeneratedValue(mEntryInfo) - clipboardHelper?.copyToClipboard(fieldToCopy.label, generatedValue) + clipboardHelper?.copyToClipboard( + fieldToCopy.label, + generatedValue, + fieldToCopy.isSensitive + ) val builder = buildNewNotification() .setSmallIcon(R.drawable.notification_ic_clipboard_key_24dp) @@ -186,13 +189,17 @@ class ClipboardEntryNotificationService : LockNotificationService() { // New auto generated value if (generatedValue != newGeneratedValue) { generatedValue = newGeneratedValue - clipboardHelper?.copyToClipboard(fieldToCopy.label, generatedValue) + clipboardHelper?.copyToClipboard( + fieldToCopy.label, + generatedValue, + fieldToCopy.isSensitive + ) } }) { stopNotificationAndSendLockIfNeeded() // Clean password only if no next field if (nextFields.size <= 0) - cleanClipboard() + clipboardHelper?.cleanClipboard() } } else { // No timer @@ -202,25 +209,15 @@ class ClipboardEntryNotificationService : LockNotificationService() { } catch (e: Exception) { Log.e(TAG, "Clipboard can't be populate", e) } - - } - - private fun cleanClipboard() { - try { - clipboardHelper?.cleanClipboard() - } catch (e: Exception) { - Log.e(TAG, "Clipboard can't be cleaned", e) - } } override fun onTaskRemoved(rootIntent: Intent?) { - cleanClipboard() - + clipboardHelper?.cleanClipboard() super.onTaskRemoved(rootIntent) } override fun onDestroy() { - cleanClipboard() + clipboardHelper?.cleanClipboard() super.onDestroy() } diff --git a/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt b/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt index 14f550819..6e92bfb9b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt @@ -24,117 +24,117 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.os.Build +import android.os.PersistableBundle import android.text.SpannableString import android.text.method.LinkMovementMethod import android.text.util.Linkify +import android.util.Log import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AlertDialog import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.database.exception.ClipboardException import com.kunzisoft.keepass.settings.PreferencesUtil import java.util.* -class ClipboardHelper(private val context: Context) { +class ClipboardHelper(context: Context) { + private var mAppContext = context.applicationContext private var mClipboardManager: ClipboardManager? = null private val mTimer = Timer() private fun getClipboardManager(): ClipboardManager? { if (mClipboardManager == null) - mClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager? + mClipboardManager = mAppContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager? return mClipboardManager } - fun timeoutCopyToClipboard(text: String, toastString: String = "") { - if (toastString.isNotEmpty()) - Toast.makeText(context, toastString, Toast.LENGTH_LONG).show() - + fun timeoutCopyToClipboard(label: String, text: String, sensitive: Boolean = false) { try { - copyToClipboard(text) - } catch (e: ClipboardException) { + copyToClipboard(label, text, sensitive) + } catch (e: Exception) { showClipboardErrorDialog() return } - val clipboardTimeout = PreferencesUtil.getClipboardTimeout(context) + val clipboardTimeout = PreferencesUtil.getClipboardTimeout(mAppContext) if (clipboardTimeout > 0) { - mTimer.schedule(ClearClipboardTask(context, text), clipboardTimeout) + mTimer.schedule(ClearClipboardTask(text), clipboardTimeout) } } - fun getClipboard(context: Context): CharSequence { - if (getClipboardManager()?.hasPrimaryClip() == true) { - val data = getClipboardManager()?.primaryClip - if (data != null && data.itemCount > 0) { - val text = data.getItemAt(0).coerceToText(context) - if (text != null) { - return text + fun copyToClipboard(label: String, value: String, sensitive: Boolean = false) { + getClipboardManager()?.setPrimaryClip(ClipData.newPlainText(DEFAULT_LABEL, value).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + description.extras = PersistableBundle().apply { + putBoolean("android.content.extra.IS_SENSITIVE", sensitive) } } + }) + if (label.isNotEmpty() && Build.VERSION.SDK_INT < Build.VERSION_CODES.S_V2) { + Toast.makeText( + mAppContext, + mAppContext.getString( + R.string.copy_field, + label + ), + Toast.LENGTH_LONG + ).show() } - return "" } - @Throws(ClipboardException::class) - fun copyToClipboard(value: String) { - copyToClipboard("", value) - } - - @Throws(ClipboardException::class) - fun copyToClipboard(label: String, value: String) { - try { - getClipboardManager()?.setPrimaryClip(ClipData.newPlainText(label, value)) - } catch (e: Exception) { - throw ClipboardException(e) - } - - } - - @Throws(ClipboardException::class) - fun cleanClipboard(label: String = "") { + fun cleanClipboard() { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { getClipboardManager()?.clearPrimaryClip() } else { - copyToClipboard(label, "") + copyToClipboard(DEFAULT_LABEL, "") } } catch (e: Exception) { - throw ClipboardException(e) + Log.e("ClipboardHelper", "Unable to clean the clipboard", e) } } // Task which clears the clipboard, and sends a toast to the foreground. - private inner class ClearClipboardTask (private val mCtx: Context, - private val mClearText: String) : TimerTask() { + private inner class ClearClipboardTask (private val mClearText: String) : TimerTask() { override fun run() { - val currentClip = getClipboard(mCtx).toString() - if (currentClip == mClearText) { - try { - cleanClipboard() - R.string.clipboard_cleared - } catch (e: ClipboardException) { - R.string.clipboard_error_clear + if (getClipboard(mAppContext).toString() == mClearText) { + cleanClipboard() + } + } + + private fun getClipboard(context: Context): CharSequence { + if (getClipboardManager()?.hasPrimaryClip() == true) { + val data = getClipboardManager()?.primaryClip + if (data != null && data.itemCount > 0) { + val text = data.getItemAt(0).coerceToText(context) + if (text != null) { + return text + } } } + return "" } } private fun showClipboardErrorDialog() { - val textDescription = context.getString(R.string.clipboard_error) + val textDescription = mAppContext.getString(R.string.clipboard_error) val spannableString = SpannableString(textDescription) - val textView = TextView(context).apply { + val textView = TextView(mAppContext).apply { text = spannableString autoLinkMask = Activity.RESULT_OK movementMethod = LinkMovementMethod.getInstance() } Linkify.addLinks(spannableString, Linkify.WEB_URLS) - AlertDialog.Builder(context) + AlertDialog.Builder(mAppContext) .setTitle(R.string.clipboard_error_title) .setView(textView) .setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() } .show() } + + companion object { + private const val DEFAULT_LABEL = "" + } } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/InheritedCompletionView.kt b/app/src/main/java/com/kunzisoft/keepass/view/InheritedCompletionView.kt index 6ec294850..7a122912e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/InheritedCompletionView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/InheritedCompletionView.kt @@ -52,9 +52,16 @@ class InheritedCompletionView @JvmOverloads constructor( } init { - setAdapter(adapter) + isFocusable = false + isFocusableInTouchMode = false + //hardwareKeyCompletion.isEnabled = false + isCursorVisible = false + setTextIsSelectable(false) inputType = InputType.TYPE_NULL - adapter.filter.filter(null) + setAdapter(adapter) + setOnClickListener { + showDropDown() + } } fun getValue(): Boolean? { @@ -63,7 +70,6 @@ class InheritedCompletionView @JvmOverloads constructor( fun setValue(inherited: Boolean?) { setText(context.getString(InheritedStatus.getStatusFromValue(inherited).stringId)) - adapter.filter.filter(null) } private enum class InheritedStatus(val stringId: Int, val value: Boolean?) { diff --git a/app/src/main/res/layout/view_search_filters.xml b/app/src/main/res/layout/view_search_filters.xml index cc78cfc4f..f48c67270 100644 --- a/app/src/main/res/layout/view_search_filters.xml +++ b/app/src/main/res/layout/view_search_filters.xml @@ -69,34 +69,6 @@ android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:orientation="vertical"> - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 76ef0db6b..dd388e5a1 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -41,4 +41,53 @@ ক্লিপবোর্ড পরিষ্কার করা হয়েছে শেষ ব্যবহার কিছু ডিভাইস অ্যাপ্লিকেশনগুলোকে ক্লিপবোর্ড ব্যবহার করতে দেয় না। + সংখ্যা + পাসওয়ার্ড + খুলো + লিখন-সুরক্ষিত + স্পেস + লিখন-সুরক্ষিত + সুরক্ষা + বাতিল + মূল + সৃষ্টি + ইতিহাস + দৈর্ঘ্য + দৈর্ঘ্য + সম্পর্কে + সতর্কতা + সম্পাদনা + শিরোনাম + নাম + বড় হাতের + চেহারা + ইউআরএল + দান করো + অনুলিপি + লেপন + পাসওয়ার্ড + পরিবর্তন + গণক + উপমা + বিয়োগ + কখনো না + স্থানান্তর + গোপন + পাসওয়ার্ড + সাজাও + শিরোনাম + অ্যালগরিদম + ওটিপি + নাম + চাবিনথি(কি ফাইল) + পছন্দসমূহ + ছোটো হাতের + মুছো + অনুসন্ধান + পরিবর্তনযোগ্য + কাজ করা হচ্ছে… + বিশেষ + নিম্নরেখা + প্রবেশ + অনুসন্ধান \ No newline at end of file diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml new file mode 100644 index 000000000..855687db0 --- /dev/null +++ b/app/src/main/res/values-bn/strings.xml @@ -0,0 +1,96 @@ + + + যোগাযোগ + অবদান + প্রতিক্রিয়া + মূলপাতা + কিপাস পাসওয়ার্ড ম্যানেজারের অ্যান্ড্রয়েড বাস্তবায়ন + গ্রহণ + এন্টরি যোগ করুন + এন্টরি সম্পাদনা করুন + গ্রুপ যোগ করুন + প্রধান চাবি + নিরাপত্তা + এনক্রিপশন + এনক্রিপশন অ্যালগরিদম + কি পাওয়ার ফাংশন + অ্যাপের সময় পার হয়ে গিয়েছিলো + ডাটাবেস লক করার আগে অব্যবহৃত সময় + অ্যাপ + ব্র্যাকেট + বর্ধিত ASCII + ACTION_CREATE_DOCUMENT এবং ACTION_OPEN_DOCUMENT অভিপ্রায় গ্রহণ করে এমন একটি ফাইল ম্যানেজার ডাটাবেস ফাইলগুলো তৈরি করা, খোলা এবং সংরক্ষণ করতে প্রয়োজন। + অনুমোদন + ক্লিপবোর্ড পরিষ্কার করা হয়েছে + ক্লিপবোর্ড ত্রুটি + কিছু ডিভাইস অ্যাপ্লিকেশনগুলোকে ক্লিপবোর্ড ব্যবহার করতে দেয় না। + পটভূমি + সত্যায়ন + বাতিল + হালনাগাদ + সরাও + তথ্যভিত্তি + ডিজিট + শেষ ব্যবহার + বাতিল + দ্রষ্টব্য + তৈরিকৃত + মেয়াদ + বিশেষ শনাক্তকরণ সংকেত(ইউইউআইডি) + ইতিহাস + সংযুক্তি + চাবিনথি(কিফাইল) + পরিবর্তিত + ক্লিপবোর্ড পরিষ্কার করা যায়নি + ক্লিপবোর্ডের সময় শেষ + পাসওয়ার্ড + শিরোনাম + গোপন + চাবিনথি(কি ফাইল) + দান করো + সম্পাদনা + ইতিহাস + চেহারা + গণক + সংখ্যা + অ্যালগরিদম + ওটিপি + ইউআরএল + নাম + দৈর্ঘ্য + পাসওয়ার্ড + পাসওয়ার্ড + দৈর্ঘ্য + ছোটো হাতের + সম্পর্কে + পছন্দসমূহ + অনুলিপি + স্থানান্তর + লেপন + মুছো + বাতিল + খুলো + অনুসন্ধান + লিখন-সুরক্ষিত + পরিবর্তনযোগ্য + বিয়োগ + কখনো না + কাজ করা হচ্ছে… + সুরক্ষা + লিখন-সুরক্ষিত + মূল + উপমা + স্পেস + সাজাও + শিরোনাম + নাম + সৃষ্টি + পরিবর্তন + প্রবেশ + বিশেষ + অনুসন্ধান + নিম্নরেখা + বড় হাতের + সতর্কতা + ক্লিপবোর্ডে সংরক্ষণ সময়কাল (যদি তোমার যন্ত্র সনর্থন করে) + \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 451b240f4..10c704587 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -471,13 +471,13 @@ Uložení dat není povoleno, je-li databáze v režimu pouze pro čtení. Po dokončení vyplňování formuláře se zeptat na uložení dat Zeptat se před uložením - Pokuste se uložit údaje hledání, když manuálně vybíráte položku + Pokusit se uložit údaje hledání pro příští použití, vybíráte-li manuálně záznam Uložit výsledky vyhledávání Zavřít databázi po samovyplnění polí Zavřít databázi Po uzamknutí databáze automaticky přepnout zpět na předchozí klávesnici Uzamknout databázi - Je-li po sdílení URL s KeePassDX vybrán záznam, pokusit se zapamatovat onen záznam pro další použití + Pokusit se uložit sdílený záznam pro příští použití, je-li záznam manuálně vybrán Uložit sdílené info Oznámení Vyžadována aktualizace biometrického zabezpečení. @@ -504,7 +504,7 @@ Nedaří se načíst klíč rozšířeného odemknutí. Prosím, smažte ho a opakujte proces rozpoznání odemknutí. Načíst důvěrný údaj pomocí dat rozšířeného odemknutí Otevřít pomocí rozšířeného odemykání - Varování: Pokud použijete rozpoznání rozšířeného odemknutí, musíte si i nadále pamatovat hlavní heslo. + Pokud použijete rozpoznání rozšířeného odemknutí, musíte si i nadále pamatovat hlavní heslo. Rozpoznání rozšířeného odemknutí Pro uložení důvěrných údajů otevřete pobídku rozšířeného odemknutí Databázi otevřete i pomocí nabídky rozšířeného odemykání @@ -622,4 +622,27 @@ Zavření navigačního panelu Převzít Posloupnost automatického vyplňování + Počet slov hesla + Heslo + Zabarvit hesla + Zabarvit znaky hesla podle typu + Databáze je již otevřená, zavřete ji, než otevřete jinou + Tato funkce uloží přihlašovací údaje v bezpečném úložišti klíčů Vašeho zařízení. +\n +\nV závislosti na implementaci nativního API operačního systému nemusí být plně funkční. +\nOvěřte kompatibilitu a zabezpečení úložiště klíčů u výrobce svého zařízení a dodavatele operačního systému, jejž používáte. + Panel hledání + Automaticky přepnout na předchozí klávesnici v panelu hledání + Entropie: %1$s bitů + Entropie: spočítat… + Alespoň jeden znak z každé + Entropie: vysoká + Vyloučit víceznačné znaky + Uvážit znaky + Oddělovač + Vyloučit znaky + malá písmena + VELKÁ PÍSMENA + Titulové Psaní + Počet znaků: %1$d \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index ba958e9d6..57a83afa5 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -564,4 +564,7 @@ Brugerdefinerede data Søg filtre Nuværende gruppe + Nummer + Navn + Type \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 72af7c365..cd6136647 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -291,7 +291,7 @@ \n\"Modifiable\" vous permet d’ajouter, de supprimer ou de modifier tous les éléments comme vous le souhaitez. Modifier l’entrée Impossible de charger votre base de données. - Impossible de charger la clé. Veuillez essayer de diminuer l’utilisation mémoire de la fonction de dérivation de clé. + Impossible de charger la clé. Essayez de diminuer l’utilisation mémoire de la fonction de dérivation de clé. Afficher les noms d’utilisateur Affiche les noms d’utilisateur dans les listes d’entrées Compilation %1$s diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 858440003..3d76afe65 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -461,7 +461,7 @@ Podaci Svejedno ukloniti ove podatke\? Podaci za prijavu - Pokušaj spremiti podatke pretrage prilikom odabira ručnog unosa + Pokušaj spremiti podatke prilikom odabira ručnog unosa za jednostavniju buduću upotrebu Obavijest Nije dopušteno spremati novi element u zaštićenoj bazi podataka Spremanje podataka nije dopušteno za bazu podataka koja je otvorena u zaštićenom stanju. @@ -474,7 +474,7 @@ Zatvori bazu podataka Automatski prebaci na prethodnu tipkovnicu nakon zaključavanja baze podataka Zaključaj bazu podataka - Nakon dijeljenja informacija s KeePassDX-om, kad je unos odabran, pokušaj zapamtiti taj unos za buduće korištenje + Pokušaj spremiti dijeljene podatke prilikom ručnog odabira unosa za jednostavniju buduću upotrebu Spremi dijeljene informacije Trajno izbrisati sve čvorove iz smeća\? Potrebno je aktualizirati biometrijsku zaštitu. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e377d3350..8829e85f2 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -193,19 +193,19 @@ Blocco schermo Blocca il database dopo alcuni secondi quando lo schermo è spento Impronta digitale - Scansione di impronte + Scansione biometrica Consente la scansione biometrica per aprire il database Elimina chiavi di cifratura Elimina tutte le chiavi di cifratura relative allo sblocco avanzato Impossibile avviare questa funzione. Il dispositivo usa Android %1$s, ma richiede %2$s o versioni successive. L\'hardware relativo non è stato trovato. - Nome file + Nome del file Percorso Assegna una chiave master Crea un nuovo database - Uso del Cestino - Sposta i gruppi e le voci nel gruppo «Cestino» prima di eliminarlo + Utilizzo del Cestino + Sposta i gruppi e le voci nel gruppo «Cestino» prima di eliminarli Carattere campi Cambia il carattere usato nei campi per una migliore visibilità Fiducia appunti @@ -392,9 +392,9 @@ Convalida Dimensione massima Numero massimo - Apri automaticamente la richiesta - Limita la dimensione della cronologia per voce - Limita il numero di elementi della cronologia per voce + Messaggio di apertura automatica + Limita la dimensione della cronologia per ciascuna voce + Limita il numero di elementi della cronologia per ciascuna voce Gruppo cestino La compressione dei dati riduce le dimensioni del database Compressione dati @@ -455,7 +455,7 @@ Carica %1$s Carica un allegato alla voce per salvare dati esterni importanti. Aggiungi allegato - Rimuovi gli allegati contenuti nel database ma non collegati ad una voce + Rimuovi gli allegati contenuti nel database ma non riferiti ad alcuna voce Rimuovi i dati scollegati Dati Il contenuto del file chiave non deve mai essere modificato e, nel migliore dei casi, dovrebbe contenere dati generati casualmente. @@ -471,15 +471,15 @@ Visualizza l\'UUID collegato a una voce o a un gruppo Mostra UUID Il salvataggio dei dati non è consentito per un database aperto in sola lettura. - Chiedi di salvare i dati quando un modulo viene convalidato + Chiedi di salvare i dati quando l\'immissione dei dati in un form viene completata Chiedi di salvare i dati - Prova a salvare le informazioni di ricerca quando effettui una selezione di immissione manuale + Provare a salvare le informazioni di ricerca quando viene selezionato manualmente un elemento per facilitarne gli utilizzi futuri Salva le informazioni di ricerca Chiudi il database dopo aver usato l\'autocompletamento Chiudi database Torna automaticamente alla tastiera precedente dopo aver bloccato il database Blocca il database - Dopo la una URL in KeePassDX, quando viene selezionata una voce, prova a salvare quella voce per usi futuri + Provare a salvare l\'informazione condivisa quando viene selezionato manualmente un elemento, per poterne facilitare gli utilizzi futuri Salva le informazioni condivise Notifica È necessario un aggiornamento della sicurezza biometrica. @@ -498,20 +498,20 @@ Torna alla tasitera precedente Campi personalizzati Vuoi eliminare le chiavi di cifratura relative allo sblocco avanzato\? - Scadenza sblocco avanzato + Durata dello sblocco avanzato Non salvare alcun contenuto criptato per usare lo sblocco avanzato Validità dello sblocco avanzato prima di eliminarne il contenuto - Scadenza sblocco avanzato + Scadenza dello sblocco avanzato Sblocco avanzato temporaneo - Utilizza le credenziali del dispositivo per sbloccare il database - Sblocco con credenziali dispositivo + Permette di usare le credenziali del dispositivo per sbloccare il database + Sblocco con le credenziali del dispositivo Tocca per eliminare le chiavi di sblocco avanzato Contenuto Non è possibile inizializzare lo sblocco avanzato. Non è possibile riconoscere lo sblocco avanzato Non è possibile leggere la chiave di sblocco avanzato. Eliminala e ripeti la procedura di riconoscimento dello sblocco. Estrai le credenziali del database con i dati dallo sblocco avanzato - Attenzione: dovrai sempre ricordare la password principale anche se usi lo sblocco avanzato. + Attenzione: dovrai comunque ricordare la password principale anche se usi lo sblocco avanzato. Riconoscimento con sblocco avanzato Credenziali del dispositivo Inserisci la password, poi clicca questo pulsante. @@ -558,8 +558,8 @@ Questa parola è riservata e non può essere usata. Non puoi spostare un gruppo qui. Modelli - Gruppo di modelli - Usa modelli dinamici per riempire i campi di una voce + Gruppo dei modelli + Usa i modelli dinamici per riempire i campi di una voce Utilizzo dei modelli Versione Modello @@ -617,10 +617,34 @@ Chiusura del cassetto di navigazione Ricercabile Intestazione di navigazione - Ereditato + Eredita Filtri di ricerca Espressione regolare Unisci da … Salva una copia in … Distinzione tra maiuscole e minuscole + Numero di parole della password + Scaduta + Frase di accesso + Colora le password + Colora i tipi di carattere della password + Un database è già aperto, chiuderlo prima di aprirne un altro. + Sequenza di autodigitazione + Questa funzione memorizzerà le informazioni cifrate di accesso nel KeyStore protetto del dispositivo. +\nA seconda di come è stata implementata l\'API nativa del sistema operativo, potrebbe non essere pienanente funzionante. +\nVerificare la compatibilità e la sicurezza del KeyStore consultando sia il costruttore del dispositivo che il creatore della ROM in uso nel dispositivo stesso. + Schermata di ricerca + Ritornare automaticamente alla tastiera precedente quando ci si trova sulla schermata di ricerca + Entropia: Alta + Entropia: Calcolo in corso… + Almeno un carattere di ciascuno + Escludere i caratteri ambigui + Includi i caratteri + Separatore + Ignorare i caratteri + minuscolo + MAIUSCOLO + Iniziali maiuscole + Numero di caratteri: %1$d + Entropia: %1$s bit \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 08fbf6a8f..0bc43839b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -634,7 +634,7 @@ ナビゲーション ドロワーが開いています ナビゲーション ドロワーが閉じています Auto-Type シークエンス - 現在のグループ + 選択されたグループ 検索画面で切り替え前のキーボードに自動的に戻します マージ… エントロピー:計算中… diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 506162433..6a5d4aef0 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,8 +16,7 @@ You should have received a copy of the GNU General Public License along with KeePassDX. If not, see . ---> - +--> 피드백 홈페이지 KeePass 암호 관리자의 Android 구현본 @@ -28,19 +27,19 @@ 암호화 안호화 방식 키 파생 기능 - 앱 자동 종료 시간 - 앱이 잠기기 전에 비활성화됨 + 자동 종료 시간 + 데이터베이스를 잠그기 전 유휴 시간 브라켓 확장 ASCII - OpenIntents File Manager를 설치하여 파일 찾아보기 + 파일 관리자는 데이터베이스 파일 생성, 열기 및 저장하기 위해 ACTION_CREATE_DOCUMENT 및 ACTION_OPEN_DOCUMENT 인텐트 액션의 허가가 필요합니다. 허가 클립보드 비워짐 클립보드 오류 - 일부 삼성 안드로이드 폰은 앱이 클립보드를 사용하지 못하게 합니다. + 일부 장치는 앱이 클립보드를 사용하지 못하게 할 수 있습니다. 클립보드를 비울 수 없음 클립보드 시간 초과 - 클립보드 저장이 유지될 시간 + 클립보드 저장이 유지될 시간 (장치가 지원한다면) %1$s 을(를) 클립보드에 복사하려면 선택하십시오. 데이터베이스 키를 검색하는 중… 데이터베이스 @@ -152,7 +151,7 @@ 그룹 추가 파일 정보 비밀번호 체크박스 - 내용_설명_키파일_체크박스 + 키파일 체크박스 토글 비밀번호 가시성 반복 비밀번호 생성 비밀번호 길이 @@ -160,4 +159,44 @@ 필드 제거 항목을 여기로 옮길 수 없습니다. 항목을 여기로 복사할 수 없습니다. + 인증서 + 마스터키 + 기여 + 첨부파일 추가 + 비밀구절 단어 수 + 만료됨 + 대소문자 구분 + 데이터베이스 파일을 생성할 수 없습니다. + 신분증 + 발행지 + 가상 화폐 지갑 + 이 단어는 예약되어 사용할 수 없습니다. + OTP 비밀키가 유효하지 않습니다. + 하나 이상의 자격 증명을 설정해야 합니다. + 데이터베이스를 저장할 수 없습니다. + 비밀키는 Base32 포맷이어야 합니다. + 이 비밀번호와 키파일로 데이터베이스를 생성할 수 없습니다. + 데이터베이스 색상 + 항목 전면 색상 + 항목 배경 색상 + 변경사항을 취소하시겠습니까\? + 직불 / 신용 카드 + 알고리즘 + 발행일자 + 그룹을 여기로 옮길 수 없습니다. + 그룹을 여기로 복사할 수 없습니다. + 일회용 암호 정보 + 보안 + 항목 아이콘 + 아이템 추가 + 문의 + 갱신 + 검증 + 우리의 자유를 지키고, 버그를 고치고, 기능을 추가하고, 언제나 활성화되기 위해 우리는 당신의 기여를 믿습니다. + 일회용 비밀번호 설정 + OTP 유형 + 주기 (초) + 검색 필터 + 정규 표현식 + 이미 존재하는 라벨입니다. \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f2c698a2a..55304553d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -50,7 +50,7 @@ Заметки Подтверждение пароля Создано - Срок действия + Окончание Файл ключа Изменено Данные записи не найдены. diff --git a/build.gradle b/build.gradle index f501dba35..b7ca96403 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,16 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.21' - ext.android_core_version = '1.7.0' - ext.android_appcompat_version = '1.4.1' - ext.android_material_version = '1.6.0' + ext.kotlin_version = '1.7.0' + ext.android_core_version = '1.8.0' + ext.android_appcompat_version = '1.4.2' + ext.android_material_version = '1.6.1' ext.android_test_version = '1.4.0' repositories { mavenCentral() google() } dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' + classpath 'com.android.tools.build:gradle:7.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/crypto/build.gradle b/crypto/build.gradle index b834697a6..693dd7dbe 100644 --- a/crypto/build.gradle +++ b/crypto/build.gradle @@ -5,14 +5,12 @@ plugins { } android { - compileSdkVersion 31 - buildToolsVersion "31.0.0" + compileSdkVersion 32 + buildToolsVersion "32.0.0" defaultConfig { minSdkVersion 15 - targetSdkVersion 31 - versionCode 1 - versionName "1.0" + targetSdkVersion 32 multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/fastlane/metadata/android/en-US/changelogs/114.txt b/fastlane/metadata/android/en-US/changelogs/114.txt index 2ba386422..0a525bfec 100644 --- a/fastlane/metadata/android/en-US/changelogs/114.txt +++ b/fastlane/metadata/android/en-US/changelogs/114.txt @@ -1 +1,6 @@ + * Fix custom data in group (fix KeeShare) #1335 + * Fix device credential unlocking #1344 + * New clipboard manager #1343 * Keep screen on by default when viewing an entry + * Change the order of the search filters + * Fix searchable selection diff --git a/fastlane/metadata/android/fr-FR/changelogs/114.txt b/fastlane/metadata/android/fr-FR/changelogs/114.txt index f46526cec..94939f2b3 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/114.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/114.txt @@ -1 +1,6 @@ - * Garder l'écran allumé par défaut lors d'une visualisation d'entrée + * Correction des données customisées dans les groupes (correction de KeeShare) #1335 + * Correction du déblocage par identifiants de l'appareil #1344 + * Nouveau gestionnaire de presse-papier #1343 + * Garde l'écran allumé par défaut lors d'une visualisation d'entrée + * Changement d'ordre des filtres de recherche + * Correction de la selection cherchable diff --git a/icon-pack-classic/build.gradle b/icon-pack-classic/build.gradle index 0559baee7..f5dbd2954 100644 --- a/icon-pack-classic/build.gradle +++ b/icon-pack-classic/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 31 - buildToolsVersion '31.0.0' + compileSdkVersion 32 + buildToolsVersion '32.0.0' defaultConfig { minSdkVersion 14 - targetSdkVersion 31 + targetSdkVersion 32 } resourcePrefix 'classic_' diff --git a/icon-pack-material/build.gradle b/icon-pack-material/build.gradle index a9667829b..1a5598e13 100644 --- a/icon-pack-material/build.gradle +++ b/icon-pack-material/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 31 - buildToolsVersion '31.0.0' + compileSdkVersion 32 + buildToolsVersion '32.0.0' defaultConfig { minSdkVersion 14 - targetSdkVersion 31 + targetSdkVersion 32 } resourcePrefix 'material_'