diff --git a/app/build.gradle b/app/build.gradle
index f8c77f4ed..8c736e683 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -33,7 +33,6 @@ android {
buildTypes {
release {
minifyEnabled = false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 44a807414..42eba5a23 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -160,9 +160,11 @@
android:configChanges="keyboardHidden"
android:excludeFromRecents="true"/>
+ android:name="com.kunzisoft.keepass.settings.AdvancedUnlockSettingsActivity" />
+
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 df2177a9d..84adc6cfa 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt
@@ -112,9 +112,9 @@ class EntryActivity : DatabaseLockActivity() {
}
private var mIcon: IconImage? = null
- private var mColorAccent: Int = 0
- private var mControlColor: Int = 0
- private var mColorPrimary: Int = 0
+ private var mColorSecondary: Int = 0
+ private var mColorSurface: Int = 0
+ private var mColorOnSurface: Int = 0
private var mColorBackground: Int = 0
private var mBackgroundColor: Int? = null
private var mForegroundColor: Int? = null
@@ -146,17 +146,17 @@ class EntryActivity : DatabaseLockActivity() {
toolbar?.title = " "
// Retrieve the textColor to tint the toolbar
- val taColorAccent = theme.obtainStyledAttributes(intArrayOf(R.attr.colorAccent))
- val taControlColor = theme.obtainStyledAttributes(intArrayOf(R.attr.toolbarColorControl))
- val taColorPrimary = theme.obtainStyledAttributes(intArrayOf(R.attr.colorPrimary))
+ val taColorSecondary = theme.obtainStyledAttributes(intArrayOf(R.attr.colorSecondary))
+ val taColorSurface = theme.obtainStyledAttributes(intArrayOf(R.attr.colorSurface))
+ val taColorOnSurface = theme.obtainStyledAttributes(intArrayOf(R.attr.colorOnSurface))
val taColorBackground = theme.obtainStyledAttributes(intArrayOf(android.R.attr.windowBackground))
- mColorAccent = taColorAccent.getColor(0, Color.BLACK)
- mControlColor = taControlColor.getColor(0, Color.BLACK)
- mColorPrimary = taColorPrimary.getColor(0, Color.BLACK)
+ mColorSecondary = taColorSecondary.getColor(0, Color.BLACK)
+ mColorSurface = taColorSurface.getColor(0, Color.BLACK)
+ mColorOnSurface = taColorOnSurface.getColor(0, Color.BLACK)
mColorBackground = taColorBackground.getColor(0, Color.BLACK)
- taColorAccent.recycle()
- taControlColor.recycle()
- taColorPrimary.recycle()
+ taColorSecondary.recycle()
+ taColorSurface.recycle()
+ taColorOnSurface.recycle()
taColorBackground.recycle()
// Init Tags adapter
@@ -225,10 +225,10 @@ class EntryActivity : DatabaseLockActivity() {
this.mEntryIsHistory = entryIsHistory
// Assign history dedicated view
historyView?.visibility = if (entryIsHistory) View.VISIBLE else View.GONE
+ // TODO History badge
+ /*
if (entryIsHistory) {
- collapsingToolbarLayout?.contentScrim =
- ColorDrawable(mColorAccent)
- }
+ }*/
val entryInfo = entryInfoHistory.entryInfo
// Manage entry copy to start notification if allowed (at the first start)
@@ -366,8 +366,8 @@ class EntryActivity : DatabaseLockActivity() {
}
private fun applyToolbarColors() {
- appBarLayout?.setBackgroundColor(mBackgroundColor ?: mColorPrimary)
- collapsingToolbarLayout?.contentScrim = ColorDrawable(mBackgroundColor ?: mColorPrimary)
+ collapsingToolbarLayout?.setBackgroundColor(mBackgroundColor ?: mColorSurface)
+ collapsingToolbarLayout?.contentScrim = ColorDrawable(mBackgroundColor ?: mColorSurface)
val backgroundDarker = if (mBackgroundColor != null) {
ColorUtils.blendARGB(mBackgroundColor!!, Color.WHITE, 0.1f)
} else {
@@ -380,12 +380,12 @@ class EntryActivity : DatabaseLockActivity() {
mDatabase?.iconDrawableFactory?.assignDatabaseIcon(
iconView,
icon,
- mForegroundColor ?: mColorAccent
+ mForegroundColor ?: mColorSecondary
)
}
}
- toolbar?.changeControlColor(mForegroundColor ?: mControlColor)
- collapsingToolbarLayout?.changeTitleColor(mForegroundColor ?: mControlColor)
+ toolbar?.changeControlColor(mForegroundColor ?: mColorOnSurface)
+ collapsingToolbarLayout?.changeTitleColor(mForegroundColor ?: mColorOnSurface)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
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 7408c9f89..b04c8091f 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt
@@ -19,8 +19,6 @@
package com.kunzisoft.keepass.activities
import android.app.Activity
-import android.app.DatePickerDialog
-import android.app.TimePickerDialog
import android.content.Context
import android.content.Intent
import android.net.Uri
@@ -33,10 +31,8 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
-import android.widget.DatePicker
import android.widget.ProgressBar
import android.widget.Spinner
-import android.widget.TimePicker
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
@@ -48,16 +44,16 @@ import androidx.core.view.isVisible
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
+import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.snackbar.Snackbar
+import com.google.android.material.timepicker.MaterialTimePicker
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.ColorPickerDialogFragment
-import com.kunzisoft.keepass.activities.dialogs.DatePickerFragment
import com.kunzisoft.keepass.activities.dialogs.EntryCustomFieldDialogFragment
import com.kunzisoft.keepass.activities.dialogs.FileTooBigDialogFragment
import com.kunzisoft.keepass.activities.dialogs.FileTooBigDialogFragment.Companion.MAX_WARNING_BINARY_FILE
import com.kunzisoft.keepass.activities.dialogs.ReplaceFileDialogFragment
import com.kunzisoft.keepass.activities.dialogs.SetOTPDialogFragment
-import com.kunzisoft.keepass.activities.dialogs.TimePickerFragment
import com.kunzisoft.keepass.activities.fragments.EntryEditFragment
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
@@ -90,8 +86,8 @@ import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.AttachmentFileBinderManager
import com.kunzisoft.keepass.timeout.TimeoutHelper
-import com.kunzisoft.keepass.utils.getParcelableExtraCompat
import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile
+import com.kunzisoft.keepass.utils.getParcelableExtraCompat
import com.kunzisoft.keepass.view.ToolbarAction
import com.kunzisoft.keepass.view.asError
import com.kunzisoft.keepass.view.hideByFading
@@ -99,14 +95,11 @@ import com.kunzisoft.keepass.view.showActionErrorIfNeeded
import com.kunzisoft.keepass.view.updateLockPaddingLeft
import com.kunzisoft.keepass.viewmodels.ColorPickerViewModel
import com.kunzisoft.keepass.viewmodels.EntryEditViewModel
-import org.joda.time.DateTime
import java.util.UUID
class EntryEditActivity : DatabaseLockActivity(),
EntryCustomFieldDialogFragment.EntryCustomFieldListener,
SetOTPDialogFragment.CreateOtpListener,
- DatePickerDialog.OnDateSetListener,
- TimePickerDialog.OnTimeSetListener,
FileTooBigDialogFragment.ActionChooseListener,
ReplaceFileDialogFragment.ActionChooseListener {
@@ -291,14 +284,20 @@ class EntryEditActivity : DatabaseLockActivity(),
mEntryEditViewModel.requestDateTimeSelection.observe(this) { dateInstant ->
if (dateInstant.type == DateInstant.Type.TIME) {
// Launch the time picker
- val dateTime = DateTime(dateInstant.date)
- TimePickerFragment.getInstance(dateTime.hourOfDay, dateTime.minuteOfHour)
- .show(supportFragmentManager, "TimePickerFragment")
+ MaterialTimePicker.Builder().build().apply {
+ addOnPositiveButtonClickListener {
+ mEntryEditViewModel.selectTime(this.hour, this.minute)
+ }
+ show(supportFragmentManager, "TimePickerFragment")
+ }
} else {
// Launch the date picker
- val dateTime = DateTime(dateInstant.date)
- DatePickerFragment.getInstance(dateTime.year, dateTime.monthOfYear - 1, dateTime.dayOfMonth)
- .show(supportFragmentManager, "DatePickerFragment")
+ MaterialDatePicker.Builder.datePicker().build().apply {
+ addOnPositiveButtonClickListener {
+ mEntryEditViewModel.selectDate(it)
+ }
+ show(supportFragmentManager, "DatePickerFragment")
+ }
}
}
@@ -684,18 +683,6 @@ class EntryEditActivity : DatabaseLockActivity(),
return super.onOptionsItemSelected(item)
}
- override fun onDateSet(datePicker: DatePicker?, year: Int, month: Int, day: Int) {
- // To fix android 4.4 issue
- // https://stackoverflow.com/questions/12436073/datepicker-ondatechangedlistener-called-twice
- if (datePicker?.isShown == true) {
- mEntryEditViewModel.selectDate(year, month, day)
- }
- }
-
- override fun onTimeSet(timePicker: TimePicker?, hours: Int, minutes: Int) {
- mEntryEditViewModel.selectTime(hours, minutes)
- }
-
override fun onBackPressed() {
onApprovedBackPressed {
super@EntryEditActivity.onBackPressed()
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 c766bf550..2bba90ec0 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt
@@ -19,9 +19,7 @@
package com.kunzisoft.keepass.activities
import android.app.Activity
-import android.app.DatePickerDialog
import android.app.SearchManager
-import android.app.TimePickerDialog
import android.content.ComponentName
import android.content.Context
import android.content.Intent
@@ -38,11 +36,9 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
-import android.widget.DatePicker
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
-import android.widget.TimePicker
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.viewModels
@@ -59,13 +55,13 @@ import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.isVisible
import androidx.drawerlayout.widget.DrawerLayout
import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.datepicker.MaterialDatePicker
+import com.google.android.material.timepicker.MaterialTimePicker
import com.kunzisoft.keepass.R
-import com.kunzisoft.keepass.activities.dialogs.DatePickerFragment
import com.kunzisoft.keepass.activities.dialogs.GroupDialogFragment
import com.kunzisoft.keepass.activities.dialogs.GroupEditDialogFragment
import com.kunzisoft.keepass.activities.dialogs.MainCredentialDialogFragment
import com.kunzisoft.keepass.activities.dialogs.SortDialogFragment
-import com.kunzisoft.keepass.activities.dialogs.TimePickerFragment
import com.kunzisoft.keepass.activities.fragments.GroupFragment
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
@@ -100,12 +96,12 @@ import com.kunzisoft.keepass.settings.SettingsActivity
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.BACK_PREVIOUS_KEYBOARD_ACTION
+import com.kunzisoft.keepass.utils.UriUtil.openUrl
import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
import com.kunzisoft.keepass.utils.getParcelableList
import com.kunzisoft.keepass.utils.putParcelableList
import com.kunzisoft.keepass.utils.readParcelableCompat
-import com.kunzisoft.keepass.utils.UriUtil.openUrl
import com.kunzisoft.keepass.view.AddNodeButtonView
import com.kunzisoft.keepass.view.NavigationDatabaseView
import com.kunzisoft.keepass.view.SearchFiltersView
@@ -115,12 +111,9 @@ import com.kunzisoft.keepass.view.showActionErrorIfNeeded
import com.kunzisoft.keepass.view.updateLockPaddingLeft
import com.kunzisoft.keepass.viewmodels.GroupEditViewModel
import com.kunzisoft.keepass.viewmodels.GroupViewModel
-import org.joda.time.DateTime
class GroupActivity : DatabaseLockActivity(),
- DatePickerDialog.OnDateSetListener,
- TimePickerDialog.OnTimeSetListener,
GroupFragment.NodeClickListener,
GroupFragment.NodesActionMenuListener,
GroupFragment.OnScrollListener,
@@ -140,7 +133,6 @@ class GroupActivity : DatabaseLockActivity(),
private var databaseNameView: TextView? = null
private var searchView: SearchView? = null
private var searchFiltersView: SearchFiltersView? = null
- private var toolbarBreadcrumb: Toolbar? = null
private var toolbarAction: ToolbarAction? = null
private var numberChildrenView: TextView? = null
private var addNodeButtonView: AddNodeButtonView? = null
@@ -277,7 +269,6 @@ class GroupActivity : DatabaseLockActivity(),
databaseColorView = findViewById(R.id.database_color)
databaseNameView = findViewById(R.id.database_name)
searchFiltersView = findViewById(R.id.search_filters)
- toolbarBreadcrumb = findViewById(R.id.toolbar_breadcrumb)
breadcrumbListView = findViewById(R.id.breadcrumb_list)
toolbarAction = findViewById(R.id.toolbar_action)
lockView = findViewById(R.id.lock_button)
@@ -459,18 +450,20 @@ class GroupActivity : DatabaseLockActivity(),
mGroupEditViewModel.requestDateTimeSelection.observe(this) { dateInstant ->
if (dateInstant.type == DateInstant.Type.TIME) {
// Launch the time picker
- val dateTime = DateTime(dateInstant.date)
- TimePickerFragment.getInstance(dateTime.hourOfDay, dateTime.minuteOfHour)
- .show(supportFragmentManager, "TimePickerFragment")
+ MaterialTimePicker.Builder().build().apply {
+ addOnPositiveButtonClickListener {
+ mGroupEditViewModel.selectTime(this.hour, this.minute)
+ }
+ show(supportFragmentManager, "TimePickerFragment")
+ }
} else {
// Launch the date picker
- val dateTime = DateTime(dateInstant.date)
- DatePickerFragment.getInstance(
- dateTime.year,
- dateTime.monthOfYear - 1,
- dateTime.dayOfMonth
- )
- .show(supportFragmentManager, "DatePickerFragment")
+ MaterialDatePicker.Builder.datePicker().build().apply {
+ addOnPositiveButtonClickListener {
+ mGroupEditViewModel.selectDate(it)
+ }
+ show(supportFragmentManager, "DatePickerFragment")
+ }
}
}
@@ -970,18 +963,6 @@ class GroupActivity : DatabaseLockActivity(),
}
}
- override fun onDateSet(datePicker: DatePicker?, year: Int, month: Int, day: Int) {
- // To fix android 4.4 issue
- // https://stackoverflow.com/questions/12436073/datepicker-ondatechangedlistener-called-twice
- if (datePicker?.isShown == true) {
- mGroupEditViewModel.selectDate(year, month, day)
- }
- }
-
- override fun onTimeSet(view: TimePicker?, hours: Int, minutes: Int) {
- mGroupEditViewModel.selectTime(hours, minutes)
- }
-
private fun finishNodeAction() {
actionNodeMode?.finish()
}
@@ -1228,11 +1209,11 @@ class GroupActivity : DatabaseLockActivity(),
}
}
if (it.isActionViewExpanded) {
- toolbarBreadcrumb?.visibility = View.GONE
+ breadcrumbListView?.visibility = View.GONE
searchFiltersView?.visibility = View.VISIBLE
} else {
searchFiltersView?.visibility = View.GONE
- toolbarBreadcrumb?.visibility = View.VISIBLE
+ breadcrumbListView?.visibility = View.VISIBLE
}
mLockSearchListeners = false
}
diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt
index 4f26c8dfe..7095ea30c 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt
@@ -1,6 +1,6 @@
/*
* Copyright 2019 Jeremy Jamet / Kunzisoft.
- *
+ *
* This file is part of KeePassDX.
*
* KeePassDX is free software: you can redistribute it and/or modify
@@ -67,14 +67,15 @@ import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.DATABASE_URI_KEY
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.MAIN_CREDENTIAL_KEY
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.READ_ONLY_KEY
+import com.kunzisoft.keepass.settings.AdvancedUnlockSettingsActivity
+import com.kunzisoft.keepass.settings.AppearanceSettingsActivity
import com.kunzisoft.keepass.settings.PreferencesUtil
-import com.kunzisoft.keepass.settings.SettingsAdvancedUnlockActivity
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.utils.BACK_PREVIOUS_KEYBOARD_ACTION
import com.kunzisoft.keepass.utils.MenuUtil
+import com.kunzisoft.keepass.utils.UriUtil.getUri
import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
-import com.kunzisoft.keepass.utils.UriUtil.getUri
import com.kunzisoft.keepass.view.MainCredentialView
import com.kunzisoft.keepass.view.asError
import com.kunzisoft.keepass.view.showActionErrorIfNeeded
@@ -88,6 +89,7 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
// Views
private var toolbar: Toolbar? = null
private var filenameView: TextView? = null
+ private var logotypeButton: View? = null
private var advancedUnlockButton: View? = null
private var mainCredentialView: MainCredentialView? = null
private var confirmButtonView: Button? = null
@@ -128,7 +130,8 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
supportActionBar?.setDisplayShowHomeEnabled(true)
filenameView = findViewById(R.id.filename)
- advancedUnlockButton = findViewById(R.id.activity_password_advanced_unlock_button)
+ logotypeButton = findViewById(R.id.activity_password_logotype)
+ advancedUnlockButton = findViewById(R.id.fragment_advanced_unlock_container_view)
mainCredentialView = findViewById(R.id.activity_password_credentials)
confirmButtonView = findViewById(R.id.activity_password_open_button)
infoContainerView = findViewById(R.id.activity_password_info_container)
@@ -157,10 +160,15 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
// If is a view intent
getUriFromIntent(intent)
+ // Show appearance
+ logotypeButton?.setOnClickListener {
+ startActivity(Intent(this, AppearanceSettingsActivity::class.java))
+ }
+
// Init Biometric elements
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
advancedUnlockButton?.setOnClickListener {
- startActivity(Intent(this, SettingsAdvancedUnlockActivity::class.java))
+ startActivity(Intent(this, AdvancedUnlockSettingsActivity::class.java))
}
}
advancedUnlockFragment = supportFragmentManager
@@ -647,7 +655,7 @@ class MainCredentialActivity : DatabaseModeActivity(), AdvancedUnlockFragment.Bu
startActivity(
Intent(
this,
- SettingsAdvancedUnlockActivity::class.java
+ AdvancedUnlockSettingsActivity::class.java
)
)
},
diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt
index d3c1ea348..3c83c7750 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseDialogFragment.kt
@@ -6,7 +6,6 @@ import androidx.fragment.app.activityViewModels
import com.kunzisoft.keepass.activities.legacy.DatabaseRetrieval
import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewTouchedOrFocused
import com.kunzisoft.keepass.database.ContextualDatabase
-import com.kunzisoft.keepass.icons.IconDrawableFactory
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
@@ -16,8 +15,6 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
private val mDatabaseViewModel: DatabaseViewModel by activityViewModels()
private var mDatabase: ContextualDatabase? = null
- protected var mIconDrawableFactory: IconDrawableFactory? = null
-
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
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
deleted file mode 100644
index 86081c301..000000000
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatePickerFragment.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-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
-
-// Not as DatabaseDialogFragment because crash on KitKat
-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 onDetach() {
- mListener = null
- super.onDetach()
- }
-
- 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/GroupDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupDialogFragment.kt
index 31679f85d..593a99d6f 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupDialogFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupDialogFragment.kt
@@ -35,9 +35,9 @@ import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.database.element.icon.IconImage
import com.kunzisoft.keepass.model.GroupInfo
import com.kunzisoft.keepass.settings.PreferencesUtil
-import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.utils.TimeUtil.getDateTimeString
import com.kunzisoft.keepass.utils.UuidUtil
+import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.view.DateTimeFieldView
class GroupDialogFragment : DatabaseDialogFragment() {
@@ -65,7 +65,7 @@ class GroupDialogFragment : DatabaseDialogFragment() {
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
mPopulateIconMethod = { imageView, icon ->
- mIconDrawableFactory?.assignDatabaseIcon(imageView, icon, mIconColor)
+ database?.iconDrawableFactory?.assignDatabaseIcon(imageView, icon, mIconColor)
}
mPopulateIconMethod?.invoke(iconView, mGroupInfo.icon)
@@ -108,7 +108,7 @@ class GroupDialogFragment : DatabaseDialogFragment() {
uuidReferenceView = root.findViewById(R.id.group_UUID_reference)
// Retrieve the textColor to tint the icon
- val ta = activity.theme.obtainStyledAttributes(intArrayOf(R.attr.colorAccent))
+ val ta = activity.theme.obtainStyledAttributes(intArrayOf(R.attr.colorSecondary))
mIconColor = ta.getColor(0, Color.WHITE)
ta.recycle()
diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt
index 9ffc40d3d..46894e1d5 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt
@@ -90,13 +90,11 @@ class GroupEditDialogFragment : DatabaseDialogFragment() {
mPopulateIconMethod?.invoke(iconButtonView, mGroupInfo.icon)
}
- mGroupEditViewModel.onDateSelected.observe(this) { viewModelDate ->
+ mGroupEditViewModel.onDateSelected.observe(this) { dateMilliseconds ->
// Save the date
mGroupInfo.expiryTime = DateInstant(
DateTime(mGroupInfo.expiryTime.date)
- .withYear(viewModelDate.year)
- .withMonthOfYear(viewModelDate.month + 1)
- .withDayOfMonth(viewModelDate.day)
+ .withMillis(dateMilliseconds)
.toDate())
expirationView.dateTime = mGroupInfo.expiryTime
if (expirationView.dateTime.type == DateInstant.Type.DATE_TIME) {
diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/MainCredentialDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/MainCredentialDialogFragment.kt
index 1ea3d50da..e00d39563 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/MainCredentialDialogFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/MainCredentialDialogFragment.kt
@@ -28,8 +28,8 @@ import androidx.appcompat.app.AlertDialog
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
import com.kunzisoft.keepass.database.MainCredential
-import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.utils.UriUtil.getDocumentFile
+import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.view.MainCredentialView
class MainCredentialDialogFragment : DatabaseDialogFragment() {
diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt
index 560f1b7a1..167386b81 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt
@@ -44,9 +44,9 @@ import com.kunzisoft.keepass.otp.OtpElement.Companion.MIN_TOTP_PERIOD
import com.kunzisoft.keepass.otp.OtpTokenType
import com.kunzisoft.keepass.otp.OtpType
import com.kunzisoft.keepass.otp.TokenCalculator
-import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.utils.UriUtil.isContributingUser
import com.kunzisoft.keepass.utils.UriUtil.openUrl
+import com.kunzisoft.keepass.utils.getParcelableCompat
import java.util.*
class SetOTPDialogFragment : DatabaseDialogFragment() {
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
deleted file mode 100644
index 9e6a0ebc7..000000000
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/TimePickerFragment.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-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
-
-// Not as DatabaseDialogFragment because crash on KitKat
-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 onDetach() {
- mListener = null
- super.onDetach()
- }
-
- 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/activities/dialogs/UnavailableFeatureDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/UnavailableFeatureDialogFragment.kt
index 9632021cd..7072b58f9 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/UnavailableFeatureDialogFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/UnavailableFeatureDialogFragment.kt
@@ -22,12 +22,12 @@ package com.kunzisoft.keepass.activities.dialogs
import android.app.Dialog
import android.os.Build
import android.os.Bundle
-import androidx.fragment.app.DialogFragment
-import androidx.appcompat.app.AlertDialog
import android.text.SpannableStringBuilder
import android.text.method.LinkMovementMethod
import android.widget.TextView
+import androidx.appcompat.app.AlertDialog
import androidx.core.text.HtmlCompat
+import androidx.fragment.app.DialogFragment
import com.kunzisoft.keepass.R
class UnavailableFeatureDialogFragment : DialogFragment() {
diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt
index 3ecb9eabf..2688700eb 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseModeActivity.kt
@@ -9,7 +9,7 @@ import com.kunzisoft.keepass.activities.helpers.SpecialMode
import com.kunzisoft.keepass.activities.helpers.TypeMode
import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.settings.PreferencesUtil
-import com.kunzisoft.keepass.view.SpecialModeView
+import com.kunzisoft.keepass.view.ToolbarSpecial
/**
@@ -20,7 +20,7 @@ abstract class DatabaseModeActivity : DatabaseActivity() {
protected var mSpecialMode: SpecialMode = SpecialMode.DEFAULT
private var mTypeMode: TypeMode = TypeMode.DEFAULT
- private var mSpecialModeView: SpecialModeView? = null
+ private var mToolbarSpecial: ToolbarSpecial? = null
override fun onBackPressed() {
if (mSpecialMode != SpecialMode.DEFAULT)
@@ -113,8 +113,8 @@ abstract class DatabaseModeActivity : DatabaseActivity() {
?: EntrySelectionHelper.retrieveSearchInfoFromIntent(intent)
// To show the selection mode
- mSpecialModeView = findViewById(R.id.special_mode_view)
- mSpecialModeView?.apply {
+ mToolbarSpecial = findViewById(R.id.special_mode_view)
+ mToolbarSpecial?.apply {
// Populate title
val selectionModeStringId = when (mSpecialMode) {
SpecialMode.DEFAULT, // Not important because hidden
diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt
index f87576716..5e39ebf00 100644
--- a/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/adapters/BreadcrumbAdapter.kt
@@ -39,10 +39,10 @@ class BreadcrumbAdapter(val context: Context)
mShowNumberEntries = PreferencesUtil.showNumberEntries(context)
mShowUUID = PreferencesUtil.showUUID(context)
- // Retrieve the textColor to tint the icon
- val taTextColor = context.theme.obtainStyledAttributes(intArrayOf(R.attr.textColorInverse))
- mIconColor = taTextColor.getColor(0, Color.WHITE)
- taTextColor.recycle()
+ // Retrieve the color to tint the icon
+ val taIconColor = context.theme.obtainStyledAttributes(intArrayOf(R.attr.colorOnSurface))
+ mIconColor = taIconColor.getColor(0, Color.WHITE)
+ taIconColor.recycle()
}
@SuppressLint("NotifyDataSetChanged")
@@ -71,7 +71,7 @@ class BreadcrumbAdapter(val context: Context)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BreadcrumbGroupViewHolder {
return BreadcrumbGroupViewHolder(inflater.inflate(
when (viewType) {
- 0 -> R.layout.item_group
+ 0 -> R.layout.item_breadcrumb_important
else -> R.layout.item_breadcrumb
}, parent, false)
)
diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt
index 6d9f9dab7..deb11bb98 100644
--- a/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt
@@ -27,9 +27,9 @@ import android.util.TypedValue
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
-import android.widget.ProgressBar
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.progressindicator.CircularProgressIndicator
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.ImageViewerActivity
import com.kunzisoft.keepass.database.ContextualDatabase
@@ -38,6 +38,7 @@ import com.kunzisoft.keepass.database.helper.getLocalizedName
import com.kunzisoft.keepass.model.AttachmentState
import com.kunzisoft.keepass.model.EntryAttachmentState
import com.kunzisoft.keepass.model.StreamDirection
+import com.kunzisoft.keepass.services.AttachmentFileNotificationService.Companion.FILE_PROGRESSION_MAX
import com.kunzisoft.keepass.tasks.BinaryDatabaseManager
import com.kunzisoft.keepass.view.expand
import kotlin.math.max
@@ -138,6 +139,7 @@ class EntryAttachmentsItemsAdapter(context: Context)
visibility = View.GONE
}
}
+ holder.binaryFileProgress.max = FILE_PROGRESSION_MAX
when (entryAttachmentState.streamDirection) {
StreamDirection.UPLOAD -> {
holder.binaryFileProgressIcon.isActivated = true
@@ -182,7 +184,7 @@ class EntryAttachmentsItemsAdapter(context: Context)
AttachmentState.START,
AttachmentState.IN_PROGRESS -> View.VISIBLE
}
- progress = entryAttachmentState.downloadProgression
+ setProgressCompat(entryAttachmentState.downloadProgression, true)
}
holder.binaryFileInfo.setOnClickListener {
onItemClickListener?.invoke(entryAttachmentState)
@@ -201,7 +203,7 @@ class EntryAttachmentsItemsAdapter(context: Context)
var binaryFileCompression: TextView = itemView.findViewById(R.id.item_attachment_compression)
var binaryFileProgressContainer: View = itemView.findViewById(R.id.item_attachment_progress_container)
var binaryFileProgressIcon: ImageView = itemView.findViewById(R.id.item_attachment_icon)
- var binaryFileProgress: ProgressBar = itemView.findViewById(R.id.item_attachment_progress)
+ var binaryFileProgress: CircularProgressIndicator = itemView.findViewById(R.id.item_attachment_progress)
var binaryFileDeleteButton: View = itemView.findViewById(R.id.item_attachment_delete_button)
}
}
diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt
index 0d16635a7..7ebdb54f5 100644
--- a/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt
@@ -23,12 +23,14 @@ import android.content.Context
import android.graphics.Color
import android.graphics.PorterDuff
import android.net.Uri
-import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.*
-import androidx.annotation.ColorInt
+import android.widget.CompoundButton
+import android.widget.EditText
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.ViewSwitcher
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.SortedList
import androidx.recyclerview.widget.SortedListAdapterCallback
@@ -84,20 +86,6 @@ class FileDatabaseHistoryAdapter(context: Context)
}
)
- @ColorInt
- private val defaultColor: Int
- @ColorInt
- private val warningColor: Int
-
- init {
- val typedValue = TypedValue()
- val theme = context.theme
- theme.resolveAttribute(R.attr.colorAccent, typedValue, true)
- warningColor = typedValue.data
- theme.resolveAttribute(android.R.attr.textColorHintInverse, typedValue, true)
- defaultColor = typedValue.data
- }
-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FileDatabaseHistoryViewHolder {
val view = inflater.inflate(R.layout.item_file_info, parent, false)
return FileDatabaseHistoryViewHolder(view)
diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt
index 61a1eaaab..8eb46ad33 100644
--- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt
@@ -20,6 +20,7 @@
package com.kunzisoft.keepass.adapters
import android.content.Context
+import android.content.res.ColorStateList
import android.graphics.Color
import android.util.Log
import android.util.TypedValue
@@ -29,6 +30,7 @@ import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.ColorInt
+import androidx.core.view.ViewCompat
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.SortedList
import androidx.recyclerview.widget.SortedListAdapterCallback
@@ -88,6 +90,8 @@ class NodesAdapter (
private var mNodeClickCallback: NodeClickCallback? = null
private var mClipboardHelper = ClipboardHelper(context)
+ @ColorInt
+ private val mColorSurfaceContainer: Int
@ColorInt
private val mTextColorPrimary: Int
@ColorInt
@@ -95,9 +99,9 @@ class NodesAdapter (
@ColorInt
private val mTextColorSecondary: Int
@ColorInt
- private val mColorAccentLight: Int
+ private val mColorSecondary: Int
@ColorInt
- private val mColorOnAccentColor: Int
+ private val mColorOnSecondary: Int
/**
* Determine if the adapter contains or not any element
@@ -114,6 +118,9 @@ class NodesAdapter (
this.mNodeSortedListCallback = NodeSortedListCallback()
this.mNodeSortedList = SortedList(Node::class.java, mNodeSortedListCallback)
+ val taColorSurfaceContainer = context.theme.obtainStyledAttributes(intArrayOf(R.attr.colorSurfaceContainer))
+ this.mColorSurfaceContainer = taColorSurfaceContainer.getColor(0, Color.BLACK)
+ taColorSurfaceContainer.recycle()
// Retrieve the color to tint the icon
val taTextColorPrimary = context.theme.obtainStyledAttributes(intArrayOf(android.R.attr.textColorPrimary))
this.mTextColorPrimary = taTextColorPrimary.getColor(0, Color.BLACK)
@@ -127,13 +134,13 @@ class NodesAdapter (
this.mTextColorSecondary = taTextColorSecondary.getColor(0, Color.BLACK)
taTextColorSecondary.recycle()
// To get background color for selection
- val taColorAccentLight = context.theme.obtainStyledAttributes(intArrayOf(R.attr.colorAccentLight))
- this.mColorAccentLight = taColorAccentLight.getColor(0, Color.GRAY)
- taColorAccentLight.recycle()
+ val taColorSecondary = context.theme.obtainStyledAttributes(intArrayOf(R.attr.colorSecondary))
+ this.mColorSecondary = taColorSecondary.getColor(0, Color.GRAY)
+ taColorSecondary.recycle()
// To get text color for selection
- val taColorOnAccentColor = context.theme.obtainStyledAttributes(intArrayOf(R.attr.colorOnAccentColor))
- this.mColorOnAccentColor = taColorOnAccentColor.getColor(0, Color.WHITE)
- taColorOnAccentColor.recycle()
+ val taColorOnSecondary = context.theme.obtainStyledAttributes(intArrayOf(R.attr.colorOnSecondary))
+ this.mColorOnSecondary = taColorOnSecondary.getColor(0, Color.WHITE)
+ taColorOnSecondary.recycle()
}
private fun assignPreferences() {
@@ -380,10 +387,10 @@ class NodesAdapter (
// Assign icon colors
var iconColor = if (holder.container.isSelected)
- mColorOnAccentColor
+ mColorOnSecondary
else when (subNode.type) {
- Type.GROUP -> mTextColorPrimary
- Type.ENTRY -> mTextColor
+ Type.GROUP -> mTextColor
+ Type.ENTRY -> mColorSecondary
}
// Specific elements for entry
@@ -428,16 +435,8 @@ class NodesAdapter (
if (entry.containsAttachment()) View.VISIBLE else View.GONE
// Assign colors
- val backgroundColor = if (mShowEntryColors) entry.backgroundColor else null
- if (!holder.container.isSelected) {
- if (backgroundColor != null) {
- holder.container.setBackgroundColor(backgroundColor)
- } else {
- holder.container.setBackgroundColor(Color.TRANSPARENT)
- }
- } else {
- holder.container.setBackgroundColor(mColorAccentLight)
- }
+ assignBackgroundColor(holder.container, entry)
+ assignBackgroundColor(holder.otpContainer, entry)
val foregroundColor = if (mShowEntryColors) entry.foregroundColor else null
if (!holder.container.isSelected) {
if (foregroundColor != null) {
@@ -457,12 +456,12 @@ class NodesAdapter (
holder.meta.setTextColor(mTextColor)
}
} else {
- holder.text.setTextColor(mColorOnAccentColor)
- holder.subText?.setTextColor(mColorOnAccentColor)
- holder.otpToken?.setTextColor(mColorOnAccentColor)
- holder.otpProgress?.setIndicatorColor(mColorOnAccentColor)
- holder.attachmentIcon?.setColorFilter(mColorOnAccentColor)
- holder.meta.setTextColor(mColorOnAccentColor)
+ holder.text.setTextColor(mColorOnSecondary)
+ holder.subText?.setTextColor(mColorOnSecondary)
+ holder.otpToken?.setTextColor(mColorOnSecondary)
+ holder.otpProgress?.setIndicatorColor(mColorOnSecondary)
+ holder.attachmentIcon?.setColorFilter(mColorOnSecondary)
+ holder.meta.setTextColor(mColorOnSecondary)
}
database.stopManageEntry(entry)
@@ -528,7 +527,8 @@ class NodesAdapter (
try {
mClipboardHelper.copyToClipboard(
TemplateField.getLocalizedName(context, TemplateField.LABEL_TOKEN),
- token
+ token,
+ true
)
} catch (e: Exception) {
Log.e(TAG, "Unable to copy the OTP token", e)
@@ -537,6 +537,22 @@ class NodesAdapter (
}
}
+ private fun assignBackgroundColor(view: View?, entry: Entry) {
+ view?.let {
+ ViewCompat.setBackgroundTintList(
+ view,
+ ColorStateList.valueOf(
+ if (!view.isSelected) {
+ (if (mShowEntryColors) entry.backgroundColor else null)
+ ?: mColorSurfaceContainer
+ } else {
+ mColorSecondary
+ }
+ )
+ )
+ }
+ }
+
class OtpRunnable(val view: View?): Runnable {
var action: (() -> Unit)? = null
diff --git a/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt b/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt
index baffaf973..50dcb7472 100644
--- a/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt
@@ -221,8 +221,6 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
allowOpenBiometricPrompt = true
if (PreferencesUtil.isBiometricUnlockEnable(context)) {
- mAdvancedUnlockInfoView?.setIconResource(R.drawable.fingerprint)
-
// biometric not supported (by API level or hardware) so keep option hidden
// or manually disable
val biometricCanAuthenticate = AdvancedUnlockManager.canAuthenticate(context)
@@ -241,7 +239,6 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU
}
}
} else if (PreferencesUtil.isDeviceCredentialUnlockEnable(context)) {
- mAdvancedUnlockInfoView?.setIconResource(R.drawable.bolt)
if (AdvancedUnlockManager.isDeviceSecure(context)) {
selectMode()
} else {
@@ -297,12 +294,12 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU
private fun initNotAvailable() {
showViews(false)
- mAdvancedUnlockInfoView?.setIconViewClickListener(false, null)
+ mAdvancedUnlockInfoView?.setIconViewClickListener(null)
}
@RequiresApi(Build.VERSION_CODES.M)
private fun openBiometricSetting() {
- mAdvancedUnlockInfoView?.setIconViewClickListener(false) {
+ mAdvancedUnlockInfoView?.setIconViewClickListener {
try {
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
@@ -351,11 +348,11 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU
@RequiresApi(Build.VERSION_CODES.M)
private fun initWaitData() {
showViews(true)
- setAdvancedUnlockedTitleView(R.string.no_credentials_stored)
+ setAdvancedUnlockedTitleView(R.string.unavailable)
setAdvancedUnlockedMessageView("")
context?.let { context ->
- mAdvancedUnlockInfoView?.setIconViewClickListener(false) {
+ mAdvancedUnlockInfoView?.setIconViewClickListener {
onAuthenticationError(BiometricPrompt.ERROR_UNABLE_TO_PROCESS,
context.getString(R.string.credential_before_click_advanced_unlock_button))
}
@@ -382,7 +379,7 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU
@RequiresApi(Build.VERSION_CODES.M)
private fun initEncryptData() {
showViews(true)
- setAdvancedUnlockedTitleView(R.string.open_advanced_unlock_prompt_store_credential)
+ setAdvancedUnlockedTitleView(R.string.unlock_and_link_biometric)
setAdvancedUnlockedMessageView("")
advancedUnlockManager?.initEncryptData { cryptoPrompt ->
@@ -396,7 +393,7 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU
@RequiresApi(Build.VERSION_CODES.M)
private fun initDecryptData() {
showViews(true)
- setAdvancedUnlockedTitleView(R.string.open_advanced_unlock_prompt_unlock_database)
+ setAdvancedUnlockedTitleView(R.string.unlock)
setAdvancedUnlockedMessageView("")
advancedUnlockManager?.let { unlockHelper ->
@@ -629,7 +626,7 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU
@RequiresApi(Build.VERSION_CODES.M)
private fun setAdvancedUnlockedMessageView(text: CharSequence) {
lifecycleScope.launch(Dispatchers.Main) {
- mAdvancedUnlockInfoView?.message = text
+ mAdvancedUnlockInfoView?.setMessage(text)
}
}
diff --git a/app/src/main/java/com/kunzisoft/keepass/biometric/FingerPrintAnimatedVector.kt b/app/src/main/java/com/kunzisoft/keepass/biometric/FingerPrintAnimatedVector.kt
deleted file mode 100644
index 8ee09f349..000000000
--- a/app/src/main/java/com/kunzisoft/keepass/biometric/FingerPrintAnimatedVector.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2019 Jeremy Jamet / Kunzisoft.
- *
- * This file is part of KeePassDX.
- *
- * KeePassDX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * KeePassDX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with KeePassDX. If not, see .
- *
- */
-package com.kunzisoft.keepass.biometric
-
-import android.content.Context
-import android.graphics.drawable.Drawable
-import android.os.Build
-import androidx.annotation.RequiresApi
-import android.widget.ImageView
-import androidx.vectordrawable.graphics.drawable.Animatable2Compat
-import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
-
-import com.kunzisoft.keepass.R
-
-@RequiresApi(api = Build.VERSION_CODES.M)
-class FingerPrintAnimatedVector(context: Context, imageView: ImageView) {
-
- private val scanFingerprint: AnimatedVectorDrawableCompat? =
- AnimatedVectorDrawableCompat.create(context, R.drawable.scan_fingerprint)
-
- init {
- imageView.setImageDrawable(scanFingerprint)
- }
-
- private var animationCallback = object : Animatable2Compat.AnimationCallback() {
- override fun onAnimationEnd(drawable: Drawable) {
- imageView.post {
- scanFingerprint?.start()
- }
- }
- }
-
- fun startScan() {
- scanFingerprint?.registerAnimationCallback(animationCallback)
-
- if (scanFingerprint?.isRunning != true)
- scanFingerprint?.start()
- }
-
- fun stopScan() {
- scanFingerprint?.unregisterAnimationCallback(animationCallback)
-
- if (scanFingerprint?.isRunning == true)
- scanFingerprint.stop()
- }
-}
diff --git a/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt
index df50724c1..ad7022312 100644
--- a/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/database/DatabaseTaskProvider.kt
@@ -20,7 +20,6 @@
package com.kunzisoft.keepass.database
import android.Manifest
-import android.app.AlertDialog
import android.content.BroadcastReceiver
import android.content.ComponentName
import android.content.Context
@@ -38,6 +37,7 @@ import android.os.IBinder
import android.util.Log
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
+import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity
@@ -107,7 +107,7 @@ class DatabaseTaskProvider(
// To show dialog only if context is an activity
private var activity: FragmentActivity? = try { context as? FragmentActivity? }
- catch (_: Exception) { null }
+ catch (_: Exception) { null }
var onDatabaseRetrieved: ((database: ContextualDatabase?) -> Unit)? = null
@@ -252,12 +252,10 @@ class DatabaseTaskProvider(
serviceConnection = object : ServiceConnection {
override fun onBindingDied(name: ComponentName?) {
stopDialog()
- super.onBindingDied(name)
}
override fun onNullBinding(name: ComponentName?) {
stopDialog()
- super.onNullBinding(name)
}
override fun onServiceConnected(name: ComponentName?, serviceBinder: IBinder?) {
@@ -323,10 +321,10 @@ class DatabaseTaskProvider(
}
}
context.registerReceiver(databaseTaskBroadcastReceiver,
- IntentFilter().apply {
- addAction(DATABASE_START_TASK_ACTION)
- addAction(DATABASE_STOP_TASK_ACTION)
- }
+ IntentFilter().apply {
+ addAction(DATABASE_START_TASK_ACTION)
+ addAction(DATABASE_STOP_TASK_ACTION)
+ }
)
// Check if a service is currently running else do nothing
@@ -350,12 +348,12 @@ class DatabaseTaskProvider(
private val requestPermissionLauncher = activity?.registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { _ ->
- // Whether or not the user has accepted, the service can be started,
- // There just won't be any notification if it's not allowed.
- tempServiceParameters.removeFirstOrNull()?.let {
- startService(it.first, it.second)
- }
+ // Whether or not the user has accepted, the service can be started,
+ // There just won't be any notification if it's not allowed.
+ tempServiceParameters.removeFirstOrNull()?.let {
+ startService(it.first, it.second)
}
+ }
private fun start(bundle: Bundle? = null, actionTask: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
@@ -372,7 +370,7 @@ class DatabaseTaskProvider(
// it's not the first time, so the user deliberately chooses not to display the notification
startService(bundle, actionTask)
} else {
- AlertDialog.Builder(activity)
+ AlertDialog.Builder(context)
.setMessage(R.string.warning_database_notification_permission)
.setNegativeButton(R.string.later) { _, _ ->
// Refuses the notification, so start the service
@@ -414,7 +412,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri)
putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential)
}
- , ACTION_DATABASE_CREATE_TASK)
+ , ACTION_DATABASE_CREATE_TASK)
}
fun startDatabaseLoad(databaseUri: Uri,
@@ -429,7 +427,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.CIPHER_DATABASE_KEY, cipherEncryptDatabase)
putBoolean(DatabaseTaskNotificationService.FIX_DUPLICATE_UUID_KEY, fixDuplicateUuid)
}
- , ACTION_DATABASE_LOAD_TASK)
+ , ACTION_DATABASE_LOAD_TASK)
}
fun startDatabaseMerge(save: Boolean,
@@ -447,7 +445,7 @@ class DatabaseTaskProvider(
start(Bundle().apply {
putBoolean(DatabaseTaskNotificationService.FIX_DUPLICATE_UUID_KEY, fixDuplicateUuid)
}
- , ACTION_DATABASE_RELOAD_TASK)
+ , ACTION_DATABASE_RELOAD_TASK)
}
fun askToStartDatabaseReload(conditionToAsk: Boolean, approved: () -> Unit) {
@@ -471,7 +469,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, databaseUri)
putParcelable(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY, mainCredential)
}
- , ACTION_DATABASE_ASSIGN_CREDENTIAL_TASK)
+ , ACTION_DATABASE_ASSIGN_CREDENTIAL_TASK)
}
/*
@@ -488,7 +486,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.PARENT_ID_KEY, parent.nodeId)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_CREATE_GROUP_TASK)
+ , ACTION_DATABASE_CREATE_GROUP_TASK)
}
fun startDatabaseUpdateGroup(oldGroup: Group,
@@ -499,7 +497,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.GROUP_KEY, groupToUpdate)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_GROUP_TASK)
+ , ACTION_DATABASE_UPDATE_GROUP_TASK)
}
fun startDatabaseCreateEntry(newEntry: Entry,
@@ -510,7 +508,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.PARENT_ID_KEY, parent.nodeId)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_CREATE_ENTRY_TASK)
+ , ACTION_DATABASE_CREATE_ENTRY_TASK)
}
fun startDatabaseUpdateEntry(oldEntry: Entry,
@@ -521,7 +519,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.ENTRY_KEY, entryToUpdate)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_ENTRY_TASK)
+ , ACTION_DATABASE_UPDATE_ENTRY_TASK)
}
private fun startDatabaseActionListNodes(actionTask: String,
@@ -550,7 +548,7 @@ class DatabaseTaskProvider(
putParcelable(DatabaseTaskNotificationService.PARENT_ID_KEY, newParentId)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , actionTask)
+ , actionTask)
}
fun startDatabaseCopyNodes(nodesToCopy: List,
@@ -584,7 +582,7 @@ class DatabaseTaskProvider(
putInt(DatabaseTaskNotificationService.ENTRY_HISTORY_POSITION_KEY, entryHistoryPosition)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_RESTORE_ENTRY_HISTORY)
+ , ACTION_DATABASE_RESTORE_ENTRY_HISTORY)
}
fun startDatabaseDeleteEntryHistory(mainEntryId: NodeId,
@@ -595,7 +593,7 @@ class DatabaseTaskProvider(
putInt(DatabaseTaskNotificationService.ENTRY_HISTORY_POSITION_KEY, entryHistoryPosition)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_DELETE_ENTRY_HISTORY)
+ , ACTION_DATABASE_DELETE_ENTRY_HISTORY)
}
/*
@@ -612,7 +610,7 @@ class DatabaseTaskProvider(
putString(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newName)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_NAME_TASK)
+ , ACTION_DATABASE_UPDATE_NAME_TASK)
}
fun startDatabaseSaveDescription(oldDescription: String,
@@ -623,7 +621,7 @@ class DatabaseTaskProvider(
putString(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newDescription)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_DESCRIPTION_TASK)
+ , ACTION_DATABASE_UPDATE_DESCRIPTION_TASK)
}
fun startDatabaseSaveDefaultUsername(oldDefaultUsername: String,
@@ -634,7 +632,7 @@ class DatabaseTaskProvider(
putString(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newDefaultUsername)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK)
+ , ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK)
}
fun startDatabaseSaveColor(oldColor: String,
@@ -645,7 +643,7 @@ class DatabaseTaskProvider(
putString(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newColor)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_COLOR_TASK)
+ , ACTION_DATABASE_UPDATE_COLOR_TASK)
}
fun startDatabaseSaveCompression(oldCompression: CompressionAlgorithm,
@@ -656,14 +654,14 @@ class DatabaseTaskProvider(
putSerializable(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newCompression)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_COMPRESSION_TASK)
+ , ACTION_DATABASE_UPDATE_COMPRESSION_TASK)
}
fun startDatabaseRemoveUnlinkedData(save: Boolean) {
start(Bundle().apply {
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK)
+ , ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK)
}
fun startDatabaseSaveRecycleBin(oldRecycleBin: Group?,
@@ -696,7 +694,7 @@ class DatabaseTaskProvider(
putInt(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newMaxHistoryItems)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK)
+ , ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK)
}
fun startDatabaseSaveMaxHistorySize(oldMaxHistorySize: Long,
@@ -707,7 +705,7 @@ class DatabaseTaskProvider(
putLong(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newMaxHistorySize)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_MAX_HISTORY_SIZE_TASK)
+ , ACTION_DATABASE_UPDATE_MAX_HISTORY_SIZE_TASK)
}
/*
@@ -724,7 +722,7 @@ class DatabaseTaskProvider(
putSerializable(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newEncryption)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_ENCRYPTION_TASK)
+ , ACTION_DATABASE_UPDATE_ENCRYPTION_TASK)
}
fun startDatabaseSaveKeyDerivation(oldKeyDerivation: KdfEngine,
@@ -735,7 +733,7 @@ class DatabaseTaskProvider(
putSerializable(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newKeyDerivation)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK)
+ , ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK)
}
fun startDatabaseSaveIterations(oldIterations: Long,
@@ -746,7 +744,7 @@ class DatabaseTaskProvider(
putLong(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newIterations)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_ITERATIONS_TASK)
+ , ACTION_DATABASE_UPDATE_ITERATIONS_TASK)
}
fun startDatabaseSaveMemoryUsage(oldMemoryUsage: Long,
@@ -757,7 +755,7 @@ class DatabaseTaskProvider(
putLong(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newMemoryUsage)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK)
+ , ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK)
}
fun startDatabaseSaveParallelism(oldParallelism: Long,
@@ -768,7 +766,7 @@ class DatabaseTaskProvider(
putLong(DatabaseTaskNotificationService.NEW_ELEMENT_KEY, newParallelism)
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
}
- , ACTION_DATABASE_UPDATE_PARALLELISM_TASK)
+ , ACTION_DATABASE_UPDATE_PARALLELISM_TASK)
}
/**
@@ -779,14 +777,14 @@ class DatabaseTaskProvider(
putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save)
putParcelable(DatabaseTaskNotificationService.DATABASE_URI_KEY, saveToUri)
}
- , ACTION_DATABASE_SAVE)
+ , ACTION_DATABASE_SAVE)
}
fun startChallengeResponded(response: ByteArray?) {
start(Bundle().apply {
putByteArray(DatabaseTaskNotificationService.DATA_BYTES, response)
}
- , ACTION_CHALLENGE_RESPONDED)
+ , ACTION_CHALLENGE_RESPONDED)
}
companion object {
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 782b7428f..81e8d9b40 100644
--- a/app/src/main/java/com/kunzisoft/keepass/education/Education.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/education/Education.kt
@@ -98,7 +98,7 @@ open class Education(val activity: Activity) {
}
protected fun getCircleColor(): Int {
- val typedArray = activity.obtainStyledAttributes(intArrayOf(R.attr.educationCircleColor))
+ val typedArray = activity.obtainStyledAttributes(intArrayOf(R.attr.colorPrimaryContainer))
val colorControl = typedArray.getColor(0, Color.GREEN)
typedArray.recycle()
return colorControl
@@ -109,7 +109,7 @@ open class Education(val activity: Activity) {
}
protected fun getTextColor(): Int {
- val typedArray = activity.obtainStyledAttributes(intArrayOf(R.attr.educationTextColor))
+ val typedArray = activity.obtainStyledAttributes(intArrayOf(R.attr.colorOnPrimaryContainer))
val colorControl = typedArray.getColor(0, Color.WHITE)
typedArray.recycle()
return colorControl
diff --git a/app/src/main/java/com/kunzisoft/keepass/education/PasswordActivityEducation.kt b/app/src/main/java/com/kunzisoft/keepass/education/PasswordActivityEducation.kt
index dc4afd1d9..805e768c0 100644
--- a/app/src/main/java/com/kunzisoft/keepass/education/PasswordActivityEducation.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/education/PasswordActivityEducation.kt
@@ -93,8 +93,9 @@ class PasswordActivityEducation(activity: Activity)
activity.getString(R.string.education_advanced_unlock_summary))
.outerCircleColorInt(getCircleColor())
.outerCircleAlpha(getCircleAlpha())
+ .icon(ContextCompat.getDrawable(activity, R.drawable.ic_fingerprint_24))
.textColorInt(getTextColor())
- .tintTarget(false)
+ .tintTarget(true)
.cancelable(true),
object : TapTargetView.Listener() {
override fun onTargetClick(view: TapTargetView) {
diff --git a/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt
index b79c65ab5..c15e7988c 100644
--- a/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/services/AttachmentFileNotificationService.kt
@@ -240,10 +240,10 @@ class AttachmentFileNotificationService: LockNotificationService() {
setOngoing(true)
}
AttachmentState.IN_PROGRESS -> {
- if (attachmentNotification.entryAttachmentState.downloadProgression > 100) {
+ if (attachmentNotification.entryAttachmentState.downloadProgression > FILE_PROGRESSION_MAX) {
setContentText(getString(R.string.download_finalization))
} else {
- setProgress(100,
+ setProgress(FILE_PROGRESSION_MAX,
attachmentNotification.entryAttachmentState.downloadProgression,
false)
setContentText(getString(R.string.download_progression,
@@ -446,7 +446,7 @@ class AttachmentFileNotificationService: LockNotificationService() {
if (downloadState != AttachmentState.CANCELED
&& downloadState != AttachmentState.ERROR) {
downloadState = AttachmentState.COMPLETE
- downloadProgression = 100
+ downloadProgression = FILE_PROGRESSION_MAX
}
}
attachmentNotification.attachmentFileAction = null
@@ -495,6 +495,8 @@ class AttachmentFileNotificationService: LockNotificationService() {
const val FILE_URI_KEY = "FILE_URI_KEY"
const val ATTACHMENT_KEY = "ATTACHMENT_KEY"
+
+ const val FILE_PROGRESSION_MAX = 100
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsAdvancedUnlockActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/AdvancedUnlockSettingsActivity.kt
similarity index 95%
rename from app/src/main/java/com/kunzisoft/keepass/settings/SettingsAdvancedUnlockActivity.kt
rename to app/src/main/java/com/kunzisoft/keepass/settings/AdvancedUnlockSettingsActivity.kt
index 8ff82df74..c74e0160b 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsAdvancedUnlockActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/AdvancedUnlockSettingsActivity.kt
@@ -23,7 +23,7 @@ import android.os.Bundle
import androidx.fragment.app.Fragment
-class SettingsAdvancedUnlockActivity : SettingsActivity() {
+class AdvancedUnlockSettingsActivity : SettingsActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/AppearanceSettingsActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/AppearanceSettingsActivity.kt
new file mode 100644
index 000000000..87efa3961
--- /dev/null
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/AppearanceSettingsActivity.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2019 Jeremy Jamet / Kunzisoft.
+ *
+ * This file is part of KeePassDX.
+ *
+ * KeePassDX is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * KeePassDX is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with KeePassDX. If not, see .
+ *
+ */
+package com.kunzisoft.keepass.settings
+
+import android.os.Bundle
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+
+
+class AppearanceSettingsActivity : SettingsActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ mTimeoutEnable = false
+ setTitle(NestedSettingsFragment.Screen.APPEARANCE)
+ }
+
+ override fun retrieveMainFragment(): Fragment {
+ return NestedSettingsFragment.newInstance(NestedSettingsFragment.Screen.APPEARANCE)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsFragment.kt
index 1e9fa538a..abd8445e9 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsFragment.kt
@@ -24,7 +24,7 @@ import android.os.Bundle
import androidx.fragment.app.DialogFragment
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
-import androidx.preference.SwitchPreference
+import androidx.preference.TwoStatePreference
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.settings.preferencedialogfragment.AutofillBlocklistAppIdPreferenceDialogFragmentCompat
import com.kunzisoft.keepass.settings.preferencedialogfragment.AutofillBlocklistWebDomainPreferenceDialogFragmentCompat
@@ -35,7 +35,7 @@ class AutofillSettingsFragment : PreferenceFragmentCompat() {
// Load the preferences from an XML resource
setPreferencesFromResource(R.xml.preferences_autofill, rootKey)
- val autofillInlineSuggestionsPreference: SwitchPreference? = findPreference(getString(R.string.autofill_inline_suggestions_key))
+ val autofillInlineSuggestionsPreference: TwoStatePreference? = findPreference(getString(R.string.autofill_inline_suggestions_key))
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
autofillInlineSuggestionsPreference?.isVisible = false
}
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt
index 0e0696858..11328513e 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/MainPreferenceFragment.kt
@@ -24,6 +24,7 @@ import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import androidx.preference.Preference
+import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
@@ -60,6 +61,9 @@ class MainPreferenceFragment : PreferenceFragmentCompat() {
private fun checkDatabaseLoaded() {
findPreference(getString(R.string.settings_database_key))
?.isEnabled = mDatabaseLoaded
+
+ findPreference(getString(R.string.settings_database_category_key))
+ ?.isVisible = mDatabaseLoaded
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
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 c67615c42..ed2476e2f 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedAppSettingsFragment.kt
@@ -34,7 +34,7 @@ import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentActivity
import androidx.preference.ListPreference
import androidx.preference.Preference
-import androidx.preference.SwitchPreference
+import androidx.preference.TwoStatePreference
import com.kunzisoft.keepass.BuildConfig
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.ProFeatureDialogFragment
@@ -119,14 +119,14 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
activity?.let { activity ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- val autoFillEnablePreference: SwitchPreference? = findPreference(getString(R.string.settings_autofill_enable_key))
+ val autoFillEnablePreference: TwoStatePreference? = findPreference(getString(R.string.settings_autofill_enable_key))
val autofillManager = activity.getSystemService(AutofillManager::class.java)
if (autofillManager != null && autofillManager.hasEnabledAutofillServices())
autoFillEnablePreference?.isChecked = autofillManager.hasEnabledAutofillServices()
autoFillEnablePreference?.onPreferenceClickListener = object : Preference.OnPreferenceClickListener {
@RequiresApi(api = Build.VERSION_CODES.O)
override fun onPreferenceClick(preference: Preference): Boolean {
- if ((preference as SwitchPreference).isChecked) {
+ if ((preference as TwoStatePreference).isChecked) {
try {
enableService()
} catch (e: ActivityNotFoundException) {
@@ -208,14 +208,13 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
false
}
- val copyPasswordPreference: SwitchPreference? = findPreference(getString(R.string.allow_copy_password_key))
+ val copyPasswordPreference: TwoStatePreference? = findPreference(getString(R.string.allow_copy_password_key))
copyPasswordPreference?.setOnPreferenceChangeListener { _, newValue ->
if (newValue as Boolean && context != null) {
val message = getString(R.string.allow_copy_password_warning) +
"\n\n" +
getString(R.string.clipboard_warning)
- AlertDialog
- .Builder(requireContext())
+ AlertDialog.Builder(requireContext())
.setMessage(message)
.create()
.apply {
@@ -240,10 +239,10 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
activity?.let { activity ->
- val biometricUnlockEnablePreference: SwitchPreference? = findPreference(getString(R.string.biometric_unlock_enable_key))
- val deviceCredentialUnlockEnablePreference: SwitchPreference? = findPreference(getString(R.string.device_credential_unlock_enable_key))
- val autoOpenPromptPreference: SwitchPreference? = findPreference(getString(R.string.biometric_auto_open_prompt_key))
- val tempAdvancedUnlockPreference: SwitchPreference? = findPreference(getString(R.string.temp_advanced_unlock_enable_key))
+ val biometricUnlockEnablePreference: TwoStatePreference? = findPreference(getString(R.string.biometric_unlock_enable_key))
+ val deviceCredentialUnlockEnablePreference: TwoStatePreference? = findPreference(getString(R.string.device_credential_unlock_enable_key))
+ val autoOpenPromptPreference: TwoStatePreference? = findPreference(getString(R.string.biometric_auto_open_prompt_key))
+ val tempAdvancedUnlockPreference: TwoStatePreference? = findPreference(getString(R.string.temp_advanced_unlock_enable_key))
val biometricUnlockSupported = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
AdvancedUnlockManager.biometricUnlockSupported(activity)
@@ -253,7 +252,7 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
if (!biometricUnlockSupported) {
isChecked = false
setOnPreferenceClickListener { preference ->
- (preference as SwitchPreference).isChecked = false
+ (preference as TwoStatePreference).isChecked = false
UnavailableFeatureDialogFragment.getInstance(Build.VERSION_CODES.M)
.show(parentFragmentManager, "unavailableFeatureDialog")
false
@@ -300,7 +299,7 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
if (!deviceCredentialUnlockSupported) {
isChecked = false
setOnPreferenceClickListener { preference ->
- (preference as SwitchPreference).isChecked = false
+ (preference as TwoStatePreference).isChecked = false
UnavailableFeatureDialogFragment.getInstance(Build.VERSION_CODES.M)
.show(parentFragmentManager, "unavailableFeatureDialog")
false
@@ -523,7 +522,7 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
super.onResume()
activity?.let { activity ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- findPreference(getString(R.string.settings_autofill_enable_key))?.let { autoFillEnablePreference ->
+ findPreference(getString(R.string.settings_autofill_enable_key))?.let { autoFillEnablePreference ->
val autofillManager = activity.getSystemService(AutofillManager::class.java)
autoFillEnablePreference.isChecked = autofillManager != null
&& autofillManager.hasEnabledAutofillServices()
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt
index d8c11720f..080ece82f 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt
@@ -28,7 +28,7 @@ import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
-import androidx.preference.SwitchPreference
+import androidx.preference.TwoStatePreference
import com.kunzisoft.androidclearchroma.ChromaUtil
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.SetMainCredentialDialogFragment
@@ -253,7 +253,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
// Recycle bin
if (database.allowConfigurableRecycleBin) {
- val recycleBinEnablePref: SwitchPreference? = findPreference(getString(R.string.recycle_bin_enable_key))
+ val recycleBinEnablePref: TwoStatePreference? = findPreference(getString(R.string.recycle_bin_enable_key))
recycleBinEnablePref?.apply {
isChecked = database.isRecycleBinEnabled
isEnabled = if (!mDatabaseReadOnly) {
@@ -286,7 +286,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
val templatesGroupPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_templates_key))
templatesGroupPref = findPreference(getString(R.string.templates_group_uuid_key))
if (database.allowTemplatesGroup) {
- val templatesEnablePref: SwitchPreference? = findPreference(getString(R.string.templates_group_enable_key))
+ val templatesEnablePref: TwoStatePreference? = findPreference(getString(R.string.templates_group_enable_key))
templatesEnablePref?.apply {
isChecked = database.isTemplatesEnabled
isEnabled = if (!mDatabaseReadOnly) {
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt
index f7f36b872..814e50d76 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedSettingsFragment.kt
@@ -23,7 +23,7 @@ import android.content.res.Resources
import android.os.Bundle
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
-import androidx.preference.SwitchPreference
+import androidx.preference.TwoStatePreference
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.UnderDevelopmentFeatureDialogFragment
@@ -49,7 +49,7 @@ abstract class NestedSettingsFragment : PreferenceFragmentCompat() {
protected fun preferenceInDevelopment(preferenceInDev: Preference) {
preferenceInDev.setOnPreferenceClickListener { preference ->
try { // don't check if we can
- (preference as SwitchPreference).isChecked = false
+ (preference as TwoStatePreference).isChecked = false
} catch (ignored: Exception) {
}
UnderDevelopmentFeatureDialogFragment().show(parentFragmentManager, "underDevFeatureDialog")
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt
index d88fa8f7f..86c83b36b 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt
@@ -70,7 +70,7 @@ abstract class InputPreferenceDialogFragmentCompat : PreferenceDialogFragmentCom
get() = textUnitView?.text?.toString() ?: ""
set(unitText) {
textUnitView?.apply {
- if (unitText != null && unitText.isNotEmpty()) {
+ if (!unitText.isNullOrEmpty()) {
text = unitText
visibility = View.VISIBLE
} else {
@@ -88,7 +88,7 @@ abstract class InputPreferenceDialogFragmentCompat : PreferenceDialogFragmentCom
get() = textExplanationView?.text?.toString() ?: ""
set(explanationText) {
textExplanationView?.apply {
- if (explanationText != null && explanationText.isNotEmpty()) {
+ if (!explanationText.isNullOrEmpty()) {
text = explanationText
visibility = View.VISIBLE
} else {
@@ -107,7 +107,7 @@ abstract class InputPreferenceDialogFragmentCompat : PreferenceDialogFragmentCom
fun setExplanationButton(explanationButtonText: String?, clickListener: View.OnClickListener) {
explanationButton?.apply {
- if (explanationButtonText != null && explanationButtonText.isNotEmpty()) {
+ if (!explanationButtonText.isNullOrEmpty()) {
text = explanationButtonText
visibility = View.VISIBLE
setOnClickListener(clickListener)
diff --git a/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt b/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt
index 6e92bfb9b..9fce0d822 100644
--- a/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt
@@ -34,7 +34,8 @@ import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.settings.PreferencesUtil
-import java.util.*
+import java.util.Timer
+import java.util.TimerTask
class ClipboardHelper(context: Context) {
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 b123fce8d..910abff0a 100644
--- a/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/view/AddNodeButtonView.kt
@@ -43,7 +43,9 @@ class AddNodeButtonView @JvmOverloads constructor(context: Context,
var addButtonView: FloatingActionButton? = null
private lateinit var addEntryView: View
+ private lateinit var fabAddEntryView: View
private lateinit var addGroupView: View
+ private lateinit var fabAddGroupView: View
private var addEntryEnable: Boolean = false
private var addGroupEnable: Boolean = false
@@ -77,7 +79,9 @@ class AddNodeButtonView @JvmOverloads constructor(context: Context,
addButtonView = findViewById(R.id.add_button)
addEntryView = findViewById(R.id.container_add_entry)
+ fabAddEntryView = findViewById(R.id.fab_add_entry)
addGroupView = findViewById(R.id.container_add_group)
+ fabAddGroupView = findViewById(R.id.fab_add_group)
animationDuration = 300L
@@ -189,24 +193,21 @@ class AddNodeButtonView @JvmOverloads constructor(context: Context,
}
}
+ private fun onButtonClickListener(onClickListener: OnClickListener) =
+ OnClickListener { view ->
+ onClickListener.onClick(view)
+ closeButtonIfOpen()
+ }
+
fun setAddGroupClickListener(onClickListener: OnClickListener) {
- if (addGroupEnable)
- addGroupView.setOnClickListener { view ->
- onClickListener.onClick(view)
- closeButtonIfOpen()
- }
+ if (addGroupEnable) {
+ fabAddGroupView.setOnClickListener(onButtonClickListener(onClickListener))
+ }
}
fun setAddEntryClickListener(onClickListener: OnClickListener) {
if (addEntryEnable) {
- addEntryView.setOnClickListener { view ->
- onClickListener.onClick(view)
- closeButtonIfOpen()
- }
- addEntryView.setOnClickListener { view ->
- onClickListener.onClick(view)
- closeButtonIfOpen()
- }
+ fabAddEntryView.setOnClickListener(onButtonClickListener(onClickListener))
}
}
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 c91a7a9da..083b2be73 100644
--- a/app/src/main/java/com/kunzisoft/keepass/view/AdvancedUnlockInfoView.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/view/AdvancedUnlockInfoView.kt
@@ -23,14 +23,12 @@ import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.view.LayoutInflater
-import android.view.View
-import android.widget.ImageView
+import android.widget.Button
import android.widget.LinearLayout
-import android.widget.TextView
+import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.annotation.StringRes
import com.kunzisoft.keepass.R
-import com.kunzisoft.keepass.biometric.FingerPrintAnimatedVector
@RequiresApi(api = Build.VERSION_CODES.M)
class AdvancedUnlockInfoView @JvmOverloads constructor(context: Context,
@@ -38,83 +36,38 @@ class AdvancedUnlockInfoView @JvmOverloads constructor(context: Context,
defStyle: Int = 0)
: LinearLayout(context, attrs, defStyle) {
- private val unlockContainerView: View
- private var unlockAnimatedVector: FingerPrintAnimatedVector? = null
- private var unlockTitleTextView: TextView? = null
- private var unlockMessageTextView: TextView? = null
- private var unlockIconImageView: ImageView? = null
+ private var biometricButtonView: Button? = null
init {
-
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater?
inflater?.inflate(R.layout.view_advanced_unlock, this)
- unlockContainerView = findViewById(R.id.fingerprint_container)
- unlockTitleTextView = findViewById(R.id.biometric_title)
- unlockMessageTextView = findViewById(R.id.biometric_message)
- unlockIconImageView = findViewById(R.id.biometric_image)
+ biometricButtonView = findViewById(R.id.biometric_button)
}
- private fun startIconViewAnimation() {
- unlockAnimatedVector?.startScan()
- }
-
- private fun stopIconViewAnimation() {
- unlockAnimatedVector?.stopScan()
- }
-
- fun setIconResource(iconId: Int) {
- unlockIconImageView?.setImageResource(iconId)
- // Init the fingerprint animation
- unlockAnimatedVector = when (iconId) {
- R.drawable.fingerprint -> FingerPrintAnimatedVector(context, unlockIconImageView!!)
- else -> null
- }
- }
-
- fun setIconViewClickListener(animation: Boolean = true,
- listener: ((view: View)->Unit)?) {
- var animateButton = animation
- if (listener == null)
- animateButton = false
- if (animateButton) {
- startIconViewAnimation()
- unlockContainerView.alpha = 1f
- } else {
- stopIconViewAnimation()
- unlockContainerView.alpha = 0.8f
- }
- unlockIconImageView?.setOnClickListener(listener)
+ fun setIconViewClickListener(listener: OnClickListener?) {
+ biometricButtonView?.setOnClickListener(listener)
}
var title: CharSequence
get() {
- return unlockTitleTextView?.text?.toString() ?: ""
+ return biometricButtonView?.text?.toString() ?: ""
}
set(value) {
- unlockTitleTextView?.text = value
+ biometricButtonView?.text = value
}
fun setTitle(@StringRes textId: Int) {
title = context.getString(textId)
}
- var message: CharSequence?
- get() {
- return unlockMessageTextView?.text?.toString() ?: ""
- }
- set(value) {
- if (value == null || value.isEmpty()) {
- unlockMessageTextView?.visibility = GONE
- } else {
- unlockMessageTextView?.visibility = VISIBLE
- stopIconViewAnimation()
- }
- unlockMessageTextView?.text = value ?: ""
- }
+ fun setMessage(text: CharSequence) {
+ if (text.isNotEmpty())
+ Toast.makeText(context, text, Toast.LENGTH_LONG).show()
+ }
fun setMessage(@StringRes textId: Int) {
- message = context.getString(textId)
+ Toast.makeText(context, textId, Toast.LENGTH_LONG).show()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/kunzisoft/keepass/view/DataDate.kt b/app/src/main/java/com/kunzisoft/keepass/view/DataDate.kt
deleted file mode 100644
index 24f520198..000000000
--- a/app/src/main/java/com/kunzisoft/keepass/view/DataDate.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-package com.kunzisoft.keepass.view
-
-data class DataDate(val year: Int, val month: Int, val day: Int)
\ No newline at end of file
diff --git a/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt b/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt
index 434e4e715..0536b6f39 100644
--- a/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt
@@ -189,6 +189,8 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
searchParameters.searchInTemplates = isChecked
mOnParametersChangeListener?.invoke(searchParameters)
}
+
+ searchNumbers.setOnClickListener(null)
}
fun setNumbers(numbers: Int) {
diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt
index 31b8f9af3..151a9a422 100644
--- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt
@@ -217,14 +217,12 @@ class TemplateEditView @JvmOverloads constructor(context: Context,
}
}
- fun setCurrentDateTimeValue(date: DataDate) {
+ fun setCurrentDateTimeValue(dateMilliseconds: Long) {
// Save the date
setCurrentDateTimeSelection { instant ->
val newDateInstant = DateInstant(
DateTime(instant.date)
- .withYear(date.year)
- .withMonthOfYear(date.month + 1)
- .withDayOfMonth(date.day)
+ .withMillis(dateMilliseconds)
.toDate(), instant.type)
if (instant.type == DateInstant.Type.DATE_TIME) {
val instantTime = DateInstant(instant.date, DateInstant.Type.TIME)
diff --git a/app/src/main/java/com/kunzisoft/keepass/view/ToolbarAction.kt b/app/src/main/java/com/kunzisoft/keepass/view/ToolbarAction.kt
index 852bd9aa3..82f0fbfa1 100644
--- a/app/src/main/java/com/kunzisoft/keepass/view/ToolbarAction.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/view/ToolbarAction.kt
@@ -31,14 +31,14 @@ import android.view.View
import androidx.annotation.ColorInt
import androidx.appcompat.view.ActionMode
import androidx.appcompat.view.SupportMenuInflater
-import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
+import com.google.android.material.appbar.MaterialToolbar
import com.kunzisoft.keepass.R
class ToolbarAction @JvmOverloads constructor(context: Context,
attrs: AttributeSet? = null,
- defStyle: Int = androidx.appcompat.R.attr.toolbarStyle)
- : Toolbar(context, attrs, defStyle) {
+ defStyle: Int = R.attr.toolbarActionStyle)
+ : MaterialToolbar(context, attrs, defStyle) {
private var mActionModeCallback: ActionMode.Callback? = null
private val actionMode = NodeActionMode(this)
@@ -47,7 +47,7 @@ class ToolbarAction @JvmOverloads constructor(context: Context,
init {
ContextCompat.getDrawable(context, R.drawable.ic_close_white_24dp)?.let { closeDrawable ->
val typedValue = TypedValue()
- context.theme.resolveAttribute(R.attr.colorControlNormal, typedValue, true)
+ context.theme.resolveAttribute(R.attr.colorOnSurface, typedValue, true)
@ColorInt val colorControl = typedValue.data
closeDrawable.colorFilter = PorterDuffColorFilter(colorControl, PorterDuff.Mode.SRC_ATOP)
navigationIcon = closeDrawable
diff --git a/app/src/main/java/com/kunzisoft/keepass/view/SpecialModeView.kt b/app/src/main/java/com/kunzisoft/keepass/view/ToolbarSpecial.kt
similarity index 85%
rename from app/src/main/java/com/kunzisoft/keepass/view/SpecialModeView.kt
rename to app/src/main/java/com/kunzisoft/keepass/view/ToolbarSpecial.kt
index 77ab72795..2da08e1dc 100644
--- a/app/src/main/java/com/kunzisoft/keepass/view/SpecialModeView.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/view/ToolbarSpecial.kt
@@ -26,14 +26,14 @@ import android.util.AttributeSet
import android.util.TypedValue
import android.view.View
import androidx.annotation.ColorInt
-import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
+import com.google.android.material.appbar.MaterialToolbar
import com.kunzisoft.keepass.R
-class SpecialModeView @JvmOverloads constructor(context: Context,
- attrs: AttributeSet? = null,
- defStyle: Int = androidx.appcompat.R.attr.toolbarStyle)
- : Toolbar(context, attrs, defStyle) {
+class ToolbarSpecial @JvmOverloads constructor(context: Context,
+ attrs: AttributeSet? = null,
+ defStyle: Int = R.attr.toolbarSpecialStyle)
+ : MaterialToolbar(context, attrs, defStyle) {
init {
ContextCompat.getDrawable(context, R.drawable.ic_arrow_back_white_24dp)?.let { closeDrawable ->
diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt
index 4c55af246..e649063c0 100644
--- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodeEditViewModel.kt
@@ -4,7 +4,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import com.kunzisoft.keepass.database.element.DateInstant
import com.kunzisoft.keepass.database.element.icon.IconImage
-import com.kunzisoft.keepass.view.DataDate
import com.kunzisoft.keepass.view.DataTime
abstract class NodeEditViewModel : ViewModel() {
@@ -24,8 +23,8 @@ abstract class NodeEditViewModel : ViewModel() {
val requestDateTimeSelection : LiveData get() = _requestDateTimeSelection
private val _requestDateTimeSelection = SingleLiveEvent()
- val onDateSelected : LiveData get() = _onDateSelected
- private val _onDateSelected = SingleLiveEvent()
+ val onDateSelected : LiveData get() = _onDateSelected
+ private val _onDateSelected = SingleLiveEvent()
val onTimeSelected : LiveData get() = _onTimeSelected
private val _onTimeSelected = SingleLiveEvent()
@@ -58,8 +57,8 @@ abstract class NodeEditViewModel : ViewModel() {
_requestDateTimeSelection.value = dateInstant
}
- fun selectDate(year: Int, month: Int, day: Int) {
- _onDateSelected.value = DataDate(year, month, day)
+ fun selectDate(dateMilliseconds: Long) {
+ _onDateSelected.value = dateMilliseconds
}
fun selectTime(hours: Int, minutes: Int) {
diff --git a/app/src/main/res/animator-v23/scan.xml b/app/src/main/res/animator-v23/scan.xml
deleted file mode 100644
index d4965f389..000000000
--- a/app/src/main/res/animator-v23/scan.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/color-v23/progress_color.xml b/app/src/main/res/color-v23/progress_color.xml
deleted file mode 100644
index cc68be3d4..000000000
--- a/app/src/main/res/color-v23/progress_color.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/background_button_color_accent.xml b/app/src/main/res/color/background_button_color_accent.xml
deleted file mode 100644
index 9af1c0e0d..000000000
--- a/app/src/main/res/color/background_button_color_accent.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/background_button_color_primary.xml b/app/src/main/res/color/background_button_color_primary.xml
deleted file mode 100644
index 31a28d56a..000000000
--- a/app/src/main/res/color/background_button_color_primary.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/background_button_color_secondary.xml b/app/src/main/res/color/background_button_color_secondary.xml
deleted file mode 100644
index 0a69948d9..000000000
--- a/app/src/main/res/color/background_button_color_secondary.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/background_color_chip.xml b/app/src/main/res/color/background_color_chip.xml
deleted file mode 100644
index 18061d697..000000000
--- a/app/src/main/res/color/background_color_chip.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/edit_text_stroke_color.xml b/app/src/main/res/color/edit_text_stroke_color.xml
deleted file mode 100644
index 1e73b070e..000000000
--- a/app/src/main/res/color/edit_text_stroke_color.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/list_color.xml b/app/src/main/res/color/list_color.xml
deleted file mode 100644
index cc8ab381d..000000000
--- a/app/src/main/res/color/list_color.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/list_secondary_color.xml b/app/src/main/res/color/list_secondary_color.xml
deleted file mode 100644
index 369b45e68..000000000
--- a/app/src/main/res/color/list_secondary_color.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/color/on_surface_selector.xml b/app/src/main/res/color/on_surface_selector.xml
new file mode 100644
index 000000000..b4d423690
--- /dev/null
+++ b/app/src/main/res/color/on_surface_selector.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/progress_color.xml b/app/src/main/res/color/progress_color.xml
deleted file mode 100644
index 71df5c427..000000000
--- a/app/src/main/res/color/progress_color.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/color/text_color_button.xml b/app/src/main/res/color/text_color_button.xml
deleted file mode 100644
index 13c44bba4..000000000
--- a/app/src/main/res/color/text_color_button.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/text_color_light.xml b/app/src/main/res/color/text_color_light.xml
deleted file mode 100644
index 83fbc9bbf..000000000
--- a/app/src/main/res/color/text_color_light.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/text_color_night.xml b/app/src/main/res/color/text_color_night.xml
deleted file mode 100644
index b452f1fa0..000000000
--- a/app/src/main/res/color/text_color_night.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/text_color_secondary_light.xml b/app/src/main/res/color/text_color_secondary_light.xml
deleted file mode 100644
index 7005319e0..000000000
--- a/app/src/main/res/color/text_color_secondary_light.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/text_color_secondary_night.xml b/app/src/main/res/color/text_color_secondary_night.xml
deleted file mode 100644
index ea11472bf..000000000
--- a/app/src/main/res/color/text_color_secondary_night.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/list_primary_color.xml b/app/src/main/res/color/text_primary_color.xml
similarity index 70%
rename from app/src/main/res/color/list_primary_color.xml
rename to app/src/main/res/color/text_primary_color.xml
index 06694e43a..c996c36e2 100644
--- a/app/src/main/res/color/list_primary_color.xml
+++ b/app/src/main/res/color/text_primary_color.xml
@@ -1,5 +1,5 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color-v23/list_secondary_color.xml b/app/src/main/res/color/text_secondary_color.xml
similarity index 100%
rename from app/src/main/res/color-v23/list_secondary_color.xml
rename to app/src/main/res/color/text_secondary_color.xml
diff --git a/app/src/main/res/drawable-v21/background_button.xml b/app/src/main/res/drawable-v21/background_button.xml
deleted file mode 100644
index efe76dbbc..000000000
--- a/app/src/main/res/drawable-v21/background_button.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v21/background_button_small.xml b/app/src/main/res/drawable-v21/background_button_small.xml
deleted file mode 100644
index a1a543eb2..000000000
--- a/app/src/main/res/drawable-v21/background_button_small.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v21/background_icon.xml b/app/src/main/res/drawable-v21/background_icon.xml
index 4bf4cf1ca..eeed6744d 100644
--- a/app/src/main/res/drawable-v21/background_icon.xml
+++ b/app/src/main/res/drawable-v21/background_icon.xml
@@ -11,7 +11,7 @@
android:right="12dp"
android:top="12dp"
android:bottom="12dp"/>
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v21/background_image_button.xml b/app/src/main/res/drawable-v21/background_image_button.xml
index ae42055a0..416ee142b 100644
--- a/app/src/main/res/drawable-v21/background_image_button.xml
+++ b/app/src/main/res/drawable-v21/background_image_button.xml
@@ -6,7 +6,7 @@
-
-
+
-
-
-
-
-
-
+
+
-
+
+
-
+
+
+
+
+
+ -
+
+
+
+
+
+
- -
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v23/bolt.xml b/app/src/main/res/drawable-v23/bolt.xml
deleted file mode 100644
index 8684f8cf3..000000000
--- a/app/src/main/res/drawable-v23/bolt.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable-v23/fingerprint.xml b/app/src/main/res/drawable-v23/fingerprint.xml
deleted file mode 100644
index 43393ec87..000000000
--- a/app/src/main/res/drawable-v23/fingerprint.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable-v23/fingerprint_scan.xml b/app/src/main/res/drawable-v23/fingerprint_scan.xml
deleted file mode 100644
index 553792910..000000000
--- a/app/src/main/res/drawable-v23/fingerprint_scan.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable-v23/scan_fingerprint.xml b/app/src/main/res/drawable-v23/scan_fingerprint.xml
deleted file mode 100644
index 248691440..000000000
--- a/app/src/main/res/drawable-v23/scan_fingerprint.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/background_button.xml b/app/src/main/res/drawable/background_button.xml
deleted file mode 100644
index a61486df1..000000000
--- a/app/src/main/res/drawable/background_button.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/background_item_selection.xml b/app/src/main/res/drawable/background_item_selection.xml
index eb60a1034..d013c67bc 100644
--- a/app/src/main/res/drawable/background_item_selection.xml
+++ b/app/src/main/res/drawable/background_item_selection.xml
@@ -2,12 +2,14 @@
-
-
+
+
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/background_progress_circle.xml b/app/src/main/res/drawable/background_progress_circle.xml
deleted file mode 100644
index 649f42f5b..000000000
--- a/app/src/main/res/drawable/background_progress_circle.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/background_button_small.xml b/app/src/main/res/drawable/background_switch.xml
similarity index 89%
rename from app/src/main/res/drawable/background_button_small.xml
rename to app/src/main/res/drawable/background_switch.xml
index 3516e7b18..01d009478 100644
--- a/app/src/main/res/drawable/background_button_small.xml
+++ b/app/src/main/res/drawable/background_switch.xml
@@ -5,7 +5,7 @@
-
+ android:radius="@dimen/dialog_radius" />
+ android:radius="@dimen/dialog_radius" />
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/foreground_progress_circle_secondary.xml b/app/src/main/res/drawable/foreground_progress_circle_secondary.xml
deleted file mode 100644
index 446ebc816..000000000
--- a/app/src/main/res/drawable/foreground_progress_circle_secondary.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_fingerprint_24.xml b/app/src/main/res/drawable/ic_fingerprint_24.xml
new file mode 100644
index 000000000..c6427bc4b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_fingerprint_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_info_hint_color_24dp.xml b/app/src/main/res/drawable/ic_info_hint_color_24dp.xml
index 937c7ac22..98027c3e7 100644
--- a/app/src/main/res/drawable/ic_info_hint_color_24dp.xml
+++ b/app/src/main/res/drawable/ic_info_hint_color_24dp.xml
@@ -4,6 +4,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
diff --git a/app/src/main/res/drawable/ic_modified_white_12dp.xml b/app/src/main/res/drawable/ic_modified_white_12dp.xml
index eba1bd509..23c74ec42 100644
--- a/app/src/main/res/drawable/ic_modified_white_12dp.xml
+++ b/app/src/main/res/drawable/ic_modified_white_12dp.xml
@@ -6,7 +6,8 @@
android:viewportHeight="24">
diff --git a/app/src/main/res/layout-v23/view_advanced_unlock.xml b/app/src/main/res/layout-v23/view_advanced_unlock.xml
index 5d9fb8f0e..dba85bdb3 100644
--- a/app/src/main/res/layout-v23/view_advanced_unlock.xml
+++ b/app/src/main/res/layout-v23/view_advanced_unlock.xml
@@ -17,56 +17,11 @@
You should have received a copy of the GNU General Public License
along with KeePassDX. If not, see .
-->
-
-
-
-
-
-
-
-
+ style="@style/KeepassDXStyle.Button.Secondary"
+ app:icon="@drawable/ic_fingerprint_24"
+ android:text="@string/configure" />
diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml
index d6eab3c13..d956bfc9d 100644
--- a/app/src/main/res/layout/activity_about.xml
+++ b/app/src/main/res/layout/activity_about.xml
@@ -110,9 +110,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
- android:text="@string/about"
- android:textStyle="bold"
- style="@style/KeepassDXStyle.TextAppearance.Title"/>
+ android:text="@string/info"
+ style="@style/KeepassDXStyle.Title"/>
+ style="@style/KeepassDXStyle.Title"/>
+ style="@style/KeepassDXStyle.SubTitle"/>
+ style="@style/KeepassDXStyle.SubTitle"/>
+ style="@style/KeepassDXStyle.SubTitle"/>
+ android:layout_height="wrap_content">
+ android:paddingBottom="12dp">
-
-
+ android:layout_height="wrap_content"
+ style="@style/KeepassDXStyle.Toolbar.Transparent"
+ app:layout_collapseMode="pin" />
-
@@ -59,7 +58,7 @@
android:layout_height="match_parent"
android:paddingTop="@dimen/card_view_margin_vertical"
android:paddingBottom="@dimen/card_view_margin_vertical">
-
@@ -93,8 +91,7 @@
android:layout_height="wrap_content"
android:contentDescription="@string/validate"
android:src="@drawable/ic_check_white_24dp"
- android:tint="?attr/colorOnAccentColor"
- app:fabSize="mini"
+ app:fabCustomSize="@dimen/button_small_size"
app:layout_constraintTop_toTopOf="@+id/entry_edit_bottom_bar"
app:layout_constraintBottom_toTopOf="@+id/screenshot_mode_banner"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/app/src/main/res/layout/activity_file_selection.xml b/app/src/main/res/layout/activity_file_selection.xml
index 96448a944..76c0dcbc4 100644
--- a/app/src/main/res/layout/activity_file_selection.xml
+++ b/app/src/main/res/layout/activity_file_selection.xml
@@ -27,11 +27,10 @@
android:importantForAutofill="noExcludeDescendants"
tools:targetApi="o">
-
+ android:layout_height="wrap_content">
+ android:paddingBottom="36dp">
-
-
+ app:layout_collapseMode="pin"/>
@@ -142,57 +132,49 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
-
-
+
+
+
+
+
+
-
+ app:layout_constraintHorizontal_bias="0.5"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:focusable="true"
+ style="@style/KeepassDXStyle.Button.Primary"/>
+
diff --git a/app/src/main/res/layout/activity_group.xml b/app/src/main/res/layout/activity_group.xml
index 9701e0534..a4feb2d68 100644
--- a/app/src/main/res/layout/activity_group.xml
+++ b/app/src/main/res/layout/activity_group.xml
@@ -24,27 +24,23 @@
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:filterTouchesWhenObscured="true"
- android:fitsSystemWindows="true">
+ android:filterTouchesWhenObscured="true">
-
-
+ style="@style/KeepassDXStyle.Title.OnSurface" />
-
+
-
-
+
@@ -102,7 +95,6 @@
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- tools:targetApi="lollipop"
android:fitsSystemWindows="true">
-
-
-
+ android:layout_height="64dp"
+ android:paddingHorizontal="12dp"
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+ android:orientation="horizontal" />
+ android:layout_height="wrap_content"/>
@@ -145,6 +130,7 @@
android:id="@+id/nodes_list_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:paddingTop="@dimen/selectable_margin_vertical"
android:background="?android:attr/windowBackground" />
@@ -159,9 +145,8 @@
diff --git a/app/src/main/res/layout/activity_icon_picker.xml b/app/src/main/res/layout/activity_icon_picker.xml
index a56c04c8d..aa1578622 100644
--- a/app/src/main/res/layout/activity_icon_picker.xml
+++ b/app/src/main/res/layout/activity_icon_picker.xml
@@ -40,9 +40,8 @@
-
+ android:layout_height="wrap_content" />
+ android:layout_height="wrap_content">
-
-
-
-
-
+ app:layout_collapseMode="parallax"
+ android:layout_gravity="center_horizontal|bottom"
+ android:gravity="center_horizontal"
+ android:paddingTop="?attr/actionBarSize">
+
-
+ android:layout_height="wrap_content"
+ android:elevation="0dp"
+ app:elevation="0dp"
+ app:layout_collapseMode="pin">
-
+
@@ -135,16 +109,24 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
- android:elevation="4dp"
app:layout_constraintWidth_percent="@dimen/content_percent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
-
+
+ style="@style/KeepassDXStyle.Cardview.SurfaceContainer"
+ android:layout_margin="16dp">
+
+
@@ -174,24 +156,39 @@
android:paddingLeft="24dp"
android:paddingEnd="24dp"
android:paddingRight="24dp"
- style="@style/KeepassDXStyle.TextAppearance.Tiny"
+ style="@style/KeepassDXStyle.Text.Tiny"
android:text="@string/warning_database_link_revoked"
- android:textColor="?attr/textColorInverse"
- android:background="?attr/colorAccent"
+ android:textColor="?attr/colorOnSecondary"
+ android:background="?attr/colorSecondary"
app:layout_constraintBottom_toTopOf="@+id/activity_password_info_delimiter"
android:layout_gravity="bottom"/>
-
-
+ android:background="?attr/colorSurface">
+
+
+
diff --git a/app/src/main/res/layout/fragment_advanced_unlock.xml b/app/src/main/res/layout/fragment_advanced_unlock.xml
index f9e736982..c19dccbb7 100644
--- a/app/src/main/res/layout/fragment_advanced_unlock.xml
+++ b/app/src/main/res/layout/fragment_advanced_unlock.xml
@@ -1,13 +1,8 @@
-
-
-
\ No newline at end of file
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:visibility="gone"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_color_picker.xml b/app/src/main/res/layout/fragment_color_picker.xml
index 091c092ec..1afecd520 100644
--- a/app/src/main/res/layout/fragment_color_picker.xml
+++ b/app/src/main/res/layout/fragment_color_picker.xml
@@ -36,14 +36,15 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
-
diff --git a/app/src/main/res/layout/fragment_entry_new_field.xml b/app/src/main/res/layout/fragment_entry_new_field.xml
index 46ad8b55e..07f531826 100644
--- a/app/src/main/res/layout/fragment_entry_new_field.xml
+++ b/app/src/main/res/layout/fragment_entry_new_field.xml
@@ -61,9 +61,8 @@
android:contentDescription="@string/menu_delete"
style="@style/KeepassDXStyle.ImageButton.Simple" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_generate_passphrase.xml b/app/src/main/res/layout/fragment_generate_passphrase.xml
index 41dc10434..153ed7347 100644
--- a/app/src/main/res/layout/fragment_generate_passphrase.xml
+++ b/app/src/main/res/layout/fragment_generate_passphrase.xml
@@ -34,7 +34,7 @@
+ android:background="?attr/colorSurface" />
+ android:layout_gravity="bottom">
+ android:valueTo="@integer/passphrase_generator_word_count_max" />
+ android:background="?attr/colorSurface" />
+ android:layout_gravity="bottom">
+ android:valueTo="@integer/password_generator_length_max" />
+ android:background="?attr/colorSurface">
+ android:gravity="center">
+ style="@style/KeepassDXStyle.Title.Large.OnSurface" />
diff --git a/app/src/main/res/layout/fragment_main_credential.xml b/app/src/main/res/layout/fragment_main_credential.xml
index 6fd4e5c9e..fccc3e645 100644
--- a/app/src/main/res/layout/fragment_main_credential.xml
+++ b/app/src/main/res/layout/fragment_main_credential.xml
@@ -40,7 +40,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text="@string/database"
- style="@style/KeepassDXStyle.TextAppearance.Large"/>
+ style="@style/KeepassDXStyle.Title"/>
+ android:layout_marginTop="18dp"
+ android:layout_marginLeft="32dp"
+ android:layout_marginRight="32dp"
+ android:layout_marginStart="32dp"
+ android:layout_marginEnd="32dp"
+ style="@style/KeepassDXStyle.Title"/>
+ android:layout_marginTop="18dp"
+ android:layout_marginLeft="32dp"
+ android:layout_marginRight="32dp"
+ android:layout_marginStart="32dp"
+ android:layout_marginEnd="32dp"
+ style="@style/KeepassDXStyle.SubTitle"/>
+ android:layout_marginTop="18dp"
+ android:layout_marginLeft="32dp"
+ android:layout_marginRight="32dp"
+ android:layout_marginStart="32dp"
+ android:layout_marginEnd="32dp"
+ style="@style/KeepassDXStyle.Text"/>
diff --git a/app/src/main/res/layout/fragment_set_main_credential.xml b/app/src/main/res/layout/fragment_set_main_credential.xml
index 58e5619c4..76c65f01a 100644
--- a/app/src/main/res/layout/fragment_set_main_credential.xml
+++ b/app/src/main/res/layout/fragment_set_main_credential.xml
@@ -41,7 +41,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/credentials_information"
android:text="@string/assign_master_key"
- style="@style/KeepassDXStyle.TextAppearance.Large"/>
+ style="@style/KeepassDXStyle.Title"/>
-
+ app:endIconTint="?attr/colorSecondary">
-
-
+ style="@style/KeepassDXStyle.Title"/>
+ android:textColor="?attr/colorSecondary"/>
+ app:endIconTint="?attr/colorSecondary">
.
-->
-
diff --git a/app/src/main/res/layout/item_attachment.xml b/app/src/main/res/layout/item_attachment.xml
index 5dbb9e209..700b49f1e 100644
--- a/app/src/main/res/layout/item_attachment.xml
+++ b/app/src/main/res/layout/item_attachment.xml
@@ -43,7 +43,8 @@
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_alignBottom="@+id/item_attachment_thumbnail"
- android:background="?attr/cardBackgroundTransparentColor">
+ android:alpha="0.8"
+ android:background="?attr/colorSurfaceContainer">
-
diff --git a/app/src/main/res/layout/item_breadcrumb.xml b/app/src/main/res/layout/item_breadcrumb.xml
index bd7b38d16..3fd284c8e 100644
--- a/app/src/main/res/layout/item_breadcrumb.xml
+++ b/app/src/main/res/layout/item_breadcrumb.xml
@@ -17,50 +17,55 @@
You should have received a copy of the GNU General Public License
along with KeePassDX. If not, see .
-->
-
-
-
+
-
-
+ android:orientation="horizontal"
+ android:gravity="center"
+ android:layout_gravity="center"
+ android:baselineAligned="false">
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_breadcrumb_important.xml b/app/src/main/res/layout/item_breadcrumb_important.xml
new file mode 100644
index 000000000..94fdc3b1b
--- /dev/null
+++ b/app/src/main/res/layout/item_breadcrumb_important.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_file_info.xml b/app/src/main/res/layout/item_file_info.xml
index bd1b66b38..389b46e29 100644
--- a/app/src/main/res/layout/item_file_info.xml
+++ b/app/src/main/res/layout/item_file_info.xml
@@ -25,203 +25,216 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:background="?attr/colorPrimary"
- android:elevation="4dp"
+ android:background="?attr/colorSurface"
+ android:paddingBottom="8dp"
tools:targetApi="lollipop">
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
+ android:layout_height="wrap_content"
+ style="@style/KeepassDXStyle.Cardview.Surface"
+ android:layout_marginHorizontal="@dimen/card_view_margin_horizontal">
+
+
+
+
+
-
+ android:layout_height="@dimen/item_file_info_height">
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_group.xml b/app/src/main/res/layout/item_group.xml
deleted file mode 100644
index 9bfc67eb3..000000000
--- a/app/src/main/res/layout/item_group.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_list_nodes_entry.xml b/app/src/main/res/layout/item_list_nodes_entry.xml
index 7bfa59ca6..78ef4b236 100644
--- a/app/src/main/res/layout/item_list_nodes_entry.xml
+++ b/app/src/main/res/layout/item_list_nodes_entry.xml
@@ -21,18 +21,18 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/node_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- style="@style/KeepassDXStyle.Selectable.Item">
+ android:paddingVertical="@dimen/selectable_margin_vertical"
+ android:paddingHorizontal="@dimen/selectable_margin_horizontal">
@@ -129,18 +131,17 @@
android:id="@+id/node_otp_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginEnd="8dp"
- android:layout_marginRight="8dp"
- android:background="?android:attr/selectableItemBackground"
+ style="@style/KeepassDXStyle.Selectable.Item"
android:orientation="horizontal"
- android:padding="4dp"
- app:layout_constraintBottom_toTopOf="@+id/node_attachment_icon"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toTopOf="parent">
+ android:paddingStart="8dp"
+ android:paddingLeft="8dp"
+ android:paddingEnd="4dp"
+ android:paddingRight="4dp"
+ android:paddingVertical="4dp">
+ android:layout_gravity="center">
+ android:layout_gravity="center"
+ android:src="@drawable/ic_attach_file_white_24dp" />
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_list_nodes_group.xml b/app/src/main/res/layout/item_list_nodes_group.xml
index e0a77bdf8..02e11ad12 100644
--- a/app/src/main/res/layout/item_list_nodes_group.xml
+++ b/app/src/main/res/layout/item_list_nodes_group.xml
@@ -21,22 +21,23 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/node_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- style="@style/KeepassDXStyle.Selectable.Item">
+ android:paddingVertical="@dimen/selectable_margin_vertical"
+ android:paddingHorizontal="@dimen/selectable_margin_horizontal">
+ app:layout_constraintEnd_toEndOf="parent" >
diff --git a/app/src/main/res/layout/item_tag.xml b/app/src/main/res/layout/item_tag.xml
index 20b544bb7..1d08eae1f 100644
--- a/app/src/main/res/layout/item_tag.xml
+++ b/app/src/main/res/layout/item_tag.xml
@@ -35,10 +35,10 @@
android:layout_gravity="center"
app:drawableLeftCompat="@drawable/ic_bookmark_white_12dp"
app:drawableStartCompat="@drawable/ic_bookmark_white_12dp"
- app:drawableTint="?attr/colorAccent"
+ app:drawableTint="?attr/colorSecondary"
android:drawablePadding="2dp"
tools:text="text"
- android:textColor="?attr/colorAccent"
+ android:textColor="?attr/colorSecondary"
android:textSize="12sp"
android:paddingLeft="8dp"
android:paddingStart="8dp"
diff --git a/app/src/main/res/layout/item_tag_edit.xml b/app/src/main/res/layout/item_tag_edit.xml
index b520a9b4a..67c1526dc 100644
--- a/app/src/main/res/layout/item_tag_edit.xml
+++ b/app/src/main/res/layout/item_tag_edit.xml
@@ -33,7 +33,7 @@
android:layout_gravity="center_vertical"
app:drawableLeftCompat="@drawable/ic_bookmark_white_12dp"
app:drawableStartCompat="@drawable/ic_bookmark_white_12dp"
- app:drawableTint="?attr/colorAccent"
+ app:drawableTint="?attr/colorSecondary"
android:drawablePadding="2dp"
tools:text="text"
android:textSize="12sp"
@@ -47,7 +47,7 @@
android:layout_height="24dp"
android:padding="4dp"
android:src="@drawable/ic_close_white_24dp"
- app:tint="?attr/colorAccent"
+ app:tint="?attr/colorSecondary"
android:gravity="center_vertical"
android:layout_gravity="center"
android:contentDescription="@string/menu_delete" />
diff --git a/app/src/main/res/layout/item_template.xml b/app/src/main/res/layout/item_template.xml
index 2d87db211..891323b97 100644
--- a/app/src/main/res/layout/item_template.xml
+++ b/app/src/main/res/layout/item_template.xml
@@ -20,10 +20,12 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:background="?android:attr/windowBackground"
xmlns:tools="http://schemas.android.com/tools">
@@ -44,7 +43,7 @@
android:layout_marginBottom="12dp"
app:srcCompat="@drawable/ic_database_white_36dp"
style="@style/KeepassDXStyle.Icon"
- app:tint="?attr/colorAccent" />
+ app:tint="?attr/colorSecondary" />
+ style="@style/KeepassDXStyle.SubTitle"/>
-
+ style="@style/KeepassDXStyle.SubTitle"/>
-
-
+
-
-
-
+ android:layout_marginTop="12dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/switch_element"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/explanation_text"
+ android:layout_marginHorizontal="24dp"
+ android:orientation="horizontal">
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/pref_dialog_input_text.xml b/app/src/main/res/layout/pref_dialog_input_text.xml
index 25ce891e6..0b20db56e 100644
--- a/app/src/main/res/layout/pref_dialog_input_text.xml
+++ b/app/src/main/res/layout/pref_dialog_input_text.xml
@@ -33,18 +33,18 @@
android:layout_height="wrap_content"
android:layout_width="0dp"
android:gravity="center"
- android:layout_marginBottom="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
- style="@style/KeepassDXStyle.TextAppearance.SmallTitle"/>
-
+
+ style="@style/KeepassDXStyle.SubTitle"/>
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/preference_category_material.xml b/app/src/main/res/layout/preference_category_material.xml
new file mode 100644
index 000000000..026896b3c
--- /dev/null
+++ b/app/src/main/res/layout/preference_category_material.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/preference_material.xml b/app/src/main/res/layout/preference_material.xml
new file mode 100644
index 000000000..5dc7d61ba
--- /dev/null
+++ b/app/src/main/res/layout/preference_material.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/preference_material_switch.xml b/app/src/main/res/layout/preference_material_switch.xml
new file mode 100644
index 000000000..1f03ffdcb
--- /dev/null
+++ b/app/src/main/res/layout/preference_material_switch.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/toolbar_default.xml b/app/src/main/res/layout/toolbar_default.xml
index d3bd36aa1..9225a7583 100644
--- a/app/src/main/res/layout/toolbar_default.xml
+++ b/app/src/main/res/layout/toolbar_default.xml
@@ -17,14 +17,9 @@
You should have received a copy of the GNU General Public License
along with KeePassDX. If not, see .
-->
-
\ No newline at end of file
+ android:layout_height="wrap_content" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_button_add_node.xml b/app/src/main/res/layout/view_button_add_node.xml
index 5edb6a1ab..2232c2433 100644
--- a/app/src/main/res/layout/view_button_add_node.xml
+++ b/app/src/main/res/layout/view_button_add_node.xml
@@ -18,7 +18,6 @@
along with KeePassDX. If not, see .
-->
-
-
+ style="@style/KeepassDXStyle.Fab.Menu"
+ android:text="@string/add_entry" />
-
-
+ style="@style/KeepassDXStyle.Fab.Menu"
+ android:text="@string/add_group"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_button_lock.xml b/app/src/main/res/layout/view_button_lock.xml
index 346798ba0..22781d154 100644
--- a/app/src/main/res/layout/view_button_lock.xml
+++ b/app/src/main/res/layout/view_button_lock.xml
@@ -2,18 +2,22 @@
+ android:layout_gravity="bottom"
+ android:visibility="visible"
+ android:src="@drawable/ic_lock_white_padding_24dp" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_edit_date_time.xml b/app/src/main/res/layout/view_edit_date_time.xml
index f1d18aa4e..997d080da 100644
--- a/app/src/main/res/layout/view_edit_date_time.xml
+++ b/app/src/main/res/layout/view_edit_date_time.xml
@@ -13,6 +13,8 @@
android:hint="@string/entry_expires"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
app:layout_constraintEnd_toStartOf="@+id/expiration_checkbox">
-
-
-
+ android:layout_toStartOf="@+id/password_checkbox"
+ android:layout_toLeftOf="@+id/password_checkbox"
+ app:endIconMode="password_toggle">
+
+
@@ -62,25 +66,30 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
-
+
+
@@ -89,24 +98,29 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_passkey.xml b/app/src/main/res/layout/view_passkey.xml
index fa9c858a6..0bf582ffa 100644
--- a/app/src/main/res/layout/view_passkey.xml
+++ b/app/src/main/res/layout/view_passkey.xml
@@ -14,7 +14,7 @@
android:importantForAccessibility="no"
android:importantForAutofill="no"
app:endIconMode="password_toggle"
- app:endIconTint="?attr/colorAccent"
+ app:endIconTint="?attr/colorSecondary"
tools:ignore="UnusedAttribute">
diff --git a/app/src/main/res/layout/view_search_filters.xml b/app/src/main/res/layout/view_search_filters.xml
index f48c67270..55dfe13bf 100644
--- a/app/src/main/res/layout/view_search_filters.xml
+++ b/app/src/main/res/layout/view_search_filters.xml
@@ -5,17 +5,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true"
- android:minHeight="?attr/actionBarSize"
android:orientation="vertical">
+ app:tint="?attr/colorOnSurface"/>
قاعدة بيانات غير مدعومة.
بناء %1$s
تم حفظ كلمة السر المشفرة
- قاعدة البيانات لا تمتلك بيانات اعتماد.
+ قاعدة البيانات لا تمتلك بيانات اعتماد.
المظهر
عام
ملأ تلقائي
@@ -467,8 +467,6 @@
خطأ أثناء تصدير خصائص التطبيق
غُيِّرت معلومات قاعدة البيانات من خارج هذا التطبيق.
ادمج البيانات أو استبدل التعديلات الخارجية بحفظ قاعدة البيانات أو أعد تحميلها لجلب آخر التغييرات.
- افتح محث فك القفل المتقدم لتخزين بيانات الاعتماد
- افتح محث فك القفل المتقدم لفتح قاعدة البيانات
اكتب كلمة السر، وأنقر هذا الزر.
بيانات الاعتماد للجهاز
انفر لحذف مفاتيح فك القفل المتقدم
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 8e0c59e45..e2f3fe3c8 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -174,7 +174,7 @@
Pokračovat bez ochrany heslem\?
Pokračovat bez šifrovacího klíče\?
Šifrované heslo uloženo
- Tato databáze zatím nemá uložené heslo.
+ Tato databáze zatím nemá uložené heslo.
Historie
Vzhled
Obecné
@@ -506,8 +506,6 @@
Otevřít pomocí rozšířeného odemykání
Pokud použijete rozpoznání rozšířeného odemknutí, musíte si i nadále pamatovat hlavní heslo.
Rozpoznání rozšířeného odemknutí
- Pro uložení důvěrných údajů otevřete pobídku rozšířeného odemknutí
- Databázi otevřete i pomocí nabídky rozšířeného odemykání
Smazat klíč rozšířeného odemknutí
Rozšířené odemknutí databáze
Časový limit rozšířeného odemknutí
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index a5ddc83bd..3c7b71cdb 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -173,7 +173,7 @@
Fortsæt uden adgangskode til beskyttelse mod oplåsning\?
Fortsæt uden krypteringsnøgle\?
Krypteret adgangskode er gemt
- Denne database har endnu ikke gemt legitimationsoplysninger.
+ Denne database har endnu ikke gemt legitimationsoplysninger.
Historik
Udseende
Generelt
@@ -524,7 +524,6 @@
Oplysninger om engangsadgangskode
Udtræk database legitimationsoplysninger med avancerede oplåsningdata
Du skal stadig huske din primære legitimationsoplysning, hvis du bruger avanceret oplåsningsgenkendelse.
- Åbn den avancerede låseprompt for at låse databasen op
Adgang til filen tilbagekaldt af filhåndteringsprogrammet, luk databasen og genåbn den fra dens placering.
Der opstod en fejl under udførelsen af en handling på databasen.
Der opstod en fejl under fjernelsen af fildata.
@@ -543,7 +542,6 @@
Midlertidig avanceret oplåsning
Enhedens legitimation
Egenskaber
- Åbn den avancerede låseprompt for at gemme legitimationsoplysninger
Fejl under eksport af app-egenskaber
App-egenskaber eksporteret
Fejl under importering af app-egenskaber
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 989d21252..ed9083b74 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -171,7 +171,7 @@
Verschlüsseltes Passwort wurde gespeichert
Verlauf
Allgemein
- Diese Datenbank enthält noch keine Anmeldedaten.
+ Diese Datenbank enthält noch keine Anmeldedaten.
Verschlüsselung
Schlüsselableitungsfunktion
Erweiterte ASCII
@@ -507,8 +507,6 @@
Alle Knoten unwiderruflich aus dem Papierkorb löschen\?
Der Feldname existiert bereits.
Du musst dich weiterhin an dein Passwort erinnern, wenn du schnelle Entsperrmethoden verwendest.
- Abfrage schneller Entsperrung öffnen, um Anmeldedaten zu speichern
- Abfrage schneller Entsperrung öffnen, um Datenbank zu entsperren
Schlüssel für Schnellentsperrung löschen
Schnelle Entsperrmethoden
Verknüpfe dein Passwort mit Biometrie- oder Geräteanmeldedaten, um die Datenbank schnell zu entsperren.
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 5b5897239..61a9e541a 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -326,7 +326,7 @@
Κλείσιμο πεδίων
Δεν είναι δυνατή η δημιουργία βάσης δεδομένων με αυτόν τον κωδικό πρόσβασης και το αρχείο κλειδί.
Προηγμένο ξεκλείδωμα
- Αυτή η βάση δεδομένων δεν έχει αποθηκευμένα διαπιστευτήρια ακόμα.
+ Αυτή η βάση δεδομένων δεν έχει αποθηκευμένα διαπιστευτήρια ακόμα.
Εμφάνιση
Βιομετρία
Προηγμένο ξεκλείδωμα
@@ -490,8 +490,6 @@
Προηγμένο ξεκλείδωμα αναγνώρισης
Πρέπει ακόμα να θυμάστε τα κύρια διαπιστευτήριά σας εάν χρησιμοποιείτε σύνθετη αναγνώριση ξεκλειδώματος.
Ανοίξτε τη βάση δεδομένων με προηγμένο ξεκλείδωμα αναγνώρισης
- Ανοίξτε τη προηγμένη προτροπή ξεκλειδώματος για αποθήκευση διαπιστευτηρίων
- Ανοίξτε τη προηγμένη προτροπή ξεκλειδώματος για να ξεκλειδώσετε τη βάση δεδομένων
Διαγραφή προηγμένου κλειδιού ξεκλειδώματος
Enter
Backspace
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index d3f7cf65d..ec9fa2f8c 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -169,7 +169,7 @@
Contraseña cifrada almacenada
Historial
Habilite el servicio para completar formularios fácilmente desde otras aplicaciones
- Esta base de datos aún no tiene credenciales almacenadas.
+ Esta base de datos aún no tiene credenciales almacenadas.
Apariencia
General
Autocompletado
@@ -463,8 +463,6 @@
Abrir la base de datos con reconocimiento de desbloqueo avanzado
Aún debe recordar su contraseña maestra si emplea el reconocimiento de desbloqueo avanzado.
Reconocimiento de desbloqueo avanzado
- Abrir el indicador de desbloqueo avanzado para almacenar las credenciales
- Abrir el aviso de desbloqueo avanzado para desbloquear la base de datos
El almacén de claves no está debidamente inicializado.
Se requiere una actualización de la seguridad biométrica.
No se ha inscrito ninguna credencial biométrica o del dispositivo.
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index f86b0d4d4..7ffe818a3 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -487,9 +487,8 @@
Fusionatu datuak, gain idatzi kanpo aldaketak datu-basean gordez edo birkargatu azken aldaketekin.
Ez diozu aplikazioari alarma zehatz bat erabiltzen utzi, Hori dela eta, tenporizadore bat behar dituzten ezaugarriak ez dira ordu zehatz batean egingo.
Zure pasahitz-nagusia gogoratu behar duzu desblokeo aurreratuko ezagutzea erabili arren.
- Ireki desblokeo aurreratuko abisua kredentzialak gordetzeko
Zifratutako pasahitza gordeta
- Datu-base honek ez du biltegiratuta kredentzialik.
+ Datu-base honek ez du biltegiratuta kredentzialik.
Desblokeatze aurreratuko errorea: %1$s
Itxura
KeePassDXekin erregistratu
@@ -520,7 +519,6 @@
Datu-basea berriz kargatzeak lokalean aldatutako datuak ezabatuko ditu.
Fusioa arrakastaz bukatu da
Gako-biltegia ez da behar bezala hasieratu.
- Ireki desblokeo aurreratuko abisua datu-basea desblokeatzeko
Aplikazio diseinua
Bilatu sarrerak titulu, erabiltzaile izen edo beste eremu batzuk erabiliz pasahitzak errez berreskuratzeko.
Aplikazioan erabilitako diseinua
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 8e01e02c7..cfe8104ab 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -2,7 +2,7 @@
ظاهر
تاریخچه
- در این پایگاه داده هنوز اعتبار نامه ذخیره نشده است.
+ در این پایگاه داده هنوز اعتبار نامه ذخیره نشده است.
رمز رمزگذاری شده ذخیره شده است
فروشگاه اصلی به درستی تنظیم نشده است.
%1$s را بسازید
@@ -244,8 +244,6 @@
در صورت عدم انتخاب اعتبار نامه ، ضربه زدن روی دکمه \"باز کردن\" امکان پذیر است
به طور خودکار به صفحه کلید قبلی در صفحه اعتبار نامه پایگاه داده برگردید
صفحه اعتبار نامه پایگاه داده
- برای ذخیره اعتبار نامه ، قفل پیشرفته را باز کنید
- برای باز کردن قفل پایگاه داده قفل پیشرفته را باز کنید
به روز رسانی امنیتی بیومتریک مورد نیاز است.
هیچ بیومتریک یا اعتبار دستگاه ثبت نشده است.
برای حذف کلیدهای پیشرفته باز کردن قفل ضربه بزنید
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index edfa408bd..d10d9e22b 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -192,7 +192,7 @@
Ulkonäkö
Historia
Biometrinen
- Tässä salasanatietokannassa ei ole vielä pääsytietoja.
+ Tässä salasanatietokannassa ei ole vielä pääsytietoja.
Avainsäilöä ei ole kunnolla alustettu.
Koontiversio %1$s
Tiedostoon pääsy evätty
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 4361e6178..c061f0300 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -159,7 +159,7 @@
Aucune information d’identification biométrique ou de périphérique n’est enregistrée.
Mot de passe chiffré stocké
Historique
- Cette base de données n’a pas encore stocké d’identifiants.
+ Cette base de données n’a pas encore stocké d’identifiants.
Apparence
Général
Remplissage automatique
@@ -515,8 +515,6 @@
Ouvrir la base de données avec la reconnaissance de déverrouillage avancée
Vous devez toujours vous souvenir de votre identifiant principal si vous utilisez le déverrouillage avancé.
Reconnaissance de déverrouillage avancée
- Ouvrez l\'invite de déverrouillage avancé pour stocker les informations d\'identification
- Ouvrez l\'invite de déverrouillage avancé pour déverrouiller la base de données
Supprimer la clé de déverrouillage avancé
Entrer
Retour arrière
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 543cb3f5e..6e7baadc7 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -366,7 +366,6 @@
Procura rápida
Contido
Permiso
- Abrir o aviso de desbloqueo avanzado para acceder á base de datos
Configuracións de autocompletado
Recoñecemento de desbloqueo avanzado
É necesaria unha actualización da seguranza biométrica.
@@ -396,9 +395,8 @@
Compilación %1$s
Non hai rexistro de ningún credencial biométrico ou de dispositivo.
O almacén de claves non foi iniciado correctamente.
- Abrir o aviso de desbloqueo avanzado para gardar as credenciais
Extraer a credencial da base de datos cos datos de desbloqueo avanzado
- Esta base de datos non ten credenciais almacenadas aínda.
+ Esta base de datos non ten credenciais almacenadas aínda.
Non foi posíbel inciar o desbloqueo avanzado.
Escriba o contrasinal, e logo faga click neste botón.
Propiedades
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index e4c6ca859..2c32950d0 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -267,7 +267,7 @@
Posebni znakovi
Podcrtaj
Velika slova
- Ova baza podataka još nema spremljene podatke za prijavu.
+ Ova baza podataka još nema spremljene podatke za prijavu.
Biometrija
Prijavi se s KeePassDX
Aktiviraj automatsko ispunjavanje za brzo ispunjavanje obrazaca u drugim aplikacijama
@@ -492,8 +492,6 @@
Nije moguće pokrenuti prozor naprednog otključavanja.
Greška naprednog otključavanja: %1$s
Izdvoji podatake za prijavu na bazu podataka pomoću podataka naprednog otključavanja
- Otvori prozor naprednog otključavanja za spremanje podataka za prijavu
- Otvori prozor naprednog otključavanja za otključavanje baze podataka
Nije moguće prepoznati digitanlni otisak za napredno otključavanje
Nije moguće pročitati ključ naprednog otključavanja. Izbriši ga i ponovi postupak prepoznavanja otključavanja.
Tipka Enter
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index a3bb61f46..cddf8b64b 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -132,7 +132,7 @@
Kerülje a Latin-1 karakterkészlettől eltérő jelszókaraktereket az adatbázis-fájlban (a nem felismert karakterek mert ugyanarra a betűre lesznek alakítva).
Verzió: %1$s
Titkosított jelszó tárolva
- Az adatbázisnak még nincs jelszava.
+ Az adatbázisnak még nincs jelszava.
Adja meg a jelszót és/vagy a kulcsfájlt, hogy kinyithassa az adatbázist.
\n
\nKészítsen biztonsági mentést az adatbázisról minden egyes módosítás után.
@@ -521,7 +521,6 @@
Ikon neve
Válasszon bejegyzést…
Adatok egyesítése, majd a külső módosítások felülírása az adatbázis mentésével, vagy az adatbázis újratöltése a legfrissebb változtatásokkal.
- Nyissa meg a speciális feloldási képernyőt az adatbázis feloldásához
Speciális feloldásfelismerés
Figyelmeztetés: Továbbra is meg kell jegyeznie a mesterjelszót, ha a speciális feloldásfelismerést használja.
Adatbázis hitelesítő adatainak kinyerése a speciális adatfeloldással
@@ -534,7 +533,6 @@
Speciális feloldás lejárati ideje
A fájl elérését visszavonta a fájlkezelő, zárja be az adatbázist és nyissa meg újra a helyéről.
Nem engedélyezte az alkalmazásnak, hogy pontos riasztást használjon. Ezért az időzítőt használó funkciók nem a pontos időt fogják használni.
- Nyissa meg a speciális feloldási képernyőt a hitelesítő adatok tárolásához
Adatbázis megnyitása a speciális feloldásfelismeréssel
Írja be a jelszót, majd kattintson erre a gombra.
Ideiglenes speciális feloldás
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 0cf2ad125..c162047b2 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -238,7 +238,6 @@
Lainnya
Tampilan
Pengenalan pembuka kunci tingkat lanjut
- Buka prompt buka kunci lanjutan untuk membuka kunci database
Keystore tidak diinisialisasi dengan benar.
Pembaruan keamanan biometrik diperlukan.
Tidak ada kredensial biometrik atau perangkat yang terdaftar.
@@ -416,7 +415,7 @@
Memperbolehkan Anda memindai biometrik Anda untuk membuka basis data
Membuka kunci biometrik
Gunakan buka kunci lanjutan untuk membuka database dengan lebih mudah
- Basis data ini belum menyimpan kredensial.
+ Basis data ini belum menyimpan kredensial.
Tidak dapat mengenali cetakan buka kunci lanjutan
Tidak dapat membaca kunci pembuka lanjutan. Harap hapus dan ulangi prosedur pengenalan buka kunci.
Ekstrak kredensial basis data dengan pembuka kunci data lanjutan
@@ -533,7 +532,6 @@
Warna latar belakang entri
Wi-Fi
Label
- Buka penguncian lanjutan untuk menyimpan kredensial
Hapus permanen node yang dipilih\?
Aktifkan keyboard kustom yang mengisi kata sandi Anda dan semua bidang identitas
Pemilihan manual
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index de57b9c9c..b211e3ef9 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -134,7 +134,7 @@
Evita password con caratteri al di fuori del formato di codifica del testo nel file del database (i caratteri non riconosciuti vengono convertiti nella stessa lettera).
Versione %1$s
Password criptata salvata
- Questo database non contiene alcuna credenziale.
+ Questo database non contiene alcuna credenziale.
Inserisci la password e/o il file chiave per sbloccare il database.
\n
\nEseguire il backup del file del database in un luogo sicuro dopo ogni modifica.
@@ -517,8 +517,6 @@
Inserisci la password, poi clicca questo pulsante.
Errore sblocco avanzato: %1$s
Apri il database con lo sblocco avanzato
- Autentica con lo sblocco avanzato per sbloccare il database
- Autentica con lo sblocco avanzato per salvare le credenziali
Elimina chiave di sblocco avanzato
Non è possibile ricostruire la lista correttamente.
Non è stato recuperato l\'indirizzo del database.
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 562213414..43e6ccb99 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -267,7 +267,7 @@
生体認証セキュリティの更新が必要です。
キーストアが正しく初期化されていません。
保存された暗号化済みパスワード
- データベースの保存済み認証情報はありません。
+ データベースの保存済み認証情報はありません。
履歴
デザイン
生体認証
@@ -506,8 +506,6 @@
高度なロック解除を使ってデータベースを開く
高度なロック解除を使用する場合も、主たる認証情報は記憶する必要があります。
高度なロック解除の認証
- ログイン プロンプトを開いて認証情報を保存する
- ログイン プロンプトを開いてロックを解除する
エントリーを選択
スキャンした生体情報またはデバイス認証情報にパスワードをリンクして、データベースのロックをすばやく解除します。
データベースの高度なロック解除
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index c0af5a07f..d94344564 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -283,7 +283,7 @@
ഉദ്ദേശിക്കുന്ന പ്രവര്ത്തനം സ്വീകരിക്കുന്ന ഒരു ഫയല് മാനേജര്. ഡാറ്റാബേസ് ഫയലുകള് നിര്മ്മിക്കാനും തുറക്കാനും സൂക്ഷിക്കാനും ACTION_CREATE_DOCUMENT നോടൊപ്പം ACTION_OPEN_DOCUMENT കൂടെ ആവശ്യമുണ്ട്.
KeePassDX ഫോം ഓട്ടോഫില്ലിംഗ്
ബയോമെട്രിക്
- ഈ ഡാറ്റാബേസിൽ ഇതുവരെ ക്രെഡൻഷ്യൽ സംഭരിച്ചിട്ടില്ല.
+ ഈ ഡാറ്റാബേസിൽ ഇതുവരെ ക്രെഡൻഷ്യൽ സംഭരിച്ചിട്ടില്ല.
എന്തായാലും ഫയൽ ചേർക്കണോ\?
ഈ ഫയൽ അപ്ലോഡുചെയ്യുന്നത് നിലവിലുള്ള ഫയലിനെ മാറ്റിസ്ഥാപിക്കും.
ഫയൽ മാനേജർ റദ്ദാക്കിയ ഫയലിലേക്കുള്ള ആക്സസ്
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index a3e8a6a3a..239e60e5b 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -168,7 +168,7 @@
Ønsker du å fortsette uten en krypteringsnøkkel\?
Versjon %1$s
Kryptert passord lagret
- Denne databasen har ikke et passord enda.
+ Denne databasen har ikke et passord enda.
Historikk
Utseende
Generelt
@@ -536,8 +536,6 @@
Tilgang
Biometrisk sikkerhetsoppdatering kreves.
Du har ikke tillat programmet å bruke en eksakt alarm. Som resultat vil funksjoner som krever et tidsur ikke gjøres til eksakt tid.
- Åpne avansert opplåsningsspørring for å låse opp databasen
- Åpne avansert opplåsningsspørring for å lagre identitetsdetaljer
Advarsel: Du vil fremdeles måtte huske hovedpassordet ditt hvis du bruker avansert opplåsningsgjenkjennelse.
Kunne ikke gjenkjenne avansert opplåsningsskrift
Skriv inn passordet, og klikk deretter på denne knappen.
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 93110682c..644af8ded 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -180,7 +180,7 @@
Doorgaan zonder beveiliging voor wachtwoordontgrendeling\?
Doorgaan zonder coderingssleutel\?
Versleuteld wachtwoord is opgeslagen
- Deze database heeft nog geen opgeslagen gegevens.
+ Deze database heeft nog geen opgeslagen gegevens.
Geschiedenis
Uiterlijk
Algemeen
@@ -515,8 +515,6 @@
Open database met geavanceerde ontgrendelingsherkenning
Je moet nog steeds je hoofdwachtwoord onthouden als je geavanceerde ontgrendelingsherkenning gebruikt.
Geavanceerde ontgrendelingsherkenning
- Open de geavanceerde ontgrendelingsprompt om inloggegevens op te slaan
- Open de geavanceerde ontgrendelingsprompt om de database te ontgrendelen
Geavanceerde ontgrendelingssleutel verwijderen
De veldnaam bestaat al.
GiB
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 576aa395a..d8fbda0c4 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -176,7 +176,7 @@
Wersja %1$s
Zapisano zaszyfrowane hasło
Pokaż Grupy na górze listy
- Baza danych nie ma jeszcze hasła.
+ Baza danych nie ma jeszcze hasła.
Historia
Wygląd
Ogólne
@@ -520,8 +520,6 @@
Spróbuj wyświetlić sugestie autouzupełniania bezpośrednio z kompatybilnej klawiatury
Zaawansowane odblokowywanie tymczasowe
Nie można zainicjować monitu odblokowania zaawansowanego.
- Otwórz monit odblokowania zaawansowanego, aby przechowywać poświadczenia
- Otwórz monit odblokowania zaawansowanego, aby odblokować bazę danych
Dostęp do pliku odwołany przez menedżera plików, zamknij bazę danych i otwórz ją ponownie z jej lokalizacji.
Scal dane, zastąp modyfikacje zewnętrzne poprzez zapisanie bazy danych lub ponownie załaduj ją z najnowszymi zmianami.
Informacje zawarte w pliku bazy danych zostały zmodyfikowane poza aplikacją.
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 74188b743..2f8bd398f 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -173,7 +173,7 @@
Continuar sem proteção de desbloqueio por senha\?
Continuar sem chave de criptografia\?
Senha cifrada armazenada
- Ainda não há nenhuma senha armazenada nesse banco de dados.
+ Ainda não há nenhuma senha armazenada nesse banco de dados.
Histórico
Aparência
Geral
@@ -519,8 +519,6 @@
Banco de dados aberto com reconhecimento avançado de desbloqueio
Você ainda precisa lembrar sua credencial principal se usar o reconhecimento de desbloqueio avançado.
Reconhecimento de desbloqueio avançado
- Abra o prompt de desbloqueio avançado para armazenar as credenciais
- Abra o prompt de desbloqueio avançado para desbloquear o banco de dados
Atualização de segurança biométrica necessária.
Nenhuma credencial biométrica ou de dispositivo está registrada.
Acesso ao arquivo revogado pelo gerenciador de arquivos, feche o banco de dados e reabra-o de sua localização.
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 18024f2c2..987528db6 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -172,7 +172,7 @@
Continuar sem a chave de encriptação\?
Compilação %1$s
Palavra-passe encriptada armazenada
- Ainda não há nenhuma palavra-chave armazenada nesta base de dados.
+ Ainda não há nenhuma palavra-chave armazenada nesta base de dados.
Histórico
Aparência
Geral
@@ -475,8 +475,6 @@
Abrir base de dados com reconhecimento de desbloqueio avançado
Ainda terá de se lembrar da sua credencial principal se usar o reconhecimento de desbloqueio avançado.
Reconhecimento de desbloqueio avançado
- Abrir o alerta de desbloqueio avançado para armazenar as credenciais
- Abrir o alerta de desbloqueio avançado para desbloquear a base de dados
É necessária uma atualização de segurança biométrica.
Não está registada nenhuma credencial biométrica ou de dispositivo.
Acesso ao ficheiro revogado pelo gestor de ficheiros. Feche a base de dados e reabra-a a partir da sua localização.
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 8f35ff877..9ba3d50f4 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -334,7 +334,7 @@
Desbloqueio avançado
Biométrico
Aparência
- Ainda não há nenhuma palavra-chave armazenada nesta base de dados.
+ Ainda não há nenhuma palavra-chave armazenada nesta base de dados.
Configurações da base de dados
Alterar chave mestra
Não foi possível criar a base de dados com essa palavra-passe e ficheiro-chave.
@@ -453,8 +453,6 @@
Abrir base de dados com reconhecimento de desbloqueio avançado
Ainda terá de se lembrar da sua credencial principal se usar o reconhecimento de desbloqueio avançado.
Reconhecimento de desbloqueio avançado
- Abrir o alerta de desbloqueio avançado para armazenar as credenciais
- Abrir o alerta de desbloqueio avançado para desbloquear a base de dados
É necessária uma atualização de segurança biométrica.
Não está registada nenhuma credencial biométrica ou de dispositivo.
Acesso ao ficheiro revogado pelo gestor de ficheiros. Feche a base de dados e reabra-a a partir da sua localização.
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index d0456c65e..8d9756282 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -232,7 +232,7 @@
Construiți %1$s
Magazinul de chei nu este inițializat corect.
Parola criptată stocată
- Această bază de date nu are încă credențiale stocate.
+ Această bază de date nu are încă credențiale stocate.
Istoric
Aparenta
Biometric
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index e13d911f1..e6a1556a9 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -133,7 +133,7 @@
Избегайте использования в пароле символов вне кодировки текста в файле базы, так как эти символы будут преобразованы в одинаковый символ.
Версия %1$s
Зашифрованный пароль сохранён
- Для этой базы главный пароль ещё не сохранён.
+ Для этой базы главный пароль ещё не сохранён.
Введите пароль и/или файл ключа, чтобы разблокировать базу.
\n
\nНе забывайте сохранять копию файла базы в безопасном месте после каждого изменения.
@@ -497,8 +497,6 @@
Извлекать учётные данные базы с использованием расширенной разблокировки
Открыть базу с расширенным распознаванием разблокировки
При использовании расширенной разблокировки вам всё равно необходимо помнить основные учётные данные.
- Открыть запрос расширенной разблокировки для сохранения учётных данных
- Открыть запрос расширенной разблокировки для разблокировки базы
Удалить все ключи шифрования, связанные с распознаванием расширенной разблокировки\?
Ошибка расширенной разблокировки: %1$s
Распознавание расширенной разблокировки
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 673f94783..1055dc0aa 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -290,8 +290,6 @@
Chcete súbor napriek tomu pridať\?
Vyžaduje sa biometrická aktualizácia zabezpečenia.
Úložisko kľúčov nie je správne inicializované.
- Ak chcete odomknúť databázu, otvorte výzvu na rozšírené odomknutie
- Ak chcete uložiť poverenia, otvorte výzvu na rozšírené odomknutie
Nastavenia automatického dopĺňania
Veľkosť vygenerovaného hesla
Nastaví predvolenú veľkosť generovaných hesiel
@@ -363,7 +361,7 @@
Prístup k súboru odmietnutý správcom súborov
Chcete napriek tomu tieto údaje odstrániť\?
Informácie obsiahnuté vo vašom databázovom súbore boli upravené mimo aplikácie.
- Táto databáza zatiaľ nemá uložené poverenia.
+ Táto databáza zatiaľ nemá uložené poverenia.
Nie je možné inicializovať výzvu na rozšírené odomknutie.
Obsah
Odstráňte neprepojené údaje
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 1b32966ac..ce4e53666 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -328,7 +328,7 @@
Visa antalet poster i en grupp
Det går inte att skapa en databas med det här lösenordet och nyckelfil.
Avancerad upplåsning
- Den här databasen har inga sparade autentiseringsuppgifter ännu.
+ Den här databasen har inga sparade autentiseringsuppgifter ännu.
Utseende
Biometrik
Avancerad upplåsning
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 143d76bda..826f3abeb 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -22,7 +22,6 @@
ความปลอดภัย
ปิดบังรหัสผ่านเป็น (***) โดยค่าเรื่มต้น
ระยะเวลาที่ไม่ได้ใช้งานก่อนที่จะทำการล็อกฐานข้อมูล
- ยืนยันการปลดล็อกขั้นสูงเพื่อปลดล็อกฐานข้อมูล
การตั้งค่า
รหัสผ่าน
สร้างรหัสผ่านแล้ว
@@ -91,7 +90,6 @@
ไม่รองรับกุญแจฮาร์ดแวร์
สร้างฐานข้อมูลใหม่
ไม่ได้กำหนดข้อมูลการยืนยันตัวตนหรือไบโอเมตริก
- ยืนยันการปลดล็อกขั้นสูงเพื่อบันทึกข้อมูลประจำตัว
คุณยังจำเป็นต้องจำข้อมูลประจำตัวหลักอยู่ถ้าใช้การปลดล็อกขั้นสูง
กุญแจฮาร์ดแวร์
กำลังโหลดฐานข้อมูล…
@@ -529,7 +527,7 @@
แยกข้อมูลประจำตัวออกด้วยข้อมูลการปลดล็อกขั้นสูง
การปลดล็อกขั้นสูงผิดพลาด: %1$s
คุณสมบัติ
- ฐานข้อมูลนี้ยังไม่มีข้อมูลการเข้าสูระบบเลย
+ ฐานข้อมูลนี้ยังไม่มีข้อมูลการเข้าสูระบบเลย
ประวัติ
เลือกไฟล์ที่จะนําเข้าคุณสมบัติของแอป
นำเข้าคุณสมบัติแอปแล้ว
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 86a3ef557..465da5e4a 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -487,7 +487,7 @@
Aygıt kimlik bilgileri
Parolayı yazın ve ardından bu düğmeye tıklayın.
Gelişmiş kilit açma istemi başlatılamıyor.
- Bu veri tabanında henüz saklanmış kimlik bilgisi yok.
+ Bu veri tabanında henüz saklanmış kimlik bilgisi yok.
Gelişmiş kilit açma hatası: %1$s
Gelişmiş kilit açma parmak izi tanınamadı
Gelişmiş kilit açma anahtarı okunamıyor. Lütfen silin ve kilit açma tanıma işlemini tekrarlayın.
@@ -495,8 +495,6 @@
Veri tabanını gelişmiş kilit açma tanıma ile aç
Gelişmiş kilit açma tanıma kullanırsanız, yine de ana kimlik bilgilerinizi hatırlamanız gerekmektedir.
Gelişmiş kilit açma tanıma
- Kimlik bilgilerini saklamak için gelişmiş kilit açma istemini aç
- Veri tabanının kilidini açmak için gelişmiş kilit açma istemini aç
Gelişmiş kilit açma anahtarını sil
Enter
Backspace
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index be7df8b8f..829c1079b 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -405,7 +405,7 @@
Біометричний ключ
Зовнішній вигляд
Історія
- У цій базі даних ще немає збережених облікових даних.
+ У цій базі даних ще немає збережених облікових даних.
Зашифрований пароль збережено
Сховище ключів не ініціалізовано належним чином.
Збірка %1$s
@@ -500,8 +500,6 @@
Відкрити базу даних розширеним розпізнаванням розблокування
Навіть якщо ви користуєтеся розширеним розблокуванням, вам однаково необхідно пам\'ятати основні облікові дані.
Розпізнавання розширеного розблокування
- Відкривати запит розширеного розблокування, щоб зберегти облікові дані
- Відкривати запит розширеного розблокування, щоб розблокувати базу даних
Видалити ключ розширеного розблокування
Enter
Backspace
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
index cc528f75e..87fdb5c51 100644
--- a/app/src/main/res/values-v21/styles.xml
+++ b/app/src/main/res/values-v21/styles.xml
@@ -24,50 +24,33 @@
- @color/grey_dark
-
+
+
+
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v21/styles_classic.xml b/app/src/main/res/values-v21/styles_classic.xml
deleted file mode 100644
index 07fe6822c..000000000
--- a/app/src/main/res/values-v21/styles_classic.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v21/styles_divine.xml b/app/src/main/res/values-v21/styles_divine.xml
deleted file mode 100644
index 450665471..000000000
--- a/app/src/main/res/values-v21/styles_divine.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v21/styles_kunzite.xml b/app/src/main/res/values-v21/styles_kunzite.xml
deleted file mode 100644
index a865ed5af..000000000
--- a/app/src/main/res/values-v21/styles_kunzite.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v21/styles_moon.xml b/app/src/main/res/values-v21/styles_moon.xml
deleted file mode 100644
index 40d51ea7b..000000000
--- a/app/src/main/res/values-v21/styles_moon.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v21/styles_reply.xml b/app/src/main/res/values-v21/styles_reply.xml
deleted file mode 100644
index 2bccd5769..000000000
--- a/app/src/main/res/values-v21/styles_reply.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v21/styles_simple.xml b/app/src/main/res/values-v21/styles_simple.xml
deleted file mode 100644
index d5a0f4ea5..000000000
--- a/app/src/main/res/values-v21/styles_simple.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v21/styles_sun.xml b/app/src/main/res/values-v21/styles_sun.xml
deleted file mode 100644
index 88f29ba05..000000000
--- a/app/src/main/res/values-v21/styles_sun.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v23/fingerprint.xml b/app/src/main/res/values-v23/fingerprint.xml
deleted file mode 100644
index aef4ccdf0..000000000
--- a/app/src/main/res/values-v23/fingerprint.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
- 160
- 160
- 80
- 5
- 7
- 80dp
-
-
- M56.2199243,45.3815903 C56.2199243,45.3815903 65.1913567,38.8543184 80.3604294,38.8543184 C95.5295022,38.8543184 103.720044,45.2851323 103.720044,45.2851323
- M45.5181172,67.9181841 C49.9761548,62.7019025 59.122049,49.7790452 80.2279027,49.7790452 C101.333756,49.7790452 110.740506,62.0384399 114.937688,67.9181841
- M51.7375623,107.718438 C51.7375623,107.718438 48.7129745,99.6302234 48.7129745,91.6334356 C48.7129745,81.3266864 55.9028711,60.2476586 80.4057228,60.2478671 C100.798248,60.2480407 112.457463,79.7942647 112.457463,88.386575 C112.457462,99.2963939 105.619846,103.039218 100.781849,102.18762 C95.9438519,101.336021 90.4490979,97.2187731 91.0639139,92.3178681 C91.67873,87.4169631 85.2177374,81.3265129 80.7504553,81.3266871 C73.0900115,81.3269859 69.8146331,85.3921834 69.8146329,92.2700585 C69.8146324,107.718437 83.7557525,121.02713 91.6787289,121.027128
- M70.7357889,121.024995 C70.7357889,121.024995 57.4650216,106.018711 58.8888756,91.5596242 C60.5513085,74.6777941 73.9858126,70.313752 80.3788823,70.3807995 C86.771952,70.4478469 101.550994,76.8218704 101.550997,92.2895418
- M80.1599645,91.1813411 C80.1599645,91.1813411 81.1144795,102.68333 86.7971146,107.529716 C93.2390527,113.023667 105.911091,112.342743 105.911091,112.342743
-
- M52.2735573,79.0771904 C52.2735573,79.0771904 69.2403688,96.0440006 69.2403683,96.0440014 C69.2403679,96.0440021 109.820188,55.4641819 109.820188,55.4641819
-
- M62,62 C62,62 80.5647617,80.5647617 80.564762,80.564762 C80.5647622,80.5647622 94.2921789,94.223714 98.5644262,98.5644262
- M98.5644262,62 C98.5644251,62 81.1979242,79.366503 81.1979229,79.3665033 C81.1979216,79.3665035 62,98.5644262 62,98.5644262
-
-
- M0 0 L160 0 L160 40 L0 40 Z
- M0 120 L160 120 L160 160 L0 160 Z
-
- ?attr/colorOnAccentColor
- ?attr/colorOnAccentColor
-
-
diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml
index 32c8c37b8..0841a936e 100644
--- a/app/src/main/res/values-v23/styles.xml
+++ b/app/src/main/res/values-v23/styles.xml
@@ -19,18 +19,13 @@
-->
-
-
-
-
diff --git a/app/src/main/res/values-v23/styles_classic.xml b/app/src/main/res/values-v23/styles_classic.xml
deleted file mode 100644
index fc41f6e8c..000000000
--- a/app/src/main/res/values-v23/styles_classic.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/values-v23/styles_divine.xml b/app/src/main/res/values-v23/styles_divine.xml
deleted file mode 100644
index 4b5fef5fd..000000000
--- a/app/src/main/res/values-v23/styles_divine.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/values-v23/styles_simple.xml b/app/src/main/res/values-v23/styles_simple.xml
deleted file mode 100644
index 8bd4e1137..000000000
--- a/app/src/main/res/values-v23/styles_simple.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml
index 0cee890ff..e0d3a8db2 100644
--- a/app/src/main/res/values-v27/styles.xml
+++ b/app/src/main/res/values-v27/styles.xml
@@ -19,11 +19,11 @@
-->
diff --git a/app/src/main/res/values-v27/styles_classic.xml b/app/src/main/res/values-v27/styles_classic.xml
deleted file mode 100644
index 003e545c2..000000000
--- a/app/src/main/res/values-v27/styles_classic.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/values-v27/styles_divine.xml b/app/src/main/res/values-v27/styles_divine.xml
deleted file mode 100644
index 251346395..000000000
--- a/app/src/main/res/values-v27/styles_divine.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/values-v27/styles_simple.xml b/app/src/main/res/values-v27/styles_simple.xml
deleted file mode 100644
index bf756fc2b..000000000
--- a/app/src/main/res/values-v27/styles_simple.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 9fd7dad4b..0447b36c9 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -208,7 +208,7 @@
确认不使用加密密钥吗?
构建 %1$s
加密密码已保存
- 当前数据库无密码。
+ 当前数据库无密码。
设为默认的填充服务
启用自动填充功能,以快速填写其他应用中的表单
密码生成长度
@@ -500,8 +500,6 @@
用高级解锁识别打开数据库
即使您使用高级解锁识别,您仍然需要记住您的主凭据。
高级解锁识别
- 点击以打开高级解锁提示来存储凭证
- 点击以使用高级识别解锁
删除高级解锁密钥
输入
退格键
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 2944dfcc3..ca5ebb493 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -448,13 +448,11 @@
欄位字型
姓名
從不
- 當前資料庫無密碼。
+ 當前資料庫無密碼。
沒有搜尋結果
沒有這個連結的處理程式。
通知
卡號
- 點擊以開啟高級解鎖提示來存儲憑證
- 點擊以使用高級解鎖
其他
演算法
計數器
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index aa42f153d..a56fe1610 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -18,24 +18,10 @@
along with KeePassDX. If not, see .
-->
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 1d7fbc0cb..45c866db7 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -39,8 +39,10 @@
#0e0e0e
#E00E0E0E
#000001
+ #0D000000
#E0000000
+ #F1F8FF
#E6F3FF
#90CAF9
#5DB2F6
@@ -48,12 +50,22 @@
#1E88E5
#1976D2
#1565C0
+ #1D2632
+ #161B22
#33b5e5
#2B9AC3
#2486AB
#2c7a96
+ #0E2D37
+ #E5F3E2
+ #E8F1E6
+ #E0EDDD
+ #DEEFDB
+ #D8EDD5
+ #D1EACE
+ #D0ECCC
#a5d6a7
#66BB6A
#4caf50
@@ -61,12 +73,18 @@
#388e3c
#2e7d32
#1B5E20
+ #24352A
+ #202923
+ #FBECEE
+ #FCE6E8
#ef9a9a
#EF5350
#f44336
#e53935
#d32f2f
+ #422429
+ #332023
#FFCC80
#ffa726
@@ -79,6 +97,7 @@
#F2EDFA
#F7F3FD
#E0F7F3FD
+ #F7D9FB
#ce93d8
#9048bc
#743998
@@ -90,6 +109,7 @@
#FCFCFF
#E0FCFCFF
+ #191A1B
#202124
#E0202124
#3E4247
@@ -98,16 +118,564 @@
#263238
#5E97F6
#1A73E8
+
+
+
- #FFBA52
- #F9AA33
- #EDF0F2
- #D1DBE0
- #4A6572
- #344955
- #E0232F34
- #232F34
- #27343A
- #414445
+ @color/green
+ @color/green_whitest
+ @color/white
+ @color/green
+ @color/white
+ @color/orange_dark
+ @color/white
+ @color/orange_dark
+ @color/white
+ #835500
+ #FFFFFF
+ #FFDDB4
+ #291800
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ #D4F1D0
+ #1A1C19
+ #D0ECCC
+ #3C423A
+ #D3EDD0
+ #CDEACA
+ #C8E8C5
+ #C2E4BF
+ #BEE1BB
+ #DEE5D8
+ #424940
+ #72796F
+ #F0F1EB
+ #2F312D
+ #7DDC7A
+
+ @color/green
+ #1A251C
+ @color/white
+ @color/green
+ @color/white
+ @color/orange
+ @color/green_black_light
+ @color/orange
+ @color/green_black_light
+ #FFB953
+ #452B00
+ #633F00
+ #FFDDB4
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ #182219
+ #E2E3DD
+ #1A251C
+ #E2E3DD
+ #27332A
+ #223025
+ #212f24
+ #1D2C21
+ #1B2B1E
+ #424940
+ #C2C9BD
+ #8C9388
+ #1A1C19
+ #E2E3DD
+ #006E1C
+
+
+
+ @color/cyan_lighter
+ @color/white_darkest
+ @color/white
+ @color/cyan_lighter
+ @color/white
+ @color/cyan
+ @color/white
+ @color/cyan
+ @color/white
+ @color/cyan_dark
+ @color/white
+ @color/cyan_dark
+ @color/white
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ #E1E3E4
+ @color/cyan_dark
+ #D4D4D4
+ @color/cyan_dark
+ #E6E8EA
+ #E6E8EA
+ #DBDDDF
+ #D8DCDF
+ #D3D8DC
+ #DEE5D8
+ #404649
+ #72796F
+ #F0F1EB
+ #2D2F31
+ #4FC3F7
+ @color/cyan
+
+ #209BC6
+ @color/black_light
+ @color/white
+ @color/cyan
+ @color/white
+ #268EB3
+ @color/white
+ #215B70
+ @color/white_grey_light
+ @color/cyan_dark
+ @color/white
+ @color/cyan_dark
+ @color/white
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ #0C0E0E
+ #DDE3E3
+ #1A2125
+ #F1F2F3
+ #222D30
+ #212B2F
+ #1D262C
+ #1B252B
+ #182025
+ #404649
+ #C2C9BD
+ #888F93
+ #191B1C
+ #DDE1E3
+ #00486E
+ @color/cyan_lightest
+
+
+
+ @color/orange_dark
+ @color/white
+ @color/white
+ @color/green_dark
+ @color/white
+ @color/orange_dark
+ #FBEFE5
+ @color/orange_dark
+ @color/white
+ @color/orange_lightest
+ #3A1A04
+ @color/orange_lightest
+ #3A1A04
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ @color/white
+ @color/orange_darkest
+ @color/white
+ #351904
+ #FFFCF9
+ #FFFBF6
+ #FEF9F2
+ #FBF5EC
+ #FAF2E7
+ #E5DED8
+ #494340
+ #79736F
+ #F1EEEB
+ #312F2D
+ #F7924F
+ @color/orange_dark
+
+ @color/orange_darkest
+ @color/black
+ @color/white
+ @color/green_darkest
+ @color/white
+ @color/orange_dark
+ @color/white
+ @color/orange_darkest
+ @color/white
+ @color/green_darkest
+ @color/white
+ @color/green_darkest
+ @color/white
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ @color/black
+ #E3E0DD
+ @color/black
+ #F3F2F1
+ #2C221E
+ #221A17
+ #1C1613
+ #171210
+ #130F0E
+ #494340
+ #C9C2BD
+ #938B88
+ #1C1A19
+ #E3E0DD
+ #6E3000
+ @color/orange_lighter
+
+
+
+ @color/blue_deep
+ @color/white_slight
+ @color/white
+ @color/blue_deep
+ @color/white_darkest
+ @color/blue_deep
+ @color/white
+ #B9DFFF
+ #151B2C
+ @color/cyan_dark
+ @color/white
+ @color/cyan_dark
+ @color/white
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ @color/white_slight
+ @color/cyan_dark
+ @color/white_slight
+ @color/cyan_dark
+ #FCFEFF
+ #F8FCFF
+ #F1F7FD
+ #EEF7FF
+ #EAF5FF
+ #DEE5D8
+ #404649
+ #72796F
+ #F0F1EB
+ #2D2F31
+ @color/blue_deep
+ @color/grey_darker
+
+ #1A66CC
+ @color/grey_slight
+ @color/white
+ #0D58BA
+ @color/white
+ @color/blue_slight
+ @color/white
+ #043370
+ @color/white_grey_light
+ @color/cyan_dark
+ @color/white
+ @color/cyan_dark
+ @color/white
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ #191A1B
+ #DDE3E3
+ #191A1B
+ #F1F2F3
+ #212B2F
+ #1D262C
+ #1B252B
+ #182025
+ #141A1E
+ #404649
+ #C2C9BD
+ #888F93
+ #191B1C
+ #DDE1E3
+ #00486E
+ @color/white
+
+
+
+ @color/blue_light
+ @color/blue_dark
+ @color/white
+ @color/blue_deep
+ @color/white_darkest
+ @color/blue_lighter
+ @color/white
+ @color/blue
+ @color/white
+ @color/cyan_dark
+ @color/white
+ @color/cyan_dark
+ @color/white
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ #EBF7FF
+ @color/cyan_dark
+ #D8E7F6
+ @color/cyan_dark
+ #E9F5FF
+ #E1F1FF
+ #DBEEFE
+ #D5ECFF
+ #D2EBFF
+ #DEE5D8
+ #404649
+ #72796F
+ #F0F1EB
+ #2D2F31
+ @color/blue_deep
+ @color/blue_darker
+
+ @color/blue
+ @color/blue_dark
+ @color/white
+ @color/blue_deep
+ @color/white
+ @color/blue_light
+ @color/white
+ @color/blue_light
+ @color/white
+ @color/cyan_dark
+ @color/white
+ @color/cyan_dark
+ @color/white
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ #051B2E
+ #DDE3E3
+ #082239
+ #F1F2F3
+ #0C3355
+ #0A2C49
+ #092741
+ #082239
+ #071F33
+ #404649
+ #C2C9BD
+ #888F93
+ #191B1C
+ #DDE1E3
+ #00486E
+ @color/blue_lighter
+
+
+
+ @color/red
+ @color/red_dark
+ @color/red_white_light
+ @color/red
+ @color/white_darkest
+ @color/orange
+ @color/white
+ @color/orange
+ @color/white
+ #986100
+ @color/white
+ #986100
+ @color/white
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ @color/red_white_light
+ @color/red_black_dark
+ #FFEDEF
+ @color/red_black_dark
+ #FBEBEB
+ #FAE2E2
+ #FADDDE
+ #FBD9DA
+ #FBD6D7
+ #DEE5D8
+ #494040
+ #796F6F
+ #F0F1EB
+ #312D2D
+ @color/red_black
+ @color/red_dark
+
+ @color/red
+ @color/red_dark
+ @color/red_white_light
+ @color/red_dark
+ @color/white
+ @color/orange_dark
+ @color/white
+ @color/orange_darkest
+ @color/white
+ #986100
+ @color/white
+ #986100
+ @color/white
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ @color/red_black_dark
+ #DDE3E3
+ #2E1D20
+ #F1F2F3
+ #4E2B2E
+ #432527
+ #3C2123
+ #321B1D
+ #2B1719
+ #494040
+ #C2C9BD
+ #938888
+ #1C1919
+ #E3DDDD
+ #6E0000
+ @color/red_lighter
+
+
+
+ #F9AA33
+ #D1DADF
+ #232F34
+ #F9AA33
+ #232F34
+ #FF9A00
+ #232F34
+ #3E5560
+ #F6F8FA
+ #986100
+ @color/white
+ #986100
+ @color/white
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ #D4DFE4
+ #27343A
+ #CCD7DC
+ #27343A
+ #EFF1F3
+ #EAEDEF
+ #E3E7E9
+ #DEE2E4
+ #D8DDDF
+ #D8DFE5
+ #494040
+ #6F7479
+ #F0F1EB
+ #414445
+ #243442
+ #27343A
+
+ #F9AA33
+ #1D272B
+ #232F34
+ #F9AA33
+ #232F34
+ #FF9A00
+ #232F34
+ #2D3E45
+ #F6F8FA
+ #27343A
+ #232F34
+ #986100
+ @color/white
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ #212B30
+ #DDE3E3
+ #28373C
+ #F1F2F3
+ #2A383E
+ #263339
+ #233035
+ #1F2B30
+ #1C282C
+ #404449
+ #DEE4E6
+ #6F7479
+ #F0F1EB
+ #414445
+ #243442
+ #F1F2F3
+
+
+
+ @color/red
+ #F5F3F6
+ @color/white
+ @color/red
+ @color/white
+ @color/red
+ @color/white
+ #8449A8
+ @color/white
+ #CD35CA
+ @color/white
+ #CD35CA
+ @color/white
+ #BA1A1A
+ #FFDAD6
+ #FFFFFF
+ #410002
+ #FEE5FF
+ #2A2033
+ #F3D6FF
+ @color/red_black_dark
+ #FAE1FB
+ #F9DDFA
+ #FADBFB
+ #F6D3F8
+ #F9D3FB
+ #DFD8E5
+ #454049
+ #756F79
+ #EFEBF1
+ #2F2D31
+ #2F2442
+ @color/purple_dark
+
+ @color/red_dark
+ @color/black_purple
+ @color/white_purple_light
+ @color/red_dark
+ @color/white
+ @color/red
+ @color/white_purple_light
+ #4C186A
+ #DED1E8
+ #A80D8F
+ @color/white
+ #A80D8F
+ @color/white
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ #2A1239
+ #DDE3E3
+ @color/black_purple_dark
+ #F1F2F3
+ #3F1B55
+ #3A184E
+ #321243
+ #301440
+ #2A1239
+ #424049
+ #C2BDC9
+ #8D8893
+ #1A191C
+ #E0DDE3
+ #2E006E
+ @color/purple_lighter
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index e87cea9f7..4948a6087 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -19,12 +19,16 @@
-->
18dp
- 8dp
+ 4dp
22dp
8dp
15dp
144dp
- 6dp
+ 8dp
+ 4dp
+ 8dp
+ 48dp
+ 48dp
10dp
5dp
14dp
@@ -32,6 +36,10 @@
48dp
0dp
1
- 160dp
+ 24dp
+ 12dp
+ 24dp
+ 48dp
+ 8dp
260
\ 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 1ee2f2d1e..97a30c577 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -260,6 +260,7 @@
false
+ settings_database_category_key
settings_database_key
settings_database_security_key
settings_database_credentials_key
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d43f97320..eaacbc013 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -18,6 +18,7 @@
along with KeePassDX. If not, see .
-->
Contact
+ Info
Contribution
Feedback
Homepage
@@ -252,11 +253,17 @@
Copy of %1$s
Settings
App settings
+ Search, lock, history, properties
Form filling
+ Keyboard, autofill, clipboard
Advanced unlocking
+ Biometry, device credential
Database settings
+ Metadata, recycle bin, templates, history
Security settings
+ Encryption, key derivation function
Master key settings
+ Change, renewal
Donate
Edit
Copy
@@ -286,8 +293,8 @@
Never
No search results
Install a web browser to open this URL.
- Open existing database
- Create new database
+ Open existing vault
+ Create new vault
Quick search
Request a search when opening a database
Subdomain search
@@ -381,11 +388,11 @@
Permission
Version %1$s
Build %1$s
+ Configure
No biometric or device credential is enrolled.
Biometric security update required.
The keystore is not properly initialized.
- Open the advanced unlock prompt to unlock the database
- Open the advanced unlock prompt to store credentials
+ Unlock and link biometric
Advanced unlock recognition
You still need to remember your main credential if you use advanced unlock recognition.
Open database with advanced unlock recognition
@@ -394,12 +401,13 @@
Cannot read the advanced unlock key. Please delete it and repeat the unlock recognition procedure.
Could not recognize advanced unlock print
Advanced unlock error: %1$s
- This database does not have stored credential yet.
+ Unavailable
Unable to initialize advanced unlock prompt.
Type in the password, and then click this button.
History
Properties
Appearance
+ Themes, colors, attributes
Biometric
Device credential
General
@@ -428,6 +436,7 @@
Show lock button
Displays the lock button in the user interface
Content
+ Unlock
Advanced unlock
Tap to delete advanced unlocking keys
Use advanced unlocking to open a database more easily
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index ea7428ab8..e1feda0a6 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -20,89 +20,103 @@
-
-
+
-
@@ -111,235 +125,254 @@
-
-
-
-
-
-
-
+
+ - @style/KeepassDXStyle.SnackBar
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -348,161 +381,133 @@
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
@@ -513,44 +518,37 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values/styles_classic.xml b/app/src/main/res/values/styles_classic.xml
index 01b525d56..bfb67f937 100644
--- a/app/src/main/res/values/styles_classic.xml
+++ b/app/src/main/res/values/styles_classic.xml
@@ -19,157 +19,80 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_divine.xml b/app/src/main/res/values/styles_divine.xml
index a99d3c1f0..ac4315637 100644
--- a/app/src/main/res/values/styles_divine.xml
+++ b/app/src/main/res/values/styles_divine.xml
@@ -19,170 +19,80 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_kunzite.xml b/app/src/main/res/values/styles_kunzite.xml
index e6518b250..96e78b9c4 100644
--- a/app/src/main/res/values/styles_kunzite.xml
+++ b/app/src/main/res/values/styles_kunzite.xml
@@ -19,157 +19,80 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_moon.xml b/app/src/main/res/values/styles_moon.xml
index c4db44720..4f81e851d 100644
--- a/app/src/main/res/values/styles_moon.xml
+++ b/app/src/main/res/values/styles_moon.xml
@@ -19,132 +19,80 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_reply.xml b/app/src/main/res/values/styles_reply.xml
index e38c7b4c7..8efe3c0c8 100644
--- a/app/src/main/res/values/styles_reply.xml
+++ b/app/src/main/res/values/styles_reply.xml
@@ -19,154 +19,81 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_simple.xml b/app/src/main/res/values/styles_simple.xml
index dc4145d7f..5c7a1efd6 100644
--- a/app/src/main/res/values/styles_simple.xml
+++ b/app/src/main/res/values/styles_simple.xml
@@ -19,157 +19,80 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_sun.xml b/app/src/main/res/values/styles_sun.xml
index 212d2ca60..2c3b7c8b2 100644
--- a/app/src/main/res/values/styles_sun.xml
+++ b/app/src/main/res/values/styles_sun.xml
@@ -19,131 +19,80 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 05fd37224..1cf0484e8 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -25,42 +25,50 @@
android:key="@string/settings_app_key"
android:title="@string/menu_app_settings"
android:icon="@drawable/prefs_phone_android_24dp"
+ android:summary="@string/menu_app_settings_summary"
android:persistent="false" />
+ android:key="@string/settings_database_key"
+ android:title="@string/menu_database_settings"
+ android:icon="@drawable/prefs_data_usage_24dp"
+ android:summary="@string/menu_database_settings_summary"
+ android:persistent="false" />
diff --git a/app/src/main/res/xml/preferences_advanced_unlock.xml b/app/src/main/res/xml/preferences_advanced_unlock.xml
index b66b7168e..39d4756e5 100644
--- a/app/src/main/res/xml/preferences_advanced_unlock.xml
+++ b/app/src/main/res/xml/preferences_advanced_unlock.xml
@@ -24,17 +24,17 @@
android:key="@string/advanced_unlock_explanation_key"
android:icon="@drawable/prefs_info_24dp"
android:summary="@string/advanced_unlock_explanation_summary"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -55,12 +55,12 @@
android:key="@string/clipboard_explanation_key"
android:icon="@drawable/prefs_info_24dp"
android:summary="@string/clipboard_explanation_summary"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-