From 92b0d1bfa9e0e5399d8b6553407550e630689a6d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 10 Mar 2020 19:02:37 +0100 Subject: [PATCH 01/68] Upgrade to version 2.5beta29 --- CHANGELOG | 3 +++ app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/29.txt | 1 + fastlane/metadata/android/fr-FR/changelogs/29.txt | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/29.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/29.txt diff --git a/CHANGELOG b/CHANGELOG index c3f32b334..8ded47b92 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +KeePassDX(2.5beta29) + * + KeePassDX(2.5beta28) * Fix read only database * Upgrade to Android SDK 29 diff --git a/app/build.gradle b/app/build.gradle index 3234e5c95..bc641d45a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.kunzisoft.keepass" minSdkVersion 14 targetSdkVersion 29 - versionCode = 28 - versionName = "2.5beta28" + versionCode = 29 + versionName = "2.5beta29" multiDexEnabled true testApplicationId = "com.kunzisoft.keepass.tests" diff --git a/fastlane/metadata/android/en-US/changelogs/29.txt b/fastlane/metadata/android/en-US/changelogs/29.txt new file mode 100644 index 000000000..9cb731fbf --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29.txt @@ -0,0 +1 @@ + * diff --git a/fastlane/metadata/android/fr-FR/changelogs/29.txt b/fastlane/metadata/android/fr-FR/changelogs/29.txt new file mode 100644 index 000000000..9cb731fbf --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/29.txt @@ -0,0 +1 @@ + * From 60615ee1eb3c49c05591dc304a7320a72a3d80a8 Mon Sep 17 00:00:00 2001 From: jan madsen Date: Tue, 10 Mar 2020 18:37:42 +0000 Subject: [PATCH 02/68] Translated using Weblate (Danish) Currently translated at 98.5% (420 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/ --- app/src/main/res/values-da/strings.xml | 27 +++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 70ed72f96..2e5689db9 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -283,7 +283,7 @@ Opret en stærk adgangskode til posten. Generer en stærk kodeord til at forbinde elementet, definer det i henhold til kriteriet for formularen og glem ikke et sikkert kodeord. Tilføj brugerdefinerede felter - Registrer et grundlæggende felt, der ikke er oprettet, ved at udfylde et ny, som også kan beskyttes. + Registrer et ekstra felt, tilføj en værdi og beskyt det eventuelt. Lås databasen op Skrivebeskyt databasen Skift åbningstilstanden for sessionen. @@ -300,9 +300,9 @@ Vælg hvordan poster og grupper er sorteret. Deltag Bidrag til at øge stabiliteten, sikkerheden og med at tilføje flere funktioner. - I modsætning til andre programmer til adgangskodeadministration er denne <strong> annoncefri </strong>, <strong> copyleft fri software</strong>, og indsamler ikke personlige data, uanset hvilken version der bruges. - Ved at købe pro-versionen, er der adgang til <strong>visuel funktionen</strong>, og det vil især hjælpe <strong>gennemførelsen af lokale projekter.</strong> - Denne <strong>visuelle funktion</strong> er tilgængelige takket være bidrag. + I modsætning til andre programmer til adgangskodeadministration er denne annoncefri, copyleft fri software, og indsamler ikke personlige data, uanset hvilken version der bruges. + Ved at købe pro-versionen, er der adgang til visuel stil, og det vil især hjælpe gennemførelsen af lokale projekter. + Denne visuelle stil er tilgængelige takket være bidrag. For at bevare uafhængighed og altid at være aktiv, regner vi med <strong>bidrag.</strong> Funktionen er <strong>under udvikling</strong>, og det kræver <strong>bidrag</strong>, for snart at være tilgængelig. Ved at købe <strong>pro</strong> versionen, @@ -449,9 +449,26 @@ Handling af Gå-tasten udføres automatisk, efter der er trykket på en Felt nøgle Hent %1$s Initialiserer… - I gang: %1$d% + I gang: %1$d% Færdiggørelse… Komplet! Tryk for at åbne filen. Skjul udløbne poster Udløbne poster vil blive skjult + Kontakt + Bidrag + Tilbagemelding + KeePassDX ©%1$d Kunzisoft er open source og uden reklamer. +\nDet leveres som det er under GPLv3 licens uden nogen garanti. + For at holde vores frihed, rette fejl, tilføje funktioner og at være altid aktiv, regner vi med bidrag. + Hurtig søgning + Anmod om en søgning når en database åbnes + Gem placering af databaser + Husk placeringen af databaser + Gem placering af nøglefiler + Husker placeringen af databasernøglefiler + Vis seneste filer + Vis placeringer af de seneste databaser + Skjule brudte databaselinks + Skjul brudte links på listen over seneste databaser + Giv fil skriveadgang for at gemme databasændringer \ No newline at end of file From 3f6ae6bdacad655c61bbdb3a87ecd0d697599c71 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 11 Mar 2020 12:42:18 +0100 Subject: [PATCH 03/68] Fix node update #487 --- .../com/kunzisoft/keepass/activities/EntryActivity.kt | 10 ++++------ .../com/kunzisoft/keepass/activities/GroupActivity.kt | 4 ++-- .../kunzisoft/keepass/activities/ListNodesFragment.kt | 10 ++++------ 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt index 46b9bc775..5ab07809f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt @@ -541,12 +541,10 @@ class EntryActivity : LockingActivity() { override fun finish() { // Transit data in previous Activity after an update - /* - TODO Slowdown when add entry as result - Intent intent = new Intent(); - intent.putExtra(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY, mEntry); - onFinish(EntryEditActivity.UPDATE_ENTRY_RESULT_CODE, intent); - */ + Intent().apply { + putExtra(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY, mEntry) + setResult(EntryEditActivity.UPDATE_ENTRY_RESULT_CODE, this) + } super.finish() } 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 0a490065e..27b0af396 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -905,8 +905,8 @@ class GroupActivity : LockingActivity(), AutofillHelper.onActivityResultSetResultAndFinish(this, requestCode, resultCode, data) } - // Not directly get the entry from intent data but from database - mListNodesFragment?.rebuildList() + // Directly used the onActivityResult in fragment + mListNodesFragment?.onActivityResult(requestCode, resultCode, data) } private fun removeSearchInIntent(intent: Intent) { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/ListNodesFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/ListNodesFragment.kt index cf6c056e2..cc18b4558 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/ListNodesFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/ListNodesFragment.kt @@ -369,13 +369,11 @@ class ListNodesFragment : StylishFragment(), SortDialogFragment.SortSelectionLis EntryEditActivity.ADD_OR_UPDATE_ENTRY_REQUEST_CODE -> { if (resultCode == EntryEditActivity.ADD_ENTRY_RESULT_CODE || resultCode == EntryEditActivity.UPDATE_ENTRY_RESULT_CODE) { - data?.getParcelableExtra(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY)?.let { newNode -> + data?.getParcelableExtra(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY)?.let { changedNode -> if (resultCode == EntryEditActivity.ADD_ENTRY_RESULT_CODE) - mAdapter?.addNode(newNode) - if (resultCode == EntryEditActivity.UPDATE_ENTRY_RESULT_CODE) { - //mAdapter.updateLastNodeRegister(newNode); - rebuildList() - } + addNode(changedNode) + if (resultCode == EntryEditActivity.UPDATE_ENTRY_RESULT_CODE) + mAdapter?.notifyDataSetChanged() } ?: Log.e(this.javaClass.name, "New node can be retrieve in Activity Result") } } From 1f03c922c22e12a7223a3f33e0bd5e77e6c5ea8e Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 11 Mar 2020 16:46:44 +0100 Subject: [PATCH 04/68] Encapsulate lock broadcast --- .../activities/lock/LockingActivity.kt | 51 ++-------------- .../DatabaseOpenNotificationService.kt | 12 +++- .../notifications/LockNotificationService.kt | 29 ++++----- .../keepass/timeout/TimeoutHelper.kt | 29 +++++---- .../keepass/utils/BroadcastAction.kt | 61 +++++++++++++++++++ 5 files changed, 107 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt index 9fa070262..9a79a16fc 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt @@ -20,11 +20,7 @@ package com.kunzisoft.keepass.activities.lock import android.app.Activity -import android.app.NotificationManager -import android.content.BroadcastReceiver -import android.content.Context import android.content.Intent -import android.content.IntentFilter import android.os.Bundle import android.util.Log import android.view.View @@ -34,12 +30,9 @@ import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper import com.kunzisoft.keepass.activities.stylish.StylishActivity import com.kunzisoft.keepass.database.action.ProgressDialogThread import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.notifications.KeyboardEntryNotificationService -import com.kunzisoft.keepass.magikeyboard.MagikIME -import com.kunzisoft.keepass.notifications.ClipboardEntryNotificationService import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.TimeoutHelper -import com.kunzisoft.keepass.utils.LOCK_ACTION +import com.kunzisoft.keepass.utils.* abstract class LockingActivity : StylishActivity() { @@ -81,12 +74,10 @@ abstract class LockingActivity : StylishActivity() { } if (mTimeoutEnable) { - mLockReceiver = LockReceiver() - val intentFilter = IntentFilter().apply { - addAction(Intent.ACTION_SCREEN_OFF) - addAction(LOCK_ACTION) + mLockReceiver = LockReceiver { + lockAndExit() } - registerReceiver(mLockReceiver, intentFilter) + registerLockReceiver(mLockReceiver) } mExitLock = false @@ -151,26 +142,8 @@ abstract class LockingActivity : StylishActivity() { } override fun onDestroy() { + unregisterLockReceiver(mLockReceiver) super.onDestroy() - if (mLockReceiver != null) - unregisterReceiver(mLockReceiver) - } - - inner class LockReceiver : BroadcastReceiver() { - - override fun onReceive(context: Context, intent: Intent) { - // If allowed, lock and exit - if (!TimeoutHelper.temporarilyDisableTimeout) { - intent.action?.let { - when (it) { - Intent.ACTION_SCREEN_OFF -> if (PreferencesUtil.isLockDatabaseWhenScreenShutOffEnable(this@LockingActivity)) { - lockAndExit() - } - LOCK_ACTION -> lockAndExit() - } - } - } - } } protected fun lockAndExit() { @@ -208,20 +181,8 @@ abstract class LockingActivity : StylishActivity() { } fun Activity.lock() { - // Stop the Magikeyboard service - stopService(Intent(this, KeyboardEntryNotificationService::class.java)) - MagikIME.removeEntry(this) + closeDatabase() - // Stop the notification service - stopService(Intent(this, ClipboardEntryNotificationService::class.java)) - - Log.i(Activity::class.java.name, "Shutdown " + localClassName + - " after inactivity or manual lock") - (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).apply { - cancelAll() - } - // Clear data - Database.getInstance().closeAndClear(applicationContext.filesDir) // Add onActivityForResult response setResult(LockingActivity.RESULT_EXIT_LOCK) finish() diff --git a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt index 43b7fb035..2325931e6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt @@ -27,7 +27,9 @@ import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.GroupActivity import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.settings.PreferencesUtil +import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.utils.LOCK_ACTION +import com.kunzisoft.keepass.utils.closeDatabase class DatabaseOpenNotificationService: LockNotificationService() { @@ -36,8 +38,12 @@ class DatabaseOpenNotificationService: LockNotificationService() { private fun stopNotificationAndSendLock() { // Send lock action sendBroadcast(Intent(LOCK_ACTION)) - // Stop the service - stopSelf() + } + + override fun actionOnLock() { + closeDatabase() + // Service is stopped after receive the broadcast + super.actionOnLock() } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @@ -59,6 +65,7 @@ class DatabaseOpenNotificationService: LockNotificationService() { val pendingDeleteIntent = PendingIntent.getService(this, 0, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT) val database = Database.getInstance() + // TODO start Foreground if (database.loaded) { notificationManager?.notify(notificationId, buildNewNotification().apply { setSmallIcon(R.drawable.notification_ic_database_open) @@ -68,6 +75,7 @@ class DatabaseOpenNotificationService: LockNotificationService() { setContentIntent(pendingDatabaseIntent) setDeleteIntent(pendingDeleteIntent) }.build()) + TimeoutHelper.recordTime(this) } else { stopSelf() } diff --git a/app/src/main/java/com/kunzisoft/keepass/notifications/LockNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/notifications/LockNotificationService.kt index d447aac18..1fc914311 100644 --- a/app/src/main/java/com/kunzisoft/keepass/notifications/LockNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/notifications/LockNotificationService.kt @@ -19,31 +19,28 @@ */ package com.kunzisoft.keepass.notifications -import android.content.BroadcastReceiver -import android.content.Context import android.content.Intent -import android.content.IntentFilter -import com.kunzisoft.keepass.utils.LOCK_ACTION +import com.kunzisoft.keepass.utils.LockReceiver +import com.kunzisoft.keepass.utils.registerLockReceiver +import com.kunzisoft.keepass.utils.unregisterLockReceiver abstract class LockNotificationService : NotificationService() { - private var lockBroadcastReceiver: BroadcastReceiver? = null + private var mLockReceiver: LockReceiver? = null + + protected open fun actionOnLock() { + // Stop the service in all cases + stopSelf() + } override fun onCreate() { super.onCreate() // Register a lock receiver to stop notification service when lock on keyboard is performed - lockBroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - // Stop the service in all cases - stopSelf() - } + mLockReceiver = LockReceiver { + actionOnLock() } - registerReceiver(lockBroadcastReceiver, - IntentFilter().apply { - addAction(LOCK_ACTION) - } - ) + registerLockReceiver(mLockReceiver) } protected fun stopTask(task: Thread?) { @@ -59,7 +56,7 @@ abstract class LockNotificationService : NotificationService() { override fun onDestroy() { - unregisterReceiver(lockBroadcastReceiver) + unregisterLockReceiver(mLockReceiver) super.onDestroy() } 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 cb56119f5..4433cfbfe 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt @@ -61,21 +61,28 @@ object TimeoutHelper { if (Database.getInstance().loaded) { val timeout = PreferencesUtil.getAppTimeout(context) - - // No timeout don't start timeout service if (timeout != NEVER) { - val triggerTime = System.currentTimeMillis() + timeout - val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager - Log.d(TAG, "TimeoutHelper start") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - am.setExact(AlarmManager.RTC, triggerTime, getLockPendingIntent(context)) - } else { - am.set(AlarmManager.RTC, triggerTime, getLockPendingIntent(context)) + // No timeout don't start timeout service + (context.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) { + alarmManager.setExact(AlarmManager.RTC, triggerTime, getLockPendingIntent(context)) + } else { + alarmManager.set(AlarmManager.RTC, triggerTime, getLockPendingIntent(context)) + } } } } } + fun cancelRecordTime(context: Context) { + (context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> + Log.d(TAG, "TimeoutHelper cancel") + alarmManager.cancel(getLockPendingIntent(context)) + } + } + /** * Check the time previously record with recordTime and do the [timeoutAction] if timeout * if temporarilyDisableTimeout() is called, the function as no effect until releaseTemporarilyDisableTimeoutAndCheckTime() is called @@ -88,9 +95,7 @@ object TimeoutHelper { // Cancel the lock PendingIntent if (Database.getInstance().loaded) { - val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager - Log.d(TAG, "TimeoutHelper cancel") - am.cancel(getLockPendingIntent(context)) + cancelRecordTime(context) } // Check whether the timeout has expired 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 b3f1f4436..c41bbcdd2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt @@ -19,6 +19,19 @@ */ package com.kunzisoft.keepass.utils +import android.app.NotificationManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.util.Log +import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.magikeyboard.MagikIME +import com.kunzisoft.keepass.notifications.ClipboardEntryNotificationService +import com.kunzisoft.keepass.notifications.KeyboardEntryNotificationService +import com.kunzisoft.keepass.settings.PreferencesUtil +import com.kunzisoft.keepass.timeout.TimeoutHelper + const val DATABASE_START_TASK_ACTION = "com.kunzisoft.keepass.DATABASE_START_TASK_ACTION" const val DATABASE_STOP_TASK_ACTION = "com.kunzisoft.keepass.DATABASE_STOP_TASK_ACTION" @@ -26,3 +39,51 @@ const val LOCK_ACTION = "com.kunzisoft.keepass.LOCK" const val REMOVE_ENTRY_MAGIKEYBOARD_ACTION = "com.kunzisoft.keepass.REMOVE_ENTRY_MAGIKEYBOARD" +class LockReceiver(var action: () -> Unit) : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + // If allowed, lock and exit + if (!TimeoutHelper.temporarilyDisableTimeout) { + intent.action?.let { + when (it) { + Intent.ACTION_SCREEN_OFF -> + if (PreferencesUtil.isLockDatabaseWhenScreenShutOffEnable(context)) { + action.invoke() + } + LOCK_ACTION -> action.invoke() + } + } + } + } +} + +fun Context.registerLockReceiver(lockReceiver: LockReceiver?) { + lockReceiver?.let { + registerReceiver(it, IntentFilter().apply { + addAction(Intent.ACTION_SCREEN_OFF) + addAction(LOCK_ACTION) + }) + } +} + +fun Context.unregisterLockReceiver(lockReceiver: LockReceiver?) { + lockReceiver?.let { + unregisterReceiver(it) + } +} + +fun Context.closeDatabase() { + // Stop the Magikeyboard service + stopService(Intent(this, KeyboardEntryNotificationService::class.java)) + MagikIME.removeEntry(this) + + // Stop the notification service + stopService(Intent(this, ClipboardEntryNotificationService::class.java)) + + Log.i(Context::class.java.name, "Shutdown after inactivity or manual lock") + (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).apply { + cancelAll() + } + // Clear data + Database.getInstance().closeAndClear(applicationContext.filesDir) +} \ No newline at end of file From 21c9c898c3bde9a81066fcb9da1ed3f3d0831b8f Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 11 Mar 2020 18:30:11 +0100 Subject: [PATCH 05/68] Add lock timer in service, notification remains lock to capture the broadcast --- .../keepass/activities/GroupActivity.kt | 43 +++++++++++-------- .../database/action/LoadDatabaseRunnable.kt | 5 ++- .../DatabaseOpenNotificationService.kt | 15 ++++--- .../keepass/settings/PreferencesUtil.kt | 6 --- .../keepass/timeout/TimeoutHelper.kt | 38 +++++++++------- 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-fr/strings.xml | 2 - app/src/main/res/values-hr/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-pl/strings.xml | 2 - app/src/main/res/values-pt-rBR/strings.xml | 2 - app/src/main/res/values-ru/strings.xml | 2 - app/src/main/res/values-sv/strings.xml | 2 - app/src/main/res/values-tr/strings.xml | 2 - app/src/main/res/values-zh-rCN/strings.xml | 2 - app/src/main/res/values/donottranslate.xml | 2 - app/src/main/res/values/strings.xml | 2 - .../main/res/xml/preferences_application.xml | 5 --- 22 files changed, 58 insertions(+), 86 deletions(-) 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 27b0af396..b8665fff6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -953,19 +953,27 @@ class GroupActivity : LockingActivity(), private const val SEARCH_FRAGMENT_TAG = "SEARCH_FRAGMENT_TAG" private const val OLD_GROUP_TO_UPDATE_KEY = "OLD_GROUP_TO_UPDATE_KEY" - private fun buildAndLaunchIntent(context: Context, group: Group?, readOnly: Boolean, - intentBuildLauncher: (Intent) -> Unit) { - val checkTime = if (context is Activity) - TimeoutHelper.checkTimeAndLockIfTimeout(context) - else - TimeoutHelper.checkTime(context) - if (checkTime) { - val intent = Intent(context, GroupActivity::class.java) - if (group != null) { - intent.putExtra(GROUP_ID_KEY, group.nodeId) - } - ReadOnlyHelper.putReadOnlyInIntent(intent, readOnly) - intentBuildLauncher.invoke(intent) + private fun buildIntent(context: Context, group: Group?, readOnly: Boolean, + intentBuildLauncher: (Intent) -> Unit) { + val intent = Intent(context, GroupActivity::class.java) + if (group != null) { + intent.putExtra(GROUP_ID_KEY, group.nodeId) + } + ReadOnlyHelper.putReadOnlyInIntent(intent, readOnly) + intentBuildLauncher.invoke(intent) + } + + private fun checkTimeAndBuildIntent(activity: Activity, group: Group?, readOnly: Boolean, + intentBuildLauncher: (Intent) -> Unit) { + if (TimeoutHelper.checkTimeAndLockIfTimeout(activity)) { + buildIntent(activity, group, readOnly, intentBuildLauncher) + } + } + + private fun checkTimeAndBuildIntent(context: Context, group: Group?, readOnly: Boolean, + intentBuildLauncher: (Intent) -> Unit) { + if (TimeoutHelper.checkTime(context)) { + buildIntent(context, group, readOnly, intentBuildLauncher) } } @@ -977,8 +985,7 @@ class GroupActivity : LockingActivity(), @JvmOverloads fun launch(context: Context, readOnly: Boolean = PreferencesUtil.enableReadOnlyDatabase(context)) { - TimeoutHelper.recordTime(context) - buildAndLaunchIntent(context, null, readOnly) { intent -> + checkTimeAndBuildIntent(context, null, readOnly) { intent -> context.startActivity(intent) } } @@ -991,8 +998,7 @@ class GroupActivity : LockingActivity(), // TODO implement pre search to directly open the direct group fun launchForKeyboardSelection(context: Context, readOnly: Boolean) { - TimeoutHelper.recordTime(context) - buildAndLaunchIntent(context, null, readOnly) { intent -> + checkTimeAndBuildIntent(context, null, readOnly) { intent -> EntrySelectionHelper.startActivityForEntrySelection(context, intent) } } @@ -1006,8 +1012,7 @@ class GroupActivity : LockingActivity(), @RequiresApi(api = Build.VERSION_CODES.O) fun launchForAutofillResult(activity: Activity, assistStructure: AssistStructure, readOnly: Boolean) { - TimeoutHelper.recordTime(activity) - buildAndLaunchIntent(activity, null, readOnly) { intent -> + checkTimeAndBuildIntent(activity, null, readOnly) { intent -> AutofillHelper.startActivityForAutofillResult(activity, intent, assistStructure) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt index d584f1bbb..9f1ab2475 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt @@ -86,8 +86,11 @@ class LoadDatabaseRunnable(private val context: Context, .addOrUpdateCipherDatabase(cipherDatabaseEntity) // return value not called } + // Register the current time to init the lock timer + PreferencesUtil.saveCurrentTime(context) + // Start the opening notification - DatabaseOpenNotificationService.startIfAllowed(context) + DatabaseOpenNotificationService.start(context) } else { mDatabase.closeAndClear(cacheDirectory) } diff --git a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt index 2325931e6..6a8811e81 100644 --- a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt @@ -26,7 +26,6 @@ import android.os.Build import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.GroupActivity import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.utils.LOCK_ACTION import com.kunzisoft.keepass.utils.closeDatabase @@ -42,6 +41,8 @@ class DatabaseOpenNotificationService: LockNotificationService() { override fun actionOnLock() { closeDatabase() + // Remove the lock timer (no more needed if it exists) + TimeoutHelper.cancelLockTimer(this) // Service is stopped after receive the broadcast super.actionOnLock() } @@ -65,9 +66,8 @@ class DatabaseOpenNotificationService: LockNotificationService() { val pendingDeleteIntent = PendingIntent.getService(this, 0, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT) val database = Database.getInstance() - // TODO start Foreground if (database.loaded) { - notificationManager?.notify(notificationId, buildNewNotification().apply { + startForeground(notificationId, buildNewNotification().apply { setSmallIcon(R.drawable.notification_ic_database_open) setContentTitle(getString(R.string.database_opened)) setContentText(database.name + " (" + database.version + ")") @@ -75,7 +75,6 @@ class DatabaseOpenNotificationService: LockNotificationService() { setContentIntent(pendingDatabaseIntent) setDeleteIntent(pendingDeleteIntent) }.build()) - TimeoutHelper.recordTime(this) } else { stopSelf() } @@ -88,9 +87,11 @@ class DatabaseOpenNotificationService: LockNotificationService() { companion object { const val ACTION_CLOSE_DATABASE = "ACTION_CLOSE_DATABASE" - fun startIfAllowed(context: Context) { - if (PreferencesUtil.isPersistentNotificationEnable(context)) { - // Start the opening notification + fun start(context: Context) { + // Start the opening notification, keep it active to receive lock + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(Intent(context, DatabaseOpenNotificationService::class.java)) + } else { context.startService(Intent(context, DatabaseOpenNotificationService::class.java)) } } 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 e2c4f5140..badb90ea2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt @@ -207,12 +207,6 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.enable_auto_save_database_default)) } - fun isPersistentNotificationEnable(context: Context): Boolean { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return prefs.getBoolean(context.getString(R.string.persistent_notification_key), - context.resources.getBoolean(R.bool.persistent_notification_default)) - } - fun isBiometricUnlockEnable(context: Context): Boolean { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getBoolean(context.getString(R.string.biometric_unlock_enable_key), 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 4433cfbfe..67a697f1b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt @@ -46,24 +46,22 @@ object TimeoutHelper { private set private fun getLockPendingIntent(context: Context): PendingIntent { - return PendingIntent.getBroadcast(context, + return PendingIntent.getBroadcast(context.applicationContext, REQUEST_ID, Intent(LOCK_ACTION), PendingIntent.FLAG_CANCEL_CURRENT) } /** - * Record the current time to check it later with checkTime + * Start the lock timer by creating an alarm, + * if the method is recalled with a previous lock timer pending, the previous one is deleted */ - fun recordTime(context: Context) { - // Record timeout time in case timeout service is killed - PreferencesUtil.saveCurrentTime(context) - + private fun startLockTimer(context: Context) { if (Database.getInstance().loaded) { val timeout = PreferencesUtil.getAppTimeout(context) if (timeout != NEVER) { // No timeout don't start timeout service - (context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> + (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) { @@ -76,28 +74,35 @@ object TimeoutHelper { } } - fun cancelRecordTime(context: Context) { - (context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> + /** + * Cancel the lock timer currently pending, useful if lock was triggered by another way + */ + fun cancelLockTimer(context: Context) { + (context.applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> Log.d(TAG, "TimeoutHelper cancel") alarmManager.cancel(getLockPendingIntent(context)) } } + /** + * Record the current time, to check it later with checkTime and start a new lock timer + */ + fun recordTime(context: Context) { + // Record timeout time in case timeout service is killed + PreferencesUtil.saveCurrentTime(context) + startLockTimer(context) + } + /** * Check the time previously record with recordTime and do the [timeoutAction] if timeout * if temporarilyDisableTimeout() is called, the function as no effect until releaseTemporarilyDisableTimeoutAndCheckTime() is called - * return 'false' if timeout, 'true' if in time + * return 'false' and send broadcast lock action if timeout, 'true' if in time */ fun checkTime(context: Context, timeoutAction: (() -> Unit)? = null): Boolean { // No effect if temporarily disable if (temporarilyDisableTimeout) return true - // Cancel the lock PendingIntent - if (Database.getInstance().loaded) { - cancelRecordTime(context) - } - // Check whether the timeout has expired val currentTime = System.currentTimeMillis() @@ -120,6 +125,7 @@ object TimeoutHelper { if (diff >= appTimeout) { // We have timed out timeoutAction?.invoke() + context.sendBroadcast(Intent(LOCK_ACTION)) return false } return true @@ -166,7 +172,7 @@ object TimeoutHelper { } if (inTime) { // Start the opening notification - DatabaseOpenNotificationService.startIfAllowed(context) + DatabaseOpenNotificationService.start(context) } return inTime } diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 06c2b69c9..c6629aa86 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -412,8 +412,6 @@ Prověřením toho dialogu opraví KeePassDX chybu (založením nového UUID pro duplikáty) a bude pokračovat. Databáze otevřena Kopírujte pole záznamů pomocí schránky Vašeho zařízení - Trvalé oznámení - Přidat oznámení, když je databáze otevřena K snadnějšímu otevření databáze použijte pokročilé odemknutí Komprese dat Komprese dat snižuje velikost databáze. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 70ed72f96..2c7e25af0 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -411,8 +411,6 @@ Ved at godkende dialogboksen, vil KeePassDX løse problemet (ved at generere nye UUID\'er for dubletter) og fortsætte. Database åbnet Kopier indtastningsfelter ved hjælp af enhedens udklipsholder - Vedvarende meddelelse - Tilføj en meddelelse, når databasen er åben Brug avanceret oplåsning for at gøre det lettere at åbne en database Datakomprimering Datakomprimering reducerer databasens størrelse. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 12cfae376..39d9a403a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -415,8 +415,6 @@ Durch die Validierung dieses Dialogs wird KeePassDX das Problem (durch Erzeugung neuer UUIDs für Duplikate) beheben und weiter ausgeführt. Datenbank geöffnet Eintragsfelder mithilfe der Zwischenablage des Geräts kopieren - Dauerhafte Benachrichtigung - Bei geöffneter Datenbank eine Benachrichtigung hinzufügen Erweitertes Entsperren verwenden, um eine Datenbank einfacher zu öffnen. Datenkompression Datenkompression reduziert die Datenbankgröße. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9cccd80f2..86dfc3d86 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -408,8 +408,6 @@ Ενεργοποιήστε την αυτόματη συμπλήρωση για να συμπληρώσετε γρήγορα φόρμες σε άλλες εφαρμογές Η Βάση Δεδομένων άνοιξε Αντιγράψτε τα πεδία εισαγωγής χρησιμοποιώντας το πρόχειρο της συσκευής σας - Συνεχής ειδοποίηση - Προσθήκη ειδοποίησης όταν η βάση δεδομένων είναι ανοιχτή Χρησιμοποιήστε το προηγμένο ξεκλείδωμα για να ανοίξετε μια βάση δεδομένων πιο εύκολα Συμπίεση Δεδομένων Η συμπίεση δεδομένων μειώνει το μέγεθος της βάσης δεδομένων. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e557b294f..8f5162972 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -422,8 +422,6 @@ En validant cette boîte de dialogue, KeePassDX corrigera le problème (en générant de nouveaux UUID pour les doublons) et continuera. Base de données ouverte Copie les champs d’une entrée à l’aide du presse-papier de votre appareil - Notification persistante - Ajoute une notification lorsque la base de données est ouverte Utilise le déverrouillage avancé pour ouvrir plus facilement une base de données Compression de données La compression des données réduit la taille de la base de données. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 22fd7deb9..4ded77fa2 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -184,8 +184,6 @@ Ako automatsko brisanje međuspremnika ne uspije, izbrišite njegovu povijest ručno. Zaključaj bazu podataka kada je ekran ugašen Pritisni \'Natrag\' za zaključavanje - Trajna obavijest - Dodaj obavijest kada je baza podataka otvorena Napredno otključavanje Koristite napredno otključavanje za jednostavnije otvaranje baze podataka Biometričko otključavanje diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 09f310986..25db838ac 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -389,8 +389,6 @@ Sikkerhetsinnstillinger Hovednøkkelinnstillinger Databasen inneholder dupliserte UUID-er. - Vedvarende merknad - Legg til en merknad når databasen er åpen Datakomprimering Datakomprimering reduserer databasens størrelse. Komprimering diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c75e12e65..c7d345c28 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -418,8 +418,6 @@ Door dit dialoogvenster te valideren, zal KeePassDX het probleem oplossen (door nieuwe UUID\'s voor duplicaten te genereren) en doorgaan. Database geopend Kopieer invoervelden met behulp van het klembord van uw apparaat - Aanhoudende melding - Voeg een melding toe wanneer de database is geopend Geavanceerde ontgrendeling gebruiken om een database gemakkelijker te openen Gegevenscompressie Gegevenscompressie verkleint de omvang van de database. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6022faea3..2766a3ed9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -402,8 +402,6 @@ Ustawienia klucza głównego Baza danych zawiera zduplikowane identyfikatory UUID. Baza danych otwarta - Stałe powiadamianie - Dodaj powiadomienie, gdy baza danych jest otwarta Kompresja danych Ogranicz liczbę elementów historii na wpis Maksymalny rozmiar diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a68112464..c6b0e05ef 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -414,8 +414,6 @@ Ao validar este diálogo, o KeePassDX irá consertar o problema (gerando um novo UUID para os duplicados) e continuar. Banco de dados aberto Copiar campos de entrada usando a área de transferência do seu aparelho - Notificação persistente - Adicionar uma notificação quando o banco de dados for aberto Usar destravamento avançado para abrir o banco de dados mais facilmente Compressão dos dados Compressão dos dados reduz o tamanho do banco de dados. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 59af53db1..33c9d5475 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -412,8 +412,6 @@ Если вы разрешите, KeePassDX исправит проблему (путём создания новых UUID для дубликатов) и продолжит работу. База открыта Копирование полей ввода с помощью буфера обмена устройства - Постоянное уведомление - Показывать уведомление, пока открыта база Использовать дополнительную разблокировку для более лёгкого открытия базы данных Сжатие данных Сжатие данных уменьшает размер базы. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0c6f73dc8..356261979 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -410,8 +410,6 @@ Aktivera autofyll för att snabbt kunna fylla i formulär i andra appar Databas öppnad Kopiera post-fält med hjälp av enhetens urklipp - Beständig avisering - Lägg till en avisering när databasen är öppen Använd avancerad upplåsning för att öppna en databas enklare Datakomprimering Datakomprimering reducerar databasens storlek. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index de8d24274..6beeefa83 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -395,8 +395,6 @@ Bu iletişim kutusunu doğrulayarak, KeePassDX sorunu çözecek (tekrarlananlar için yeni UUID\'ler oluşturarak) ve devam edecektir. Veritabanı açıldı Cihazınızın panosunu kullanarak giriş alanlarını kopyala - Kalıcı bildirim - Veritabanı açıkken bir bildirim ekle Veritabanını daha kolay açmak için gelişmiş kilit açma özelliğini kullan Veri sıkıştırma Veri sıkıştırma veritabanı boyutunu azaltır. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d183ed388..e4574038c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -414,8 +414,6 @@ 通过验证此对话框,KeePassDX将解决这个问题(通过给重复项生成新的UUID)并继续。 数据库开启 使用设备的剪贴板来复制输入字段 - 持久通知 - 当数据库打开时产生一条通知 使用高级解锁轻松打开数据库 数据压缩 数据压缩可降低数据库大小。 diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index a3c222a21..f75061a48 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -75,8 +75,6 @@ app_timeout_key lock_database_screen_off_key true - persistent_notification_key - true lock_database_back_root_key false password_length_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb701ccbd..7dbbd1b3e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -295,8 +295,6 @@ Lock the database when the screen is off Press \'Back\' to lock Lock the database when the user clicks the back button on the root screen - Persistent notification - Add a notification when the database is open Advanced unlock Use advanced unlocking to open a database more easily Biometric unlocking diff --git a/app/src/main/res/xml/preferences_application.xml b/app/src/main/res/xml/preferences_application.xml index 88dc017d4..f401c1bfd 100644 --- a/app/src/main/res/xml/preferences_application.xml +++ b/app/src/main/res/xml/preferences_application.xml @@ -83,11 +83,6 @@ android:title="@string/lock_database_back_root_title" android:summary="@string/lock_database_back_root_summary" android:defaultValue="@bool/lock_database_back_root_default"/> - From 62fdb69d6bca7c36d12aa090ae52f755d400ff7d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 11 Mar 2020 18:56:45 +0100 Subject: [PATCH 06/68] Fix small element --- .../main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c41bbcdd2..a3245923b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt @@ -81,7 +81,7 @@ fun Context.closeDatabase() { stopService(Intent(this, ClipboardEntryNotificationService::class.java)) Log.i(Context::class.java.name, "Shutdown after inactivity or manual lock") - (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).apply { + (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?)?.apply { cancelAll() } // Clear data From d92e0c86207c6d8ee0922556f99137bde8e1ec2b Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 11 Mar 2020 19:17:51 +0100 Subject: [PATCH 07/68] Fix magikeyboard lock --- .../keepass/magikeyboard/MagikIME.kt | 24 ++++--------------- .../keepass/utils/BroadcastAction.kt | 13 ++++++---- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt index 177489855..47ee3837a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt +++ b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt @@ -19,10 +19,8 @@ */ package com.kunzisoft.keepass.magikeyboard -import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.content.IntentFilter import android.inputmethodservice.InputMethodService import android.inputmethodservice.Keyboard import android.inputmethodservice.KeyboardView @@ -42,8 +40,7 @@ import com.kunzisoft.keepass.model.EntryInfo import com.kunzisoft.keepass.model.Field import com.kunzisoft.keepass.notifications.KeyboardEntryNotificationService import com.kunzisoft.keepass.settings.PreferencesUtil -import com.kunzisoft.keepass.utils.LOCK_ACTION -import com.kunzisoft.keepass.utils.REMOVE_ENTRY_MAGIKEYBOARD_ACTION +import com.kunzisoft.keepass.utils.* class MagikIME : InputMethodService(), KeyboardView.OnKeyboardActionListener { @@ -55,29 +52,18 @@ class MagikIME : InputMethodService(), KeyboardView.OnKeyboardActionListener { private var fieldsAdapter: FieldsAdapter? = null private var playSoundDuringCLick: Boolean = false - private var lockBroadcastReceiver: BroadcastReceiver? = null + private var lockReceiver: LockReceiver? = null override fun onCreate() { super.onCreate() // Remove the entry and lock the keyboard when the lock signal is receive - lockBroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - when (intent?.action) { - REMOVE_ENTRY_MAGIKEYBOARD_ACTION, LOCK_ACTION -> { + lockReceiver = LockReceiver { removeEntryInfo() assignKeyboardView() - } - } - } } - registerReceiver(lockBroadcastReceiver, - IntentFilter().apply { - addAction(LOCK_ACTION) - addAction(REMOVE_ENTRY_MAGIKEYBOARD_ACTION) - } - ) + registerLockReceiver(lockReceiver, true) } override fun onCreateInputView(): View { @@ -301,7 +287,7 @@ class MagikIME : InputMethodService(), KeyboardView.OnKeyboardActionListener { override fun onDestroy() { dismissCustomKeys() - unregisterReceiver(lockBroadcastReceiver) + unregisterLockReceiver(lockReceiver) super.onDestroy() } 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 a3245923b..7b20f6b6a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt @@ -36,10 +36,9 @@ const val DATABASE_START_TASK_ACTION = "com.kunzisoft.keepass.DATABASE_START_TAS const val DATABASE_STOP_TASK_ACTION = "com.kunzisoft.keepass.DATABASE_STOP_TASK_ACTION" const val LOCK_ACTION = "com.kunzisoft.keepass.LOCK" - const val REMOVE_ENTRY_MAGIKEYBOARD_ACTION = "com.kunzisoft.keepass.REMOVE_ENTRY_MAGIKEYBOARD" -class LockReceiver(var action: () -> Unit) : BroadcastReceiver() { +class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { // If allowed, lock and exit @@ -48,20 +47,24 @@ class LockReceiver(var action: () -> Unit) : BroadcastReceiver() { when (it) { Intent.ACTION_SCREEN_OFF -> if (PreferencesUtil.isLockDatabaseWhenScreenShutOffEnable(context)) { - action.invoke() + lockAction.invoke() } - LOCK_ACTION -> action.invoke() + LOCK_ACTION, + REMOVE_ENTRY_MAGIKEYBOARD_ACTION -> lockAction.invoke() } } } } } -fun Context.registerLockReceiver(lockReceiver: LockReceiver?) { +fun Context.registerLockReceiver(lockReceiver: LockReceiver?, + registerRemoveEntryMagikeyboard: Boolean = false) { lockReceiver?.let { registerReceiver(it, IntentFilter().apply { addAction(Intent.ACTION_SCREEN_OFF) addAction(LOCK_ACTION) + if (registerRemoveEntryMagikeyboard) + addAction(REMOVE_ENTRY_MAGIKEYBOARD_ACTION) }) } } From 133e78fe970fb8095a743134a588c8edb0509fa7 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 09:20:29 +0100 Subject: [PATCH 08/68] Update CHANGELOG --- CHANGELOG | 3 ++- fastlane/metadata/android/en-US/changelogs/29.txt | 3 ++- fastlane/metadata/android/fr-FR/changelogs/29.txt | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 8ded47b92..b3958fc5f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ KeePassDX(2.5beta29) - * + * Fix title and username entry view refresh after an update + * Fix database lock request (open notification always active) KeePassDX(2.5beta28) * Fix read only database diff --git a/fastlane/metadata/android/en-US/changelogs/29.txt b/fastlane/metadata/android/en-US/changelogs/29.txt index 9cb731fbf..8dd534438 100644 --- a/fastlane/metadata/android/en-US/changelogs/29.txt +++ b/fastlane/metadata/android/en-US/changelogs/29.txt @@ -1 +1,2 @@ - * + * Fix title and username entry view refresh after an update + * Fix database lock request (open notification always active) diff --git a/fastlane/metadata/android/fr-FR/changelogs/29.txt b/fastlane/metadata/android/fr-FR/changelogs/29.txt index 9cb731fbf..99974001c 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/29.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/29.txt @@ -1 +1,2 @@ - * + * Correction de l'actualisation de la vue d'entrée du titre et du nom d'utilisateur après une mise à jour + * Correction de la demande de verrouillage de la base de données (notification ouverte toujours active) From f760110569f70e92e7e823fe3fac086186c6a0c0 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 09:28:46 +0100 Subject: [PATCH 09/68] default_database_path_key in strings.xml --- .../com/kunzisoft/keepass/settings/PreferencesUtil.kt | 8 +++----- app/src/main/res/values/donottranslate.xml | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) 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 badb90ea2..be7fea957 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt @@ -31,15 +31,13 @@ object PreferencesUtil { var APPEARANCE_CHANGED = false - private const val KEY_DEFAULT_DATABASE_PATH = "KEY_DEFAULT_DATABASE_PATH" - fun saveDefaultDatabasePath(context: Context, defaultDatabaseUri: Uri?) { val prefs = PreferenceManager.getDefaultSharedPreferences(context) prefs?.edit()?.apply { defaultDatabaseUri?.let { - putString(KEY_DEFAULT_DATABASE_PATH, it.toString()) + putString(context.getString(R.string.default_database_path_key), it.toString()) } ?: kotlin.run { - remove(KEY_DEFAULT_DATABASE_PATH) + remove(context.getString(R.string.default_database_path_key)) } apply() } @@ -47,7 +45,7 @@ object PreferencesUtil { fun getDefaultDatabasePath(context: Context): String? { val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return prefs.getString(KEY_DEFAULT_DATABASE_PATH, "") + return prefs.getString(context.getString(R.string.default_database_path_key), "") } fun saveNodeSort(context: Context, diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index f75061a48..26c475251 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -195,6 +195,7 @@ --> show_beta_warning + default_database_path_key sort_node_key From 25977d389d8285be2f00470bd23b1500d1b75b76 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 13:18:36 +0100 Subject: [PATCH 10/68] Add DAO command to delete registered keyfile --- .../keepass/activities/FileDatabaseSelectActivity.kt | 3 --- .../keepass/app/database/FileDatabaseHistoryAction.kt | 8 ++++++++ .../keepass/app/database/FileDatabaseHistoryDao.kt | 3 +++ .../database/action/AssignPasswordInDatabaseRunnable.kt | 4 ++++ 4 files changed, 15 insertions(+), 3 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 d85cd2013..e3aee34df 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -161,9 +161,6 @@ class FileDatabaseSelectActivity : StylishActivity(), onActionFinish = { actionTask, _ -> when (actionTask) { ACTION_DATABASE_CREATE_TASK -> { - // TODO Check - // mAdapterDatabaseHistory?.notifyDataSetChanged() - // updateFileListVisibility() GroupActivity.launch(this@FileDatabaseSelectActivity) } } 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 61cf5e882..8605ae32a 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 @@ -112,6 +112,14 @@ class FileDatabaseHistoryAction(applicationContext: Context) { ).execute() } + fun deleteKeyFileByDatabaseUri(databaseUri: Uri) { + ActionDatabaseAsyncTask( + { + databaseFileHistoryDao.deleteKeyFileByDatabaseUri(databaseUri.toString()) + } + ).execute() + } + fun deleteAllKeyFiles() { ActionDatabaseAsyncTask( { diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt index 2ca9bcfb1..75f10f2c6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt @@ -38,6 +38,9 @@ interface FileDatabaseHistoryDao { @Delete fun delete(fileDatabaseHistory: FileDatabaseHistoryEntity): Int + @Query("UPDATE file_database_history SET keyfile_uri=null WHERE database_uri = :databaseUriString") + fun deleteKeyFileByDatabaseUri(databaseUriString: String) + @Query("UPDATE file_database_history SET keyfile_uri=null") fun deleteAllKeyFiles() diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt index 73578e8c9..f3f22d066 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignPasswordInDatabaseRunnable.kt @@ -22,6 +22,7 @@ package com.kunzisoft.keepass.database.action import android.content.Context import android.net.Uri import com.kunzisoft.keepass.app.database.CipherDatabaseAction +import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.utils.UriUtil @@ -70,6 +71,9 @@ open class AssignPasswordInDatabaseRunnable ( // Erase the biometric CipherDatabaseAction.getInstance(context) .deleteByDatabaseUri(mDatabaseUri) + // Erase the register keyfile + FileDatabaseHistoryAction.getInstance(context) + .deleteKeyFileByDatabaseUri(mDatabaseUri) if (!result.isSuccess) { // Erase the current master key From 4706afa8237da09eac8f022dc0d485e59285056e Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 14:16:30 +0100 Subject: [PATCH 11/68] Fix credentials options --- .../keepass/activities/PasswordActivity.kt | 83 ++++++++++--------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt index 254b51aad..22fba1e07 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt @@ -165,6 +165,12 @@ open class PasswordActivity : StylishActivity() { enableOrNotTheConfirmationButton() } + // If is a view intent + getUriFromIntent(intent) + if (savedInstanceState?.containsKey(KEY_KEYFILE) == true) { + mDatabaseKeyFileUri = UriUtil.parse(savedInstanceState.getString(KEY_KEYFILE)) + } + mProgressDialogThread = ProgressDialogThread(this).apply { onActionFinish = { actionTask, result -> when (actionTask) { @@ -177,11 +183,9 @@ open class PasswordActivity : StylishActivity() { } } - // Remove the password in view in all cases - removePassword() - if (result.isSuccess) { - setEmptyViews() + mDatabaseKeyFileUri = null + clearCredentialsViews(true) launchGroupActivity() } else { var resultError = "" @@ -237,6 +241,24 @@ open class PasswordActivity : StylishActivity() { } } + private fun getUriFromIntent(intent: Intent?) { + // If is a view intent + val action = intent?.action + if (action != null + && action == VIEW_INTENT) { + mDatabaseFileUri = intent.data + mDatabaseKeyFileUri = UriUtil.getUriFromIntent(intent, KEY_KEYFILE) + } else { + mDatabaseFileUri = intent?.getParcelableExtra(KEY_FILENAME) + mDatabaseKeyFileUri = intent?.getParcelableExtra(KEY_KEYFILE) + } + } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + getUriFromIntent(intent) + } + private fun launchGroupActivity() { EntrySelectionHelper.doEntrySelectionAction(intent, { @@ -271,7 +293,7 @@ open class PasswordActivity : StylishActivity() { // If the database isn't accessible make sure to clear the password field, if it // was saved in the instance state if (Database.getInstance().loaded) { - setEmptyViews() + clearCredentialsViews() } // For check shutdown @@ -283,46 +305,31 @@ open class PasswordActivity : StylishActivity() { } override fun onSaveInstanceState(outState: Bundle) { + mDatabaseKeyFileUri?.let { + outState.putString(KEY_KEYFILE, it.toString()) + } ReadOnlyHelper.onSaveInstanceState(outState, readOnly) super.onSaveInstanceState(outState) } private fun initUriFromIntent() { - - val databaseUri: Uri? - val keyFileUri: Uri? - - // If is a view intent - val action = intent.action - if (action != null - && action == VIEW_INTENT) { - databaseUri = intent.data - keyFileUri = UriUtil.getUriFromIntent(intent, KEY_KEYFILE) - } else { - databaseUri = intent.getParcelableExtra(KEY_FILENAME) - keyFileUri = intent.getParcelableExtra(KEY_KEYFILE) - } - - mForceReadOnly = !UriUtil.isUriWritable(contentResolver, databaseUri) + mForceReadOnly = !UriUtil.isUriWritable(contentResolver, mDatabaseFileUri) // Post init uri with KeyFile if needed - if (mRememberKeyFile && (keyFileUri == null || keyFileUri.toString().isEmpty())) { + if (mRememberKeyFile && (mDatabaseKeyFileUri == null || mDatabaseKeyFileUri.toString().isEmpty())) { // Retrieve KeyFile in a thread - databaseUri?.let { databaseUriNotNull -> + mDatabaseFileUri?.let { databaseUri -> FileDatabaseHistoryAction.getInstance(applicationContext) - .getKeyFileUriByDatabaseUri(databaseUriNotNull) { + .getKeyFileUriByDatabaseUri(databaseUri) { onPostInitUri(databaseUri, it) } } } else { - onPostInitUri(databaseUri, keyFileUri) + onPostInitUri(mDatabaseFileUri, mDatabaseKeyFileUri) } } private fun onPostInitUri(databaseFileUri: Uri?, keyFileUri: Uri?) { - mDatabaseFileUri = databaseFileUri - mDatabaseKeyFileUri = keyFileUri - // Define title databaseFileUri?.let { FileDatabaseInfo(this, it).retrieveDatabaseTitle { title -> @@ -331,9 +338,8 @@ open class PasswordActivity : StylishActivity() { } // Define Key File text - val keyUriString = keyFileUri?.toString() ?: "" - if (keyUriString.isNotEmpty() && mRememberKeyFile) { // Bug KeepassDX #18 - populateKeyFileTextView(keyUriString) + if (mRememberKeyFile) { + populateKeyFileTextView(keyFileUri?.toString()) } // Define listeners for default database checkbox and validate button @@ -428,10 +434,9 @@ open class PasswordActivity : StylishActivity() { } } - private fun setEmptyViews() { + private fun clearCredentialsViews(clearKeyFile: Boolean = !mRememberKeyFile) { populatePasswordTextView(null) - // Bug KeepassDX #18 - if (!mRememberKeyFile) { + if (clearKeyFile) { populateKeyFileTextView(null) } } @@ -497,18 +502,13 @@ open class PasswordActivity : StylishActivity() { mDatabaseKeyFileUri = if (checkboxKeyFileView?.isChecked != true) null else keyFile } - private fun removePassword() { - passwordView?.setText("") - checkboxPasswordView?.isChecked = false - } - private fun loadDatabase(databaseFileUri: Uri?, password: String?, keyFileUri: Uri?, cipherDatabaseEntity: CipherDatabaseEntity? = null) { if (PreferencesUtil.deletePasswordAfterConnexionAttempt(this)) { - removePassword() + clearCredentialsViews() } databaseFileUri?.let { databaseUri -> @@ -671,6 +671,7 @@ open class PasswordActivity : StylishActivity() { keyFileResult = it.onActivityResultCallback(requestCode, resultCode, data ) { uri -> if (uri != null) { + mDatabaseKeyFileUri = uri populateKeyFileTextView(uri.toString()) } } @@ -679,7 +680,7 @@ open class PasswordActivity : StylishActivity() { // this block if not a key file response when (resultCode) { LockingActivity.RESULT_EXIT_LOCK, Activity.RESULT_CANCELED -> { - setEmptyViews() + clearCredentialsViews() Database.getInstance().closeAndClear(applicationContext.filesDir) } } From b0e14110124bc678d5ac95b2951b6a014c2f471d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 14:20:48 +0100 Subject: [PATCH 12/68] Update CHANGELOG --- CHANGELOG | 1 + fastlane/metadata/android/en-US/changelogs/29.txt | 1 + fastlane/metadata/android/fr-FR/changelogs/29.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index b3958fc5f..99ff88f1d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ KeePassDX(2.5beta29) + * Delete registered KeyFile after save new credentials * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) diff --git a/fastlane/metadata/android/en-US/changelogs/29.txt b/fastlane/metadata/android/en-US/changelogs/29.txt index 8dd534438..3609d4e42 100644 --- a/fastlane/metadata/android/en-US/changelogs/29.txt +++ b/fastlane/metadata/android/en-US/changelogs/29.txt @@ -1,2 +1,3 @@ + * Delete registered KeyFile after save new credentials * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) diff --git a/fastlane/metadata/android/fr-FR/changelogs/29.txt b/fastlane/metadata/android/fr-FR/changelogs/29.txt index 99974001c..398d740fd 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/29.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/29.txt @@ -1,2 +1,3 @@ + * Suppression du fichier clé enregistré après avoir sauvegardé de nouvelles informations d'identification * Correction de l'actualisation de la vue d'entrée du titre et du nom d'utilisateur après une mise à jour  * Correction de la demande de verrouillage de la base de données (notification ouverte toujours active) From 3c0725baff0efdb2c5344ad9f1d593992820b236 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 14:24:33 +0100 Subject: [PATCH 13/68] Fix remember key file option --- .../java/com/kunzisoft/keepass/activities/PasswordActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt index 22fba1e07..9aa21f31e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt @@ -111,8 +111,6 @@ open class PasswordActivity : StylishActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mRememberKeyFile = PreferencesUtil.rememberKeyFileLocations(this) - setContentView(R.layout.activity_password) toolbar = findViewById(R.id.toolbar) @@ -287,6 +285,8 @@ open class PasswordActivity : StylishActivity() { } override fun onResume() { + mRememberKeyFile = PreferencesUtil.rememberKeyFileLocations(this) + if (Database.getInstance().loaded) launchGroupActivity() From 1f3f7634e703ae46e7d18eb480dc8c24aa48bf91 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 14:41:02 +0100 Subject: [PATCH 14/68] Allow empty title in entries #423 --- CHANGELOG | 1 + .../keepass/view/EntryEditContentsView.kt | 8 - app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 319 +++++++++--------- app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-iw/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-nb/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-nn/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - .../metadata/android/en-US/changelogs/29.txt | 1 + .../metadata/android/fr-FR/changelogs/29.txt | 1 + 37 files changed, 162 insertions(+), 200 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 99ff88f1d..97369a3c3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ KeePassDX(2.5beta29) * Delete registered KeyFile after save new credentials * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) + * Allow empty title in entries KeePassDX(2.5beta28) * Fix read only database diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt index 81a2f39b5..76db2f2a9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt @@ -228,14 +228,6 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, fun isValid(): Boolean { var isValid = true - // Require title - if (entryTitleView.text.toString().isEmpty()) { - entryTitleLayoutView.error = context.getString(R.string.error_title_required) - isValid = false - } else { - entryTitleLayoutView.error = null - } - // Validate password if (entryPasswordView.text.toString() != entryConfirmationPasswordView.text.toString()) { entryPasswordLayoutView.error = context.getString(R.string.error_pass_match) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 504c01b70..e7226ebc9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -50,7 +50,6 @@ تأكد أن المسار صحيح. ادخل اسمًا. كلمتا السر غير متطابقتين. - اكتب عنوانًا. اسم الحقل قيمة الحقل توليد كلمة سر diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index db8e2f6d2..c9639f291 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -69,7 +69,6 @@ Has de seleccionar almenys un tipus de generador de contrasenyes Les contrasenyes no coincideixen. Massa passades. Establint a 2147483648. - És necessari un títol. Insereix un enter positiu al camp longitud Explorador d\'arxius Generar contrasenya diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c6629aa86..2a1f39850 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -71,7 +71,6 @@ Zadání hesla se neshodují. Příliš vysoký „Počet průchodů“. Nastavuji na 2147483648. Je třeba, aby každý řetězec měl název kolonky. - Přidejte název. Do nastavení „Délka“ zadejte celé kladné číslo. Název pole Hodnota pole diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 2c7e25af0..910e17271 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -70,7 +70,6 @@ Adgangskoderne er ikke ens. \"Transformation Runder\" er for stor. Sættes til 2147483648. Hver streng skal have et feltnavn. - Tilføj en titel. Angiv et positivt heltal i feltet \"Længde\". Feltnavn Feltværdi diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 39d9a403a..ba6ede771 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -75,7 +75,6 @@ Die Passwörter stimmen nicht überein. „Transformationsrunden“ zu hoch. Wird auf 2147483648 eingestellt. Für jede Zeichenfolge ist ein Feldname notwendig. - Titel hinzufügen. Eine positive ganze Zahl in das Feld „Länge“ eingeben. Feldname Feldwert diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 86dfc3d86..632e80ae6 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -71,7 +71,6 @@ Οι κωδικοί δεν ταιριάζουν. Οι \"κύκλοι μετασχηματισμού\" είναι πολύ υψηλοί. Ρύθμιση στο 2147483648. Κάθε σειρά πρέπει να έχει όνομα πεδίου. - Προσθέστε έναν τίτλο. Εισάγετε ένα θετικό ακέραιο αριθμό στο πεδίο \"Μήκος\". Όνομα πεδίου Τιμή πεδίου diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 58fedc613..8a0fa9206 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -67,7 +67,6 @@ Debe seleccionar al menos un tipo de generación de contraseñas. Las contraseñas no coinciden. Pasadas demasiado grande. Establecido a 2147483648. - Añada un título. Proporcione un número entero positivo en el campo «Longitud». Explorador de archivos Generar contraseña diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index c9644b5d8..096f20150 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -73,7 +73,6 @@ Pasahitzak ez datoz bat. Rondak handiegiak. 2147483648 balorean jarrita. Eremu izen bat behar da testu kate bakoitzerako. - Izenburu bat behar da. Eremuaren luzeran entero positibo bat sartu Eremuaren izena Eremuaren balorea diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 011a85d20..ae7125b14 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1,161 +1,160 @@ - - - - Palaute: - Kotisivu: - KeePassDX on KeePass-salasanahallintaohjelman Android-versio - Hyväksy - Lisää uusi salasanatietue - Lisää ryhmä - Algoritmi - Ohjelman aikakatkaisu - Aika, jonka jälkeen KeePass lukitaan jos se on ollut toimeton. - Ohjelma - Ohjelman asetukset - Älä näytä enää uudelleen - Hakasulkeet - Tiedostojen selaus vaatii Open Intents File Manager -tiedostonhallintaohjelman, klikkaa alla olevaa linkkiä asentaaksesi sen. Joidenkin ominaisuuksien takia se ei ehkä toimi oikein ensimmäisellä käynnistyksellä. - Leikepöytä tyhjennetty. - Leikepöytävirhe - Joissakin Android-puhelimissa on virhe leikepöydän toteutuksessa, mikä aiheuttaa kopioinnin epäonnistumisen. Lisätietoa: - Leikepöydän tyhjennys epäonnistui - Leikepöydän aikakatkaisu - Aika, jonka jälkeen leikepöytä tyhjennetään käyttäjätunnuksen tai salasanan kopioinnin jälkeen - Valitse kopioidaksesi %1$s - Luodaan tietokanta-avainta… - Tietokanta - Puretaan tietokannan salausta… - Käytä tätä oletustietokantana - Numerot - KeePassDX © %1$d Kunzisoft comes with absolutely no warranty. This is free software, and you are welcome to redistribute it under the conditions of the GPL version 3 or later. - Anna tietokannan tiedostonimi - Käytetty - Peruuta - Kommentit - Vahvista salasana - Luotu - Vanhenee - Avaintiedosto - Muokattu - Tietueen tietoja ei löytynyt. - Salasana - Tallenna - Nimi - URL-osoite - Käyttäjänimi - The Arcfour stream cipher ei ole tuettu. - KeePassDX ei osaa käsitellä tätä osoitetta. - Tiedoston luonti epäonnistui: - Viallinen salasanatietokanta. - Viallinen hakemistopolku. - Nimi puuttuu. - Salasana tai avaintiedosto puuttuu. - Puhelimesta loppui muisti salasanatietokantaa avatessa. Tietokanta voi olla liian suuri tälle puhelinmallille. - Vähintään yksi salasanagenerointitapa täytyy olla valittuna. - Salasanat eivät täsmää. - Kierroksia on liian paljon. Asetetaan se arvoon 2147483648. - Kentän nimi on pakollinen joka tekstille. - Otsikko on pakollinen. - Syötä positiivinen kokonaisluku pituus-kenttään - Kentän nimi - Kentän arvo - Tiedostoselain - Generoi salasana - vahvista salasana - generoidut salasanat - Ryhmän nimi - avaintiedosto - pituus - salasana - Salasana - Asenna Play Storesta - Asenna F-Droid - Väärä salasana tai avaintiedosto. - Epäkelpo algoritmi. - Salasanatietokannan tyyppiä ei tunnistettu. - Avaintiedosto on tyhjä. - Pituus - Ryhmälistan pituus - Tekstin koko ryhmälistauksessa - Ladataan salasanatietokantaa… - pienet kirjaimet - Piilota salasaan - Piilota salasanat oletuksena - Tietoa - Vaihda pääsalasanaa - Asetukset - Salasanatietokannan asetukset - Poista - Lahjoita - Muokkaa - Piilota salasana - Lukitse salasanatietokanta - Avaa - Etsi - Näytä salasana - Mene URL-osoitteeseen - Miinus - Ei koskaan - Ei hakutuloksia - Tälle URL:lle ei ole käsittelijää. - Avaa viimeisin salasanatietokanta : - Älä etsi varmuuskopioista eikä roskakorista - Poista \'Varmuuskopiot\' ja roskakori hakutuloksista - Luodaan uutta tietokantaa… - Työskennellään… - Suojaus - Poista - Rijndael (AES) - Juuri - Salauskierroksia - Suurempi kierrosten määrä parantaa suojausta raa\'alla voimalla tehdyiltä murtoyrityksiltä, mutta voi todella hidastaa lataamista ja tallentamista. - Tallennetaan tietokantaa… - Tila - Etsi - Tietokannan lajittelujärjestys - Erityistä - Tietueen otsikko/kuvaus - Hakutulokset - Twofish - Alleviivattu - Ei-tuettu salasanatietokannan versio. - Isot kirjaimet - SD-korttia ei löydy. Et voi ladata tai tallentaa salasanatietokantaa. - Versio %1$s - - Syötä salasana ja/tai avaintiedosto avataksesi tietokantasi. - - - 5 sekuntia - 10 sekuntia - 20 sekuntia - 30 sekuntia - 1 minuutti - 5 minuttia - 15 minuttia - 30 minuttia - Ei koskaan - - - Pieni - Keskikokoinen - Suuri - + + + + Palaute: + Kotisivu: + KeePassDX on KeePass-salasanahallintaohjelman Android-versio + Hyväksy + Lisää uusi salasanatietue + Lisää ryhmä + Algoritmi + Ohjelman aikakatkaisu + Aika, jonka jälkeen KeePass lukitaan jos se on ollut toimeton. + Ohjelma + Ohjelman asetukset + Älä näytä enää uudelleen + Hakasulkeet + Tiedostojen selaus vaatii Open Intents File Manager -tiedostonhallintaohjelman, klikkaa alla olevaa linkkiä asentaaksesi sen. Joidenkin ominaisuuksien takia se ei ehkä toimi oikein ensimmäisellä käynnistyksellä. + Leikepöytä tyhjennetty. + Leikepöytävirhe + Joissakin Android-puhelimissa on virhe leikepöydän toteutuksessa, mikä aiheuttaa kopioinnin epäonnistumisen. Lisätietoa: + Leikepöydän tyhjennys epäonnistui + Leikepöydän aikakatkaisu + Aika, jonka jälkeen leikepöytä tyhjennetään käyttäjätunnuksen tai salasanan kopioinnin jälkeen + Valitse kopioidaksesi %1$s + Luodaan tietokanta-avainta… + Tietokanta + Puretaan tietokannan salausta… + Käytä tätä oletustietokantana + Numerot + KeePassDX © %1$d Kunzisoft comes with absolutely no warranty. This is free software, and you are welcome to redistribute it under the conditions of the GPL version 3 or later. + Anna tietokannan tiedostonimi + Käytetty + Peruuta + Kommentit + Vahvista salasana + Luotu + Vanhenee + Avaintiedosto + Muokattu + Tietueen tietoja ei löytynyt. + Salasana + Tallenna + Nimi + URL-osoite + Käyttäjänimi + The Arcfour stream cipher ei ole tuettu. + KeePassDX ei osaa käsitellä tätä osoitetta. + Tiedoston luonti epäonnistui: + Viallinen salasanatietokanta. + Viallinen hakemistopolku. + Nimi puuttuu. + Salasana tai avaintiedosto puuttuu. + Puhelimesta loppui muisti salasanatietokantaa avatessa. Tietokanta voi olla liian suuri tälle puhelinmallille. + Vähintään yksi salasanagenerointitapa täytyy olla valittuna. + Salasanat eivät täsmää. + Kierroksia on liian paljon. Asetetaan se arvoon 2147483648. + Kentän nimi on pakollinen joka tekstille. + Syötä positiivinen kokonaisluku pituus-kenttään + Kentän nimi + Kentän arvo + Tiedostoselain + Generoi salasana + vahvista salasana + generoidut salasanat + Ryhmän nimi + avaintiedosto + pituus + salasana + Salasana + Asenna Play Storesta + Asenna F-Droid + Väärä salasana tai avaintiedosto. + Epäkelpo algoritmi. + Salasanatietokannan tyyppiä ei tunnistettu. + Avaintiedosto on tyhjä. + Pituus + Ryhmälistan pituus + Tekstin koko ryhmälistauksessa + Ladataan salasanatietokantaa… + pienet kirjaimet + Piilota salasaan + Piilota salasanat oletuksena + Tietoa + Vaihda pääsalasanaa + Asetukset + Salasanatietokannan asetukset + Poista + Lahjoita + Muokkaa + Piilota salasana + Lukitse salasanatietokanta + Avaa + Etsi + Näytä salasana + Mene URL-osoitteeseen + Miinus + Ei koskaan + Ei hakutuloksia + Tälle URL:lle ei ole käsittelijää. + Avaa viimeisin salasanatietokanta : + Älä etsi varmuuskopioista eikä roskakorista + Poista \'Varmuuskopiot\' ja roskakori hakutuloksista + Luodaan uutta tietokantaa… + Työskennellään… + Suojaus + Poista + Rijndael (AES) + Juuri + Salauskierroksia + Suurempi kierrosten määrä parantaa suojausta raa\'alla voimalla tehdyiltä murtoyrityksiltä, mutta voi todella hidastaa lataamista ja tallentamista. + Tallennetaan tietokantaa… + Tila + Etsi + Tietokannan lajittelujärjestys + Erityistä + Tietueen otsikko/kuvaus + Hakutulokset + Twofish + Alleviivattu + Ei-tuettu salasanatietokannan versio. + Isot kirjaimet + SD-korttia ei löydy. Et voi ladata tai tallentaa salasanatietokantaa. + Versio %1$s + + Syötä salasana ja/tai avaintiedosto avataksesi tietokantasi. + + + 5 sekuntia + 10 sekuntia + 20 sekuntia + 30 sekuntia + 1 minuutti + 5 minuttia + 15 minuttia + 30 minuttia + Ei koskaan + + + Pieni + Keskikokoinen + Suuri + \ 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 8f5162972..56cac2f73 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -76,7 +76,6 @@ Les mots de passe ne correspondent pas. « Tours de transformation » trop grand. Définition à 2147483648. Chaque chaîne doit avoir un nom de champ. - Veuillez ajouter un titre. Veuillez saisir un entier positif dans le champ « Longueur ». Impossible d’activer le service de remplissage automatique. Nom du champ diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 3f1569f16..0402eae7d 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -58,7 +58,6 @@ पासवर्ड मेल नहीं खाते हैं। \"परिवर्तन राउंड\" बहुत अधिक है। 2147483648 पर सेट हो रहा है। प्रत्येक स्ट्रिंग में फ़ील्ड नाम होना चाहिए। - एक शीर्षक जोड़ें। फ़ाइल खोलें नोड के बच्चे नोड जोड़ें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 4ded77fa2..7e88d3807 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -73,7 +73,6 @@ Odaberi datoteku ključa. Bar jedan tip generiranja lozinke mora biti odabran. Lozinke se ne podudaraju. - Dodaj naslov. Unesi pozitivan cijeli broj u polje \"Duljina\". Tajni ključ mora biti u Base32 formatu. Brojač mora biti između %1$d i %2$d. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 500bccc19..6506d893c 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -71,7 +71,6 @@ A jelszavak nem egyeznek meg. A „Transzformációs körök” száma túl nagy. Beállítás 2147483648-ra. Minden karakterlánchoz szükséges egy mezőnév. - Adjon hozzá egy címet. Írjon be egy pozitív egész számot a „Hossz” mezőbe. Mezőnév Mezőérték diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c2557a599..09bccda78 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -71,7 +71,6 @@ Le password non corrispondono. \"Livello\" troppo alto. Impostato a 2147483648. Ogni stringa deve avere un nome. - Aggiungi un titolo. Inserisci un numero naturale positivo nel campo \"lunghezza\". Nome campo Valore campo diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 7676737c9..9b39fdc71 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -69,7 +69,6 @@ הסיסמאות לא תואמות. מספר סיבובים גדול מדי. מגדיר ל-2147483648. שדה שם נדרש לכל מחרוזת. - כותרת נדרשת. הזן מספר חיובי בשדה האורך שם השדה ערך השדה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 1c9c311f4..f9868f637 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -65,7 +65,6 @@ 少なくとも1つ以上のパスワード生成タイプを選択する必要があります。 パスワードが一致しません 値が大きすぎます。 2147483648にセットしました。 - タイトルは必須入力です。 \"長さ\"欄には正の整数を入力してください。 ファイルブラウザ パスワードを生成する diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index f671b1a5c..be97256e0 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -78,7 +78,6 @@ 비밀번호가 일치하지 않습니다. \"Transformation rounds\" 가 너무 높습니다. 2147483648로 설정합니다. 각 항목은 필드 이름을 가져야 합니다. - 제목을 입력하십시오. \"길이\" 필드에는 양수를 입력하십시오. 자동 채우기 서비스를 활성화할 수 없습니다. 그룹을 자신에게 옮길 수 없습니다. diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 2694b6d57..c20b85eb8 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -52,7 +52,6 @@ Paroles nesakrīt. Līmenis pārāk liels. Maksimālais 2147483648 A field name is required for each string. - Nepieciešams nosaukums. Norādiet garumu lielāku par nulli Lauka nosaukums Lauka vērtība diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 25db838ac..b4e0f3f63 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -77,7 +77,6 @@ Passordene samsvarer ikke. \"Omganger\" er for stort. Setter til 2147483648. Hver streng må ha et feltnavn. - En tittel er påkrevd. Skriv inn et positivt heltall i \"Lengde\"-feltet. Autofyll-tjenesten kan ikke skrus på. Kan ikke flytte gruppe inn i seg selv. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c7d345c28..831898ca1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -67,7 +67,6 @@ Je moet minimaal één soort wachtwoordgenerering kiezen. De wachtwoorden komen niet overeen. \"Cycli-waarde\" te groot. Wordt ingesteld op 2147483648. - Voeg een titel toe. Voer een positief geheel getal in in het veld \"Lengte\". Bestandsverkenner Wachtwoord genereren diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 0b5802180..5159725ee 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -66,7 +66,6 @@ Du må velja minst éin passordlagingstype Passorda samsvarer ikkje. For mange omgangar. Bruker 2147483648. - Treng ein tittel. Bruk eit positivt heiltal i lengdfeltet Filbehandlar Lag passord diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2766a3ed9..15b099f65 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -64,7 +64,6 @@ Należy wybrać co najmniej jeden rodzaj generowania hasła. Hasła nie pasują do siebie. \"Rundy szyfrowania\" są zbyt wysokie. Ustaw na 2147483648. - Dodaj tytuł. Wprowadź dodatnią liczbę całkowitą w polu \"Długość\". Przeglądarka plików Generuj hasło diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c6b0e05ef..d573ce0d4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -65,7 +65,6 @@ Pelo menos um tipo de geração de senhas deve ser selecionado. As senhas não combinam. \"Número de rodadas\" é muito grande. Modificado para 2147483648. - Insira um título. Digite um número inteiro positivo no campo \"Tamanho\". Localizador de arquivos Gerar senha diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index f623e3980..acc2fa92d 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -72,7 +72,6 @@ As palavras-passe não coincidem. \"Número de rodadas\" é muito grande. Modificado para 2147483648. Um nome do campo é necessário para cada string. - Adicione um título. Digite um número inteiro positivo no campo \"Tamanho\". Nome do campo Valor do campo diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index eb3103ad8..57065e556 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -95,7 +95,6 @@ Parolele nu se potrivesc. \"Transformările rotunde\" prea sus. Setarea la 2147483648. Fiecare șir trebuie să aibă un nume de câmp. - Adăugați un titlu. Introduceți un număr întreg pozitiv în câmpul \"Lungime\". Nu s-a putut activa serviciul de completare automată. Nu puteți muta un grup în sine. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 33c9d5475..3f3c75873 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -72,7 +72,6 @@ Пароли не совпадают. Предельное значение 2147483648. Каждое поле должно иметь название. - Введите название. Поле \"Длина\" должно быть положительным целым числом. Название поля Значение поля diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b38d7c211..deb8bbc75 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -65,7 +65,6 @@ Musí byť vybraý najmenej jeden typ generovania hesla Heslá sa nezhodujú. Príliš veľa opakovaní. Nastavujem na 2147483648. - Vyžaduje sa názov. Zadajte celé kladné číslo na dĺžku poľa Správca Súborov Generovať Heslo diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 356261979..2ec6d884a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -72,7 +72,6 @@ Lösenorden matchar inte. \"Transformationsrundor\" är för stort. Sätter värdet till 2147483648. Varje sträng måste ha ett fältnamn. - Lägg till en titel. Ange ett positivt heltal i fältet för längd. Fältnamn Fältvärde diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6beeefa83..d8a828707 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -77,7 +77,6 @@ Parolalar uyuşmuyor. \"Dönüşüm turları\" çok yüksek. 2147483648\'e ayarlayın. Her dizenin bir alan adı olmalıdır. - Bir başlık ekle. \"Uzunluk\" alanına pozitif bir tam sayı girin. Otomatik doldurma hizmeti etkinleştirilemedi. Bir grubu kendine taşıyamazsın. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5ee9116a4..e860e6e8f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -66,7 +66,6 @@ Принаймні один тип генерації пароля необхідно вибрати. Паролі не співпадають. Надто багато циклів. Установлено 2147483648. - Необхідно вказати заголовок. Введіть ціле число на усю довжину поля Перегляд файлів Згенерувати пароль diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e4574038c..4ac0a1856 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -66,7 +66,6 @@ 必须至少选择一种密码生成类型。 密码不匹配。 “变换次数”过多。已设置为2147483648。 - 请添加标题。 请在“长度”字段输入正整数。 文件浏览器 生成密码 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f12d2975f..f93f3efc9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -65,7 +65,6 @@ 必須至少選擇一個密碼生成類型。 密碼不正確。 次數太多。最大設置到2147483648。 - 添加標題。 長度欄位輸入一個正整數 檔案管理器 生成密碼 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7dbbd1b3e..165fd9910 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -115,7 +115,6 @@ The passwords do not match. \"Transformation rounds\" too high. Setting to 2147483648. Each string must have a field name. - Add a title. Enter a positive whole number in the \"Length\" field. Could not enable autofill service. You can not move a group into itself. diff --git a/fastlane/metadata/android/en-US/changelogs/29.txt b/fastlane/metadata/android/en-US/changelogs/29.txt index 3609d4e42..448984fe6 100644 --- a/fastlane/metadata/android/en-US/changelogs/29.txt +++ b/fastlane/metadata/android/en-US/changelogs/29.txt @@ -1,3 +1,4 @@ * Delete registered KeyFile after save new credentials * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) + * Allow empty title in entries diff --git a/fastlane/metadata/android/fr-FR/changelogs/29.txt b/fastlane/metadata/android/fr-FR/changelogs/29.txt index 398d740fd..2e655211f 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/29.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/29.txt @@ -1,3 +1,4 @@ * Suppression du fichier clé enregistré après avoir sauvegardé de nouvelles informations d'identification * Correction de l'actualisation de la vue d'entrée du titre et du nom d'utilisateur après une mise à jour  * Correction de la demande de verrouillage de la base de données (notification ouverte toujours active) + * Autoriser le titre vide dans les entrées From 574d2b8904a4d0955cc0e76682f3d2c7284440a0 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 16:56:46 +0100 Subject: [PATCH 15/68] Wait 3 seconds before the lock after the screen turns off #59 --- .../keepass/utils/BroadcastAction.kt | 21 +++++++++++++++++-- app/src/main/res/values/donottranslate.xml | 1 + 2 files changed, 20 insertions(+), 2 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 7b20f6b6a..7e889f86d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt @@ -24,7 +24,9 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.os.Handler import android.util.Log +import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.magikeyboard.MagikIME import com.kunzisoft.keepass.notifications.ClipboardEntryNotificationService @@ -40,17 +42,31 @@ const val REMOVE_ENTRY_MAGIKEYBOARD_ACTION = "com.kunzisoft.keepass.REMOVE_ENTRY class LockReceiver(var lockAction: () -> Unit) : BroadcastReceiver() { + private val screenOffHandler = Handler() + private var screenOffRunnable: Runnable? = null + override fun onReceive(context: Context, intent: Intent) { + + screenOffRunnable?.let { runnable -> + screenOffHandler.removeCallbacks(runnable) + } // If allowed, lock and exit if (!TimeoutHelper.temporarilyDisableTimeout) { intent.action?.let { when (it) { - Intent.ACTION_SCREEN_OFF -> + Intent.ACTION_SCREEN_OFF -> { if (PreferencesUtil.isLockDatabaseWhenScreenShutOffEnable(context)) { - lockAction.invoke() + screenOffRunnable = Runnable { + lockAction.invoke() + } + // Launch the effective action after a small time + screenOffHandler.postDelayed(screenOffRunnable!!, + context.getString(R.string.timeout_screen_off).toLong()) } + } LOCK_ACTION, REMOVE_ENTRY_MAGIKEYBOARD_ACTION -> lockAction.invoke() + else -> {} } } } @@ -62,6 +78,7 @@ fun Context.registerLockReceiver(lockReceiver: LockReceiver?, lockReceiver?.let { registerReceiver(it, IntentFilter().apply { addAction(Intent.ACTION_SCREEN_OFF) + addAction(Intent.ACTION_SCREEN_ON) addAction(LOCK_ACTION) if (registerRemoveEntryMagikeyboard) addAction(REMOVE_ENTRY_MAGIKEYBOARD_ACTION) diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 26c475251..6d623b39d 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -243,6 +243,7 @@ timeout_backup_key 300000 + 3000 5000 10000 From de4936a16dad99ebdf324d3c1d30c755738674e9 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 17:05:53 +0100 Subject: [PATCH 16/68] Set nullable getSystemService --- .../com/kunzisoft/keepass/activities/GroupActivity.kt | 8 +++++--- .../keepass/adapters/SearchEntryCursorAdapter.kt | 6 +++--- .../keepass/biometric/BiometricUnlockDatabaseHelper.kt | 2 +- .../java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt | 8 ++++---- .../java/com/kunzisoft/keepass/view/AddNodeButtonView.kt | 4 ++-- .../com/kunzisoft/keepass/view/AdvancedUnlockInfoView.kt | 4 ++-- .../java/com/kunzisoft/keepass/view/EntryContentsView.kt | 4 ++-- .../java/com/kunzisoft/keepass/view/EntryCustomField.kt | 4 ++-- .../com/kunzisoft/keepass/view/EntryEditContentsView.kt | 4 ++-- .../com/kunzisoft/keepass/view/EntryEditCustomField.kt | 4 ++-- 10 files changed, 25 insertions(+), 23 deletions(-) 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 b8665fff6..7d0570a17 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -664,13 +664,15 @@ class GroupActivity : LockingActivity(), } // Get the SearchView and set the searchable configuration - val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager + val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager? menu.findItem(R.id.menu_search)?.let { val searchView = it.actionView as SearchView? searchView?.apply { - setSearchableInfo(searchManager.getSearchableInfo( - ComponentName(this@GroupActivity, GroupActivity::class.java))) + (searchManager?.getSearchableInfo( + ComponentName(this@GroupActivity, GroupActivity::class.java)))?.let { searchableInfo -> + setSearchableInfo(searchableInfo) + } setIconifiedByDefault(false) // Do not iconify the widget; expand it by default suggestionsAdapter = mSearchSuggestionAdapter setOnSuggestionListener(object : SearchView.OnSuggestionListener { diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.kt index b92da1f9d..306a49f86 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.kt @@ -38,8 +38,8 @@ class SearchEntryCursorAdapter(private val context: Context, private val database: Database) : androidx.cursoradapter.widget.CursorAdapter(context, null, FLAG_REGISTER_CONTENT_OBSERVER) { - private val cursorInflater: LayoutInflater = context.getSystemService( - Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + private val cursorInflater: LayoutInflater? = context.getSystemService( + Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? private var displayUsername: Boolean = false private val iconColor: Int @@ -58,7 +58,7 @@ class SearchEntryCursorAdapter(private val context: Context, override fun newView(context: Context, cursor: Cursor, parent: ViewGroup): View { - val view = cursorInflater.inflate(R.layout.item_search_entry, parent, false) + val view = cursorInflater!!.inflate(R.layout.item_search_entry, parent, false) val viewHolder = ViewHolder() viewHolder.imageViewIcon = view.findViewById(R.id.entry_icon) viewHolder.textViewTitle = view.findViewById(R.id.entry_text) diff --git a/app/src/main/java/com/kunzisoft/keepass/biometric/BiometricUnlockDatabaseHelper.kt b/app/src/main/java/com/kunzisoft/keepass/biometric/BiometricUnlockDatabaseHelper.kt index 7a001a3bf..63844f811 100644 --- a/app/src/main/java/com/kunzisoft/keepass/biometric/BiometricUnlockDatabaseHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/biometric/BiometricUnlockDatabaseHelper.kt @@ -95,7 +95,7 @@ class BiometricUnlockDatabaseHelper(private val context: FragmentActivity) { // really not much to do when no fingerprint support found isKeyManagerInit = false } else { - this.keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + this.keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager? try { this.keyStore = KeyStore.getInstance(BIOMETRIC_KEYSTORE) diff --git a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt index 47ee3837a..fabe144d1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt +++ b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt @@ -173,12 +173,12 @@ class MagikIME : InputMethodService(), KeyboardView.OnKeyboardActionListener { private fun switchToPreviousKeyboard() { var imeManager: InputMethodManager? = null try { - imeManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imeManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { switchToPreviousInputMethod() } else { window.window?.let { window -> - imeManager.switchToLastInputMethod(window.attributes.token) + imeManager?.switchToLastInputMethod(window.attributes.token) } } } catch (e: Exception) { @@ -200,8 +200,8 @@ class MagikIME : InputMethodService(), KeyboardView.OnKeyboardActionListener { KEY_BACK_KEYBOARD -> switchToPreviousKeyboard() KEY_CHANGE_KEYBOARD -> { - val imeManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imeManager.showInputMethodPicker() + (getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?) + ?.showInputMethodPicker() } KEY_UNLOCK -> { } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt b/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt index 4fdfbecdb..a2e5d317b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt @@ -69,8 +69,8 @@ class AddNodeButtonView @JvmOverloads constructor(context: Context, } private fun inflate(context: Context) { - val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - inflater.inflate(R.layout.view_button_add_node, this) + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? + inflater?.inflate(R.layout.view_button_add_node, this) addEntryEnable = true addGroupEnable = true diff --git a/app/src/main/java/com/kunzisoft/keepass/view/AdvancedUnlockInfoView.kt b/app/src/main/java/com/kunzisoft/keepass/view/AdvancedUnlockInfoView.kt index 5dc421bdb..b6cd31cc6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/AdvancedUnlockInfoView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/AdvancedUnlockInfoView.kt @@ -44,8 +44,8 @@ class AdvancedUnlockInfoView @JvmOverloads constructor(context: Context, init { - val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - inflater.inflate(R.layout.view_advanced_unlock, this) + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? + inflater?.inflate(R.layout.view_advanced_unlock, this) unlockContainerView = findViewById(R.id.fingerprint_container) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt index 74f64fefd..a691585cf 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt @@ -99,8 +99,8 @@ class EntryContentsView @JvmOverloads constructor(context: Context, get() = passwordContainerView.visibility == View.VISIBLE init { - val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - inflater.inflate(R.layout.view_entry_contents, this) + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? + inflater?.inflate(R.layout.view_entry_contents, this) userNameContainerView = findViewById(R.id.entry_user_name_container) userNameView = findViewById(R.id.entry_user_name) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryCustomField.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryCustomField.kt index 72c48d340..19a262dfc 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryCustomField.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryCustomField.kt @@ -43,8 +43,8 @@ open class EntryCustomField @JvmOverloads constructor(context: Context, init { - val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - inflater.inflate(R.layout.item_entry_new_field, this) + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? + inflater?.inflate(R.layout.item_entry_new_field, this) labelView = findViewById(R.id.title) valueView = findViewById(R.id.value) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt index 76db2f2a9..e051aa204 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt @@ -60,8 +60,8 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, private var iconColor: Int = 0 init { - val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - inflater.inflate(R.layout.view_entry_edit_contents, this) + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? + inflater?.inflate(R.layout.view_entry_edit_contents, this) entryTitleLayoutView = findViewById(R.id.entry_edit_container_title) entryTitleView = findViewById(R.id.entry_edit_title) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt index 84587d426..ba3872cc0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt @@ -54,8 +54,8 @@ class EntryEditCustomField @JvmOverloads constructor(context: Context, init { - val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - inflater.inflate(R.layout.view_entry_new_field, this) + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? + inflater?.inflate(R.layout.view_entry_new_field, this) val deleteView = findViewById(R.id.entry_new_field_delete) deleteView.setOnClickListener { deleteViewFromParent() } From 9ef2ea016beeeb6b98eb046f1dc72c1e918c2b12 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 17:14:46 +0100 Subject: [PATCH 17/68] Suppress deprecation for Keyboard --- .../main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt | 2 ++ .../main/java/com/kunzisoft/keepass/view/MagikeyboardView.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt index fabe144d1..a6654d82c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt +++ b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikIME.kt @@ -17,6 +17,8 @@ * along with KeePassDX. If not, see . * */ +@file:Suppress("DEPRECATION") + package com.kunzisoft.keepass.magikeyboard import android.content.Context diff --git a/app/src/main/java/com/kunzisoft/keepass/view/MagikeyboardView.kt b/app/src/main/java/com/kunzisoft/keepass/view/MagikeyboardView.kt index 86f2c0690..d19fe8c15 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/MagikeyboardView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/MagikeyboardView.kt @@ -17,6 +17,8 @@ * along with KeePassDX. If not, see . * */ +@file:Suppress("DEPRECATION") + package com.kunzisoft.keepass.view import android.content.Context From 71a339a58faebdcd32374dae9da9b175d998f121 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 17:15:17 +0100 Subject: [PATCH 18/68] Suppress small warning --- .../java/com/kunzisoft/keepass/activities/PasswordActivity.kt | 2 +- app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt index 9aa21f31e..c19558ed0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt @@ -313,7 +313,7 @@ open class PasswordActivity : StylishActivity() { } private fun initUriFromIntent() { - mForceReadOnly = !UriUtil.isUriWritable(contentResolver, mDatabaseFileUri) + mForceReadOnly = !UriUtil.isUriWritable(mDatabaseFileUri) // Post init uri with KeyFile if needed if (mRememberKeyFile && (mDatabaseKeyFileUri == null || mDatabaseKeyFileUri.toString().isEmpty())) { 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 a6154ed9c..4872055d1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt @@ -50,7 +50,7 @@ object UriUtil { } } - fun isUriWritable(contentResolver: ContentResolver, fileUri: Uri?): Boolean { + fun isUriWritable(fileUri: Uri?): Boolean { if (fileUri == null) return false // TODO Uri writeable detection From 7539fee04bae9ea97444f8b749d016793a813d49 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 12 Mar 2020 19:15:03 +0100 Subject: [PATCH 19/68] Add BottomBar in EntryEdit --- app/src/main/AndroidManifest.xml | 3 +- .../keepass/activities/EntryEditActivity.kt | 63 +++++++++++----- .../keepass/view/EntryEditContentsView.kt | 21 ------ .../main/res/layout/activity_entry_edit.xml | 75 +++++++++++-------- .../res/layout/view_entry_edit_contents.xml | 30 +------- .../menu/{entry_otp.xml => entry_edit.xml} | 12 ++- app/src/main/res/values-ar/strings.xml | 4 +- app/src/main/res/values-cs/strings.xml | 4 +- app/src/main/res/values-da/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-el/strings.xml | 4 +- app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values-fr/strings.xml | 4 +- app/src/main/res/values-hi/strings.xml | 4 +- app/src/main/res/values-hr/strings.xml | 4 +- app/src/main/res/values-it/strings.xml | 4 +- app/src/main/res/values-ja/strings.xml | 4 +- app/src/main/res/values-ko/strings.xml | 4 +- app/src/main/res/values-nb/strings.xml | 4 +- app/src/main/res/values-nl/strings.xml | 4 +- app/src/main/res/values-pl/strings.xml | 4 +- app/src/main/res/values-pt-rBR/strings.xml | 4 +- app/src/main/res/values-pt-rPT/strings.xml | 4 +- app/src/main/res/values-ro/strings.xml | 4 +- app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 4 +- app/src/main/res/values-tr/strings.xml | 4 +- app/src/main/res/values-zh-rCN/strings.xml | 4 +- app/src/main/res/values-zh-rTW/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- 31 files changed, 149 insertions(+), 153 deletions(-) rename app/src/main/res/menu/{entry_otp.xml => entry_edit.xml} (70%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e682eb930..ffcfd805b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -127,8 +127,7 @@ android:configChanges="keyboardHidden" /> + android:configChanges="keyboardHidden" /> + when (item.itemId) { + R.id.menu_generate_password -> { + openPasswordGenerator() + true + } + R.id.menu_add_field -> { + addNewCustomField() + true + } + R.id.menu_add_otp -> { + // Retrieve the current otpElement if exists + // and open the dialog to set up the OTP + SetOTPDialogFragment.build(mEntry?.getOtpElement()?.otpModel) + .show(supportFragmentManager, "addOTPDialog") + true + } + else -> true + } + } + } // Save button saveView = findViewById(R.id.entry_edit_save) saveView?.setOnClickListener { saveEntry() } - entryEditContentsView?.allowCustomField(mNewEntry?.allowCustomFields() == true) { - addNewCustomField() - } - // Verify the education views entryEditActivityEducation = EntryEditActivityEducation(this) @@ -307,8 +341,6 @@ class EntryEditActivity : LockingActivity(), // Save database not needed here menu.findItem(R.id.menu_save_database)?.isVisible = false MenuUtil.contributionMenuInflater(inflater, menu) - if (mDatabase?.allowOTP == true) - inflater.inflate(R.menu.entry_otp, menu) entryEditActivityEducation?.let { Handler().post { performedNextEducation(it) } @@ -318,8 +350,8 @@ class EntryEditActivity : LockingActivity(), } private fun performedNextEducation(entryEditActivityEducation: EntryEditActivityEducation) { - val passwordView = entryEditContentsView?.generatePasswordView - val addNewFieldView = entryEditContentsView?.addNewFieldButton + val passwordView: View? = null// TODO entryEditContentsView?.generatePasswordView + val addNewFieldView: View? = null // TODO entryEditContentsView?.addNewFieldButton val generatePasswordEducationPerformed = passwordView != null && entryEditActivityEducation.checkAndPerformedGeneratePasswordEducation( @@ -356,13 +388,6 @@ class EntryEditActivity : LockingActivity(), MenuUtil.onContributionItemSelected(this) return true } - R.id.menu_add_otp -> { - // Retrieve the current otpElement if exists - // and open the dialog to set up the OTP - SetOTPDialogFragment.build(mEntry?.getOtpElement()?.otpModel) - .show(supportFragmentManager, "addOTPDialog") - return true - } android.R.id.home -> finish() } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt index e051aa204..f730af33f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt @@ -24,7 +24,6 @@ import android.graphics.Color import com.google.android.material.textfield.TextInputLayout import android.util.AttributeSet import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.EditText import android.widget.ImageView @@ -52,10 +51,8 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, private val entryPasswordLayoutView: TextInputLayout private val entryPasswordView: EditText private val entryConfirmationPasswordView: EditText - val generatePasswordView: View private val entryCommentView: EditText private val entryExtraFieldsContainer: ViewGroup - val addNewFieldButton: View private var iconColor: Int = 0 @@ -71,10 +68,8 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, entryPasswordLayoutView = findViewById(R.id.entry_edit_container_password) entryPasswordView = findViewById(R.id.entry_edit_password) entryConfirmationPasswordView = findViewById(R.id.entry_edit_confirmation_password) - generatePasswordView = findViewById(R.id.entry_edit_generate_button) entryCommentView = findViewById(R.id.entry_edit_notes) entryExtraFieldsContainer = findViewById(R.id.entry_edit_advanced_container) - addNewFieldButton = findViewById(R.id.entry_edit_add_new_field) // Retrieve the textColor to tint the icon val taIconColor = context.theme.obtainStyledAttributes(intArrayOf(android.R.attr.textColor)) @@ -141,10 +136,6 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, } } - fun setOnPasswordGeneratorClickListener(clickListener: () -> Unit) { - generatePasswordView.setOnClickListener { clickListener.invoke() } - } - var notes: String get() { return entryCommentView.text.toString() @@ -155,18 +146,6 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, entryCommentView.applyFontVisibility() } - fun allowCustomField(allow: Boolean, action: () -> Unit) { - addNewFieldButton.apply { - if (allow) { - visibility = View.VISIBLE - setOnClickListener { action.invoke() } - } else { - visibility = View.GONE - setOnClickListener(null) - } - } - } - val customFields: MutableList get() { val customFieldsArray = ArrayList() diff --git a/app/src/main/res/layout/activity_entry_edit.xml b/app/src/main/res/layout/activity_entry_edit.xml index 903128f94..1961707b2 100644 --- a/app/src/main/res/layout/activity_entry_edit.xml +++ b/app/src/main/res/layout/activity_entry_edit.xml @@ -17,34 +17,33 @@ You should have received a copy of the GNU General Public License along with KeePassDX. If not, see . --> - - + tools:targetApi="o" + android:layout_width="match_parent" + android:layout_height="match_parent" > - + + + android:layout_height="0dp" + app:layout_constraintTop_toBottomOf="@+id/toolbar" + app:layout_constraintBottom_toBottomOf="parent" > - - - @@ -62,18 +61,28 @@ app:layout_constraintEnd_toEndOf="parent"/> - - + - + - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_entry_edit_contents.xml b/app/src/main/res/layout/view_entry_edit_contents.xml index 98c4cbaf2..a1041ef6e 100644 --- a/app/src/main/res/layout/view_entry_edit_contents.xml +++ b/app/src/main/res/layout/view_entry_edit_contents.xml @@ -82,13 +82,11 @@ + android:layout_alignParentStart="true"> - - @@ -178,15 +161,6 @@ android:layout_height="wrap_content" android:orientation="vertical"> - - \ No newline at end of file diff --git a/app/src/main/res/menu/entry_otp.xml b/app/src/main/res/menu/entry_edit.xml similarity index 70% rename from app/src/main/res/menu/entry_otp.xml rename to app/src/main/res/menu/entry_edit.xml index 63d5cad75..b3ae0ef4b 100644 --- a/app/src/main/res/menu/entry_otp.xml +++ b/app/src/main/res/menu/entry_edit.xml @@ -19,9 +19,19 @@ --> + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index e7226ebc9..4895a9afa 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -259,7 +259,7 @@ إضافة إدخال إضافة مجموعة معلومات الملف - مولد كلمة السر + مولد كلمة السر الخلفية دورات التحويل توفر الدورات الاضافية ضد هجوم توليد التركيبات ،لكنها تبطئ التحميل والحفظ. @@ -273,7 +273,7 @@ ايقونة المدخل حفظ المدخل طول كلمة السر - أضف حقل + أضف حقل أزل حقل لا يمكنك نقل مدخل هنا. لا يمكنك نسخ مدخل هنا. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2a1f39850..6331cd530 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -362,9 +362,9 @@ Přepni ukázání hesla Ikona záznamu Uložit záznam - Generátor hesel + Generátor hesel Délka hesla - Přidej pole + Přidej pole Odebrat pole UUID Sem záznam přesunout nelze. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 910e17271..a00c210f9 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -361,9 +361,9 @@ Gentag for at skifte synlighed for adgangskode Indtastningsikon Gem indtastning - Adgangskodegenerator + Adgangskodegenerator Længde på adgangskode - Tilføj felt + Tilføj felt Fjern felt UUID Vis antal poster diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ba6ede771..7dbc859f3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -358,9 +358,9 @@ Datei-Informationen Symbol für den Eintrag Eintrag speichern - Passwort-Generator + Passwort-Generator Passwortlänge - Feld hinzufügen + Feld hinzufügen Feld entfernen UUID Anzahl der Einträge anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 632e80ae6..86e500480 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -341,9 +341,9 @@ Επανάληψη της ορατότητας του κωδικού πρόσβασης Εικονίδιο καταχώρησης Αποθήκευση καταχώρησης - Γεννήτρια κωδικού πρόσβασης + Γεννήτρια κωδικού πρόσβασης Μήκος κωδικού πρόσβασης - Προσθήκη πεδίου + Προσθήκη πεδίου Αφαίρεση πεδίου UUID Δεν μπορείτε να μετακινήσετε μια καταχώρηση εδώ. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8a0fa9206..99c01ebe8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -354,9 +354,9 @@ Casilla de contraseña Casilla de archivo de clave Icono de entrada - Generador de contraseñas + Generador de contraseñas Longitud de contraseña - Añadir campo + Añadir campo Quitar campo UUID No puede desplazar entradas aquí. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 56cac2f73..ebd0d4842 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -367,9 +367,9 @@ Ajouter un groupe Icône de l’entrée Enregistrer l’entrée - Générateur de mots de passe + Générateur de mots de passe Longueur de mot de passe - Ajouter un champ + Ajouter un champ Supprimer un champ UUID Afficher le nombre d’entrées diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 0402eae7d..33515c4f3 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -69,9 +69,9 @@ पासवर्ड दृश्यता टॉगल दोहराएं प्रवेश आइकन प्रविष्टि सहेजें - पासवर्ड जनरेटर + पासवर्ड जनरेटर पासवर्ड की लंबाई - फ़ील्ड जोड़ें + फ़ील्ड जोड़ें फ़ील्ड निकालें UUID "डेटाबेस फाइल को बनाने खोलने और सेव करने के लिए आपके फोन में फाइल मैनेजर ऐप होना चाहिए जोकि दिए गए एक्शन को सपोर्ट कर सके ACTION_CREATE_DOCUMENT और ACTION_OPEN_DOCUMENT" diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 7e88d3807..660f45956 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -31,9 +31,9 @@ Informacije o datoteci Ikona unosa Spremi unos - Generator lozinke + Generator lozinke Duljina lozinke - Dodaj polje + Dodaj polje Ukloni polje Ažuriraj Ukloni diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 09bccda78..a2ea82d12 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -365,9 +365,9 @@ Casella di controllo Keyfile Ripeti attivare / disattivare la visibilità della password Icona - Generatore di password + Generatore di password Lunghezza della password - Aggiungi un campo + Aggiungi un campo Rimuovi un campo Non è possibile spostare una voce qui. Non è possibile copiare una voce qui. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f9868f637..bf8b2e117 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -194,9 +194,9 @@ ファイル情報 エントリーのアイコン エントリーの保存 - パスワード生成 + パスワード生成 パスワードの長さ - フィールドの追加 + フィールドの追加 フィールドの削除 エントリーを移動できませんでした。 エントリーをコピーできませんでした。 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index be97256e0..13e7c2b78 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -163,9 +163,9 @@ 비밀번호 체크박스 내용_설명_키파일_체크박스 토글 비밀번호 가시성 반복 - 비밀번호 생성 + 비밀번호 생성 비밀번호 길이 - 필드 추가 + 필드 추가 필드 제거 항목을 여기로 옮길 수 없습니다. 항목을 여기로 복사할 수 없습니다. diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index b4e0f3f63..793cc1d55 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -341,9 +341,9 @@ Legg til oppføring Legg til gruppe Filinfo - Passordgenerator + Passordgenerator Passordslengde - Legg til felt + Legg til felt Fjern felt UUID Du kan ikke flytte en oppføring hit. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 831898ca1..a7c1abbc6 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -368,9 +368,9 @@ Weergave van het wachtwoord wisselen Item-icoon Item opslaan - Wachtwoordgenerator + Wachtwoordgenerator Wachtwoordlengte - Veld toevoegen + Veld toevoegen Veld verwijderen UUID Je kan hier geen item plaatsen. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 15b099f65..64ee4d207 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -355,9 +355,9 @@ Informacje o pliku Ikona wpisu Zapisz wpis - Generator haseł + Generator haseł Długość hasła - Dodaj pole + Dodaj pole Usuń pole Nie możesz tutaj skopiować wpisu. Pokaż liczbę wpisów diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d573ce0d4..019e3a78e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -359,9 +359,9 @@ Adicionar grupo Informações do arquivo Ícone da entrada - Gerador de senhas + Gerador de senhas Comprimento da senha - Adicionar campo + Adicionar campo Remover campo UUID Você não pode mover uma entrada para cá. diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index acc2fa92d..6d49ad489 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -358,9 +358,9 @@ Repetir alternar a visibilidade da palavra-passe Ícone da entrada Gravação de entrada - Gerador de palavras-passe + Gerador de palavras-passe Comprimento da palavra-passe - Adicionar campo + Adicionar campo Remover campo UUID Você não pode mover uma entrada para cá. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 57065e556..036baaa14 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -37,9 +37,9 @@ Repetați pentru a comuta vizibilitatea parolei Pictograma de intrare Salvați intrarea - Generator de parole + Generator de parole Lungimea parolei - Adăugați câmp + Adăugați câmp Elimina câmp Actualizați Elimina diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3f3c75873..c20e3477b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -361,9 +361,9 @@ Повтор переключения видимости пароля Значок записи Сохранение записи - Генератор паролей + Генератор паролей Длина пароля - Добавить поле + Добавить поле Удалить поле UUID Вы не можете переместить запись сюда. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index deb8bbc75..4aa768e64 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -157,7 +157,7 @@ Otvoriť súbor Informácie o súbore Uložiť záznam - Generátor hesla + Generátor hesla Dĺžka hesla Pozadie Bezpečnosť diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 2ec6d884a..770397939 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -173,9 +173,9 @@ Repetera växla lösenordssynlighet Post-ikon Spara post - Lösenordsgenerator + Lösenordsgenerator Lösenords längd - Lägg till fält + Lägg till fält Ta bort fält Bakgrund Uppdatera diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d8a828707..d5bf99d3f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -336,9 +336,9 @@ Parola onay kutusu Anahtar dosyası onay kutusu Giriş simgesi - Parola üreteci + Parola üreteci Parola uzunluğu - Alan ekle + Alan ekle Alanı kaldır UUID Buraya bir girişi taşıyamazsınız. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4ac0a1856..0c5132358 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -364,9 +364,9 @@ 重复切换密码可见性 条目图标 保存条目 - 密码生成器 + 密码生成器 密码长度 - 添加字段 + 添加字段 删除字段 UUID 无法移动条目到此处。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f93f3efc9..7f1b24abb 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -166,7 +166,7 @@ 金鑰推算函數 編輯入口 開啟檔案 - 密碼產生器 + 密碼產生器 UUID 背景 更新 @@ -187,7 +187,7 @@ 條目圖示 條目保存 密碼長度 - 添加欄位 + 添加欄位 刪除欄位 主密鑰 主密鑰設定 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 165fd9910..b276fd301 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -58,9 +58,9 @@ Repeat toggle password visibility Entry icon Save entry - Password generator + Password generator Password length - Add field + Add field Remove field Update Remove From ff9e179593e98e5e33e58ea3166dd76939074d5f Mon Sep 17 00:00:00 2001 From: Aurel F Date: Tue, 10 Mar 2020 21:09:42 +0000 Subject: [PATCH 20/68] Translated using Weblate (Romanian) Currently translated at 100.0% (426 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ro/ --- app/src/main/res/values-ro/strings.xml | 261 +++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index eb3103ad8..5bc9e6592 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -175,4 +175,265 @@ Ascundeți parolele Mascați parolele (***) în mod implicit Despre + Instalați un browser web pentru a deschide această adresă URL. + Deschide baza de date existentă + Creați o bază de date nouă + Baze de date recente + Crearea noii baze de date … + Lucrând … + Protecție + Protejat la scriere + În funcție de managerul de fișiere, este posibil ca KeePassDX să nu poată scrie în stocare. + Baza de date conține UUID-uri duplicate. + Prin validarea acestui dialog, KeePassDX va rezolva problema (prin generarea de noi UUID-uri pentru duplicate) și va continua. + Mod de selectare + Rădăcină + Algoritmul bazei de date de criptare utilizat pentru toate datele. + Pentru a genera cheia pentru algoritmul de criptare, cheia principală este transformată folosind o funcție de derivare a cheilor sărate aleatoriu. + Rundele de transformare + Rundele suplimentare de criptare oferă o protecție mai mare împotriva atacurilor de forță brută, dar pot încetini cu adevărat încărcarea și economisirea. + Utilizarea memoriei + Cantitatea de memorie (în octeți) care trebuie utilizată de funcția de derivare a cheilor. + Paralelism + Gradul de paralelism (adică numărul de fire) utilizat de funcția de derivare a cheilor. + Salvarea bazei de date … + Executarea comenzii … + Nu omori aplicația … + Spatiu + Cauta + Sorteaza + Prima cea mai mică ↓ + Grupuri înainte + Reciclați coșul din partea de jos + Ordine naturală + Titlu + Nume de utilizator + Creare + Modificare + Acces + Special + Căutare + Rezultatele căutării + Subliniere + Versiunea bazei de date neacceptată. + Cu majuscule + Avertizare + Evitați caracterele parole în afara formatului de codare a textului în fișierul bazei de date (caracterele nerecunoscute sunt convertite în aceeași literă). + Montați cardul de memorie pentru a crea sau încărca o bază de date. + Chiar nu doriți nicio protecție de deblocare a parolei\? + Ești sigur că nu vrei să folosești nicio cheie de criptare\? + Sigur doriți să ștergeți definitiv nodurile selectate\? + Versiunea %1$s + Construiți %1$s + Indicatorul biometric este acceptat, dar nu este configurat. + Magazinul de chei nu este inițializat corect. + Deschideți promptul biometric pentru deblocarea bazei de date + Deschideți promptul biometric pentru a stoca datele de acreditare + Salvați recunoașterea biometrică + Avertisment: trebuie să vă amintiți parola de master dacă utilizați recunoașterea biometrică. + Baza de date deschisă cu recunoaștere biometrică + Extrageți datele de bază cu date biometrice + Parola criptată stocată + Nu pot citi cheia biometrică. Vă rugăm să îl ștergeți și să repetați procedura de recunoaștere biometrică. + Nu a putut recunoaște biometric + Eroare biometrică: %1$s + Această bază de date nu are încă credențiale stocate. + De acum nu există date creditate stocate. + Istoric + Aparenta + Biometric + General + Autocompletare + Completarea automată a formularului KeePassDX + Conectați-vă cu KeePassDX + Permiteți completarea automată pentru a completa rapid formularele din alte aplicații + Setați serviciul automat de completare automată + Mărimea generată a parolei + Setează dimensiunea implicită a parolelor generate + Caractere parolă + Setați caractere permise generator de parole + Baza de date a fost deschisă + Clipboard + Copiați câmpurile de intrare cu ajutorul clipboard-ului dispozitivului + Clipboard notificări + Activați notificările pentru clipboard pentru a copia câmpurile când vizionați o intrare + Dacă ștergerea automată a clipboard-ului nu reușește, ștergeți manual istoricul acestuia. + Blocheaza + Blocare ecran + Încărcați baza de date când ecranul este deconectat + Apăsați „Înapoi” pentru a bloca ecranul + Blocați baza de date atunci când utilizatorul face clic pe butonul înapoi de pe ecranul rădăcină + Notificare persistentă + Adăugați o notificare atunci când baza de date este deschisă + Deblocare avansată + Utilizați deblocarea avansată pentru a deschide o bază de date mai ușor + Deblocare biometrică + Vă permite să scanați biometric pentru a deschide baza de date + Indicator biometric deschis automat + Deschideți automat biometric prompt atunci când o cheie biometrică este definită pentru o bază de date + Ștergeți cheile de criptare + Ștergeți toate cheile de criptare legate de recunoașterea biometrică + Sigur doriți să ștergeți toate cheile legate de recunoașterea biometrică\? + Nu s-a putut porni această caracteristică. + Versiunea dvs. de Android %1$s nu corespunde versiunii minime %2$s necesare. + Nu s-a putut găsi hardware-ul corespunzător. + Nume fișier + Cale + Atribuie o cheie master + Calea fișierului + Vizualizați calea completă a fișierului + Compresia datelor + Compresia datelor reduce dimensiunea bazei de date. + Utilizarea cosului de gunoi + Mută grupuri și intrări în grupul „Coș de reciclare” înainte de ștergere + Grupul cosului de reciclare + Număr maxim + Limitați numărul de articole istorice pe intrare + Dimensiune maximă + Limitați dimensiunea istoricului (în octeți) pe intrare + Recomandă reînnoirea + Recomandă schimbarea cheii master (zile) + Forteaza reinoirea + Solicitați schimbarea cheii master (zile) + Forteaza reînnoirea data viitoare + Solicitați schimbarea cheii master data viitoare (o dată) + Font camp + Schimbați fontul folosit în câmpuri pentru o mai bună vizibilitate a caracterelor + Clipboard de incredere + Permiteți copierea parolei de intrare și câmpurile protejate în clipboard + Avertisment: Clipboard-ul este distribuit de toate aplicațiile. Dacă datele sensibile sunt copiate, alt software îl poate recupera. + Activeaza + Dezactiveaza + Curata la închidere + Blocați baza de date la închiderea notificării + Numele bazei de date + Descrierea bazei de date + Nume utilizator implicit + Culoare personalizată a bazei de date + Versiunea bazei de date + Text + Aplicație + Alta + Compresie + Nimic + gzip + Cos de reciclare + Tastatura + TastaturaMagica + Activați o tastatură personalizată care conține parolele și toate câmpurile de identitate + Setări tastatură dispozitiv + TastaturaMagica + TastaturaMagica (KeePassDX) + Setări TastaturaMagica + Intrare + Selectia de intrare + Afișați câmpurile de intrare în TastaturaMagica când vizualizați o intrare + Informații de notificare + Afișați o notificare atunci când este disponibilă o intrare + Curata la închidere + Închideți baza de date la închiderea notificării + Sesiune expirata + Sesiune expirata pentru a șterge intrarea tastaturii + Intrare + %1$s disponibil pe TastaturaMagica + %1$s + Aparenta + Tema tastaturii + Chei + Acțiune automată cu cheie + Acțiunea tastei Go se efectuează automat după apăsarea unei taste Field + Apăsări de taste vibratoare + Apăsări de taste cheie + Nu permiteți nicio cheie principală + Activați butonul „Deschide” dacă nu sunt selectate acreditările + Ștergeți parola + Șterge parola introdusă după o încercare de conectare + Protejat la scriere + Deschideți baza de date numai în citire în mod implicit + Baza de date Autosave + Salvați automat baza de date după o acțiune importantă (numai în modul „Modificabil”) + Ecrane educative + Evidențiați elementele pentru a afla cum funcționează aplicația + Resetați ecranele educaționale + Afișează din nou toate elementele educaționale + Ecranele educaționale sunt resetate + Creați fișierul dvs. de bază de date + Creați primul dvs. fișier de gestionare a parolelor. + Deschideți o bază de date existentă + Deschideți fișierul bazei de date anterioare din browserul de fișiere pentru a-l continua. + Adăugați elemente în baza de date + Înscrierile vă ajută să vă gestionați identitățile digitale. +\n +\nGrupuri (~ foldere) organizează intrări în baza de date. + Căutați prin intrări + Introduceți titlul, numele de utilizator sau conținutul altor câmpuri pentru a prelua parolele. + Deblocarea bazei de date prin biometric + Conectați parola la biometrica scanată pentru a debloca rapid baza de date. + Modificați intrarea + Modificați-vă înregistrarea cu câmpuri personalizate. Datele despre pool pot fi referențiate între diferite câmpuri de intrare. + Creați o parolă puternică pentru intrarea dvs. + Generați o parolă puternică pentru a vă asocia cu intrarea dvs., definiți-o ușor în funcție de criteriile formularului și nu uitați parola securizată. + Adăugați câmpuri personalizate + Înregistrați un câmp suplimentar, adăugați o valoare și protejați-l opțional. + Deblocați baza de date + Introduceți parola și / sau fișierul cheie pentru a debloca baza de date. +\n +\nBackup-ul fișierului dvs. de bază de date într-un loc sigur după fiecare modificare. + Protejați-vă baza de date + Schimbați modul de deschidere pentru sesiune. +\n +\n„Protecție la scriere” previne modificările neintenționate ale bazei de date. +\n„Modificabil” vă permite să adăugați, să ștergeți sau să modificați toate elementele. + Copiați un câmp + Câmpurile copiate pot fi lipite oriunde. +\n +\nFolosiți metoda de completare a formularului pe care o preferați. + Blocați baza de date + Blocați rapid baza de date, puteți configura aplicația pentru a o bloca după un timp și când ecranul se va opri. + Sortarea articolelor + Alegeți cum sunt sortate intrările și grupurile. + Participa + Ajută la creșterea stabilității, securității și la adăugarea mai multor funcții. + Spre deosebire de multe aplicații de gestionare a parolelor, acesta este gratuit de anunțuri , software liber copilefted și nu colectează date personale pe serverele sale, indiferent de versiunea pe care o utilizați. + Cumpărând versiunea pro, veți avea acces la acest stil vizual și vă va ajuta în special implementarea proiectelor comunitare. + Acest stil vizual este disponibil datorită generozității tale. + Pentru a ne păstra libertatea și pentru a fi mereu activi, ne bazăm pe contribuția dvs. . + Această caracteristică este <strong> în curs de dezvoltare </strong> și necesită ca contribuția dvs <strong> să fie disponibilă în curând. + Cumpărând versiunea pro , + Prin contribuție , + încurajezi dezvoltatorii să creeze funcții noi și să remedieze erori în conformitate cu observațiile tale. + Mulțumesc mult pentru contribuție. + Muncim din greu pentru a lansa rapid această caracteristică. + Nu uitați să mențineți aplicația la zi instalând noi versiuni. + Descărcați + Contribuie + Descărcați %1$s + Inițializare … + In progress: %1$d% + Finalizare … + Complet! Atingeți pentru a deschide fișierul. + Rijndael (AES) + Twofish + ChaCha20 + AES + Argon2 + Tema aplicației + Tema folosită în aplicație + Pachet de pictograme + Pachet de pictograme folosit în aplicație + Ascundeți intrările expirate + Înscrierile expirate vor fi ascunse + Nu căutați prin intrări de rezervă + Omite grupurile „Backup” și „Recycle bin” din rezultatele căutării + Căutare rapidă + Solicitați o căutare atunci când deschideți o bază de date + Salvați locația bazelor de date + Amintiți-vă locația bazelor de date + Salvați locația fișierelor cheie + Amintiți-vă locația bazelor de date cheie de date + Afișați fișiere recente + Afișați locațiile bazelor de date recente + Ascundeți linkurile de bază de date stricate + Ascundeți legăturile rupte în lista bazelor de date recente + Acordă acces la scriere fișier pentru a salva modificările bazei de date \ No newline at end of file From 3df07f7f47c58859c946d3279b45639b490943bd Mon Sep 17 00:00:00 2001 From: zeritti Date: Wed, 11 Mar 2020 18:21:39 +0000 Subject: [PATCH 21/68] Translated using Weblate (Czech) Currently translated at 99.5% (424 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/cs/ --- app/src/main/res/values-cs/strings.xml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 06c2b69c9..87289c542 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -284,7 +284,7 @@ Vytvořte k záznamu silné heslo. Vygenerujte silné heslo pro svou položku, definujte je podle kritérií formuláře, a nezapomeňte na bezpečné heslo. Přidat vlastní kolonky - Chcete-li zaregistrovat základní kolonku, která není ve výchozím stavu k dispozici, jednoduše vyplňte novou kolonku. Novou kolonku můžete také nastavit jako chráněnou. + Registrovat další kolonku, zadat hodnotu a volitelně ji ochránit. Odemknout databázi Ochraňte svou databázi před zápisem Změnit režim otevírání pro dané sezení. @@ -302,7 +302,7 @@ Vyberte řazení položek a skupin. Zapojit se Zapojte se a pomozte zvýšit stabilitu, bezpečnost a přidávání dalších funkcí. - Na rozdíl od mnoha aplikací pro správu hesel, tato je <strong>bez reklam</strong>, je <strong>svobodným softwarem</strong> a <strong> pod copyleft licencí</strong>. <strong>Nesbírá žádné osobní údaje</strong> v jakékoli formě, bez ohledu na to, jakou verzi používáte. + Na rozdíl od mnoha aplikací pro správu hesel, tato je bez reklam", je " svobodný software pod copyleft licencí a nesbírá žádné osobní údaje na svých serverech bez ohledu na to, jakou verzi používáte. Zakoupením varianty „pro“ získáte přístup k tomuto <strong>vizuálnímu stylu</strong> a hlavně pomůžete <strong>uskutečnění komunitních projektů.</strong> Tento <strong>vizuální styl</strong> je k dispozici díky vaší štědrosti. Pro zajištění svobody nás všech a pokračování aktivity, počítáme s vaším <strong>přispěním.</strong> @@ -450,9 +450,23 @@ Automatická akce klíče Jít po stisknutí klíče Pole Stáhnout %1$s Zahajuji… - Probíhá: %1$d% + Probíhá: %1$d% Dokončuji… Ukončeno! Klepnout pro otevření souboru. Skrýt propadlé záznamy Propadlé záznamy budou skryty + Kontakt + Příspěvky + Feedback + Snadné hledání + Při otevření databáze žádat hledání + Uložit umístění databází + Pamatovat si umístění databází + Uložit umístění souborů s klíči + Pamatovat si umístění souborů s klíči + Ukázat nedávné soubory + Ukázat umístění nedávných databází + Skrýt špatné odkazy na databáze + Skrýt špatné odkazy v seznamu nedávných databází + Udělit právo zápisu pro uložení změn v databázi \ No newline at end of file From e49858439f2c07641fb486c0c9730b027aa147f3 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Wed, 11 Mar 2020 16:19:41 +0000 Subject: [PATCH 22/68] Translated using Weblate (Polish) Currently translated at 99.5% (424 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/ --- app/src/main/res/values-pl/strings.xml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6022faea3..4fdc71b06 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -284,7 +284,7 @@ Utwórz silne hasło do swojego wpisu. Wygeneruj silne hasło, które będzie kojarzyć się z Twoim wpisem, łatwo zdefiniuj je zgodnie z kryteriami formularza i nie zapomnij o bezpiecznym haśle. Dodaj niestandardowe pola - Zarejestruj podstawowe pole niedostarczone, wypełniając nowe pole, które możesz również chronić. + Zarejestruj dodatkowe pole, dodaj wartość i opcjonalnie chroń je. Odblokuj swoją bazę danych Zapisz ochronę swojej bazy danych Zmień tryb otwierania sesji. @@ -449,9 +449,22 @@ Działanie klawisza Go wykonywane jest automatycznie po naciśnięciu klawisza Field Pobierz %1$s Inicjowanie… - W trakcie realizacji: %1$d% + W trakcie realizacji: %1$d% Kończę… Kompletny! Stuknij, aby otworzyć plik. Ukryj wygasłe wpisy Wygasłe wpisy zostaną ukryte + Kontakt + Aby zachować naszą wolność, sprawdzać błędy, dodać funkcje i by być zawsze aktywnym, liczymy na twój wkład. + Szybkie wyszukiwanie + Wyszukiwanie po otwarciu bazy danych + Zapisz lokalizację baz danych + Zapamiętaj lokalizację baz danych + Zapisz lokalizację plików kluczy + Zapamiętaj lokalizację plików kluczy baz danych + Pokaż najnowsze pliki + Pokaż lokalizacje najnowszych baz danych + Ukryj uszkodzone łącza do bazy danych + Ukryj uszkodzone łącza na liście najnowszych baz danych + Przyznaj dostęp do zapisu pliku, aby zapisać zmiany w bazie danych \ No newline at end of file From 0ff129c5ca7a0317442e1c04a24ca9626eae12ec Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 13 Mar 2020 11:06:56 +0100 Subject: [PATCH 23/68] Edit Entry with Card View --- .../background_stroke_element.xml | 12 - .../drawable/background_stroke_element.xml | 9 - .../res/layout/view_entry_edit_contents.xml | 270 +++++++++--------- .../main/res/layout/view_entry_new_field.xml | 121 ++++---- 4 files changed, 204 insertions(+), 208 deletions(-) delete mode 100644 app/src/main/res/drawable-v21/background_stroke_element.xml delete mode 100644 app/src/main/res/drawable/background_stroke_element.xml diff --git a/app/src/main/res/drawable-v21/background_stroke_element.xml b/app/src/main/res/drawable-v21/background_stroke_element.xml deleted file mode 100644 index 79600ba06..000000000 --- a/app/src/main/res/drawable-v21/background_stroke_element.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/background_stroke_element.xml b/app/src/main/res/drawable/background_stroke_element.xml deleted file mode 100644 index a2fa9cecb..000000000 --- a/app/src/main/res/drawable/background_stroke_element.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_entry_edit_contents.xml b/app/src/main/res/layout/view_entry_edit_contents.xml index a1041ef6e..bef602125 100644 --- a/app/src/main/res/layout/view_entry_edit_contents.xml +++ b/app/src/main/res/layout/view_entry_edit_contents.xml @@ -25,142 +25,150 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_margin="@dimen/default_margin"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_entry_new_field.xml b/app/src/main/res/layout/view_entry_new_field.xml index 6fb9b346f..e5c5113c9 100644 --- a/app/src/main/res/layout/view_entry_new_field.xml +++ b/app/src/main/res/layout/view_entry_new_field.xml @@ -17,76 +17,85 @@ You should have received a copy of the GNU General Public License along with KeePassDX. If not, see . --> - + android:layout_marginEnd="@dimen/default_margin" + android:layout_marginLeft="@dimen/default_margin" + android:layout_marginRight="@dimen/default_margin" + android:layout_marginBottom="@dimen/default_margin"> - + android:importantForAutofill="noExcludeDescendants" + tools:targetApi="o"> - - + android:paddingTop="12dp" + android:paddingLeft="@dimen/default_margin" + android:paddingStart="@dimen/default_margin" + android:paddingRight="@dimen/default_margin" + android:paddingEnd="@dimen/default_margin"> - + + - + - + - - + android:paddingLeft="@dimen/default_margin" + android:paddingStart="@dimen/default_margin" + android:paddingRight="@dimen/default_margin" + android:paddingEnd="@dimen/default_margin" + android:layout_below="@+id/title_container"> - + + + + + + \ No newline at end of file From 8e83615a2247999bfe91a1e621bf3f42d07825b4 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 13 Mar 2020 17:06:09 +0100 Subject: [PATCH 24/68] Add Edit Toolbar menu on top --- app/src/main/AndroidManifest.xml | 3 +- .../keepass/activities/EntryEditActivity.kt | 10 +-- .../drawable/ic_attach_file_white_24dp.xml | 9 +++ .../main/res/layout/activity_entry_edit.xml | 64 ++++++++++++------- app/src/main/res/menu/entry_edit.xml | 13 +++- app/src/main/res/values/strings.xml | 1 + 6 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 app/src/main/res/drawable/ic_attach_file_white_24dp.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ffcfd805b..e682eb930 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -127,7 +127,8 @@ android:configChanges="keyboardHidden" /> + android:configChanges="keyboardHidden" + android:windowSoftInputMode="adjustResize" /> + + diff --git a/app/src/main/res/layout/activity_entry_edit.xml b/app/src/main/res/layout/activity_entry_edit.xml index 1961707b2..4466d5ba3 100644 --- a/app/src/main/res/layout/activity_entry_edit.xml +++ b/app/src/main/res/layout/activity_entry_edit.xml @@ -21,14 +21,15 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - android:importantForAutofill="noExcludeDescendants" - tools:targetApi="o" android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_height="match_parent" + android:importantForAutofill="noExcludeDescendants" + tools:targetApi="o" > + app:layout_constraintBottom_toBottomOf="parent"> + + + + + + + + + + + + android:scrollbars="none" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintWidth_percent="@dimen/content_percent" /> - - - \ No newline at end of file diff --git a/app/src/main/res/menu/entry_edit.xml b/app/src/main/res/menu/entry_edit.xml index b3ae0ef4b..f499cd314 100644 --- a/app/src/main/res/menu/entry_edit.xml +++ b/app/src/main/res/menu/entry_edit.xml @@ -23,15 +23,22 @@ android:icon="@drawable/ic_key_white_24dp" android:title="@string/entry_password_generator" android:orderInCategory="91" - app:showAsAction="ifRoom" /> + app:showAsAction="always" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b276fd301..320125a72 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -61,6 +61,7 @@ Password generator Password length Add field + Add attachment Remove field Update Remove From ee2d663fceb383a9c0b7d801922dd361cc6d0513 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 13 Mar 2020 21:33:38 +0100 Subject: [PATCH 25/68] New icons for entry edit tools --- .../ic_generate_password_white_24dp.xml | 21 ++++ .../res/drawable/ic_new_field_white_24dp.xml | 19 ++++ app/src/main/res/menu/entry_edit.xml | 4 +- art/ic_generate_password.svg | 101 ++++++++++++++++++ art/ic_new_field.svg | 96 +++++++++++++++++ 5 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/ic_generate_password_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_new_field_white_24dp.xml create mode 100644 art/ic_generate_password.svg create mode 100644 art/ic_new_field.svg diff --git a/app/src/main/res/drawable/ic_generate_password_white_24dp.xml b/app/src/main/res/drawable/ic_generate_password_white_24dp.xml new file mode 100644 index 000000000..2894e0409 --- /dev/null +++ b/app/src/main/res/drawable/ic_generate_password_white_24dp.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_new_field_white_24dp.xml b/app/src/main/res/drawable/ic_new_field_white_24dp.xml new file mode 100644 index 000000000..fbbecc509 --- /dev/null +++ b/app/src/main/res/drawable/ic_new_field_white_24dp.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/entry_edit.xml b/app/src/main/res/menu/entry_edit.xml index f499cd314..68e046c90 100644 --- a/app/src/main/res/menu/entry_edit.xml +++ b/app/src/main/res/menu/entry_edit.xml @@ -20,12 +20,12 @@ diff --git a/art/ic_generate_password.svg b/art/ic_generate_password.svg new file mode 100644 index 000000000..9d9cc7eda --- /dev/null +++ b/art/ic_generate_password.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/art/ic_new_field.svg b/art/ic_new_field.svg new file mode 100644 index 000000000..a4ec02592 --- /dev/null +++ b/art/ic_new_field.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + From 9eb42636ec094b83c8f5313d2fa947c892309b9d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 13 Mar 2020 21:58:32 +0100 Subject: [PATCH 26/68] Change read icons --- .../res/drawable/ic_read_only_white_24dp.xml | 36 +++++++++------- .../res/drawable/ic_read_write_white_24dp.xml | 37 ++++++++--------- art/ic_read_only.svg | 41 +++++++++++-------- art/ic_read_write.svg | 36 +++++++++------- 4 files changed, 85 insertions(+), 65 deletions(-) diff --git a/app/src/main/res/drawable/ic_read_only_white_24dp.xml b/app/src/main/res/drawable/ic_read_only_white_24dp.xml index 7f6522b98..7e2417c68 100644 --- a/app/src/main/res/drawable/ic_read_only_white_24dp.xml +++ b/app/src/main/res/drawable/ic_read_only_white_24dp.xml @@ -1,19 +1,27 @@ - - - - + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_read_write_white_24dp.xml b/app/src/main/res/drawable/ic_read_write_white_24dp.xml index db54875cd..b243dd909 100644 --- a/app/src/main/res/drawable/ic_read_write_white_24dp.xml +++ b/app/src/main/res/drawable/ic_read_write_white_24dp.xml @@ -1,25 +1,22 @@ - - - - - - + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + \ No newline at end of file diff --git a/art/ic_read_only.svg b/art/ic_read_only.svg index 25fb8870f..7fe52b547 100644 --- a/art/ic_read_only.svg +++ b/art/ic_read_only.svg @@ -13,7 +13,7 @@ height="24" id="svg4830" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" inkscape:export-filename="/home/joker/Project/Scratcheck/TestExport.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" @@ -27,34 +27,38 @@ borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="8" - inkscape:cx="-37.548191" - inkscape:cy="-10.060761" + inkscape:zoom="11.313708" + inkscape:cx="22.88688" + inkscape:cy="2.3617771" inkscape:current-layer="g4770" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:window-width="1920" - inkscape:window-height="1023" - inkscape:window-x="0" - inkscape:window-y="27" + inkscape:window-height="1016" + inkscape:window-x="1920" + inkscape:window-y="74" inkscape:window-maximized="1"> + id="guide2987" + inkscape:locked="false" /> + id="guide2989" + inkscape:locked="false" /> + id="guide2991" + inkscape:locked="false" /> + id="guide2993" + inkscape:locked="false" /> @@ -67,7 +71,7 @@ image/svg+xml - + @@ -83,10 +87,15 @@ id="Layer_1" transform="matrix(-0.00397893,0,0,0.00397893,125.58386,23.674135)" /> + diff --git a/art/ic_read_write.svg b/art/ic_read_write.svg index 627c1fc6b..b73efebca 100644 --- a/art/ic_read_write.svg +++ b/art/ic_read_write.svg @@ -13,7 +13,7 @@ height="24" id="svg4830" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.4 (5da689c313, 2019-01-14)" inkscape:export-filename="/home/joker/Project/Scratcheck/TestExport.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" @@ -27,34 +27,38 @@ borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="11.313708" - inkscape:cx="-12.80892" - inkscape:cy="-4.0293631" + inkscape:zoom="22.627416" + inkscape:cx="8.4587979" + inkscape:cy="13.002913" inkscape:current-layer="g4770" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:window-width="1920" - inkscape:window-height="1023" - inkscape:window-x="0" - inkscape:window-y="27" + inkscape:window-height="1016" + inkscape:window-x="1920" + inkscape:window-y="74" inkscape:window-maximized="1"> + id="guide2987" + inkscape:locked="false" /> + id="guide2989" + inkscape:locked="false" /> + id="guide2991" + inkscape:locked="false" /> + id="guide2993" + inkscape:locked="false" /> @@ -67,7 +71,7 @@ image/svg+xml - + @@ -83,10 +87,12 @@ id="Layer_1" transform="matrix(-0.00397893,0,0,0.00397893,125.58386,23.674135)" /> + id="path4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccc" /> From 43b3602a5235f933dc15b7dfb9aafb632bdc8e7d Mon Sep 17 00:00:00 2001 From: solokot Date: Fri, 13 Mar 2020 10:07:10 +0000 Subject: [PATCH 27/68] Translated using Weblate (Russian) Currently translated at 100.0% (426 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 59af53db1..c69873810 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -43,8 +43,8 @@ Расшифровка базы… База по умолчанию Цифры - KeePassDX © %1$d Kunzisoft с <strong>открытым исходным кодом<strong> и <strong>без рекламы<strong>. -\nРаспространяется под лицензией <strong>GPLv3<strong> без каких-либо гарантий. + KeePassDX © %1$d Kunzisoft с открытым исходным кодом и без рекламы. +\nРаспространяется под лицензией GPLv3 без каких-либо гарантий. Открыть существующую базу Доступ Отмена @@ -302,7 +302,7 @@ Выберите критерий сортировки записей и групп. Участвуйте Примите участие в проекте для повышения стабильности, безопасности и добавления новых возможностей. - В отличие от многих приложений управления паролями, это <strong>без рекламы<strong> и <strong>свободно от лицензирования<strong>. Оно не собирает ваши личные данные на своих серверах независимо от того, какую версию вы используете. + В отличие от многих приложений управления паролями, это без рекламы и свободно от лицензирования. Оно не собирает ваши личные данные на своих серверах независимо от того, какую версию вы используете. При покупке Pro-версии вы будете иметь доступ к этим <strong>визуальным стилям</strong> и особенно поможете <strong>реализации общественных проектов</strong>. Эти <strong>визуальные стили</strong> доступны благодаря вашей щедрости. Для того, чтобы сохранить нашу независимость и быть всегда активными, мы рассчитываем на ваш <strong>вклад</strong>. @@ -314,7 +314,7 @@ Мы прилагаем все усилия, чтобы быстро выпустить эту функцию. Не забывайте обновлять приложение. Скачать - Помощь проекту + Вклад ChaCha20 AES Argon2 @@ -450,14 +450,14 @@ Выполнять команду \"Ввод\" автоматически после нажатия кнопки заполнения поля Скачать %1$s Инициализация… - Выполнение: %1$d% + Выполнение: %1$d% Завершение… Готово! Нажмите, чтобы открыть файл. Скрывать устаревшие записи Записи с истёкшим сроком окончания будут скрыты Контактная информация - Вклад - Для <strong>сохранения нашей независимости<strong>, <strong>исправления ошибок<strong>, <strong>добавления новых функций<strong> и <strong>поддержания разработки в активном состоянии<strong>, мы рассчитываем на ваш <strong>вклад<strong>. + Помощь проекту + Для сохранения нашей независимости, исправления ошибок, добавления новых функций и поддержания разработки в активном состоянии, мы рассчитываем на ваш вклад. Быстрый поиск Открывать поисковый запрос при открытии базы Хранить расположение баз From 57596b29916928b7b402f43e76a6b7804e713d1a Mon Sep 17 00:00:00 2001 From: zeritti Date: Fri, 13 Mar 2020 15:57:10 +0000 Subject: [PATCH 28/68] Translated using Weblate (Czech) Currently translated at 100.0% (426 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/cs/ --- app/src/main/res/values-cs/strings.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 87289c542..b64b7834b 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -302,7 +302,7 @@ Vyberte řazení položek a skupin. Zapojit se Zapojte se a pomozte zvýšit stabilitu, bezpečnost a přidávání dalších funkcí. - Na rozdíl od mnoha aplikací pro správu hesel, tato je bez reklam", je " svobodný software pod copyleft licencí a nesbírá žádné osobní údaje na svých serverech bez ohledu na to, jakou verzi používáte. + Na rozdíl od mnoha aplikací pro správu hesel, tato je bez reklam", je "svobodný software pod copyleft licencí a nesbírá žádné osobní údaje na svých serverech bez ohledu na to, jakou verzi používáte. Zakoupením varianty „pro“ získáte přístup k tomuto <strong>vizuálnímu stylu</strong> a hlavně pomůžete <strong>uskutečnění komunitních projektů.</strong> Tento <strong>vizuální styl</strong> je k dispozici díky vaší štědrosti. Pro zajištění svobody nás všech a pokračování aktivity, počítáme s vaším <strong>přispěním.</strong> @@ -469,4 +469,7 @@ Skrýt špatné odkazy na databáze Skrýt špatné odkazy v seznamu nedávných databází Udělit právo zápisu pro uložení změn v databázi + KeePassDX © %1$d Kunzisoft je otevřený software a bey reklam. +\nJe poskytován jak je, pod licencí GPLv3, bez jakékoli záruky. + Abychom si udrželi svoji svobodu, opravili chyby,doplnili funkce a byli vždy aktivní, počítáme s Vaším přispěním. \ No newline at end of file From bc60a5d97e4eef2b7fd18f82a191723dd382af35 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Fri, 13 Mar 2020 15:05:53 +0000 Subject: [PATCH 29/68] Translated using Weblate (Polish) Currently translated at 100.0% (426 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/ --- app/src/main/res/values-pl/strings.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4fdc71b06..aec90a891 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -153,7 +153,8 @@ Niektóre urządzenia nie pozwalają aplikacjom korzystać ze schowka. Nie można wyczyścić schowka Przesuń, by wyczyścić schowek - KeePassDX © %1$d Kunzisoft korzystasz absolutnie bez gwarancji. To jest bezpłatne oprogramowanie i możesz go redystrybuować na warunkach GPL w wersji 3 lub późniejszej. + KeePassDX © %1 $d Kunzisoft jest open source i bez reklam. +\nJest on dostarczany w stanie, zgodnie z licencją GPLv3 bez żadnych gwarancji. Nie znaleziono danych wejściowych. Nie można załadować bazy danych. Nie można załadować klucza. Spróbuj zmniejszyć użycie pamięć KDF. @@ -301,7 +302,7 @@ Wybierz sposób sortowania wpisów i grup. Weź udział Pomóż zwiększyć stabilność, bezpieczeństwo i dodawanie kolejnych funkcji. - W przeciwieństwie do wielu aplikacji do zarządzania hasłami, ta jest <strong>wolna od reklam</strong>, <strong>open source</strong> i na licencji <strong>licencjonowanie copyleftted</strong>. <strong>Żadne dane osobowe nie są gromadzone</strong>, w jakiejkolwiek formie, bez względu na to, z której wersji (bezpłatnej lub pro) korzystasz. + W przeciwieństwie do wielu aplikacji do zarządzania hasłami, ta jest wolna od reklam, jest wolnym oprogramowaniem copyleftted i nie zbiera danych osobowych na swoich serwerach, bez względu na to, jakiej wersji używasz. Kupując wersję pro, będziesz mieć dostęp do <strong>stylu wizualnego</strong> a szczególnie pomożesz <strong> zrealizować projekty społecznościowe.</strong> Ten <strong>styl wizualny</strong> jest dostępny dzięki Twojej hojności. Aby zachować naszą wolność i być zawsze aktywnym, liczymy na Twój <strong>wkład.</strong> @@ -467,4 +468,5 @@ Ukryj uszkodzone łącza do bazy danych Ukryj uszkodzone łącza na liście najnowszych baz danych Przyznaj dostęp do zapisu pliku, aby zapisać zmiany w bazie danych + Wkład \ No newline at end of file From cbf33507d1f500e161d244ff20211ee44096eb50 Mon Sep 17 00:00:00 2001 From: Destiny Li Date: Fri, 13 Mar 2020 03:29:19 +0000 Subject: [PATCH 30/68] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (426 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d183ed388..0b0c1bf5c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -39,8 +39,8 @@ 正在解密数据库内容… 设为默认数据库 数字 - KeePassDX © %1$d 是Kunzisoft的一个<strong>开源<strong>和<strong>无广告<strong>软件。 -\n它是根据<strong>GPLv3 <strong>许可证分发的,您可在遵循GPL 3或者更高版本的协议下重新发布。对软件的质量和性能等问题不提供任何形式的担保。 + KeePassDX © %1$d 是Kunzisoft的一个开源无广告软件。 +\n它是根据GPLv3许可证分发的,您可在遵循GPL 3或者更高版本的协议下重新发布。Kunzisoft对软件的质量和性能等问题不提供任何形式的担保。 打开已有数据库 访问时间 取消 @@ -332,7 +332,7 @@ 选择条目和群组的排序方式。 参与开发 帮助增加稳定性,安全性并添加更多的功能。 - 不同于大多数的密码管理程序,无论您是使用免费版本还是付费版本的KeePassDX,这都是一款<strong>没有广告<strong>,<strong>基于copylefted版权协议的免费软件<strong>,同样的本软件的任何版本也不会收集您的个人信息。 + 不同于大多数的密码管理程序,无论您是使用免费版本还是付费版本的KeePassDX,这都是一款没有广告基于copylefted版权协议的免费软件,同样的本软件的任何版本也不会收集您的个人信息。 通过购买高级版本,您将解锁全部<strong>主题样式</strong>,重要的是,您会为<strong>社区项目的进行</strong>提供的帮助 此<strong>主题样式</strong>现在已经可用,感谢慷慨相助。 为继续建设此自由项目,我们需要<strong>捐助。</strong> @@ -452,14 +452,14 @@ 填入用户名或密码后直接登录 下载%1$s 正在初始化… - 进行中:%1$d% + 进行中:%1$d% 正在完成… 完成!点击打开文件。 隐藏过期条目 过期条目将被隐藏 联系我们 贡献 - 为了<strong>保持我们的自由<strong>,<strong>修复错误<strong>,<strong>添加功能<strong>和<strong>始终保持活跃<strong>,我们期待您的 <strong>贡献。<strong> + 为了保持我们的自由修复错误添加功能始终保持活跃,我们期待您的 贡献 快速搜索 打开数据库时询问是否进行搜索 数据库保存的路径 From 0fd955197d1ba858c67b489b21a1c5ca3be4da8f Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 14 Mar 2020 20:16:36 +0100 Subject: [PATCH 31/68] Expires selection --- .../keepass/activities/EntryEditActivity.kt | 61 ++++++++++++++-- .../activities/dialogs/DatePickerFragment.kt | 61 ++++++++++++++++ .../activities/dialogs/TimePickerFragment.kt | 57 +++++++++++++++ .../keepass/database/element/DateInstant.kt | 2 +- .../keepass/view/EntryEditContentsView.kt | 69 ++++++++++++++++--- .../res/layout/view_entry_edit_contents.xml | 42 ++++++++++- 6 files changed, 275 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatePickerFragment.kt create mode 100644 app/src/main/java/com/kunzisoft/keepass/activities/dialogs/TimePickerFragment.kt 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 999c85a18..d51a8d0d9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -19,6 +19,8 @@ package com.kunzisoft.keepass.activities import android.app.Activity +import android.app.DatePickerDialog +import android.app.TimePickerDialog import android.content.Intent import android.os.Bundle import android.os.Handler @@ -26,14 +28,14 @@ import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View +import android.widget.DatePicker +import android.widget.TimePicker import androidx.appcompat.widget.ActionMenuView import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.widget.NestedScrollView import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.activities.dialogs.GeneratePasswordDialogFragment -import com.kunzisoft.keepass.activities.dialogs.IconPickerDialogFragment -import com.kunzisoft.keepass.activities.dialogs.SetOTPDialogFragment +import com.kunzisoft.keepass.activities.dialogs.* import com.kunzisoft.keepass.activities.lock.LockingActivity import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.DateInstant @@ -53,12 +55,15 @@ import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.utils.MenuUtil import com.kunzisoft.keepass.view.EntryEditContentsView import com.kunzisoft.keepass.view.showActionError +import org.joda.time.DateTime import java.util.* class EntryEditActivity : LockingActivity(), IconPickerDialogFragment.IconPickerListener, GeneratePasswordDialogFragment.GeneratePasswordListener, - SetOTPDialogFragment.CreateOtpListener { + SetOTPDialogFragment.CreateOtpListener, + DatePickerDialog.OnDateSetListener, + TimePickerDialog.OnTimeSetListener { private var mDatabase: Database? = null @@ -96,6 +101,16 @@ class EntryEditActivity : LockingActivity(), entryEditContentsView = findViewById(R.id.entry_edit_contents) entryEditContentsView?.applyFontVisibilityToFields(PreferencesUtil.fieldFontIsInVisibility(this)) + entryEditContentsView?.onDateClickListener = View.OnClickListener { + entryEditContentsView?.expiresDate?.date?.let { expiresDate -> + val dateTime = DateTime(expiresDate) + val defaultYear = dateTime.year + val defaultMonth = dateTime.monthOfYear-1 + val defaultDay = dateTime.dayOfMonth + DatePickerFragment.getInstance(defaultYear, defaultMonth, defaultDay) + .show(supportFragmentManager, "DatePickerFragment") + } + } // Focus view to reinitialize timeout resetAppTimeoutWhenViewFocusedOrChanged(entryEditContentsView) @@ -241,6 +256,9 @@ class EntryEditActivity : LockingActivity(), username = if (newEntry.username.isEmpty()) mDatabase?.defaultUsername ?:"" else newEntry.username url = newEntry.url password = newEntry.password + expires = newEntry.expires + if (expires) + expiresDate = newEntry.expiryTime notes = newEntry.notes for (entry in newEntry.customFields.entries) { post { @@ -262,7 +280,11 @@ class EntryEditActivity : LockingActivity(), username = entryView.username url = entryView.url password = entryView.password - notes = entryView.notes + expires = entryView.expires + if (entryView.expires) { + expiryTime = entryView.expiresDate + } + notes = entryView. notes entryView.customFields.forEach { customField -> putExtraField(customField.name, customField.protectedValue) } @@ -408,6 +430,35 @@ class EntryEditActivity : LockingActivity(), } } + override fun onDateSet(datePicker: DatePicker?, year: Int, month: Int, day: Int) { + entryEditContentsView?.expiresDate?.date?.let { expiresDate -> + // Save the date + entryEditContentsView?.expiresDate = + DateInstant(DateTime(expiresDate) + .withYear(year) + .withMonthOfYear(month+1) + .withDayOfMonth(day) + .toDate()) + // Launch the time picker + val dateTime = DateTime(expiresDate) + val defaultHour = dateTime.hourOfDay + val defaultMinute = dateTime.minuteOfHour + TimePickerFragment.getInstance(defaultHour, defaultMinute) + .show(supportFragmentManager, "TimePickerFragment") + } + } + + override fun onTimeSet(timePicker: TimePicker?, hours: Int, minutes: Int) { + entryEditContentsView?.expiresDate?.date?.let { expiresDate -> + // Save the date + entryEditContentsView?.expiresDate = + DateInstant(DateTime(expiresDate) + .withHourOfDay(hours) + .withMinuteOfHour(minutes) + .toDate()) + } + } + override fun onSaveInstanceState(outState: Bundle) { mNewEntry?.let { populateEntryWithViews(it) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatePickerFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatePickerFragment.kt new file mode 100644 index 000000000..cc068d329 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatePickerFragment.kt @@ -0,0 +1,61 @@ +package com.kunzisoft.keepass.activities.dialogs + +import android.app.DatePickerDialog +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import androidx.fragment.app.DialogFragment + +class DatePickerFragment : DialogFragment() { + + private var mDefaultYear: Int = 2000 + private var mDefaultMonth: Int = 1 + private var mDefaultDay: Int = 1 + + private var mListener: DatePickerDialog.OnDateSetListener? = null + + override fun onAttach(context: Context) { + super.onAttach(context) + try { + mListener = context as DatePickerDialog.OnDateSetListener + } catch (e: ClassCastException) { + throw ClassCastException(context.toString() + + " must implement " + DatePickerDialog.OnDateSetListener::class.java.name) + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + // Create a new instance of DatePickerDialog and return it + return context?.let { + arguments?.apply { + if (containsKey(DEFAULT_YEAR_BUNDLE_KEY)) + mDefaultYear = getInt(DEFAULT_YEAR_BUNDLE_KEY) + if (containsKey(DEFAULT_MONTH_BUNDLE_KEY)) + mDefaultMonth = getInt(DEFAULT_MONTH_BUNDLE_KEY) + if (containsKey(DEFAULT_DAY_BUNDLE_KEY)) + mDefaultDay = getInt(DEFAULT_DAY_BUNDLE_KEY) + } + + DatePickerDialog(it, mListener, mDefaultYear, mDefaultMonth, mDefaultDay) + } ?: super.onCreateDialog(savedInstanceState) + } + + companion object { + + private const val DEFAULT_YEAR_BUNDLE_KEY = "DEFAULT_YEAR_BUNDLE_KEY" + private const val DEFAULT_MONTH_BUNDLE_KEY = "DEFAULT_MONTH_BUNDLE_KEY" + private const val DEFAULT_DAY_BUNDLE_KEY = "DEFAULT_DAY_BUNDLE_KEY" + + fun getInstance(defaultYear: Int, + defaultMonth: Int, + defaultDay: Int): DatePickerFragment { + return DatePickerFragment().apply { + arguments = Bundle().apply { + putInt(DEFAULT_YEAR_BUNDLE_KEY, defaultYear) + putInt(DEFAULT_MONTH_BUNDLE_KEY, defaultMonth) + putInt(DEFAULT_DAY_BUNDLE_KEY, defaultDay) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/TimePickerFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/TimePickerFragment.kt new file mode 100644 index 000000000..42474b0d2 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/TimePickerFragment.kt @@ -0,0 +1,57 @@ +package com.kunzisoft.keepass.activities.dialogs + +import android.app.DatePickerDialog +import android.app.Dialog +import android.app.TimePickerDialog +import android.content.Context +import android.os.Bundle +import android.text.format.DateFormat +import androidx.fragment.app.DialogFragment + +class TimePickerFragment : DialogFragment() { + + private var defaultHour: Int = 0 + private var defaultMinute: Int = 0 + + private var mListener: TimePickerDialog.OnTimeSetListener? = null + + override fun onAttach(context: Context) { + super.onAttach(context) + try { + mListener = context as TimePickerDialog.OnTimeSetListener + } catch (e: ClassCastException) { + throw ClassCastException(context.toString() + + " must implement " + DatePickerDialog.OnDateSetListener::class.java.name) + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + // Create a new instance of DatePickerDialog and return it + return context?.let { + arguments?.apply { + if (containsKey(DEFAULT_HOUR_BUNDLE_KEY)) + defaultHour = getInt(DEFAULT_HOUR_BUNDLE_KEY) + if (containsKey(DEFAULT_MINUTE_BUNDLE_KEY)) + defaultMinute = getInt(DEFAULT_MINUTE_BUNDLE_KEY) + } + + TimePickerDialog(it, mListener, defaultHour, defaultMinute, DateFormat.is24HourFormat(activity)) + } ?: super.onCreateDialog(savedInstanceState) + } + + companion object { + + private const val DEFAULT_HOUR_BUNDLE_KEY = "DEFAULT_HOUR_BUNDLE_KEY" + private const val DEFAULT_MINUTE_BUNDLE_KEY = "DEFAULT_MINUTE_BUNDLE_KEY" + + fun getInstance(defaultHour: Int, + defaultMinute: Int): TimePickerFragment { + return TimePickerFragment().apply { + arguments = Bundle().apply { + putInt(DEFAULT_HOUR_BUNDLE_KEY, defaultHour) + putInt(DEFAULT_MINUTE_BUNDLE_KEY, defaultMinute) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt index 1b1ce29ac..30b408875 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt @@ -142,7 +142,7 @@ class DateInstant : Parcelable { fun getDateTimeString(resources: Resources, date: Date): String { return java.text.DateFormat.getDateTimeInstance( java.text.DateFormat.MEDIUM, - java.text.DateFormat.MEDIUM, + java.text.DateFormat.SHORT, ConfigurationCompat.getLocales(resources.configuration)[0]) .format(date) } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt index f730af33f..a80ffa9a2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditContentsView.kt @@ -21,20 +21,21 @@ package com.kunzisoft.keepass.view import android.content.Context import android.graphics.Color -import com.google.android.material.textfield.TextInputLayout import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup -import android.widget.EditText -import android.widget.ImageView -import android.widget.LinearLayout +import android.widget.* +import com.google.android.material.textfield.TextInputLayout import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.element.DateInstant import com.kunzisoft.keepass.database.element.icon.IconImage import com.kunzisoft.keepass.database.element.security.ProtectedString import com.kunzisoft.keepass.icons.IconDrawableFactory import com.kunzisoft.keepass.icons.assignDatabaseIcon import com.kunzisoft.keepass.icons.assignDefaultDatabaseIcon import com.kunzisoft.keepass.model.Field +import org.joda.time.Duration +import org.joda.time.Instant class EntryEditContentsView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, @@ -51,10 +52,22 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, private val entryPasswordLayoutView: TextInputLayout private val entryPasswordView: EditText private val entryConfirmationPasswordView: EditText - private val entryCommentView: EditText + private val entryExpiresCheckBox: CompoundButton + private val entryExpiresTextView: TextView + private val entryNotesView: EditText private val entryExtraFieldsContainer: ViewGroup private var iconColor: Int = 0 + private var expiresInstant: DateInstant = DateInstant(Instant.now().plus(Duration.standardDays(30)).toDate()) + + var onDateClickListener: OnClickListener? = null + set(value) { + field = value + if (entryExpiresCheckBox.isChecked) + entryExpiresTextView.setOnClickListener(value) + else + entryExpiresTextView.setOnClickListener(null) + } init { val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater? @@ -68,9 +81,15 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, entryPasswordLayoutView = findViewById(R.id.entry_edit_container_password) entryPasswordView = findViewById(R.id.entry_edit_password) entryConfirmationPasswordView = findViewById(R.id.entry_edit_confirmation_password) - entryCommentView = findViewById(R.id.entry_edit_notes) + entryExpiresCheckBox = findViewById(R.id.entry_edit_expires_checkbox) + entryExpiresTextView = findViewById(R.id.entry_edit_expires_text) + entryNotesView = findViewById(R.id.entry_edit_notes) entryExtraFieldsContainer = findViewById(R.id.entry_edit_advanced_container) + entryExpiresCheckBox.setOnCheckedChangeListener { _, _ -> + assignExpiresDateText() + } + // Retrieve the textColor to tint the icon val taIconColor = context.theme.obtainStyledAttributes(intArrayOf(android.R.attr.textColor)) iconColor = taIconColor.getColor(0, Color.WHITE) @@ -136,14 +155,44 @@ class EntryEditContentsView @JvmOverloads constructor(context: Context, } } - var notes: String + private fun assignExpiresDateText() { + entryExpiresTextView.text = if (entryExpiresCheckBox.isChecked) { + entryExpiresTextView.setOnClickListener(onDateClickListener) + expiresInstant.getDateTimeString(resources) + } else { + entryExpiresTextView.setOnClickListener(null) + resources.getString(R.string.never) + } + if (fontInVisibility) + entryExpiresTextView.applyFontVisibility() + } + + var expires: Boolean get() { - return entryCommentView.text.toString() + return entryExpiresCheckBox.isChecked } set(value) { - entryCommentView.setText(value) + entryExpiresCheckBox.isChecked = value + assignExpiresDateText() + } + + var expiresDate: DateInstant + get() { + return expiresInstant + } + set(value) { + expiresInstant = value + assignExpiresDateText() + } + + var notes: String + get() { + return entryNotesView.text.toString() + } + set(value) { + entryNotesView.setText(value) if (fontInVisibility) - entryCommentView.applyFontVisibility() + entryNotesView.applyFontVisibility() } val customFields: MutableList diff --git a/app/src/main/res/layout/view_entry_edit_contents.xml b/app/src/main/res/layout/view_entry_edit_contents.xml index bef602125..0849f5c5f 100644 --- a/app/src/main/res/layout/view_entry_edit_contents.xml +++ b/app/src/main/res/layout/view_entry_edit_contents.xml @@ -143,7 +143,47 @@ android:hint="@string/entry_url"/> - + + + + + + + + + From d1af7349bc5d689d3579d7d3b0f47dfa91aa0118 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 14 Mar 2020 20:51:47 +0100 Subject: [PATCH 32/68] Edit button as validation --- app/src/main/res/drawable/ic_check_white_24dp.xml | 5 +++++ app/src/main/res/layout/activity_entry_edit.xml | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_check_white_24dp.xml diff --git a/app/src/main/res/drawable/ic_check_white_24dp.xml b/app/src/main/res/drawable/ic_check_white_24dp.xml new file mode 100644 index 000000000..17aca2af1 --- /dev/null +++ b/app/src/main/res/drawable/ic_check_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_entry_edit.xml b/app/src/main/res/layout/activity_entry_edit.xml index 4466d5ba3..e06e83979 100644 --- a/app/src/main/res/layout/activity_entry_edit.xml +++ b/app/src/main/res/layout/activity_entry_edit.xml @@ -70,7 +70,7 @@ @@ -95,9 +95,9 @@ android:id="@+id/entry_edit_save" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_anchor="@+id/toolbar_layout" app:layout_anchorGravity="bottom|end" - android:src="@drawable/ic_save_white_24dp" + app:layout_anchor="@+id/entry_edit_scroll" + android:src="@drawable/ic_check_white_24dp" android:contentDescription="@string/content_description_entry_save" app:useCompatPadding="true" style="@style/KeepassDXStyle.Fab"/> From 7fc93897000e0adfed5413abea8ae77989e41db0 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 14 Mar 2020 21:15:37 +0100 Subject: [PATCH 33/68] Always show menu --- app/src/main/res/menu/entry_edit.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/menu/entry_edit.xml b/app/src/main/res/menu/entry_edit.xml index 68e046c90..ee33f3394 100644 --- a/app/src/main/res/menu/entry_edit.xml +++ b/app/src/main/res/menu/entry_edit.xml @@ -17,8 +17,10 @@ You should have received a copy of the GNU General Public License along with KeePassDX. If not, see . --> - + + app:showAsAction="always" /> --> + app:showAsAction="always" /> From c5aef6b5614b98593c87e4f54c6643428036467f Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sun, 15 Mar 2020 12:21:26 +0100 Subject: [PATCH 34/68] New entry edit tool menu style --- .../main/res/layout/activity_entry_edit.xml | 138 ++++++++++-------- 1 file changed, 74 insertions(+), 64 deletions(-) diff --git a/app/src/main/res/layout/activity_entry_edit.xml b/app/src/main/res/layout/activity_entry_edit.xml index e06e83979..ace10a5c6 100644 --- a/app/src/main/res/layout/activity_entry_edit.xml +++ b/app/src/main/res/layout/activity_entry_edit.xml @@ -17,90 +17,100 @@ You should have received a copy of the GNU General Public License along with KeePassDX. If not, see . --> - + app:layout_constraintTop_toBottomOf="@+id/toolbar" + app:layout_constraintBottom_toBottomOf="parent"> - - - + android:layout_height="wrap_content" + android:fitsSystemWindows="true"> - - - + android:layout_height="match_parent" + app:titleEnabled="false" + app:toolbarId="@+id/toolbar" + app:layout_scrollFlags="enterAlways|enterAlwaysCollapsed|scroll|exitUntilCollapsed|snap"> + + android:layout_width="wrap_content" + android:layout_height="?attr/actionBarSize"/> + + - - - - - - + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + android:theme="?attr/toolbarAppearance" + android:popupTheme="?attr/toolbarPopupAppearance" + app:layout_collapseMode="pin" + tools:targetApi="lollipop" /> - - + + - + - + - - \ No newline at end of file + + + + + + + + \ No newline at end of file From 11c9a1d707cbf3320d6edb6f7fa4e58e8b568a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89frit?= Date: Mon, 16 Mar 2020 23:33:36 +0000 Subject: [PATCH 35/68] Translated using Weblate (French) Currently translated at 100.0% (426 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e557b294f..d33c66eb1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -49,7 +49,7 @@ Déchiffrement du contenu de la base de données… Utiliser comme base de données par défaut Chiffres - KeePassDX © %1$d Kunzisoft est <strong>open source</strong> et <strong>sans publicité</strong>. Il est fourni tel quel, sous licence <strong>GPLv3</strong>, sans aucune garantie. + Algorithms Dernier accès Annuler Notes @@ -460,7 +460,7 @@ Action de la touche Go effectuée automatiquement après avoir appuyé sur une touche de champ Téléchargement %1$s Initialisation… - En cours : %1$d% + En cours : %1$d% Finalisation… Terminé ! Appuyer pour ouvrir le fichier. Masquer les entrées expirées From 385b701b38efd191e76efc618485221b48926868 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 18 Mar 2020 09:42:36 +0100 Subject: [PATCH 36/68] Fix cardview margin --- .../main/res/layout/view_entry_contents.xml | 37 ++++++++----------- .../res/layout/view_entry_edit_contents.xml | 7 +++- .../main/res/layout/view_entry_new_field.xml | 8 ++-- app/src/main/res/values/dimens.xml | 1 + 4 files changed, 25 insertions(+), 28 deletions(-) diff --git a/app/src/main/res/layout/view_entry_contents.xml b/app/src/main/res/layout/view_entry_contents.xml index 92f737d65..c8336e45c 100644 --- a/app/src/main/res/layout/view_entry_contents.xml +++ b/app/src/main/res/layout/view_entry_contents.xml @@ -27,7 +27,10 @@ + android:layout_marginTop="@dimen/default_margin" + android:layout_marginBottom="@dimen/default_margin" + android:layout_marginStart="@dimen/card_view_margin" + android:layout_marginEnd="@dimen/card_view_margin"> + android:layout_marginStart="@dimen/card_view_margin" + android:layout_marginEnd="@dimen/card_view_margin" + android:layout_marginBottom="@dimen/default_margin"> - + diff --git a/app/src/main/res/layout/view_entry_new_field.xml b/app/src/main/res/layout/view_entry_new_field.xml index e5c5113c9..3166d248b 100644 --- a/app/src/main/res/layout/view_entry_new_field.xml +++ b/app/src/main/res/layout/view_entry_new_field.xml @@ -23,10 +23,10 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/default_margin" - android:layout_marginLeft="@dimen/default_margin" - android:layout_marginRight="@dimen/default_margin" - android:layout_marginBottom="@dimen/default_margin"> + android:layout_marginTop="0dp" + android:layout_marginBottom="@dimen/default_margin" + android:layout_marginStart="0dp" + android:layout_marginEnd="0dp"> 8dp 12dp 6dp + 12dp 32dp From 1abba800458a618bd83782b0db91ff28b01ff926 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 18 Mar 2020 11:45:52 +0100 Subject: [PATCH 37/68] Fix dialog theme --- app/src/main/res/values-v21/styles.xml | 4 +++ app/src/main/res/values/styles.xml | 41 +++++++++++++------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 4dedc4434..688e72ea1 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -22,10 +22,14 @@ diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b67c6315c..00517cb8e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -68,8 +68,8 @@ @color/text_color_secondary_light - @style/KeepassDXStyle.Dialog.NegativeButton - @style/KeepassDXStyle.Dialog.PositiveButton + @style/KeepassDXStyle.Light.Dialog + @style/KeepassDXStyle.Light.Dialog @style/KeepassDXStyle.Toolbar.Light @@ -121,13 +121,10 @@ @color/text_color_secondary_night + @style/KeepassDXStyle.Night.Dialog @style/KeepassDXStyle.Night.Dialog - - @style/KeepassDXStyle.Dialog.NegativeButton - @style/KeepassDXStyle.Dialog.PositiveButton - @style/KeepassDXStyle.Toolbar.Night @style/KeepassDXStyle.Night.Toolbar.Popup @@ -178,13 +175,10 @@ @color/text_color_secondary_night + @style/KeepassDXStyle.Black.Dialog @style/KeepassDXStyle.Black.Dialog - - @style/KeepassDXStyle.Dialog.NegativeButton - @style/KeepassDXStyle.Dialog.PositiveButton - @style/KeepassDXStyle.Toolbar.Black @style/KeepassDXStyle.Black.Toolbar.Popup @@ -266,25 +260,30 @@ - + - - - From f2c8082990d556983b5117a7e58264f2879eb476 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 18 Mar 2020 11:53:21 +0100 Subject: [PATCH 38/68] Fix date picker kitkat issue --- .../keepass/activities/EntryEditActivity.kt | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 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 d51a8d0d9..0cd8ae95a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -431,20 +431,24 @@ class EntryEditActivity : LockingActivity(), } override fun onDateSet(datePicker: DatePicker?, year: Int, month: Int, day: Int) { - entryEditContentsView?.expiresDate?.date?.let { expiresDate -> - // Save the date - entryEditContentsView?.expiresDate = - DateInstant(DateTime(expiresDate) - .withYear(year) - .withMonthOfYear(month+1) - .withDayOfMonth(day) - .toDate()) - // Launch the time picker - val dateTime = DateTime(expiresDate) - val defaultHour = dateTime.hourOfDay - val defaultMinute = dateTime.minuteOfHour - TimePickerFragment.getInstance(defaultHour, defaultMinute) - .show(supportFragmentManager, "TimePickerFragment") + // To fix android 4.4 issue + // https://stackoverflow.com/questions/12436073/datepicker-ondatechangedlistener-called-twice + if (datePicker?.isShown == true) { + entryEditContentsView?.expiresDate?.date?.let { expiresDate -> + // Save the date + entryEditContentsView?.expiresDate = + DateInstant(DateTime(expiresDate) + .withYear(year) + .withMonthOfYear(month + 1) + .withDayOfMonth(day) + .toDate()) + // Launch the time picker + val dateTime = DateTime(expiresDate) + val defaultHour = dateTime.hourOfDay + val defaultMinute = dateTime.minuteOfHour + TimePickerFragment.getInstance(defaultHour, defaultMinute) + .show(supportFragmentManager, "TimePickerFragment") + } } } From b0e8a3ecd9c2604cacd30c048fb8eadb8427a43a Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 18 Mar 2020 12:03:12 +0100 Subject: [PATCH 39/68] Add expiration datetime --- CHANGELOG | 1 + fastlane/metadata/android/en-US/changelogs/29.txt | 1 + fastlane/metadata/android/fr-FR/changelogs/29.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 97369a3c3..289eaceb9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ KeePassDX(2.5beta29) * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) * Allow empty title in entries + * Add expiration datetime KeePassDX(2.5beta28) * Fix read only database diff --git a/fastlane/metadata/android/en-US/changelogs/29.txt b/fastlane/metadata/android/en-US/changelogs/29.txt index 448984fe6..4e48c4c1b 100644 --- a/fastlane/metadata/android/en-US/changelogs/29.txt +++ b/fastlane/metadata/android/en-US/changelogs/29.txt @@ -2,3 +2,4 @@ * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) * Allow empty title in entries + * Add expiration datetime diff --git a/fastlane/metadata/android/fr-FR/changelogs/29.txt b/fastlane/metadata/android/fr-FR/changelogs/29.txt index 2e655211f..68f73de8b 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/29.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/29.txt @@ -2,3 +2,4 @@ * Correction de l'actualisation de la vue d'entrée du titre et du nom d'utilisateur après une mise à jour  * Correction de la demande de verrouillage de la base de données (notification ouverte toujours active) * Autoriser le titre vide dans les entrées + * Ajout des dates d'expiration From d098bf5e6ace1b72adb17677ff312bf643d1acc5 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 19 Mar 2020 14:35:22 +0100 Subject: [PATCH 40/68] Upgrade Autofill algorithm --- .../keepass/autofill/AutofillHelper.kt | 19 ++- .../keepass/autofill/KeeAutofillService.kt | 2 +- .../keepass/autofill/StructureParser.kt | 136 ++++++++++++------ 3 files changed, 106 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt index 57b431296..06f492206 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillHelper.kt @@ -26,15 +26,14 @@ import android.content.Intent import android.os.Build import android.service.autofill.Dataset import android.service.autofill.FillResponse -import androidx.annotation.RequiresApi import android.util.Log import android.view.autofill.AutofillManager import android.view.autofill.AutofillValue import android.widget.RemoteViews +import androidx.annotation.RequiresApi import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.model.EntryInfo -import java.util.* @RequiresApi(api = Build.VERSION_CODES.O) @@ -56,10 +55,10 @@ object AutofillHelper { return String.format("%s (%s)", entryInfo.title, entryInfo.username) if (entryInfo.title.isNotEmpty()) return entryInfo.title - if (entryInfo.username.isNotEmpty()) - return entryInfo.username if (entryInfo.url.isNotEmpty()) return entryInfo.url + if (entryInfo.username.isNotEmpty()) + return entryInfo.username return "" } @@ -71,12 +70,12 @@ object AutofillHelper { val builder = Dataset.Builder(views) builder.setId(entryInfo.id) - struct.password.forEach { id -> builder.setValue(id, AutofillValue.forText(entryInfo.password)) } - - val ids = ArrayList(struct.username) - if (entryInfo.username.contains("@") || struct.username.isEmpty()) - ids.addAll(struct.email) - ids.forEach { id -> builder.setValue(id, AutofillValue.forText(entryInfo.username)) } + struct.usernameId?.let { usernameId -> + builder.setValue(usernameId, AutofillValue.forText(entryInfo.username)) + } + struct.passwordId?.let { password -> + builder.setValue(password, AutofillValue.forText(entryInfo.password)) + } return try { builder.build() diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt index 305bc239e..11f3b8dca 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt @@ -41,7 +41,7 @@ class KeeAutofillService : AutofillService() { // Check user's settings for authenticating Responses and Datasets. val parseResult = StructureParser(latestStructure).parse() parseResult?.allAutofillIds()?.let { autofillIds -> - if (listOf(*autofillIds).isNotEmpty()) { + if (autofillIds.isNotEmpty()) { // If the entire Autofill Response is authenticated, AuthActivity is used // to generate Response. val sender = AutofillLauncherActivity.getAuthIntentSenderForResponse(this) diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt index 89474dbee..1ddfef95d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt @@ -21,7 +21,6 @@ package com.kunzisoft.keepass.autofill import android.app.assist.AssistStructure import android.os.Build import androidx.annotation.RequiresApi -import android.text.InputType import android.util.Log import android.view.View import android.view.autofill.AutofillId @@ -40,69 +39,126 @@ internal class StructureParser(private val structure: AssistStructure) { result = Result() result?.apply { usernameCandidate = null - for (i in 0 until structure.windowNodeCount) { + mainLoop@ for (i in 0 until structure.windowNodeCount) { val windowNode = structure.getWindowNodeAt(i) + /* title.add(windowNode.title) windowNode.rootViewNode.webDomain?.let { webDomain.add(it) } - parseViewNode(windowNode.rootViewNode) + */ + if (parseViewNode(windowNode.rootViewNode)) + break@mainLoop } // If not explicit username field found, add the field just before password field. - if (username.isEmpty() && email.isEmpty() - && password.isNotEmpty() && usernameCandidate != null) - username.add(usernameCandidate!!) + if (usernameId == null && passwordId != null && usernameCandidate != null) + usernameId = usernameCandidate } - return result + // Return the result only if password field is retrieved + return if (result?.passwordId != null) + result + else + null } - private fun parseViewNode(node: AssistStructure.ViewNode) { - val hints = node.autofillHints - val autofillId = node.autofillId - if (autofillId != null) { + private fun parseViewNode(node: AssistStructure.ViewNode): Boolean { + if (node.autofillId != null) { + val hints = node.autofillHints if (hints != null && hints.isNotEmpty()) { - when { - Arrays.stream(hints).anyMatch { View.AUTOFILL_HINT_USERNAME == it } -> result?.username?.add(autofillId) - Arrays.stream(hints).anyMatch { View.AUTOFILL_HINT_EMAIL_ADDRESS == it } -> result?.email?.add(autofillId) - Arrays.stream(hints).anyMatch { View.AUTOFILL_HINT_PASSWORD == it } -> result?.password?.add(autofillId) - else -> Log.d(TAG, "unsupported hints") + if (parseNodeByAutofillHint(node)) + return true + } else { + if (parseNodeByHtmlAttributes(node)) + return true + } + } + // Recursive method to process each node + for (i in 0 until node.childCount) { + if (parseViewNode(node.getChildAt(i))) + return true + } + return false + } + + private fun parseNodeByAutofillHint(node: AssistStructure.ViewNode): Boolean { + val autofillId = node.autofillId + node.autofillHints?.forEach { + when { + it == View.AUTOFILL_HINT_USERNAME + || it == View.AUTOFILL_HINT_EMAIL_ADDRESS + || it == View.AUTOFILL_HINT_PHONE -> { + result?.usernameId = autofillId + Log.d(TAG, "Autofill username hint") } - } else if (node.autofillType == View.AUTOFILL_TYPE_TEXT) { - val inputType = node.inputType - when { - inputType and InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS > 0 -> result?.email?.add(autofillId) - inputType and InputType.TYPE_TEXT_VARIATION_PASSWORD > 0 -> result?.password?.add(autofillId) - result?.password?.isEmpty() == true -> usernameCandidate = autofillId + it == View.AUTOFILL_HINT_PASSWORD + || it.contains("password") -> { + result?.passwordId = autofillId + Log.d(TAG, "Autofill password hint") + return true + } + it == "on" -> { + if (parseNodeByHtmlAttributes(node)) + return true + } + else -> Log.d(TAG, "Autofill unsupported hint $it") + } + } + return false + } + + private fun parseNodeByHtmlAttributes(node: AssistStructure.ViewNode): Boolean { + val autofillId = node.autofillId + val nodHtml = node.htmlInfo + when (nodHtml?.tag?.toLowerCase(Locale.ENGLISH)) { + "input" -> { + nodHtml.attributes?.forEach { pairAttribute -> + when (pairAttribute.first.toLowerCase(Locale.ENGLISH)) { + "type" -> { + when (pairAttribute.second.toLowerCase(Locale.ENGLISH)) { + "tel", "email" -> { + result?.usernameId = autofillId + Log.d(TAG, "Autofill username type: ${node.htmlInfo?.tag} ${node.htmlInfo?.attributes}") + } + "text" -> { + usernameCandidate = autofillId + Log.d(TAG, "Autofill type: ${node.htmlInfo?.tag} ${node.htmlInfo?.attributes}") + } + "password" -> { + result?.passwordId = autofillId + Log.d(TAG, "Autofill password type: ${node.htmlInfo?.tag} ${node.htmlInfo?.attributes}") + } + } + } + } } } } - - for (i in 0 until node.childCount) - parseViewNode(node.getChildAt(i)) + return false } @RequiresApi(api = Build.VERSION_CODES.O) internal class Result { - val title: MutableList - val webDomain: MutableList - val username: MutableList - val email: MutableList - val password: MutableList + var usernameId: AutofillId? = null + set(value) { + if (field == null) + field = value + } - init { - title = ArrayList() - webDomain = ArrayList() - username = ArrayList() - email = ArrayList() - password = ArrayList() - } + var passwordId: AutofillId? = null + set(value) { + if (field == null) + field = value + } fun allAutofillIds(): Array { val all = ArrayList() - all.addAll(username) - all.addAll(email) - all.addAll(password) + usernameId?.let { + all.add(it) + } + passwordId?.let { + all.add(it) + } return all.toTypedArray() } } From aae9f9e1cba6a409c9a2888825dfadc5498131d6 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 19 Mar 2020 14:59:33 +0100 Subject: [PATCH 41/68] Warning when cancel autofill --- .../java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt index 11f3b8dca..789e9a0a3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt @@ -35,7 +35,7 @@ class KeeAutofillService : AutofillService() { val fillContexts = request.fillContexts val latestStructure = fillContexts[fillContexts.size - 1].structure - cancellationSignal.setOnCancelListener { Log.e(TAG, "Cancel autofill not implemented in this sample.") } + cancellationSignal.setOnCancelListener { Log.w(TAG, "Cancel autofill.") } val responseBuilder = FillResponse.Builder() // Check user's settings for authenticating Responses and Datasets. From b792a61bf9ecf343d8a0ae7d3e08305f5d8abf40 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 19 Mar 2020 15:18:06 +0100 Subject: [PATCH 42/68] Improve hint "on" and "off" recognition --- .../keepass/autofill/StructureParser.kt | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt index 1ddfef95d..6c01b0d87 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/StructureParser.kt @@ -34,6 +34,7 @@ import java.util.* internal class StructureParser(private val structure: AssistStructure) { private var result: Result? = null private var usernameCandidate: AutofillId? = null + private var lockHint: Boolean = false fun parse(): Result? { result = Result() @@ -85,19 +86,25 @@ internal class StructureParser(private val structure: AssistStructure) { val autofillId = node.autofillId node.autofillHints?.forEach { when { - it == View.AUTOFILL_HINT_USERNAME - || it == View.AUTOFILL_HINT_EMAIL_ADDRESS - || it == View.AUTOFILL_HINT_PHONE -> { + it.toLowerCase(Locale.ENGLISH) == View.AUTOFILL_HINT_USERNAME + || it.toLowerCase(Locale.ENGLISH) == View.AUTOFILL_HINT_EMAIL_ADDRESS + || it.toLowerCase(Locale.ENGLISH) == View.AUTOFILL_HINT_PHONE -> { result?.usernameId = autofillId Log.d(TAG, "Autofill username hint") } - it == View.AUTOFILL_HINT_PASSWORD - || it.contains("password") -> { + it.toLowerCase(Locale.ENGLISH) == View.AUTOFILL_HINT_PASSWORD + || it.toLowerCase(Locale.ENGLISH).contains("password") -> { result?.passwordId = autofillId Log.d(TAG, "Autofill password hint") return true } - it == "on" -> { + it.toLowerCase(Locale.ENGLISH) == "off" -> { + Log.d(TAG, "Autofill OFF hint") + lockHint = true + return false + } + it.toLowerCase(Locale.ENGLISH) == "on" -> { + Log.d(TAG, "Autofill ON hint") if (parseNodeByHtmlAttributes(node)) return true } @@ -108,6 +115,8 @@ internal class StructureParser(private val structure: AssistStructure) { } private fun parseNodeByHtmlAttributes(node: AssistStructure.ViewNode): Boolean { + if (lockHint) + return false val autofillId = node.autofillId val nodHtml = node.htmlInfo when (nodHtml?.tag?.toLowerCase(Locale.ENGLISH)) { From dc20899d26dd49a39c2e6edcf13d4a0fd1a0519c Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 19 Mar 2020 17:48:56 +0100 Subject: [PATCH 43/68] Update CHANGELOG --- CHANGELOG | 1 + fastlane/metadata/android/en-US/changelogs/29.txt | 1 + fastlane/metadata/android/fr-FR/changelogs/29.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 289eaceb9..ad8ae1817 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ KeePassDX(2.5beta29) + * Upgrade autofill algorithm * Delete registered KeyFile after save new credentials * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) diff --git a/fastlane/metadata/android/en-US/changelogs/29.txt b/fastlane/metadata/android/en-US/changelogs/29.txt index 4e48c4c1b..3dac04892 100644 --- a/fastlane/metadata/android/en-US/changelogs/29.txt +++ b/fastlane/metadata/android/en-US/changelogs/29.txt @@ -1,3 +1,4 @@ + * Upgrade autofill algorithm * Delete registered KeyFile after save new credentials * Fix title and username entry view refresh after an update * Fix database lock request (open notification always active) diff --git a/fastlane/metadata/android/fr-FR/changelogs/29.txt b/fastlane/metadata/android/fr-FR/changelogs/29.txt index 68f73de8b..8fcd5f173 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/29.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/29.txt @@ -1,3 +1,4 @@ + * Mise à niveau de l'algorithme de remplissage automatique * Suppression du fichier clé enregistré après avoir sauvegardé de nouvelles informations d'identification * Correction de l'actualisation de la vue d'entrée du titre et du nom d'utilisateur après une mise à jour  * Correction de la demande de verrouillage de la base de données (notification ouverte toujours active) From a3860c95816f81544c0fd4d7e31955be639b706d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 19 Mar 2020 18:34:14 +0100 Subject: [PATCH 44/68] Generate password icon as dice --- .../ic_generate_password_white_24dp.xml | 123 ++++++++++++++++-- .../res/layout/fragment_generate_password.xml | 8 +- .../res/layout/view_entry_edit_contents.xml | 22 ++-- app/src/main/res/menu/entry_edit.xml | 10 +- art/ic_generate_password.svg | 39 +++--- 5 files changed, 155 insertions(+), 47 deletions(-) diff --git a/app/src/main/res/drawable/ic_generate_password_white_24dp.xml b/app/src/main/res/drawable/ic_generate_password_white_24dp.xml index 2894e0409..4dac1f0d3 100644 --- a/app/src/main/res/drawable/ic_generate_password_white_24dp.xml +++ b/app/src/main/res/drawable/ic_generate_password_white_24dp.xml @@ -5,17 +5,114 @@ android:viewportWidth="24" android:viewportHeight="24"> - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_generate_password.xml b/app/src/main/res/layout/fragment_generate_password.xml index ee09a11dc..1703ba495 100644 --- a/app/src/main/res/layout/fragment_generate_password.xml +++ b/app/src/main/res/layout/fragment_generate_password.xml @@ -55,12 +55,18 @@ tools:ignore="TextFields" /> - diff --git a/art/ic_generate_password.svg b/art/ic_generate_password.svg index 9d9cc7eda..afb086ec6 100644 --- a/art/ic_generate_password.svg +++ b/art/ic_generate_password.svg @@ -19,7 +19,15 @@ inkscape:export-ydpi="90" sodipodi:docname="ic_generate_password.svg"> + id="defs4832"> + + + inkscape:window-maximized="1" + showguides="true" + inkscape:guide-bbox="true"> - + @@ -87,15 +97,10 @@ id="Layer_1" transform="matrix(-0.00397893,0,0,0.00397893,125.58386,23.674135)" /> - + id="rect903" /> From 53935058f57108efb05f271a74edac49f28cb2e9 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 19 Mar 2020 19:16:38 +0100 Subject: [PATCH 45/68] Add OTP icon --- .../res/drawable/ic_av_timer_white_24dp.xml | 9 -- .../main/res/drawable/ic_otp_white_24dp.xml | 74 ++++++++++++++ app/src/main/res/menu/entry_edit.xml | 2 +- art/ic_otp.svg | 96 +++++++++++++++++++ 4 files changed, 171 insertions(+), 10 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_av_timer_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_otp_white_24dp.xml create mode 100644 art/ic_otp.svg diff --git a/app/src/main/res/drawable/ic_av_timer_white_24dp.xml b/app/src/main/res/drawable/ic_av_timer_white_24dp.xml deleted file mode 100644 index 36f3f9f6d..000000000 --- a/app/src/main/res/drawable/ic_av_timer_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_otp_white_24dp.xml b/app/src/main/res/drawable/ic_otp_white_24dp.xml new file mode 100644 index 000000000..5f82090f0 --- /dev/null +++ b/app/src/main/res/drawable/ic_otp_white_24dp.xml @@ -0,0 +1,74 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/entry_edit.xml b/app/src/main/res/menu/entry_edit.xml index d22f6d342..4935468c9 100644 --- a/app/src/main/res/menu/entry_edit.xml +++ b/app/src/main/res/menu/entry_edit.xml @@ -34,7 +34,7 @@ app:showAsAction="always" /> --> diff --git a/art/ic_otp.svg b/art/ic_otp.svg new file mode 100644 index 000000000..97803358d --- /dev/null +++ b/art/ic_otp.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + From 3fb1f18c2249952c6a700053d221e130b3b4c726 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 19 Mar 2020 19:47:51 +0100 Subject: [PATCH 46/68] Education screen for OTP and entry edit menu --- .../keepass/activities/EntryEditActivity.kt | 40 +++++++++++++------ .../kunzisoft/keepass/education/Education.kt | 15 ++++++- .../education/EntryEditActivityEducation.kt | 33 ++++++++++++++- app/src/main/res/values/donottranslate.xml | 2 + app/src/main/res/values/strings.xml | 4 +- 5 files changed, 78 insertions(+), 16 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 0cd8ae95a..fa3ebaab0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -212,10 +212,7 @@ class EntryEditActivity : LockingActivity(), true } R.id.menu_add_otp -> { - // Retrieve the current otpElement if exists - // and open the dialog to set up the OTP - SetOTPDialogFragment.build(mEntry?.getOtpElement()?.otpModel) - .show(supportFragmentManager, "addOTPDialog") + setupOTP() true } else -> true @@ -315,6 +312,13 @@ class EntryEditActivity : LockingActivity(), entryEditContentsView?.addEmptyCustomField() } + private fun setupOTP() { + // Retrieve the current otpElement if exists + // and open the dialog to set up the OTP + SetOTPDialogFragment.build(mEntry?.getOtpElement()?.otpModel) + .show(supportFragmentManager, "addOTPDialog") + } + /** * Saves the new entry or update an existing entry in the database */ @@ -372,12 +376,10 @@ class EntryEditActivity : LockingActivity(), } private fun performedNextEducation(entryEditActivityEducation: EntryEditActivityEducation) { - val passwordView: View? = null// TODO entryEditContentsView?.generatePasswordView - val addNewFieldView: View? = null // TODO entryEditContentsView?.addNewFieldButton - - val generatePasswordEducationPerformed = passwordView != null + val passwordGeneratorView: View? = entryEditAddToolBar?.findViewById(R.id.menu_generate_password) + val generatePasswordEducationPerformed = passwordGeneratorView != null && entryEditActivityEducation.checkAndPerformedGeneratePasswordEducation( - passwordView, + passwordGeneratorView, { openPasswordGenerator() }, @@ -386,14 +388,28 @@ class EntryEditActivity : LockingActivity(), } ) if (!generatePasswordEducationPerformed) { - // entryNewFieldEducationPerformed - mNewEntry != null && mNewEntry!!.allowCustomFields() && mNewEntry!!.customFields.isEmpty() + val addNewFieldView: View? = entryEditAddToolBar?.findViewById(R.id.menu_add_field) + val addNewFieldEducationPerformed = mNewEntry != null + && mNewEntry!!.allowCustomFields() && mNewEntry!!.customFields.isEmpty() && addNewFieldView != null && addNewFieldView.visibility == View.VISIBLE && entryEditActivityEducation.checkAndPerformedEntryNewFieldEducation( addNewFieldView, { addNewCustomField() - }) + }, + { + performedNextEducation(entryEditActivityEducation) + } + ) + if (!addNewFieldEducationPerformed) { + val setupOtpView: View? = entryEditAddToolBar?.findViewById(R.id.menu_add_otp) + setupOtpView != null && setupOtpView.visibility == View.VISIBLE + && entryEditActivityEducation.checkAndPerformedSetUpOTPEducation( + setupOtpView, + { + setupOTP() + }) + } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/education/Education.kt b/app/src/main/java/com/kunzisoft/keepass/education/Education.kt index 5dd88173b..4de51a2c6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/education/Education.kt +++ b/app/src/main/java/com/kunzisoft/keepass/education/Education.kt @@ -94,7 +94,8 @@ open class Education(val activity: Activity) { R.string.education_copy_username_key, R.string.education_entry_edit_key, R.string.education_password_generator_key, - R.string.education_entry_new_field_key) + R.string.education_entry_new_field_key, + R.string.education_setup_OTP_key) /** @@ -271,6 +272,18 @@ open class Education(val activity: Activity) { context.resources.getBoolean(R.bool.education_entry_new_field_default)) } + /** + * Determines whether the explanatory view to setup OTP has already been displayed. + * + * @param context The context to open the SharedPreferences + * @return boolean value of education_setup_OTP_key key + */ + fun isEducationSetupOTPPerformed(context: Context): Boolean { + val prefs = getEducationSharedPreferences(context) + return prefs.getBoolean(context.getString(R.string.education_setup_OTP_key), + context.resources.getBoolean(R.bool.education_setup_OTP_default)) + } + /** * Defines if the reset education preference has been reclicked * diff --git a/app/src/main/java/com/kunzisoft/keepass/education/EntryEditActivityEducation.kt b/app/src/main/java/com/kunzisoft/keepass/education/EntryEditActivityEducation.kt index c6f77a47e..b7d1f01ef 100644 --- a/app/src/main/java/com/kunzisoft/keepass/education/EntryEditActivityEducation.kt +++ b/app/src/main/java/com/kunzisoft/keepass/education/EntryEditActivityEducation.kt @@ -37,7 +37,7 @@ class EntryEditActivityEducation(activity: Activity) activity.getString(R.string.education_generate_password_title), activity.getString(R.string.education_generate_password_summary)) .textColorInt(Color.WHITE) - .tintTarget(false) + .tintTarget(true) .cancelable(true), object : TapTargetView.Listener() { override fun onTargetClick(view: TapTargetView) { @@ -66,7 +66,7 @@ class EntryEditActivityEducation(activity: Activity) activity.getString(R.string.education_entry_new_field_title), activity.getString(R.string.education_entry_new_field_summary)) .textColorInt(Color.WHITE) - .tintTarget(false) + .tintTarget(true) .cancelable(true), object : TapTargetView.Listener() { override fun onTargetClick(view: TapTargetView) { @@ -82,4 +82,33 @@ class EntryEditActivityEducation(activity: Activity) }, R.string.education_entry_new_field_key) } + + /** + * Check and display learning views + * Displays the explanation to setup OTP + */ + fun checkAndPerformedSetUpOTPEducation(educationView: View, + onEducationViewClick: ((TapTargetView?) -> Unit)? = null, + onOuterViewClick: ((TapTargetView?) -> Unit)? = null): Boolean { + return checkAndPerformedEducation(!isEducationSetupOTPPerformed(activity), + TapTarget.forView(educationView, + activity.getString(R.string.education_setup_OTP_title), + activity.getString(R.string.education_setup_OTP_summary)) + .textColorInt(Color.WHITE) + .tintTarget(true) + .cancelable(true), + object : TapTargetView.Listener() { + override fun onTargetClick(view: TapTargetView) { + super.onTargetClick(view) + onEducationViewClick?.invoke(view) + } + + override fun onOuterCircleClick(view: TapTargetView?) { + super.onOuterCircleClick(view) + view?.dismiss(false) + onOuterViewClick?.invoke(view) + } + }, + R.string.education_setup_OTP_key) + } } \ No newline at end of file diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 6d623b39d..0f44c87e2 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -236,6 +236,8 @@ false education_entry_new_field_key false + education_setup_OTP_key + false education_screen_reclicked_key false diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 320125a72..83913cd9f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -400,10 +400,12 @@ Link your password to your scanned biometric to quickly unlock your database. Edit the entry Edit your entry with custom fields. Pool data can be referenced between different entry fields. - Create a strong password for your entry. + Create a strong password Generate a strong password to associate with your entry, easily define it according to the criteria of the form and don\'t forget secure password. Add custom fields Register an additional field, add a value and optionally protect it. + Setup OTP + Setup One-Time Password management (HOTP / TOTP) to generate a token requested for Two-factor authentication (2FA). Unlock your database Enter the password and/or keyfile to unlock your database.\n\nBackup your database file in a safe place after each change. Write protect your database From c316011fbcd83f8ccc6277d2d5c789010d4ea32f Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 12:16:45 +0100 Subject: [PATCH 47/68] Show toast on invalid key exception --- .../keepass/settings/NestedAppSettingsFragment.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt index 6ac115c4b..6697c541c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt @@ -248,13 +248,19 @@ class NestedAppSettingsFragment : NestedSettingsFragment() { BiometricUnlockDatabaseHelper.deleteEntryKeyInKeystoreForBiometric( activity, object : BiometricUnlockDatabaseHelper.BiometricUnlockErrorCallback { - override fun onInvalidKeyException(e: Exception) {} - - override fun onBiometricException(e: Exception) { + fun showException(e: Exception) { Toast.makeText(context, getString(R.string.biometric_scanning_error, e.localizedMessage), Toast.LENGTH_SHORT).show() } + + override fun onInvalidKeyException(e: Exception) { + showException(e) + } + + override fun onBiometricException(e: Exception) { + showException(e) + } }) } CipherDatabaseAction.getInstance(context.applicationContext).deleteAll() From 4b9577437cb2c270c0e255024ab0c40f7976db8c Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 12:27:18 +0100 Subject: [PATCH 48/68] Hide add button when nodes are selected --- .../java/com/kunzisoft/keepass/activities/GroupActivity.kt | 5 +++-- .../java/com/kunzisoft/keepass/view/AddNodeButtonView.kt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) 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 7d0570a17..f2904aa78 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -439,8 +439,7 @@ class GroupActivity : LockingActivity(), enableAddGroup(addGroupEnabled) enableAddEntry(addEntryEnabled) - if (isEnable) - showButton() + showButton() } } @@ -504,6 +503,7 @@ class GroupActivity : LockingActivity(), private fun finishNodeAction() { actionNodeMode?.finish() actionNodeMode = null + addNodeButtonView?.showButton() } override fun onNodeSelected(nodes: List): Boolean { @@ -515,6 +515,7 @@ class GroupActivity : LockingActivity(), } else { actionNodeMode?.invalidate() } + addNodeButtonView?.hideButton() } else { finishNodeAction() } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt b/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt index a2e5d317b..c77ae653d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt @@ -132,7 +132,7 @@ class AddNodeButtonView @JvmOverloads constructor(context: Context, } fun showButton() { - if (addButtonView?.visibility != VISIBLE) + if (isEnable && addButtonView?.visibility != VISIBLE) addButtonView?.show(onAddButtonVisibilityChangedListener) } From 903bad8f36f2b8a753651df8e6f587dcf23e77d1 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 12:40:30 +0100 Subject: [PATCH 49/68] Fix launch of open db service exception --- .../activities/lock/LockingActivity.kt | 1 + .../database/action/ProgressDialogThread.kt | 26 ++++++++++++++++--- .../DatabaseOpenNotificationService.kt | 3 +++ .../DatabaseTaskNotificationService.kt | 2 -- .../keepass/timeout/TimeoutHelper.kt | 19 +++----------- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt index 9a79a16fc..c2a49bc67 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt @@ -147,6 +147,7 @@ abstract class LockingActivity : StylishActivity() { } protected fun lockAndExit() { + sendBroadcast(Intent(LOCK_ACTION)) lock() } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDialogThread.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDialogThread.kt index fb03e482b..0a1f9f571 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDialogThread.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDialogThread.kt @@ -27,6 +27,7 @@ import android.os.Build import android.os.Bundle import android.os.IBinder import androidx.fragment.app.FragmentActivity +import com.kunzisoft.keepass.activities.lock.LockingActivity import com.kunzisoft.keepass.app.database.CipherDatabaseEntity import com.kunzisoft.keepass.crypto.keyDerivation.KdfEngine import com.kunzisoft.keepass.database.element.* @@ -35,6 +36,7 @@ import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.database.element.security.EncryptionAlgorithm +import com.kunzisoft.keepass.notifications.DatabaseOpenNotificationService import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_ASSIGN_PASSWORD_TASK import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_COPY_NODES_TASK @@ -85,12 +87,17 @@ class ProgressDialogThread(private val activity: FragmentActivity) { private val actionTaskListener = object: DatabaseTaskNotificationService.ActionTaskListener { override fun onStartAction(titleId: Int?, messageId: Int?, warningId: Int?) { - TimeoutHelper.temporarilyDisableTimeout(activity) + TimeoutHelper.temporarilyDisableTimeout() + // Stop the opening notification + DatabaseOpenNotificationService.stop(activity) startOrUpdateDialog(titleId, messageId, warningId) + } override fun onUpdateAction(titleId: Int?, messageId: Int?, warningId: Int?) { - TimeoutHelper.temporarilyDisableTimeout(activity) + TimeoutHelper.temporarilyDisableTimeout() + // Stop the opening notification + DatabaseOpenNotificationService.stop(activity) startOrUpdateDialog(titleId, messageId, warningId) } @@ -98,7 +105,18 @@ class ProgressDialogThread(private val activity: FragmentActivity) { onActionFinish?.invoke(actionTask, result) // Remove the progress task ProgressTaskDialogFragment.stop(activity) - TimeoutHelper.releaseTemporarilyDisableTimeoutAndLockIfTimeout(activity) + TimeoutHelper.releaseTemporarilyDisableTimeout() + + val inTime = if (activity is LockingActivity) { + TimeoutHelper.checkTimeAndLockIfTimeout(activity) + } else { + TimeoutHelper.checkTime(activity) + } + // Start the opening notification if in time + // (databaseOpenService is open manually in Action Open Task) + if (actionTask != ACTION_DATABASE_LOAD_TASK && inTime) { + DatabaseOpenNotificationService.start(activity) + } } } @@ -126,7 +144,7 @@ class ProgressDialogThread(private val activity: FragmentActivity) { if (serviceConnection == null) { serviceConnection = object : ServiceConnection { override fun onServiceConnected(name: ComponentName?, serviceBinder: IBinder?) { - mBinder = (serviceBinder as DatabaseTaskNotificationService.ActionTaskBinder).apply { + mBinder = (serviceBinder as DatabaseTaskNotificationService.ActionTaskBinder?)?.apply { addActionTaskListener(actionTaskListener) getService().checkAction() } diff --git a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt index 6a8811e81..b681236e1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseOpenNotificationService.kt @@ -73,7 +73,10 @@ class DatabaseOpenNotificationService: LockNotificationService() { setContentText(database.name + " (" + database.version + ")") setAutoCancel(false) setContentIntent(pendingDatabaseIntent) + // Unfortunately swipe is disabled in lollipop+ setDeleteIntent(pendingDeleteIntent) + addAction(R.drawable.ic_lock_white_24dp, getString(R.string.lock), + pendingDeleteIntent) }.build()) } else { stopSelf() diff --git a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt index 4fe469c8f..38f7ce46d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt @@ -578,8 +578,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat override fun doInBackground(vararg actionRunnables: ((ProgressTaskUpdater?)-> ActionRunnable)?): ActionRunnable.Result { var resultTask = ActionRunnable.Result(false) - // Without that, bind listeners don't work properly (I don't know why?) - Thread.sleep(500) actionRunnables.forEach { it?.invoke(progressTaskUpdater)?.apply { run() 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 67a697f1b..d853b3664 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt @@ -153,27 +153,14 @@ object TimeoutHelper { /** * Temporarily disable timeout, checkTime() function always return true */ - fun temporarilyDisableTimeout(context: Context) { + fun temporarilyDisableTimeout() { temporarilyDisableTimeout = true - - // Stop the opening notification - DatabaseOpenNotificationService.stop(context) } /** - * Release the temporarily disable timeout and directly call checkTime() + * Release the temporarily disable timeout */ - fun releaseTemporarilyDisableTimeoutAndLockIfTimeout(context: Context): Boolean { + fun releaseTemporarilyDisableTimeout() { temporarilyDisableTimeout = false - val inTime = if (context is LockingActivity) { - checkTimeAndLockIfTimeout(context) - } else { - checkTime(context) - } - if (inTime) { - // Start the opening notification - DatabaseOpenNotificationService.start(context) - } - return inTime } } \ No newline at end of file From 7c986ccee8f2a3075c9e06d5440af75659beedcc Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 16:08:23 +0100 Subject: [PATCH 50/68] Fix card_view_margin issue --- app/src/main/res/layout/view_entry_contents.xml | 14 +++++++++++++- .../main/res/layout/view_entry_edit_contents.xml | 2 ++ app/src/main/res/layout/view_entry_new_field.xml | 4 +++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/view_entry_contents.xml b/app/src/main/res/layout/view_entry_contents.xml index c8336e45c..7f3ebd99e 100644 --- a/app/src/main/res/layout/view_entry_contents.xml +++ b/app/src/main/res/layout/view_entry_contents.xml @@ -30,7 +30,9 @@ android:layout_marginTop="@dimen/default_margin" android:layout_marginBottom="@dimen/default_margin" android:layout_marginStart="@dimen/card_view_margin" - android:layout_marginEnd="@dimen/card_view_margin"> + android:layout_marginEnd="@dimen/card_view_margin" + android:layout_marginLeft="@dimen/card_view_margin" + android:layout_marginRight="@dimen/card_view_margin"> + android:layout_marginEnd="0dp" + android:layout_marginLeft="0dp" + android:layout_marginRight="0dp"> Date: Sat, 21 Mar 2020 16:12:07 +0100 Subject: [PATCH 51/68] Fix bind listeners --- .../keepass/notifications/DatabaseTaskNotificationService.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt index 38f7ce46d..4fe469c8f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/notifications/DatabaseTaskNotificationService.kt @@ -578,6 +578,8 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat override fun doInBackground(vararg actionRunnables: ((ProgressTaskUpdater?)-> ActionRunnable)?): ActionRunnable.Result { var resultTask = ActionRunnable.Result(false) + // Without that, bind listeners don't work properly (I don't know why?) + Thread.sleep(500) actionRunnables.forEach { it?.invoke(progressTaskUpdater)?.apply { run() From 4bd9c84bb00ccf2c864148be6c8a9c4fd532b049 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 16:52:50 +0100 Subject: [PATCH 52/68] Add dialog to validate discard entry changes --- .../keepass/activities/EntryEditActivity.kt | 16 ++++++++++++++-- app/src/main/res/layout/activity_entry_edit.xml | 4 ++-- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-nb/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 3 ++- 26 files changed, 18 insertions(+), 28 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 fa3ebaab0..c542464c0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -30,6 +30,7 @@ import android.view.MenuItem import android.view.View import android.widget.DatePicker import android.widget.TimePicker +import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.ActionMenuView import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout @@ -221,7 +222,7 @@ class EntryEditActivity : LockingActivity(), } // Save button - saveView = findViewById(R.id.entry_edit_save) + saveView = findViewById(R.id.entry_edit_validate) saveView?.setOnClickListener { saveEntry() } // Verify the education views @@ -426,7 +427,9 @@ class EntryEditActivity : LockingActivity(), MenuUtil.onContributionItemSelected(this) return true } - android.R.id.home -> finish() + android.R.id.home -> { + onBackPressed() + } } return super.onOptionsItemSelected(item) @@ -502,6 +505,15 @@ class EntryEditActivity : LockingActivity(), // Do nothing here } + override fun onBackPressed() { + AlertDialog.Builder(this) + .setMessage(R.string.discard_changes) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(android.R.string.ok) { _, _ -> + super@EntryEditActivity.onBackPressed() + }.create().show() + } + override fun finish() { // Assign entry callback as a result in all case try { diff --git a/app/src/main/res/layout/activity_entry_edit.xml b/app/src/main/res/layout/activity_entry_edit.xml index ace10a5c6..360256baf 100644 --- a/app/src/main/res/layout/activity_entry_edit.xml +++ b/app/src/main/res/layout/activity_entry_edit.xml @@ -103,13 +103,13 @@ diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 4895a9afa..25006a61b 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -271,7 +271,6 @@ العقد الفرعية أضف عقدة ايقونة المدخل - حفظ المدخل طول كلمة السر أضف حقل أزل حقل diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 6331cd530..fec93eafb 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -361,7 +361,6 @@ Checkbox souboru s klíčem Přepni ukázání hesla Ikona záznamu - Uložit záznam Generátor hesel Délka hesla Přidej pole diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index a00c210f9..9341c4e28 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -360,7 +360,6 @@ Afkrydsningsfelt for nøglefil Gentag for at skifte synlighed for adgangskode Indtastningsikon - Gem indtastning Adgangskodegenerator Længde på adgangskode Tilføj felt diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7dbc859f3..95fe8c3c4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -357,7 +357,6 @@ Gruppe hinzufügen Datei-Informationen Symbol für den Eintrag - Eintrag speichern Passwort-Generator Passwortlänge Feld hinzufügen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 86e500480..83ec408c0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -340,7 +340,6 @@ Πλαίσιο ελέγχου κλειδιού-αρχείου Επανάληψη της ορατότητας του κωδικού πρόσβασης Εικονίδιο καταχώρησης - Αποθήκευση καταχώρησης Γεννήτρια κωδικού πρόσβασης Μήκος κωδικού πρόσβασης Προσθήκη πεδίου diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 99c01ebe8..1bbe3b3e9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -383,7 +383,6 @@ \n\"Modificable\" le permite agregar, eliminar o modificar todos los elementos. Presione hacia atrás en la raíz para bloquear Repetir la visibilidad de la contraseña - Guardar entrada Llave Maestra Seguridad Historial diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ebd0d4842..d79560fc8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -366,7 +366,6 @@ Ajouter une entrée Ajouter un groupe Icône de l’entrée - Enregistrer l’entrée Générateur de mots de passe Longueur de mot de passe Ajouter un champ diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 33515c4f3..894fc3837 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -68,7 +68,6 @@ कीफाइल चेकबॉक्स पासवर्ड दृश्यता टॉगल दोहराएं प्रवेश आइकन - प्रविष्टि सहेजें पासवर्ड जनरेटर पासवर्ड की लंबाई फ़ील्ड जोड़ें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 660f45956..9c04f8c06 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -30,7 +30,6 @@ Dodaj grupu Informacije o datoteci Ikona unosa - Spremi unos Generator lozinke Duljina lozinke Dodaj polje diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a2ea82d12..b60572643 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -373,7 +373,6 @@ Non è possibile copiare una voce qui. Mostra il numero di voci Mostra il numero di voci in un gruppo - Salva Aggiorna Chiudi campi \ 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 bf8b2e117..2e038403c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -193,7 +193,6 @@ グループの追加 ファイル情報 エントリーのアイコン - エントリーの保存 パスワード生成 パスワードの長さ フィールドの追加 diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 793cc1d55..c32746f85 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -397,7 +397,6 @@ Tøm papirkurv Kjører kommandoen… Undernoder - Lagre oppføring Forvalgt brukernavn Tilpasset databasefarge Papirkurvsgruppe diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index a7c1abbc6..ebac28b63 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -367,7 +367,6 @@ Sleutelbestandcheckbox Weergave van het wachtwoord wisselen Item-icoon - Item opslaan Wachtwoordgenerator Wachtwoordlengte Veld toevoegen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 64ee4d207..76190d896 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -354,7 +354,6 @@ Dodaj grupę Informacje o pliku Ikona wpisu - Zapisz wpis Generator haseł Długość hasła Dodaj pole diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 019e3a78e..cd8717d45 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -368,7 +368,6 @@ Você não pode copiar uma entrada aqui. Mostrar número de entradas Mostrar o número de entradas dentro de um grupo - Salvar entrada Nó filho Caixa de seleção de senha Caixa de seleção do arquivo-chave diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 6d49ad489..70d18d0b1 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -357,7 +357,6 @@ Caixa de seleção keyfile Repetir alternar a visibilidade da palavra-passe Ícone da entrada - Gravação de entrada Gerador de palavras-passe Comprimento da palavra-passe Adicionar campo diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 036baaa14..19eadf24e 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -36,7 +36,6 @@ Verifica fisierul cheie Repetați pentru a comuta vizibilitatea parolei Pictograma de intrare - Salvați intrarea Generator de parole Lungimea parolei Adăugați câmp diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c20e3477b..00c498cd5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -360,7 +360,6 @@ Флажок ключевого файла Повтор переключения видимости пароля Значок записи - Сохранение записи Генератор паролей Длина пароля Добавить поле diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4aa768e64..e4e1eeaff 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -156,7 +156,6 @@ Kontakt Otvoriť súbor Informácie o súbore - Uložiť záznam Generátor hesla Dĺžka hesla Pozadie diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 770397939..7c1866ac7 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -172,7 +172,6 @@ Nyckelfilskryssruta Repetera växla lösenordssynlighet Post-ikon - Spara post Lösenordsgenerator Lösenords längd Lägg till fält diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d5bf99d3f..1da29f955 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -353,7 +353,6 @@ Bir bağlantı denemesinden sonra girilen parolayı siler Alt düğüm Geçiş şifresi görünürlüğünü tekrarlayın - Girdiyi kaydet Arka plan Güncelleme Alanları kapat diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0c5132358..9bda8892a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -363,7 +363,6 @@ 密钥文件选框 重复切换密码可见性 条目图标 - 保存条目 密码生成器 密码长度 添加字段 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7f1b24abb..923eb5065 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -185,7 +185,6 @@ 金鑰檔案核取方塊 重複切換密碼可見性 條目圖示 - 條目保存 密碼長度 添加欄位 刪除欄位 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83913cd9f..72c716e47 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,7 +57,8 @@ Keyfile checkbox Repeat toggle password visibility Entry icon - Save entry + Validate + Discard changes? Password generator Password length Add field From da44310d1b7b5ee489683bf96cd3b93b4df4e8d9 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 17:03:36 +0100 Subject: [PATCH 53/68] Fix focus validation button --- app/src/main/res/layout/activity_entry_edit.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_entry_edit.xml b/app/src/main/res/layout/activity_entry_edit.xml index 360256baf..103b15fcf 100644 --- a/app/src/main/res/layout/activity_entry_edit.xml +++ b/app/src/main/res/layout/activity_entry_edit.xml @@ -104,7 +104,7 @@ Date: Sat, 21 Mar 2020 17:16:49 +0100 Subject: [PATCH 54/68] Move autofill setting up --- .../main/res/xml/preferences_form_filling.xml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/xml/preferences_form_filling.xml b/app/src/main/res/xml/preferences_form_filling.xml index f31e09d81..b5fbf2568 100644 --- a/app/src/main/res/xml/preferences_form_filling.xml +++ b/app/src/main/res/xml/preferences_form_filling.xml @@ -33,6 +33,19 @@ android:title="@string/magic_keyboard_title" /> + + + + + - - - - - \ No newline at end of file From 0c0d0b7a6f2185a88d64dd2f48f2ea47d2e7b8d2 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 17:23:17 +0100 Subject: [PATCH 55/68] Encapsulate readonly for launch method --- .../com/kunzisoft/keepass/activities/GroupActivity.kt | 10 +++++++--- .../keepass/autofill/AutofillLauncherActivity.kt | 7 ++++--- .../keepass/magikeyboard/KeyboardLauncherActivity.kt | 3 +-- 3 files changed, 12 insertions(+), 8 deletions(-) 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 f2904aa78..28a2a397d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -987,7 +987,8 @@ class GroupActivity : LockingActivity(), */ @JvmOverloads - fun launch(context: Context, readOnly: Boolean = PreferencesUtil.enableReadOnlyDatabase(context)) { + fun launch(context: Context, + readOnly: Boolean = PreferencesUtil.enableReadOnlyDatabase(context)) { checkTimeAndBuildIntent(context, null, readOnly) { intent -> context.startActivity(intent) } @@ -1000,7 +1001,8 @@ class GroupActivity : LockingActivity(), */ // TODO implement pre search to directly open the direct group - fun launchForKeyboardSelection(context: Context, readOnly: Boolean) { + fun launchForKeyboardSelection(context: Context, + readOnly: Boolean = PreferencesUtil.enableReadOnlyDatabase(context)) { checkTimeAndBuildIntent(context, null, readOnly) { intent -> EntrySelectionHelper.startActivityForEntrySelection(context, intent) } @@ -1014,7 +1016,9 @@ class GroupActivity : LockingActivity(), // TODO implement pre search to directly open the direct group @RequiresApi(api = Build.VERSION_CODES.O) - fun launchForAutofillResult(activity: Activity, assistStructure: AssistStructure, readOnly: Boolean) { + fun launchForAutofillResult(activity: Activity, + assistStructure: AssistStructure, + readOnly: Boolean = PreferencesUtil.enableReadOnlyDatabase(activity)) { checkTimeAndBuildIntent(activity, null, readOnly) { intent -> AutofillHelper.startActivityForAutofillResult(activity, intent, assistStructure) } diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillLauncherActivity.kt index 7e9251050..291eda9b1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/AutofillLauncherActivity.kt @@ -31,7 +31,6 @@ import androidx.appcompat.app.AppCompatActivity import com.kunzisoft.keepass.activities.FileDatabaseSelectActivity import com.kunzisoft.keepass.activities.GroupActivity import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.TimeoutHelper @RequiresApi(api = Build.VERSION_CODES.O) @@ -42,9 +41,11 @@ class AutofillLauncherActivity : AppCompatActivity() { val assistStructure = AutofillHelper.retrieveAssistStructure(intent) if (assistStructure != null) { if (Database.getInstance().loaded && TimeoutHelper.checkTime(this)) - GroupActivity.launchForAutofillResult(this, assistStructure, PreferencesUtil.enableReadOnlyDatabase(this)) + GroupActivity.launchForAutofillResult(this, + assistStructure) else { - FileDatabaseSelectActivity.launchForAutofillResult(this, assistStructure) + FileDatabaseSelectActivity.launchForAutofillResult(this, + assistStructure) } } else { setResult(Activity.RESULT_CANCELED) diff --git a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/KeyboardLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/KeyboardLauncherActivity.kt index ce52e0b06..75329c26b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/KeyboardLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/KeyboardLauncherActivity.kt @@ -24,14 +24,13 @@ import androidx.appcompat.app.AppCompatActivity import com.kunzisoft.keepass.activities.FileDatabaseSelectActivity import com.kunzisoft.keepass.activities.GroupActivity import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.TimeoutHelper class KeyboardLauncherActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { if (Database.getInstance().loaded && TimeoutHelper.checkTime(this)) - GroupActivity.launchForKeyboardSelection(this, PreferencesUtil.enableReadOnlyDatabase(this)) + GroupActivity.launchForKeyboardSelection(this) else { // Pass extra to get entry FileDatabaseSelectActivity.launchForKeyboardSelection(this) From 76ff6f5ae00ebd12258c8ddd0bbee7207765c86b Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 19:01:05 +0100 Subject: [PATCH 56/68] Fix reference loop --- .../element/entry/FieldReferencesEngine.kt | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt index 957b61746..0309f935a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt @@ -90,6 +90,7 @@ class FieldReferencesEngine { if (result != null) { val found = result.entry + found?.stopToManageFieldReferences() val wanted = result.wanted var data: String? = null @@ -145,22 +146,15 @@ class FieldReferencesEngine { searchParametersV4.setupNone() searchParametersV4.searchString = ref.substring(4) - if (scan == 'T') { - searchParametersV4.searchInTitles = true - } else if (scan == 'U') { - searchParametersV4.searchInUserNames = true - } else if (scan == 'A') { - searchParametersV4.searchInUrls = true - } else if (scan == 'P') { - searchParametersV4.searchInPasswords = true - } else if (scan == 'N') { - searchParametersV4.searchInNotes = true - } else if (scan == 'I') { - searchParametersV4.searchInUUIDs = true - } else if (scan == 'O') { - searchParametersV4.searchInOther = true - } else { - return null + when (scan) { + 'T' -> searchParametersV4.searchInTitles = true + 'U' -> searchParametersV4.searchInUserNames = true + 'A' -> searchParametersV4.searchInUrls = true + 'P' -> searchParametersV4.searchInPasswords = true + 'N' -> searchParametersV4.searchInNotes = true + 'I' -> searchParametersV4.searchInUUIDs = true + 'O' -> searchParametersV4.searchInOther = true + else -> return null } val list = ArrayList() From 81ea7080c293f82a99d4c16492eaf79664d0586b Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Sat, 21 Mar 2020 20:25:37 +0100 Subject: [PATCH 57/68] Show UUID as KeePass UUID --- .../keepass/database/element/node/NodeIdUUID.kt | 3 +-- .../com/kunzisoft/keepass/utils/StringUtil.kt | 17 ++++++++++++++--- .../kunzisoft/keepass/view/EntryContentsView.kt | 5 +++-- .../java/com/kunzisoft/keepass/view/ViewUtil.kt | 1 + 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt index 32e17493c..fef24e154 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt @@ -21,8 +21,7 @@ package com.kunzisoft.keepass.database.element.node import android.os.Parcel import android.os.Parcelable - -import java.util.UUID +import java.util.* class NodeIdUUID : NodeId { diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt index bcaf91f7c..ce630f05b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt @@ -19,8 +19,7 @@ */ package com.kunzisoft.keepass.utils -import java.util.ArrayList -import java.util.Locale +import java.util.* object StringUtil { @@ -85,5 +84,17 @@ object StringUtil { return currentText } - +} + +fun UUID.toKeePassRefString(): String { + val tempString = toString().replace("-", "").toUpperCase(Locale.ENGLISH) + return StringBuffer(reverseString2(tempString.substring(12, 16))) + .append(reverseString2(tempString.substring(8, 12))) + .append(reverseString2(tempString.substring(0, 8))) + .append(reverseString2(tempString.substring(20, 32))) + .append(reverseString2(tempString.substring(16, 20))).toString() +} + +private fun reverseString2(string: String): String { + return string.chunked(2).reversed().joinToString("") } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt index a691585cf..4035f8f68 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt @@ -31,6 +31,7 @@ import android.widget.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.SimpleItemAnimator import com.kunzisoft.keepass.R import com.kunzisoft.keepass.adapters.EntryAttachmentsAdapter import com.kunzisoft.keepass.adapters.EntryHistoryAdapter @@ -40,8 +41,8 @@ import com.kunzisoft.keepass.database.element.security.ProtectedString import com.kunzisoft.keepass.model.EntryAttachment import com.kunzisoft.keepass.otp.OtpElement import com.kunzisoft.keepass.otp.OtpType +import com.kunzisoft.keepass.utils.toKeePassRefString import java.util.* -import androidx.recyclerview.widget.SimpleItemAnimator class EntryContentsView @JvmOverloads constructor(context: Context, @@ -345,7 +346,7 @@ class EntryContentsView @JvmOverloads constructor(context: Context, } fun assignUUID(uuid: UUID) { - uuidView.text = uuid.toString() + uuidView.text = uuid.toKeePassRefString() } /* ------------- 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 252017f46..a4d28972e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt @@ -33,6 +33,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout import com.google.android.material.snackbar.Snackbar import com.kunzisoft.keepass.R import com.kunzisoft.keepass.tasks.ActionRunnable +import java.util.* /** * Replace font by monospace, must be called after seText() From cc3485b2015cfa78cffba897cbf2151e7fc87695 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 23 Mar 2020 21:10:28 +0100 Subject: [PATCH 58/68] Update Readme --- ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index ae28a4885..308a3ae1f 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -30,7 +30,7 @@ KeePassDX is a **free open source password manager for Android**, which helps yo Yes, KeePassDX is under **free license (OSI certified)** and **without advertising**. You can have a look at its full source and check whether the encryption algorithms are implemented correctly. -*Note : If you access the application from a store, visual features may not be available to incentivize the contribution to the work of open source projects. These optional visuals are accessible after a donation (and a small congratulation message :) or the purchase of an extended version, but do not worry, the main features remain completely free. If you contribute to the project and you do not have access to the themes, do not hesitate to contact me at [contact@kunzisoft.com](contact@kunzisoft.com), I will give you the procedure.* +*Note : If you access the application from a store, visual styles may not be available to encourage contribution to the work of open source projects. These optional styles are accessible after a contribution (and a congratulation message :) or the purchase of an extended version, but do not worry, the main features remain completely free. If you contribute to the project and you do not have access to the themes, do not hesitate to contact me at [contact@kunzisoft.com](contact@kunzisoft.com), I will give you the procedure.* ## Contributions From c8e0ce717dc237b4b02a682069021d311ebc7e4e Mon Sep 17 00:00:00 2001 From: anonymous Date: Tue, 24 Mar 2020 10:14:30 +0000 Subject: [PATCH 59/68] Translated using Weblate (Italian) Currently translated at 71.1% (303 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/ --- app/src/main/res/values-it/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c2557a599..841f43b19 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -31,10 +31,10 @@ App Impostazioni app Parentesi - Sfoglia i file installando il Gestore File di OpenIntents + È necessario un file manager che accetti gli Intent ACTION_CREATE_DOCUMENT e ACTION_OPEN_DOCUMENT per creare, aprire e salvare i file di database. Appunti eliminati Errore negli appunti - Alcuni telefoni Android di Samsung non permettono alle app di usare gli appunti. + Alcuni dispositivi non permettono alle app di usare gli appunti. Eliminazione degli appunti fallita Scadenza appunti Tempo prima di eliminare gli appunti @@ -377,4 +377,5 @@ Salva Aggiorna Chiudi campi + Sicurezza \ No newline at end of file From c05d412bdbf299d38a3166f58b8ee94b9b658835 Mon Sep 17 00:00:00 2001 From: Ema Panz Date: Tue, 24 Mar 2020 10:17:04 +0000 Subject: [PATCH 60/68] Translated using Weblate (Italian) Currently translated at 71.1% (303 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/ --- app/src/main/res/values-it/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 841f43b19..7c1e1a0c5 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -364,7 +364,7 @@ Informazioni sul file Casella di controllo della password Casella di controllo Keyfile - Ripeti attivare / disattivare la visibilità della password + Ripeti le richiesta di visibilità della password Icona Generatore di password Lunghezza della password @@ -378,4 +378,5 @@ Aggiorna Chiudi campi Sicurezza + Sfondo \ No newline at end of file From 0857f2f1cf26dac855af21452084377ba9db1c3f Mon Sep 17 00:00:00 2001 From: Filippo De Bortoli Date: Tue, 24 Mar 2020 10:18:14 +0000 Subject: [PATCH 61/68] Translated using Weblate (Italian) Currently translated at 78.4% (334 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/ --- app/src/main/res/values-it/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7c1e1a0c5..1cd32e421 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -44,7 +44,8 @@ Decodifica contenuto database… Usa come database predefinito Numeri - KeePassDX © %1$d Kunzisoft viene distribuito assolutamente con nessuna garanzia. Si tratta di software libero e sei invitato a distribuirlo sotto le condizioni della licenza GPL versione 3 o successiva. + KeePassDX © %1$d Kunzisoft è un programma open source e senza pubblicità. +\nViene distribuito sotto le condizioni della licenza GPL versione 3 o successiva, senza alcuna garanzia. Note Apri un database esistente Ultimo accesso @@ -364,7 +365,7 @@ Informazioni sul file Casella di controllo della password Casella di controllo Keyfile - Ripeti le richiesta di visibilità della password + Ripeti la richiesta di visibilità della password Icona Generatore di password Lunghezza della password From cf0acd9c73193cea7d980b884a721bad49096c04 Mon Sep 17 00:00:00 2001 From: anonymous Date: Tue, 24 Mar 2020 10:18:32 +0000 Subject: [PATCH 62/68] Translated using Weblate (Italian) Currently translated at 78.4% (334 of 426 strings) Translation: KeePass DX/Strings Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/ --- app/src/main/res/values-it/strings.xml | 31 +++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1cd32e421..d59e46726 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -88,7 +88,7 @@ password Installa dal Play Store Installa dal F-Droid - Password o file chiave non validi. + Non è possibile leggere le credenziali. Se questo dovesse riaccadere, il file del databese potrebbe essere corrotto. Algoritmo errato. Formato database non riconosciuto. Il file chiave è vuoto. @@ -380,4 +380,33 @@ Chiudi campi Sicurezza Sfondo + Identificativo univoco universale + Impossibile creare un database con questa password e file chiave. + Sblocco avanzato + Cronologia + Imposta password usa e getta + Tipo di password usa e getta + Segreto + Periodo (secondi) + Contatore + Cifre + Algoritmo + Password usa e getta + Segreto della password usa e getta non valido + " Impostare almeno una credenziale." + Non puoi copiare un gruppo qui. + La chiave segreta deve essere nel formato Base32 + Il contatore deve essere tra %1$d e %2$d. + Il periodo deve essere tra %1$d e %2$d secondi. + Il token deve contenere tra %1$d e %2$d cifre. + %1$s con le stesse credenziali univoche %2$s è già esistente. + Sto creando il database... + Impostazioni di sicurezza + Il databse contiene identificativi univoci univerali duplicati. + Non è possibile salvare il database. + Salva il database + Svuota il cestino + Esecuzione del comando... + Sei sicuro di voler eliminare definitivamente i nodi selezionati\? + Allegati \ No newline at end of file From ae788503a94cdf84ef17952b71cbc928f4f73875 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 24 Mar 2020 19:44:15 +0100 Subject: [PATCH 63/68] Fix html_about licence --- app/src/main/res/values-fr/strings.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d33c66eb1..5dedd908c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -49,7 +49,7 @@ Déchiffrement du contenu de la base de données… Utiliser comme base de données par défaut Chiffres - Algorithms + KeePassDX © %1$d Kunzisoft est libre et sans publicité. \nIl est fourni tel quel, sous la licence GPLv3, sans aucune garantie. Dernier accès Annuler Notes @@ -275,7 +275,6 @@ N’oubliez pas de garder votre application à jour en installant les nouvelles versions. Télécharger Contribuer - Rijndael (AES) Twofish ChaCha20 From 5f828fb986acff63d0aa240d828e792d168e6558 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 24 Mar 2020 20:09:30 +0100 Subject: [PATCH 64/68] Fix setting --- app/src/main/res/values-ro/strings.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 163956913..b52d269d1 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -261,8 +261,6 @@ Încărcați baza de date când ecranul este deconectat Apăsați „Înapoi” pentru a bloca ecranul Blocați baza de date atunci când utilizatorul face clic pe butonul înapoi de pe ecranul rădăcină - Notificare persistentă - Adăugați o notificare atunci când baza de date este deschisă Deblocare avansată Utilizați deblocarea avansată pentru a deschide o bază de date mai ușor Deblocare biometrică From 06eb5c01c30b5c16f784eb05aa197d9b2ea4ae19 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 24 Mar 2020 20:44:50 +0100 Subject: [PATCH 65/68] Update versions --- app/build.gradle | 2 +- build.gradle | 2 +- icon-pack-classic/build.gradle | 6 +++--- icon-pack-material/build.gradle | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bc641d45a..d88804569 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,7 +86,7 @@ android { } def spongycastleVersion = "1.58.0.0" -def room_version = "2.2.4" +def room_version = "2.2.5" dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/build.gradle b/build.gradle index 476f48acd..ceb673acb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.61' + ext.kotlin_version = '1.3.70' repositories { jcenter() maven { diff --git a/icon-pack-classic/build.gradle b/icon-pack-classic/build.gradle index c3b8c09e8..203c14168 100644 --- a/icon-pack-classic/build.gradle +++ b/icon-pack-classic/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 28 - buildToolsVersion '28.0.3' + compileSdkVersion 29 + buildToolsVersion '29.0.3' defaultConfig { minSdkVersion 14 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 1 versionName "1.0" } diff --git a/icon-pack-material/build.gradle b/icon-pack-material/build.gradle index 315f02c2b..56d83946e 100644 --- a/icon-pack-material/build.gradle +++ b/icon-pack-material/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 28 - buildToolsVersion '28.0.3' + compileSdkVersion 29 + buildToolsVersion '29.0.3' defaultConfig { minSdkVersion 14 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 1 versionName "1.0" } From f6c41b5a60efae26e8ea0512199524efe4bf1769 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 24 Mar 2020 20:49:33 +0100 Subject: [PATCH 66/68] Replace the strong nodes --- app/src/main/res/values-cs/strings.xml | 8 ++++---- app/src/main/res/values-da/strings.xml | 12 ++++++------ app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 4 ++-- app/src/main/res/values-pl/strings.xml | 8 ++++---- app/src/main/res/values-ro/strings.xml | 14 +++++++------- app/src/main/res/values-ru/strings.xml | 8 ++++---- app/src/main/res/values-zh-rCN/strings.xml | 8 ++++---- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d1b7450d9..2bf19bfad 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -301,7 +301,7 @@ Vyberte řazení položek a skupin. Zapojit se Zapojte se a pomozte zvýšit stabilitu, bezpečnost a přidávání dalších funkcí. - Na rozdíl od mnoha aplikací pro správu hesel, tato je bez reklam", je "svobodný software pod copyleft licencí a nesbírá žádné osobní údaje na svých serverech bez ohledu na to, jakou verzi používáte. + Na rozdíl od mnoha aplikací pro správu hesel, tato je <strong>bez reklam</strong>", je "<strong>svobodný software pod copyleft licencí</strong> a nesbírá žádné osobní údaje na svých serverech bez ohledu na to, jakou verzi používáte. Zakoupením varianty „pro“ získáte přístup k tomuto <strong>vizuálnímu stylu</strong> a hlavně pomůžete <strong>uskutečnění komunitních projektů.</strong> Tento <strong>vizuální styl</strong> je k dispozici díky vaší štědrosti. Pro zajištění svobody nás všech a pokračování aktivity, počítáme s vaším <strong>přispěním.</strong> @@ -465,7 +465,7 @@ Skrýt špatné odkazy na databáze Skrýt špatné odkazy v seznamu nedávných databází Udělit právo zápisu pro uložení změn v databázi - KeePassDX © %1$d Kunzisoft je otevřený software a bey reklam. -\nJe poskytován jak je, pod licencí GPLv3, bez jakékoli záruky. - Abychom si udrželi svoji svobodu, opravili chyby,doplnili funkce a byli vždy aktivní, počítáme s Vaším přispěním. + KeePassDX © %1$d Kunzisoft je <strong>otevřený software</strong> a <strong>bey reklam</strong>. +\nJe poskytován jak je, pod licencí <strong>GPLv3</strong>, bez jakékoli záruky. + Abychom si <strong>udrželi svoji svobodu</strong>, <strong>opravili chyby</strong>,<strong>doplnili funkce</strong> a <strong>byli vždy aktivní</strong>, počítáme s Vaším <strong>přispěním</strong>. \ 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 a18572169..0a954c1ca 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -299,9 +299,9 @@ Vælg hvordan poster og grupper er sorteret. Deltag Bidrag til at øge stabiliteten, sikkerheden og med at tilføje flere funktioner. - I modsætning til andre programmer til adgangskodeadministration er denne annoncefri, copyleft fri software, og indsamler ikke personlige data, uanset hvilken version der bruges. - Ved at købe pro-versionen, er der adgang til visuel stil, og det vil især hjælpe gennemførelsen af lokale projekter. - Denne visuelle stil er tilgængelige takket være bidrag. + I modsætning til andre programmer til adgangskodeadministration er denne <strong>annoncefri</strong>, <strong>copyleft fri software</strong>, og indsamler ikke personlige data, uanset hvilken version der bruges. + Ved at købe pro-versionen, er der adgang til <strong>visuel stil</strong>, og det vil især hjælpe <strong>gennemførelsen af lokale projekter.</strong> + Denne <strong>visuelle stil</strong> er tilgængelige takket være bidrag. For at bevare uafhængighed og altid at være aktiv, regner vi med <strong>bidrag.</strong> Funktionen er <strong>under udvikling</strong>, og det kræver <strong>bidrag</strong>, for snart at være tilgængelig. Ved at købe <strong>pro</strong> versionen, @@ -453,9 +453,9 @@ Kontakt Bidrag Tilbagemelding - KeePassDX ©%1$d Kunzisoft er open source og uden reklamer. -\nDet leveres som det er under GPLv3 licens uden nogen garanti. - For at holde vores frihed, rette fejl, tilføje funktioner og at være altid aktiv, regner vi med bidrag. + KeePassDX ©%1$d Kunzisoft er <strong>open source</strong> og <strong>uden reklamer</strong>. +\nDet leveres som det er under <strong>GPLv3</strong> licens uden nogen garanti. + For at <strong>holde vores frihed</strong>, <strong>rette fejl</strong>, <strong>tilføje funktioner</strong> og <strong>at være altid aktiv</strong>, regner vi med <strong>bidrag</strong>. Hurtig søgning Anmod om en søgning når en database åbnes Gem placering af databaser diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e9f6b80ee..10cdb1588 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -49,7 +49,7 @@ Déchiffrement du contenu de la base de données… Utiliser comme base de données par défaut Chiffres - KeePassDX © %1$d Kunzisoft est libre et sans publicité. \nIl est fourni tel quel, sous la licence GPLv3, sans aucune garantie. + KeePassDX © %1$d Kunzisoft est <strong>libre</strong> et <strong>sans publicité</strong>. \nIl est fourni tel quel, sous la licence <strong>GPLv3</strong>, sans aucune garantie. Dernier accès Annuler Notes diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e42d3c42d..29c211300 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -44,8 +44,8 @@ Decodifica contenuto database… Usa come database predefinito Numeri - KeePassDX © %1$d Kunzisoft è un programma open source e senza pubblicità. -\nViene distribuito sotto le condizioni della licenza GPL versione 3 o successiva, senza alcuna garanzia. + KeePassDX © %1$d Kunzisoft è un programma <strong>open source</strong> e <strong>senza pubblicità</strong>. +\nViene distribuito sotto le condizioni della licenza <strong>GPL versione 3</strong> o successiva, senza alcuna garanzia. Note Apri un database esistente Ultimo accesso diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index cb4fea2d8..f416fdd2f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -152,8 +152,8 @@ Niektóre urządzenia nie pozwalają aplikacjom korzystać ze schowka. Nie można wyczyścić schowka Przesuń, by wyczyścić schowek - KeePassDX © %1 $d Kunzisoft jest open source i bez reklam. -\nJest on dostarczany w stanie, zgodnie z licencją GPLv3 bez żadnych gwarancji. + KeePassDX © %1 $d Kunzisoft jest <strong>open source</strong> i <strong>bez reklam</strong>. +\nJest on dostarczany w stanie, zgodnie z licencją <strong>GPLv3</strong> bez żadnych gwarancji. Nie znaleziono danych wejściowych. Nie można załadować bazy danych. Nie można załadować klucza. Spróbuj zmniejszyć użycie pamięć KDF. @@ -301,7 +301,7 @@ Wybierz sposób sortowania wpisów i grup. Weź udział Pomóż zwiększyć stabilność, bezpieczeństwo i dodawanie kolejnych funkcji. - W przeciwieństwie do wielu aplikacji do zarządzania hasłami, ta jest wolna od reklam, jest wolnym oprogramowaniem copyleftted i nie zbiera danych osobowych na swoich serwerach, bez względu na to, jakiej wersji używasz. + W przeciwieństwie do wielu aplikacji do zarządzania hasłami, ta jest wolna od <strong>reklam</strong>, <strong>jest wolnym oprogramowaniem copyleftted</strong> i nie zbiera danych osobowych na swoich serwerach, bez względu na to, jakiej wersji używasz. Kupując wersję pro, będziesz mieć dostęp do <strong>stylu wizualnego</strong> a szczególnie pomożesz <strong> zrealizować projekty społecznościowe.</strong> Ten <strong>styl wizualny</strong> jest dostępny dzięki Twojej hojności. Aby zachować naszą wolność i być zawsze aktywnym, liczymy na Twój <strong>wkład.</strong> @@ -452,7 +452,7 @@ Ukryj wygasłe wpisy Wygasłe wpisy zostaną ukryte Kontakt - Aby zachować naszą wolność, sprawdzać błędy, dodać funkcje i by być zawsze aktywnym, liczymy na twój wkład. + Aby <strong>zachować naszą wolność</strong>, <strong>sprawdzać błędy</strong>, <strong>dodać funkcje</strong> i <strong>by być zawsze aktywnym</strong>, liczymy na twój <strong>wkład</strong>. Szybkie wyszukiwanie Wyszukiwanie po otwarciu bazy danych Zapisz lokalizację baz danych diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index b52d269d1..a29062d8e 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -390,14 +390,14 @@ Alegeți cum sunt sortate intrările și grupurile. Participa Ajută la creșterea stabilității, securității și la adăugarea mai multor funcții. - Spre deosebire de multe aplicații de gestionare a parolelor, acesta este gratuit de anunțuri , software liber copilefted și nu colectează date personale pe serverele sale, indiferent de versiunea pe care o utilizați. - Cumpărând versiunea pro, veți avea acces la acest stil vizual și vă va ajuta în special implementarea proiectelor comunitare. - Acest stil vizual este disponibil datorită generozității tale. - Pentru a ne păstra libertatea și pentru a fi mereu activi, ne bazăm pe contribuția dvs. . + Spre deosebire de multe aplicații de gestionare a parolelor, acesta este <strong> gratuit de anunțuri </strong>, <strong> software liber copilefted </strong> și nu colectează date personale pe serverele sale, indiferent de versiunea pe care o utilizați. + Cumpărând versiunea pro, veți avea acces la acest <strong> stil vizual </strong> și vă va ajuta în special <strong> implementarea proiectelor comunitare. </strong> + Acest <strong> stil vizual </strong> este disponibil datorită generozității tale. + Pentru a ne păstra libertatea și pentru a fi mereu activi, ne bazăm pe contribuția dvs. <strong>. </strong> Această caracteristică este <strong> în curs de dezvoltare </strong> și necesită ca contribuția dvs <strong> să fie disponibilă în curând. - Cumpărând versiunea pro , - Prin contribuție , - încurajezi dezvoltatorii să creeze funcții noi și să remedieze erori în conformitate cu observațiile tale. + Cumpărând versiunea <strong> pro </strong>, + Prin <strong> contribuție </strong>, + încurajezi dezvoltatorii să creeze <strong> funcții noi </strong> și să <strong> remedieze erori </strong> în conformitate cu observațiile tale. Mulțumesc mult pentru contribuție. Muncim din greu pentru a lansa rapid această caracteristică. Nu uitați să mențineți aplicația la zi instalând noi versiuni. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 53aa1bd9f..41870ed89 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -43,8 +43,8 @@ Расшифровка базы… База по умолчанию Цифры - KeePassDX © %1$d Kunzisoft с открытым исходным кодом и без рекламы. -\nРаспространяется под лицензией GPLv3 без каких-либо гарантий. + KeePassDX © %1$d Kunzisoft с <strong>открытым исходным кодом</strong> и <strong>без рекламы</strong>. +\nРаспространяется под лицензией <strong>GPLv3</strong> без каких-либо гарантий. Открыть существующую базу Доступ Отмена @@ -301,7 +301,7 @@ Выберите критерий сортировки записей и групп. Участвуйте Примите участие в проекте для повышения стабильности, безопасности и добавления новых возможностей. - В отличие от многих приложений управления паролями, это без рекламы и свободно от лицензирования. Оно не собирает ваши личные данные на своих серверах независимо от того, какую версию вы используете. + В отличие от многих приложений управления паролями, это <strong>без рекламы</strong> и <strong>свободно от лицензирования</strong>. Оно не собирает ваши личные данные на своих серверах независимо от того, какую версию вы используете. При покупке Pro-версии вы будете иметь доступ к этим <strong>визуальным стилям</strong> и особенно поможете <strong>реализации общественных проектов</strong>. Эти <strong>визуальные стили</strong> доступны благодаря вашей щедрости. Для того, чтобы сохранить нашу независимость и быть всегда активными, мы рассчитываем на ваш <strong>вклад</strong>. @@ -453,7 +453,7 @@ Записи с истёкшим сроком окончания будут скрыты Контактная информация Помощь проекту - Для сохранения нашей независимости, исправления ошибок, добавления новых функций и поддержания разработки в активном состоянии, мы рассчитываем на ваш вклад. + Для <strong>сохранения нашей независимости</strong>, <strong>исправления ошибок</strong>, <strong>добавления новых функций</strong> и <strong>поддержания разработки в активном состоянии</strong>, мы рассчитываем на ваш <strong>вклад</strong>. Быстрый поиск Открывать поисковый запрос при открытии базы Хранить расположение баз diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 11e56359d..4adbfa755 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -39,8 +39,8 @@ 正在解密数据库内容… 设为默认数据库 数字 - KeePassDX © %1$d 是Kunzisoft的一个开源无广告软件。 -\n它是根据GPLv3许可证分发的,您可在遵循GPL 3或者更高版本的协议下重新发布。Kunzisoft对软件的质量和性能等问题不提供任何形式的担保。 + KeePassDX © %1$d 是Kunzisoft的一个<strong>开源</strong>和<strong>无广告</strong>软件。 +\n它是根据<strong>GPLv3</strong>许可证分发的,您可在遵循GPL 3或者更高版本的协议下重新发布。Kunzisoft对软件的质量和性能等问题不提供任何形式的担保。 打开已有数据库 访问时间 取消 @@ -331,7 +331,7 @@ 选择条目和群组的排序方式。 参与开发 帮助增加稳定性,安全性并添加更多的功能。 - 不同于大多数的密码管理程序,无论您是使用免费版本还是付费版本的KeePassDX,这都是一款没有广告基于copylefted版权协议的免费软件,同样的本软件的任何版本也不会收集您的个人信息。 + 不同于大多数的密码管理程序,无论您是使用免费版本还是付费版本的KeePassDX,这都是一款<strong>没有广告</strong>,<strong>基于copylefted版权协议的免费软件</strong>,同样的本软件的任何版本也不会收集您的个人信息。 通过购买高级版本,您将解锁全部<strong>主题样式</strong>,重要的是,您会为<strong>社区项目的进行</strong>提供的帮助 此<strong>主题样式</strong>现在已经可用,感谢慷慨相助。 为继续建设此自由项目,我们需要<strong>捐助。</strong> @@ -455,7 +455,7 @@ 过期条目将被隐藏 联系我们 贡献 - 为了保持我们的自由修复错误添加功能始终保持活跃,我们期待您的 贡献 + 为了<strong>保持我们的自由</strong>,<strong>修复错误</strong>,<strong>添加功能</strong>和<strong>始终保持活跃</strong>,我们期待您的 <strong>贡献</strong>。 快速搜索 打开数据库时询问是否进行搜索 数据库保存的路径 From d397c5c99623c2e36ef8ba2f2a958f52dca8532d Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 25 Mar 2020 11:22:19 +0100 Subject: [PATCH 67/68] Add UUID ref for entry --- .../keepass/view/EntryContentsView.kt | 5 ++++- .../main/res/layout/view_entry_contents.xml | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt index 4035f8f68..3b8d3f727 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryContentsView.kt @@ -92,6 +92,7 @@ class EntryContentsView @JvmOverloads constructor(context: Context, private val historyAdapter = EntryHistoryAdapter(context) private val uuidView: TextView + private val uuidReferenceView: TextView val isUserNamePresent: Boolean get() = userNameContainerView.visibility == View.VISIBLE @@ -147,6 +148,7 @@ class EntryContentsView @JvmOverloads constructor(context: Context, } uuidView = findViewById(R.id.entry_UUID) + uuidReferenceView = findViewById(R.id.entry_UUID_reference) val attrColorAccent = intArrayOf(R.attr.colorAccent) val taColorAccent = context.theme.obtainStyledAttributes(attrColorAccent) @@ -346,7 +348,8 @@ class EntryContentsView @JvmOverloads constructor(context: Context, } fun assignUUID(uuid: UUID) { - uuidView.text = uuid.toKeePassRefString() + uuidView.text = uuid.toString() + uuidReferenceView.text = uuid.toKeePassRefString() } /* ------------- diff --git a/app/src/main/res/layout/view_entry_contents.xml b/app/src/main/res/layout/view_entry_contents.xml index 7f3ebd99e..3402c152b 100644 --- a/app/src/main/res/layout/view_entry_contents.xml +++ b/app/src/main/res/layout/view_entry_contents.xml @@ -426,15 +426,28 @@ style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" /> + android:layout_height="match_parent"> - + + + From 4c1630312bf28a2bd3b955fccbe7a6759ba30faf Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 25 Mar 2020 11:46:43 +0100 Subject: [PATCH 68/68] Add UUID color --- app/src/main/res/layout/view_entry_contents.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/view_entry_contents.xml b/app/src/main/res/layout/view_entry_contents.xml index 3402c152b..496cf079e 100644 --- a/app/src/main/res/layout/view_entry_contents.xml +++ b/app/src/main/res/layout/view_entry_contents.xml @@ -446,7 +446,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textIsSelectable="true" - style="@style/KeepassDXStyle.TextAppearance.TinyText"/> + style="@style/KeepassDXStyle.TextAppearance.TinyText" + android:textColor="?attr/colorAccent"/>