mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Compare commits
23 Commits
2.5.0.0bet
...
2.5.0.0bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78354e4736 | ||
|
|
b9a792e6bd | ||
|
|
c533d21250 | ||
|
|
74572c8102 | ||
|
|
b8de64fab0 | ||
|
|
877b909205 | ||
|
|
1b1dcc0f45 | ||
|
|
94e5988794 | ||
|
|
b22333fda5 | ||
|
|
400c6bef78 | ||
|
|
edf6c2ff07 | ||
|
|
5eec1a276c | ||
|
|
f707fd7649 | ||
|
|
75b028daf3 | ||
|
|
c6f259d18f | ||
|
|
954d522341 | ||
|
|
1f8d17d27e | ||
|
|
c303ffafb5 | ||
|
|
6f513b4920 | ||
|
|
a83c60583f | ||
|
|
cde8950257 | ||
|
|
0b4dd1e909 | ||
|
|
28e2600271 |
@@ -1,3 +1,10 @@
|
|||||||
|
KeepassDX (2.5.0.0beta22)
|
||||||
|
* Rebuild code for actions
|
||||||
|
* Add UUID as entry view
|
||||||
|
* Fix bug with natural order
|
||||||
|
* Fix number of entries in databaseV1
|
||||||
|
* New entry views
|
||||||
|
|
||||||
KeepassDX (2.5.0.0beta21)
|
KeepassDX (2.5.0.0beta21)
|
||||||
* Fix nested groups no longer visible in V1 databases
|
* Fix nested groups no longer visible in V1 databases
|
||||||
* Improved data import algorithm for V1 databases
|
* Improved data import algorithm for V1 databases
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ android {
|
|||||||
applicationId "com.kunzisoft.keepass"
|
applicationId "com.kunzisoft.keepass"
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 27
|
targetSdkVersion 27
|
||||||
versionCode = 21
|
versionCode = 22
|
||||||
versionName = "2.5.0.0beta21"
|
versionName = "2.5.0.0beta22"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
|
||||||
testApplicationId = "com.kunzisoft.keepass.tests"
|
testApplicationId = "com.kunzisoft.keepass.tests"
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ class EntryActivity : LockingHideActivity() {
|
|||||||
titleIconView?.assignDatabaseIcon(database.drawFactory, entry.icon, iconColor)
|
titleIconView?.assignDatabaseIcon(database.drawFactory, entry.icon, iconColor)
|
||||||
|
|
||||||
// Assign title text
|
// Assign title text
|
||||||
val entryTitle = entry.getVisualTitle()
|
val entryTitle = entry.title
|
||||||
collapsingToolbarLayout?.title = entryTitle
|
collapsingToolbarLayout?.title = entryTitle
|
||||||
toolbar?.title = entryTitle
|
toolbar?.title = entryTitle
|
||||||
|
|
||||||
@@ -236,6 +236,9 @@ class EntryActivity : LockingHideActivity() {
|
|||||||
entryContentsView?.assignExpiresDate(getString(R.string.never))
|
entryContentsView?.assignExpiresDate(getString(R.string.never))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Assign special data
|
||||||
|
entryContentsView?.assignUUID(entry.nodeId.id)
|
||||||
|
|
||||||
database.stopManageEntry(entry)
|
database.stopManageEntry(entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ import com.kunzisoft.keepass.autofill.AutofillHelper
|
|||||||
import com.kunzisoft.keepass.database.SortNodeEnum
|
import com.kunzisoft.keepass.database.SortNodeEnum
|
||||||
import com.kunzisoft.keepass.database.action.ProgressDialogSaveDatabaseThread
|
import com.kunzisoft.keepass.database.action.ProgressDialogSaveDatabaseThread
|
||||||
import com.kunzisoft.keepass.database.action.node.*
|
import com.kunzisoft.keepass.database.action.node.*
|
||||||
|
import com.kunzisoft.keepass.database.action.node.ActionNodeDatabaseRunnable.Companion.NODE_POSITION_FOR_ACTION_NATURAL_ORDER_KEY
|
||||||
import com.kunzisoft.keepass.database.element.*
|
import com.kunzisoft.keepass.database.element.*
|
||||||
import com.kunzisoft.keepass.education.GroupActivityEducation
|
import com.kunzisoft.keepass.education.GroupActivityEducation
|
||||||
import com.kunzisoft.keepass.icons.assignDatabaseIcon
|
import com.kunzisoft.keepass.icons.assignDatabaseIcon
|
||||||
@@ -61,7 +62,6 @@ import com.kunzisoft.keepass.magikeyboard.KeyboardHelper
|
|||||||
import com.kunzisoft.keepass.magikeyboard.MagikIME
|
import com.kunzisoft.keepass.magikeyboard.MagikIME
|
||||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||||
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
||||||
import com.kunzisoft.keepass.utils.LOCK_ACTION
|
|
||||||
import com.kunzisoft.keepass.utils.MenuUtil
|
import com.kunzisoft.keepass.utils.MenuUtil
|
||||||
import com.kunzisoft.keepass.view.AddNodeButtonView
|
import com.kunzisoft.keepass.view.AddNodeButtonView
|
||||||
import net.cachapa.expandablelayout.ExpandableLayout
|
import net.cachapa.expandablelayout.ExpandableLayout
|
||||||
@@ -523,10 +523,10 @@ class GroupActivity : LockingActivity(),
|
|||||||
MoveGroupRunnable(
|
MoveGroupRunnable(
|
||||||
this,
|
this,
|
||||||
Database.getInstance(),
|
Database.getInstance(),
|
||||||
groupToMove,
|
groupToMove,
|
||||||
newParent,
|
newParent,
|
||||||
AfterAddNodeRunnable(),
|
AfterAddNodeRunnable(),
|
||||||
!readOnly)
|
!readOnly)
|
||||||
}.start()
|
}.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -812,20 +812,30 @@ class GroupActivity : LockingActivity(),
|
|||||||
override fun onActionNodeFinish(actionNodeValues: ActionNodeValues) {
|
override fun onActionNodeFinish(actionNodeValues: ActionNodeValues) {
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
if (actionNodeValues.result.isSuccess) {
|
if (actionNodeValues.result.isSuccess) {
|
||||||
actionNodeValues.oldNode?.let { oldNode ->
|
|
||||||
|
|
||||||
mListNodesFragment?.removeNode(oldNode)
|
// If the action register the position, use it to remove the entry view
|
||||||
|
val positionNode = actionNodeValues.result.data?.getInt(NODE_POSITION_FOR_ACTION_NATURAL_ORDER_KEY)
|
||||||
|
if (PreferencesUtil.getListSort(this@GroupActivity) == SortNodeEnum.DB
|
||||||
|
&& positionNode != null) {
|
||||||
|
mListNodesFragment?.removeNodeAt(positionNode)
|
||||||
|
} else {
|
||||||
|
// else use the old Node that was the entry unchanged with the old parent
|
||||||
|
actionNodeValues.oldNode?.let { oldNode ->
|
||||||
|
mListNodesFragment?.removeNode(oldNode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO Move trash view
|
// Add trash in views list if it doesn't exists
|
||||||
// Add trash in views list if it doesn't exists
|
val database = Database.getInstance()
|
||||||
val database = Database.getInstance()
|
if (database.isRecycleBinEnabled) {
|
||||||
if (database.isRecycleBinEnabled) {
|
val recycleBin = database.recycleBin
|
||||||
val recycleBin = database.recycleBin
|
if (mCurrentGroup != null && recycleBin != null
|
||||||
if (mCurrentGroup != null && recycleBin != null
|
|
||||||
&& mCurrentGroup!!.parent == null
|
&& mCurrentGroup!!.parent == null
|
||||||
&& mCurrentGroup != recycleBin) {
|
&& mCurrentGroup != recycleBin) {
|
||||||
mListNodesFragment?.addNode(recycleBin)
|
if (mListNodesFragment?.contains(recycleBin) == true)
|
||||||
}
|
mListNodesFragment?.updateNode(recycleBin)
|
||||||
|
else
|
||||||
|
mListNodesFragment?.addNode(recycleBin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -252,18 +252,26 @@ class ListNodesFragment : StylishFragment(), SortDialogFragment.SortSelectionLis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun contains(node: NodeVersioned): Boolean {
|
||||||
|
return mAdapter?.contains(node) ?: false
|
||||||
|
}
|
||||||
|
|
||||||
fun addNode(newNode: NodeVersioned) {
|
fun addNode(newNode: NodeVersioned) {
|
||||||
mAdapter?.addNode(newNode)
|
mAdapter?.addNode(newNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateNode(oldNode: NodeVersioned, newNode: NodeVersioned) {
|
fun updateNode(oldNode: NodeVersioned, newNode: NodeVersioned? = null) {
|
||||||
mAdapter?.updateNode(oldNode, newNode)
|
mAdapter?.updateNode(oldNode, newNode ?: oldNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun removeNode(pwNode: NodeVersioned) {
|
fun removeNode(pwNode: NodeVersioned) {
|
||||||
mAdapter?.removeNode(pwNode)
|
mAdapter?.removeNode(pwNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun removeNodeAt(position: Int) {
|
||||||
|
mAdapter?.removeNodeAt(position)
|
||||||
|
}
|
||||||
|
|
||||||
interface OnScrollListener {
|
interface OnScrollListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ class SortDialogFragment : DialogFragment() {
|
|||||||
private var mAscending: Boolean = true
|
private var mAscending: Boolean = true
|
||||||
private var mRecycleBinBottom: Boolean = true
|
private var mRecycleBinBottom: Boolean = true
|
||||||
|
|
||||||
|
private var recycleBinBottomView: CompoundButton? = null
|
||||||
|
|
||||||
override fun onAttach(context: Context?) {
|
override fun onAttach(context: Context?) {
|
||||||
super.onAttach(context)
|
super.onAttach(context)
|
||||||
try {
|
try {
|
||||||
@@ -73,14 +75,14 @@ class SortDialogFragment : DialogFragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mCheckedId = retrieveViewFromEnum(mSortNodeEnum!!)
|
mCheckedId = retrieveViewFromEnum(mSortNodeEnum)
|
||||||
|
|
||||||
val rootView = activity.layoutInflater.inflate(R.layout.fragment_sort_selection, null)
|
val rootView = activity.layoutInflater.inflate(R.layout.fragment_sort_selection, null)
|
||||||
builder.setTitle(R.string.sort_menu)
|
builder.setTitle(R.string.sort_menu)
|
||||||
builder.setView(rootView)
|
builder.setView(rootView)
|
||||||
// Add action buttons
|
// Add action buttons
|
||||||
.setPositiveButton(android.R.string.ok
|
.setPositiveButton(android.R.string.ok
|
||||||
) { _, _ -> mListener?.onSortSelected(mSortNodeEnum!!, mAscending, mGroupsBefore, mRecycleBinBottom) }
|
) { _, _ -> mListener?.onSortSelected(mSortNodeEnum, mAscending, mGroupsBefore, mRecycleBinBottom) }
|
||||||
.setNegativeButton(R.string.cancel) { _, _ -> }
|
.setNegativeButton(R.string.cancel) { _, _ -> }
|
||||||
|
|
||||||
val ascendingView = rootView.findViewById<CompoundButton>(R.id.sort_selection_ascending)
|
val ascendingView = rootView.findViewById<CompoundButton>(R.id.sort_selection_ascending)
|
||||||
@@ -93,25 +95,35 @@ class SortDialogFragment : DialogFragment() {
|
|||||||
groupsBeforeView.isChecked = mGroupsBefore
|
groupsBeforeView.isChecked = mGroupsBefore
|
||||||
groupsBeforeView.setOnCheckedChangeListener { _, isChecked -> mGroupsBefore = isChecked }
|
groupsBeforeView.setOnCheckedChangeListener { _, isChecked -> mGroupsBefore = isChecked }
|
||||||
|
|
||||||
val recycleBinBottomView = rootView.findViewById<CompoundButton>(R.id.sort_selection_recycle_bin_bottom)
|
recycleBinBottomView = rootView.findViewById(R.id.sort_selection_recycle_bin_bottom)
|
||||||
if (!recycleBinAllowed) {
|
if (!recycleBinAllowed) {
|
||||||
recycleBinBottomView.visibility = View.GONE
|
recycleBinBottomView?.visibility = View.GONE
|
||||||
} else {
|
} else {
|
||||||
// Check if recycle bin at the bottom
|
// Check if recycle bin at the bottom
|
||||||
recycleBinBottomView.isChecked = mRecycleBinBottom
|
recycleBinBottomView?.isChecked = mRecycleBinBottom
|
||||||
recycleBinBottomView.setOnCheckedChangeListener { _, isChecked -> mRecycleBinBottom = isChecked }
|
recycleBinBottomView?.setOnCheckedChangeListener { _, isChecked -> mRecycleBinBottom = isChecked }
|
||||||
|
|
||||||
|
disableRecycleBinBottomOptionIfNaturalOrder()
|
||||||
}
|
}
|
||||||
|
|
||||||
val sortSelectionRadioGroupView = rootView.findViewById<RadioGroup>(R.id.sort_selection_radio_group)
|
val sortSelectionRadioGroupView = rootView.findViewById<RadioGroup>(R.id.sort_selection_radio_group)
|
||||||
// Check value by default
|
// Check value by default
|
||||||
sortSelectionRadioGroupView.check(mCheckedId)
|
sortSelectionRadioGroupView.check(mCheckedId)
|
||||||
sortSelectionRadioGroupView.setOnCheckedChangeListener { _, checkedId -> mSortNodeEnum = retrieveSortEnumFromViewId(checkedId) }
|
sortSelectionRadioGroupView.setOnCheckedChangeListener { _, checkedId ->
|
||||||
|
mSortNodeEnum = retrieveSortEnumFromViewId(checkedId)
|
||||||
|
disableRecycleBinBottomOptionIfNaturalOrder()
|
||||||
|
}
|
||||||
|
|
||||||
return builder.create()
|
return builder.create()
|
||||||
}
|
}
|
||||||
return super.onCreateDialog(savedInstanceState)
|
return super.onCreateDialog(savedInstanceState)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun disableRecycleBinBottomOptionIfNaturalOrder() {
|
||||||
|
// Disable recycle bin if natural order
|
||||||
|
recycleBinBottomView?.isEnabled = mSortNodeEnum != SortNodeEnum.DB
|
||||||
|
}
|
||||||
|
|
||||||
@IdRes
|
@IdRes
|
||||||
private fun retrieveViewFromEnum(sortNodeEnum: SortNodeEnum): Int {
|
private fun retrieveViewFromEnum(sortNodeEnum: SortNodeEnum): Int {
|
||||||
return when (sortNodeEnum) {
|
return when (sortNodeEnum) {
|
||||||
|
|||||||
@@ -86,7 +86,9 @@ class NodeAdapter
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun areContentsTheSame(oldItem: NodeVersioned, newItem: NodeVersioned): Boolean {
|
override fun areContentsTheSame(oldItem: NodeVersioned, newItem: NodeVersioned): Boolean {
|
||||||
return oldItem.title == newItem.title && oldItem.icon == newItem.icon
|
return oldItem.type == newItem.type
|
||||||
|
&& oldItem.title == newItem.title
|
||||||
|
&& oldItem.icon == newItem.icon
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun areItemsTheSame(item1: NodeVersioned, item2: NodeVersioned): Boolean {
|
override fun areItemsTheSame(item1: NodeVersioned, item2: NodeVersioned): Boolean {
|
||||||
@@ -149,6 +151,10 @@ class NodeAdapter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun contains(node: NodeVersioned): Boolean {
|
||||||
|
return nodeSortedList.indexOf(node) != SortedList.INVALID_POSITION
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a node to the list
|
* Add a node to the list
|
||||||
* @param node Node to add
|
* @param node Node to add
|
||||||
@@ -165,6 +171,13 @@ class NodeAdapter
|
|||||||
nodeSortedList.remove(node)
|
nodeSortedList.remove(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a node at [position] in the list
|
||||||
|
*/
|
||||||
|
fun removeNodeAt(position: Int) {
|
||||||
|
nodeSortedList.removeItemAt(position)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a node in the list
|
* Update a node in the list
|
||||||
* @param oldNode Node before the update
|
* @param oldNode Node before the update
|
||||||
@@ -245,7 +258,7 @@ class NodeAdapter
|
|||||||
if (subNode.type == Type.GROUP) {
|
if (subNode.type == Type.GROUP) {
|
||||||
if (showNumberEntries) {
|
if (showNumberEntries) {
|
||||||
holder.numberChildren?.apply {
|
holder.numberChildren?.apply {
|
||||||
text = (subNode as GroupVersioned).getChildEntries().size.toString()
|
text = (subNode as GroupVersioned).getChildEntries(true).size.toString()
|
||||||
textSize = infoTextSize
|
textSize = infoTextSize
|
||||||
visibility = View.VISIBLE
|
visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ enum class SortNodeEnum {
|
|||||||
|
|
||||||
fun getNodeComparator(ascending: Boolean, groupsBefore: Boolean, recycleBinBottom: Boolean): Comparator<NodeVersioned> {
|
fun getNodeComparator(ascending: Boolean, groupsBefore: Boolean, recycleBinBottom: Boolean): Comparator<NodeVersioned> {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
DB -> NodeNaturalComparator(ascending, groupsBefore, recycleBinBottom)
|
DB -> NodeNaturalComparator(ascending, groupsBefore, false) // Force false because natural order contains recycle bin
|
||||||
TITLE -> NodeTitleComparator(ascending, groupsBefore, recycleBinBottom)
|
TITLE -> NodeTitleComparator(ascending, groupsBefore, recycleBinBottom)
|
||||||
USERNAME -> NodeUsernameComparator(ascending, groupsBefore, recycleBinBottom)
|
USERNAME -> NodeUsernameComparator(ascending, groupsBefore, recycleBinBottom)
|
||||||
CREATION_TIME -> NodeCreationComparator(ascending, groupsBefore, recycleBinBottom)
|
CREATION_TIME -> NodeCreationComparator(ascending, groupsBefore, recycleBinBottom)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.kunzisoft.keepass.database.action.node
|
package com.kunzisoft.keepass.database.action.node
|
||||||
|
|
||||||
import android.support.v4.app.FragmentActivity
|
import android.support.v4.app.FragmentActivity
|
||||||
|
import android.util.Log
|
||||||
import com.kunzisoft.keepass.database.action.SaveDatabaseRunnable
|
import com.kunzisoft.keepass.database.action.SaveDatabaseRunnable
|
||||||
import com.kunzisoft.keepass.database.element.Database
|
import com.kunzisoft.keepass.database.element.Database
|
||||||
|
|
||||||
@@ -23,6 +24,7 @@ abstract class ActionNodeDatabaseRunnable(
|
|||||||
super.run()
|
super.run()
|
||||||
finishRun(true)
|
finishRun(true)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
Log.e("ActionNodeDBRunnable", e.message)
|
||||||
finishRun(false, e.message)
|
finishRun(false, e.message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,4 +45,8 @@ abstract class ActionNodeDatabaseRunnable(
|
|||||||
|
|
||||||
super.onFinishRun(result)
|
super.onFinishRun(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val NODE_POSITION_FOR_ACTION_NATURAL_ORDER_KEY = "NODE_POSITION_FOR_ACTION_NATURAL_ORDER_KEY"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package com.kunzisoft.keepass.database.action.node
|
|||||||
|
|
||||||
import android.support.v4.app.FragmentActivity
|
import android.support.v4.app.FragmentActivity
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.kunzisoft.keepass.R
|
||||||
import com.kunzisoft.keepass.database.element.Database
|
import com.kunzisoft.keepass.database.element.Database
|
||||||
import com.kunzisoft.keepass.database.element.EntryVersioned
|
import com.kunzisoft.keepass.database.element.EntryVersioned
|
||||||
import com.kunzisoft.keepass.database.element.GroupVersioned
|
import com.kunzisoft.keepass.database.element.GroupVersioned
|
||||||
@@ -37,9 +38,18 @@ class CopyEntryRunnable constructor(
|
|||||||
private var mEntryCopied: EntryVersioned? = null
|
private var mEntryCopied: EntryVersioned? = null
|
||||||
|
|
||||||
override fun nodeAction() {
|
override fun nodeAction() {
|
||||||
// Update entry with new values
|
// Condition
|
||||||
mNewParent.touch(modified = false, touchParents = true)
|
var conditionAccepted = true
|
||||||
mEntryCopied = database.copyEntryTo(mEntryToCopy, mNewParent)
|
if(mNewParent == database.rootGroup && !database.rootCanContainsEntry())
|
||||||
|
conditionAccepted = false
|
||||||
|
if (conditionAccepted) {
|
||||||
|
// Update entry with new values
|
||||||
|
mNewParent.touch(modified = false, touchParents = true)
|
||||||
|
mEntryCopied = database.copyEntryTo(mEntryToCopy, mNewParent)
|
||||||
|
} else {
|
||||||
|
// Only finish thread
|
||||||
|
throw Exception(context.getString(R.string.error_copy_entry_here))
|
||||||
|
}
|
||||||
|
|
||||||
mEntryCopied?.apply {
|
mEntryCopied?.apply {
|
||||||
touch(modified = true, touchParents = true)
|
touch(modified = true, touchParents = true)
|
||||||
@@ -56,7 +66,6 @@ class CopyEntryRunnable constructor(
|
|||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.i(TAG, "Unable to delete the copied entry")
|
Log.i(TAG, "Unable to delete the copied entry")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return ActionNodeValues(result, mEntryToCopy, mEntryCopied)
|
return ActionNodeValues(result, mEntryToCopy, mEntryCopied)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.kunzisoft.keepass.database.action.node
|
package com.kunzisoft.keepass.database.action.node
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
import android.support.v4.app.FragmentActivity
|
import android.support.v4.app.FragmentActivity
|
||||||
import com.kunzisoft.keepass.database.element.Database
|
import com.kunzisoft.keepass.database.element.Database
|
||||||
import com.kunzisoft.keepass.database.element.EntryVersioned
|
import com.kunzisoft.keepass.database.element.EntryVersioned
|
||||||
@@ -35,11 +36,19 @@ class DeleteEntryRunnable constructor(
|
|||||||
private var mParent: GroupVersioned? = null
|
private var mParent: GroupVersioned? = null
|
||||||
private var mCanRecycle: Boolean = false
|
private var mCanRecycle: Boolean = false
|
||||||
|
|
||||||
|
private var mEntryToDeleteBackup: EntryVersioned? = null
|
||||||
|
private var mNodePosition: Int? = null
|
||||||
|
|
||||||
override fun nodeAction() {
|
override fun nodeAction() {
|
||||||
mParent = mEntryToDelete.parent
|
mParent = mEntryToDelete.parent
|
||||||
mParent?.touch(modified = false, touchParents = true)
|
mParent?.touch(modified = false, touchParents = true)
|
||||||
|
|
||||||
|
// Get the node position
|
||||||
|
mNodePosition = mEntryToDelete.nodePositionInParent
|
||||||
|
|
||||||
|
// Create a copy to keep the old ref and remove it visually
|
||||||
|
mEntryToDeleteBackup = EntryVersioned(mEntryToDelete)
|
||||||
|
|
||||||
// Remove Entry from parent
|
// Remove Entry from parent
|
||||||
mCanRecycle = database.canRecycle(mEntryToDelete)
|
mCanRecycle = database.canRecycle(mEntryToDelete)
|
||||||
if (mCanRecycle) {
|
if (mCanRecycle) {
|
||||||
@@ -59,6 +68,16 @@ class DeleteEntryRunnable constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ActionNodeValues(result, mEntryToDelete, null)
|
|
||||||
|
// Add position in bundle to delete the node in view
|
||||||
|
mNodePosition?.let { position ->
|
||||||
|
result.data = Bundle().apply {
|
||||||
|
putInt(NODE_POSITION_FOR_ACTION_NATURAL_ORDER_KEY, position )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a copy of unchanged entry as old param
|
||||||
|
// and entry deleted or moved in recycle bin as new param
|
||||||
|
return ActionNodeValues(result, mEntryToDeleteBackup, mEntryToDelete)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.kunzisoft.keepass.database.action.node
|
package com.kunzisoft.keepass.database.action.node
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
import android.support.v4.app.FragmentActivity
|
import android.support.v4.app.FragmentActivity
|
||||||
|
|
||||||
import com.kunzisoft.keepass.database.element.Database
|
import com.kunzisoft.keepass.database.element.Database
|
||||||
@@ -32,10 +33,19 @@ class DeleteGroupRunnable(context: FragmentActivity,
|
|||||||
private var mParent: GroupVersioned? = null
|
private var mParent: GroupVersioned? = null
|
||||||
private var mRecycle: Boolean = false
|
private var mRecycle: Boolean = false
|
||||||
|
|
||||||
|
private var mGroupToDeleteBackup: GroupVersioned? = null
|
||||||
|
private var mNodePosition: Int? = null
|
||||||
|
|
||||||
override fun nodeAction() {
|
override fun nodeAction() {
|
||||||
mParent = mGroupToDelete.parent
|
mParent = mGroupToDelete.parent
|
||||||
mParent?.touch(modified = false, touchParents = true)
|
mParent?.touch(modified = false, touchParents = true)
|
||||||
|
|
||||||
|
// Get the node position
|
||||||
|
mNodePosition = mGroupToDelete.nodePositionInParent
|
||||||
|
|
||||||
|
// Create a copy to keep the old ref and remove it visually
|
||||||
|
mGroupToDeleteBackup = GroupVersioned(mGroupToDelete)
|
||||||
|
|
||||||
// Remove Group from parent
|
// Remove Group from parent
|
||||||
mRecycle = database.canRecycle(mGroupToDelete)
|
mRecycle = database.canRecycle(mGroupToDelete)
|
||||||
if (mRecycle) {
|
if (mRecycle) {
|
||||||
@@ -56,6 +66,16 @@ class DeleteGroupRunnable(context: FragmentActivity,
|
|||||||
// TODO database.undoDeleteGroupFrom(mGroup, mParent);
|
// TODO database.undoDeleteGroupFrom(mGroup, mParent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ActionNodeValues(result, mGroupToDelete, null)
|
|
||||||
|
// Add position in bundle to delete the node in view
|
||||||
|
mNodePosition?.let { position ->
|
||||||
|
result.data = Bundle().apply {
|
||||||
|
putInt(NODE_POSITION_FOR_ACTION_NATURAL_ORDER_KEY, position )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a copy of unchanged group as old param
|
||||||
|
// and group deleted or moved in recycle bin as new param
|
||||||
|
return ActionNodeValues(result, mGroupToDeleteBackup, mGroupToDelete)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package com.kunzisoft.keepass.database.action.node
|
|||||||
|
|
||||||
import android.support.v4.app.FragmentActivity
|
import android.support.v4.app.FragmentActivity
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.kunzisoft.keepass.R
|
||||||
import com.kunzisoft.keepass.database.element.Database
|
import com.kunzisoft.keepass.database.element.Database
|
||||||
import com.kunzisoft.keepass.database.element.EntryVersioned
|
import com.kunzisoft.keepass.database.element.EntryVersioned
|
||||||
import com.kunzisoft.keepass.database.element.GroupVersioned
|
import com.kunzisoft.keepass.database.element.GroupVersioned
|
||||||
@@ -40,7 +41,18 @@ class MoveEntryRunnable constructor(
|
|||||||
// Move entry in new parent
|
// Move entry in new parent
|
||||||
mEntryToMove?.let {
|
mEntryToMove?.let {
|
||||||
mOldParent = it.parent
|
mOldParent = it.parent
|
||||||
database.moveEntryTo(it, mNewParent)
|
|
||||||
|
// Condition
|
||||||
|
var conditionAccepted = true
|
||||||
|
if(mNewParent == database.rootGroup && !database.rootCanContainsEntry())
|
||||||
|
conditionAccepted = false
|
||||||
|
// Move only if the parent change
|
||||||
|
if (mOldParent != mNewParent && conditionAccepted) {
|
||||||
|
database.moveEntryTo(it, mNewParent)
|
||||||
|
} else {
|
||||||
|
// Only finish thread
|
||||||
|
throw Exception(context.getString(R.string.error_move_entry_here))
|
||||||
|
}
|
||||||
it.touch(modified = true, touchParents = true)
|
it.touch(modified = true, touchParents = true)
|
||||||
} ?: Log.e(TAG, "Unable to create a copy of the entry")
|
} ?: Log.e(TAG, "Unable to create a copy of the entry")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,9 +46,7 @@ class MoveGroupRunnable constructor(
|
|||||||
finishRun(true)
|
finishRun(true)
|
||||||
} else {
|
} else {
|
||||||
// Only finish thread
|
// Only finish thread
|
||||||
val message = context.getString(R.string.error_move_folder_in_itself)
|
throw Exception(context.getString(R.string.error_move_folder_in_itself))
|
||||||
Log.e(TAG, message)
|
|
||||||
finishRun(false, message)
|
|
||||||
}
|
}
|
||||||
} ?: Log.e(TAG, "Unable to create a copy of the group")
|
} ?: Log.e(TAG, "Unable to create a copy of the group")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -304,14 +304,12 @@ class Database {
|
|||||||
|
|
||||||
val searchResult = search(query, SearchDbHelper.MAX_SEARCH_ENTRY)
|
val searchResult = search(query, SearchDbHelper.MAX_SEARCH_ENTRY)
|
||||||
if (searchResult != null) {
|
if (searchResult != null) {
|
||||||
for (entry in searchResult.getChildEntries()) {
|
for (entry in searchResult.getChildEntries(true)) {
|
||||||
if (!entry.isMetaStream) { // TODO metastream
|
entry.pwEntryV3?.let {
|
||||||
entry.pwEntryV3?.let {
|
cursorV3?.addEntry(it)
|
||||||
cursorV3?.addEntry(it)
|
}
|
||||||
}
|
entry.pwEntryV4?.let {
|
||||||
entry.pwEntryV4?.let {
|
cursorV4?.addEntry(it)
|
||||||
cursorV4?.addEntry(it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -484,6 +482,10 @@ class Database {
|
|||||||
pwDatabaseV4?.retrieveMasterKey(key, keyInputStream)
|
pwDatabaseV4?.retrieveMasterKey(key, keyInputStream)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun rootCanContainsEntry(): Boolean {
|
||||||
|
return pwDatabaseV3?.rootCanContainsEntry() ?: pwDatabaseV4?.rootCanContainsEntry() ?: false
|
||||||
|
}
|
||||||
|
|
||||||
fun createEntry(): EntryVersioned? {
|
fun createEntry(): EntryVersioned? {
|
||||||
pwDatabaseV3?.let { database ->
|
pwDatabaseV3?.let { database ->
|
||||||
return EntryVersioned(database.createEntry()).apply {
|
return EntryVersioned(database.createEntry()).apply {
|
||||||
|
|||||||
@@ -179,10 +179,16 @@ class GroupVersioned : NodeVersioned, PwGroupInterface<GroupVersioned, EntryVers
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getChildEntries(): MutableList<EntryVersioned> {
|
override fun getChildEntries(): MutableList<EntryVersioned> {
|
||||||
|
return getChildEntries(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getChildEntries(withoutMetaStream: Boolean): MutableList<EntryVersioned> {
|
||||||
val children = ArrayList<EntryVersioned>()
|
val children = ArrayList<EntryVersioned>()
|
||||||
|
|
||||||
pwGroupV3?.getChildEntries()?.forEach {
|
pwGroupV3?.getChildEntries()?.forEach {
|
||||||
children.add(EntryVersioned(it))
|
val entryToAddAsChild = EntryVersioned(it)
|
||||||
|
if (!withoutMetaStream || (withoutMetaStream && !entryToAddAsChild.isMetaStream))
|
||||||
|
children.add(entryToAddAsChild)
|
||||||
}
|
}
|
||||||
pwGroupV4?.getChildEntries()?.forEach {
|
pwGroupV4?.getChildEntries()?.forEach {
|
||||||
children.add(EntryVersioned(it))
|
children.add(EntryVersioned(it))
|
||||||
@@ -200,14 +206,11 @@ class GroupVersioned : NodeVersioned, PwGroupInterface<GroupVersioned, EntryVers
|
|||||||
children.addAll(getChildGroups())
|
children.addAll(getChildGroups())
|
||||||
|
|
||||||
pwGroupV3?.let {
|
pwGroupV3?.let {
|
||||||
if (withoutMetaStream)
|
children.addAll(getChildEntries(withoutMetaStream))
|
||||||
children.addAll(getChildEntries().filter { !it.isMetaStream })
|
|
||||||
else
|
|
||||||
children.addAll(getChildEntries())
|
|
||||||
}
|
}
|
||||||
pwGroupV4?.let {
|
pwGroupV4?.let {
|
||||||
// No MetasStream in V4
|
// No MetasStream in V4
|
||||||
children.addAll(getChildEntries())
|
children.addAll(getChildEntries(withoutMetaStream))
|
||||||
}
|
}
|
||||||
|
|
||||||
return children
|
return children
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ interface NodeVersioned: PwNodeInterface<GroupVersioned> {
|
|||||||
|
|
||||||
val nodePositionInParent: Int
|
val nodePositionInParent: Int
|
||||||
get() {
|
get() {
|
||||||
parent?.getChildren(false)?.let { children ->
|
parent?.getChildren(true)?.let { children ->
|
||||||
for ((i, child) in children.withIndex()) {
|
for ((i, child) in children.withIndex()) {
|
||||||
if (child == this)
|
if (child == this)
|
||||||
return i
|
return i
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.kunzisoft.keepass.database.element
|
package com.kunzisoft.keepass.database.element
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
import com.kunzisoft.keepass.database.exception.InvalidKeyFileException
|
import com.kunzisoft.keepass.database.exception.InvalidKeyFileException
|
||||||
import com.kunzisoft.keepass.database.exception.KeyFileEmptyException
|
import com.kunzisoft.keepass.database.exception.KeyFileEmptyException
|
||||||
import com.kunzisoft.keepass.utils.MemUtil
|
import com.kunzisoft.keepass.utils.MemUtil
|
||||||
@@ -234,8 +235,11 @@ abstract class PwDatabase<Group : PwGroup<*, Group, Entry>, Entry : PwEntry<Grou
|
|||||||
|
|
||||||
fun addGroupIndex(group: Group) {
|
fun addGroupIndex(group: Group) {
|
||||||
val groupId = group.nodeId
|
val groupId = group.nodeId
|
||||||
if (!groupIndexes.containsKey(groupId))
|
if (groupIndexes.containsKey(groupId)) {
|
||||||
|
Log.e(TAG, "Error, a group with the same UUID $groupId already exists")
|
||||||
|
} else {
|
||||||
this.groupIndexes[groupId] = group
|
this.groupIndexes[groupId] = group
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun removeGroupIndex(group: Group) {
|
fun removeGroupIndex(group: Group) {
|
||||||
@@ -266,8 +270,11 @@ abstract class PwDatabase<Group : PwGroup<*, Group, Entry>, Entry : PwEntry<Grou
|
|||||||
|
|
||||||
fun addEntryIndex(entry: Entry) {
|
fun addEntryIndex(entry: Entry) {
|
||||||
val entryId = entry.nodeId
|
val entryId = entry.nodeId
|
||||||
if (!entryIndexes.containsKey(entryId))
|
if (entryIndexes.containsKey(entryId)) {
|
||||||
|
Log.e(TAG, "Error, a group with the same UUID $entryId already exists, change the UUID")
|
||||||
|
} else {
|
||||||
this.entryIndexes[entryId] = entry
|
this.entryIndexes[entryId] = entry
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun removeEntryIndex(entry: Entry) {
|
fun removeEntryIndex(entry: Entry) {
|
||||||
@@ -289,6 +296,8 @@ abstract class PwDatabase<Group : PwGroup<*, Group, Entry>, Entry : PwEntry<Grou
|
|||||||
* -------------------------------------
|
* -------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
abstract fun rootCanContainsEntry(): Boolean
|
||||||
|
|
||||||
fun addGroupTo(newGroup: Group, parent: Group?) {
|
fun addGroupTo(newGroup: Group, parent: Group?) {
|
||||||
// Add tree to parent tree
|
// Add tree to parent tree
|
||||||
parent?.addChildGroup(newGroup)
|
parent?.addChildGroup(newGroup)
|
||||||
@@ -310,7 +319,7 @@ abstract class PwDatabase<Group : PwGroup<*, Group, Entry>, Entry : PwEntry<Grou
|
|||||||
}
|
}
|
||||||
|
|
||||||
open fun removeEntryFrom(entryToRemove: Entry, parent: Group?) {
|
open fun removeEntryFrom(entryToRemove: Entry, parent: Group?) {
|
||||||
// Remove entry for parent
|
// Remove entry from parent
|
||||||
parent?.removeChildEntry(entryToRemove)
|
parent?.removeChildEntry(entryToRemove)
|
||||||
removeEntryIndex(entryToRemove)
|
removeEntryIndex(entryToRemove)
|
||||||
}
|
}
|
||||||
@@ -336,6 +345,8 @@ abstract class PwDatabase<Group : PwGroup<*, Group, Entry>, Entry : PwEntry<Grou
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
private const val TAG = "PwDatabase"
|
||||||
|
|
||||||
val UUID_ZERO = UUID(0, 0)
|
val UUID_ZERO = UUID(0, 0)
|
||||||
|
|
||||||
fun hexStringToByteArray(s: String): ByteArray {
|
fun hexStringToByteArray(s: String): ByteArray {
|
||||||
|
|||||||
@@ -150,6 +150,10 @@ class PwDatabaseV3 : PwDatabase<PwGroupV3, PwEntryV3>() {
|
|||||||
return PwEntryV3()
|
return PwEntryV3()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun rootCanContainsEntry(): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
override fun isBackup(group: PwGroupV3): Boolean {
|
override fun isBackup(group: PwGroupV3): Boolean {
|
||||||
var currentGroup: PwGroupV3? = group
|
var currentGroup: PwGroupV3? = group
|
||||||
while (currentGroup != null) {
|
while (currentGroup != null) {
|
||||||
|
|||||||
@@ -317,6 +317,10 @@ class PwDatabaseV4 : PwDatabase<PwGroupV4, PwEntryV4> {
|
|||||||
return PwEntryV4()
|
return PwEntryV4()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun rootCanContainsEntry(): Boolean {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
override fun isBackup(group: PwGroupV4): Boolean {
|
override fun isBackup(group: PwGroupV4): Boolean {
|
||||||
if (recycleBin == null)
|
if (recycleBin == null)
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ abstract class PwGroup
|
|||||||
|
|
||||||
private var titleGroup = ""
|
private var titleGroup = ""
|
||||||
@Transient
|
@Transient
|
||||||
private val childGroups = LinkedHashSet<Group>()
|
private val childGroups = ArrayList<Group>()
|
||||||
@Transient
|
@Transient
|
||||||
private val childEntries = LinkedHashSet<Entry>()
|
private val childEntries = ArrayList<Entry>()
|
||||||
|
|
||||||
constructor() : super()
|
constructor() : super()
|
||||||
|
|
||||||
@@ -39,20 +39,22 @@ abstract class PwGroup
|
|||||||
set(value) { titleGroup = value }
|
set(value) { titleGroup = value }
|
||||||
|
|
||||||
override fun getChildGroups(): MutableList<Group> {
|
override fun getChildGroups(): MutableList<Group> {
|
||||||
return childGroups.toMutableList()
|
return childGroups
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getChildEntries(): MutableList<Entry> {
|
override fun getChildEntries(): MutableList<Entry> {
|
||||||
return childEntries.toMutableList()
|
return childEntries
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun addChildGroup(group: Group) {
|
override fun addChildGroup(group: Group) {
|
||||||
// TODO duplicate UUID
|
if (childGroups.contains(group))
|
||||||
|
removeChildGroup(group)
|
||||||
this.childGroups.add(group)
|
this.childGroups.add(group)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun addChildEntry(entry: Entry) {
|
override fun addChildEntry(entry: Entry) {
|
||||||
// TODO duplicate UUID
|
if (childEntries.contains(entry))
|
||||||
|
removeChildEntry(entry)
|
||||||
this.childEntries.add(entry)
|
this.childEntries.add(entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package com.kunzisoft.keepass.tasks
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
|
||||||
@@ -88,5 +89,5 @@ abstract class ActionRunnable(private var nestedActionRunnable: ActionRunnable?
|
|||||||
/**
|
/**
|
||||||
* Class to manage result from ActionRunnable
|
* Class to manage result from ActionRunnable
|
||||||
*/
|
*/
|
||||||
data class Result(var isSuccess: Boolean = true, var message: String? = null)
|
data class Result(var isSuccess: Boolean = true, var message: String? = null, var data: Bundle? = null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ class EntryContentsView @JvmOverloads constructor(context: Context, attrs: Attri
|
|||||||
private val lastAccessDateView: TextView
|
private val lastAccessDateView: TextView
|
||||||
private val expiresDateView: TextView
|
private val expiresDateView: TextView
|
||||||
|
|
||||||
|
private val uuidView: TextView
|
||||||
|
|
||||||
val isUserNamePresent: Boolean
|
val isUserNamePresent: Boolean
|
||||||
get() = userNameContainerView.visibility == View.VISIBLE
|
get() = userNameContainerView.visibility == View.VISIBLE
|
||||||
|
|
||||||
@@ -97,6 +99,8 @@ class EntryContentsView @JvmOverloads constructor(context: Context, attrs: Attri
|
|||||||
lastAccessDateView = findViewById(R.id.entry_accessed)
|
lastAccessDateView = findViewById(R.id.entry_accessed)
|
||||||
expiresDateView = findViewById(R.id.entry_expires)
|
expiresDateView = findViewById(R.id.entry_expires)
|
||||||
|
|
||||||
|
uuidView = findViewById(R.id.entry_UUID)
|
||||||
|
|
||||||
val attrColorAccent = intArrayOf(R.attr.colorAccent)
|
val attrColorAccent = intArrayOf(R.attr.colorAccent)
|
||||||
val taColorAccent = context.theme.obtainStyledAttributes(attrColorAccent)
|
val taColorAccent = context.theme.obtainStyledAttributes(attrColorAccent)
|
||||||
colorAccent = taColorAccent.getColor(0, Color.BLACK)
|
colorAccent = taColorAccent.getColor(0, Color.BLACK)
|
||||||
@@ -238,6 +242,10 @@ class EntryContentsView @JvmOverloads constructor(context: Context, attrs: Attri
|
|||||||
expiresDateView.text = constString
|
expiresDateView.text = constString
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun assignUUID(uuid: UUID) {
|
||||||
|
uuidView.text = uuid.toString()
|
||||||
|
}
|
||||||
|
|
||||||
override fun generateDefaultLayoutParams(): LayoutParams {
|
override fun generateDefaultLayoutParams(): LayoutParams {
|
||||||
return LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
|
return LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
|
||||||
}
|
}
|
||||||
|
|||||||
17
app/src/main/res/drawable-v21/background_icon.xml
Normal file
17
app/src/main/res/drawable-v21/background_icon.xml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:color="@color/white"
|
||||||
|
tools:targetApi="lollipop">
|
||||||
|
<item>
|
||||||
|
<shape
|
||||||
|
android:shape="oval">
|
||||||
|
<padding
|
||||||
|
android:left="12dp"
|
||||||
|
android:right="12dp"
|
||||||
|
android:top="12dp"
|
||||||
|
android:bottom="12dp"/>
|
||||||
|
<solid android:color="?attr/colorAccent"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</ripple>
|
||||||
14
app/src/main/res/drawable/background_icon.xml
Normal file
14
app/src/main/res/drawable/background_icon.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<shape
|
||||||
|
android:shape="oval">
|
||||||
|
<padding
|
||||||
|
android:left="12dp"
|
||||||
|
android:right="12dp"
|
||||||
|
android:top="12dp"
|
||||||
|
android:bottom="12dp"/>
|
||||||
|
<solid android:color="@color/orange"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</selector>
|
||||||
@@ -52,12 +52,13 @@
|
|||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:paddingBottom="12dp"
|
android:paddingBottom="12dp"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.Default">
|
style="@style/KeepassDXStyle.TextAppearance.Default">
|
||||||
<android.support.v7.widget.AppCompatImageButton
|
<android.support.v7.widget.AppCompatImageView
|
||||||
android:id="@+id/entry_icon"
|
android:id="@+id/entry_icon"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="4dp"
|
android:layout_margin="4dp"
|
||||||
android:src="@drawable/ic_blank_32dp"
|
android:src="@drawable/ic_blank_32dp"
|
||||||
|
style="@style/KeepassDXStyle.Icon"
|
||||||
android:layout_gravity="center"/>
|
android:layout_gravity="center"/>
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
<android.support.v7.widget.Toolbar
|
<android.support.v7.widget.Toolbar
|
||||||
|
|||||||
@@ -139,6 +139,8 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_toRightOf="@+id/password_checkbox"
|
android:layout_toRightOf="@+id/password_checkbox"
|
||||||
android:layout_toEndOf="@+id/password_checkbox"
|
android:layout_toEndOf="@+id/password_checkbox"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:importantForAutofill="no"
|
||||||
app:passwordToggleEnabled="true"
|
app:passwordToggleEnabled="true"
|
||||||
app:passwordToggleTint="?attr/colorAccent">
|
app:passwordToggleTint="?attr/colorAccent">
|
||||||
|
|
||||||
@@ -146,6 +148,7 @@
|
|||||||
android:id="@+id/password"
|
android:id="@+id/password"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight="48dp"
|
||||||
android:hint="@string/password"
|
android:hint="@string/password"
|
||||||
android:inputType="textPassword"
|
android:inputType="textPassword"
|
||||||
android:importantForAccessibility="no"
|
android:importantForAccessibility="no"
|
||||||
@@ -175,6 +178,8 @@
|
|||||||
android:id="@+id/input_entry_keyfile"
|
android:id="@+id/input_entry_keyfile"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:importantForAutofill="no"
|
||||||
android:layout_toEndOf="@+id/keyfile_checkox"
|
android:layout_toEndOf="@+id/keyfile_checkox"
|
||||||
android:layout_toRightOf="@+id/keyfile_checkox"
|
android:layout_toRightOf="@+id/keyfile_checkox"
|
||||||
android:layout_toLeftOf="@+id/browse_button"
|
android:layout_toLeftOf="@+id/browse_button"
|
||||||
@@ -184,6 +189,7 @@
|
|||||||
android:id="@+id/pass_keyfile"
|
android:id="@+id/pass_keyfile"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight="48dp"
|
||||||
android:hint="@string/entry_keyfile"
|
android:hint="@string/entry_keyfile"
|
||||||
android:inputType="textUri"
|
android:inputType="textUri"
|
||||||
android:importantForAccessibility="no"
|
android:importantForAccessibility="no"
|
||||||
|
|||||||
@@ -182,45 +182,53 @@
|
|||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<!-- Created -->
|
<!-- Created -->
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_created_label"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_created_label"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/entry_created"
|
android:text="@string/entry_created"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_created"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_created"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
||||||
|
|
||||||
<!-- Modified -->
|
<!-- Modified -->
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_modified_label"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_modified_label"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/entry_modified"
|
android:text="@string/entry_modified"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_modified"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_modified"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
||||||
|
|
||||||
<!-- Accessed -->
|
<!-- Accessed -->
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_accessed_label"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_accessed_label"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/entry_accessed"
|
android:text="@string/entry_accessed"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_accessed"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_accessed"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
||||||
|
|
||||||
<!-- Expires -->
|
<!-- Expires -->
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_expires_label"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_expires_label"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/entry_expires"
|
android:text="@string/entry_expires"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
||||||
<android.support.v7.widget.AppCompatTextView android:id="@+id/entry_expires"
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_expires"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
||||||
@@ -228,4 +236,36 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</android.support.v7.widget.CardView>
|
</android.support.v7.widget.CardView>
|
||||||
|
|
||||||
|
<android.support.v7.widget.CardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/default_margin"
|
||||||
|
android:layout_marginEnd="@dimen/default_margin"
|
||||||
|
android:layout_marginBottom="@dimen/default_margin">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_margin="@dimen/default_margin"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<!-- Expires -->
|
||||||
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_UUID_label"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/entry_UUID"
|
||||||
|
style="@style/KeepassDXStyle.TextAppearance.LabelTextStyle" />
|
||||||
|
<HorizontalScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<android.support.v7.widget.AppCompatTextView
|
||||||
|
android:id="@+id/entry_UUID"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/KeepassDXStyle.TextAppearance.TextEntryItem" />
|
||||||
|
</HorizontalScrollView>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</android.support.v7.widget.CardView>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@@ -125,7 +125,7 @@
|
|||||||
<string name="no_url_handler">Installer en web-browser til at åbne URL.</string>
|
<string name="no_url_handler">Installer en web-browser til at åbne URL.</string>
|
||||||
<string name="open_recent">Seneste databaser</string>
|
<string name="open_recent">Seneste databaser</string>
|
||||||
<string name="omitbackup_title">Gennemsøg ikke backup poster</string>
|
<string name="omitbackup_title">Gennemsøg ikke backup poster</string>
|
||||||
<string name="omitbackup_summary">Udelad \"Backup\" - gruppe fra søgeresultaterne (gælder kun for .kdb filer)</string>
|
<string name="omitbackup_summary">Udelader \"Backup\" og \"Papirkurv\" - grupper fra søgeresultater</string>
|
||||||
<string name="progress_create">Opretter ny database…</string>
|
<string name="progress_create">Opretter ny database…</string>
|
||||||
<string name="progress_title">Arbejder…</string>
|
<string name="progress_title">Arbejder…</string>
|
||||||
<string name="protection">Beskyttelse</string>
|
<string name="protection">Beskyttelse</string>
|
||||||
@@ -187,7 +187,7 @@
|
|||||||
<string name="file_not_found_content">Kunne ikke finde filen. Prøv at åbne den fra filhåndtering.</string>
|
<string name="file_not_found_content">Kunne ikke finde filen. Prøv at åbne den fra filhåndtering.</string>
|
||||||
<string name="list_entries_show_username_title">Vis brugernavne</string>
|
<string name="list_entries_show_username_title">Vis brugernavne</string>
|
||||||
<string name="list_entries_show_username_summary">Vis brugernavne i postlister</string>
|
<string name="list_entries_show_username_summary">Vis brugernavne i postlister</string>
|
||||||
<string name="copy_field">Kopieret %1$s</string>
|
<string name="copy_field">Kopi af %1$s</string>
|
||||||
<string name="menu_form_filling_settings">Formularudfyldning</string>
|
<string name="menu_form_filling_settings">Formularudfyldning</string>
|
||||||
<string name="menu_copy">Kopier</string>
|
<string name="menu_copy">Kopier</string>
|
||||||
<string name="menu_move">Flyt</string>
|
<string name="menu_move">Flyt</string>
|
||||||
@@ -215,7 +215,7 @@
|
|||||||
<string name="use_saf_summary">Brug Android Storage Access (SAF) som filhåndtering (KitKat og senere)</string>
|
<string name="use_saf_summary">Brug Android Storage Access (SAF) som filhåndtering (KitKat og senere)</string>
|
||||||
<string name="use_saf_title">Storage Access Framework</string>
|
<string name="use_saf_title">Storage Access Framework</string>
|
||||||
<string name="warning">Advarsel</string>
|
<string name="warning">Advarsel</string>
|
||||||
<string name="warning_password_encoding">Undgå adgangskodetegn undenfor Latin-1 tegnsæt i .kdb filer, da de alle konverteres til det samme bogstav.</string>
|
<string name="warning_password_encoding">Undgå adgangskodetegn uden for tekstkodningsformatet i databasefilen (ukendte tegn konverteres til samme bogstav).</string>
|
||||||
<string name="warning_empty_password">Bekræft brug af ingen adgangskode til beskyttelse mod oplåsning\?</string>
|
<string name="warning_empty_password">Bekræft brug af ingen adgangskode til beskyttelse mod oplåsning\?</string>
|
||||||
<string name="warning_no_encryption_key">Bekræft ingen brug af en krypteringsnøgle?</string>
|
<string name="warning_no_encryption_key">Bekræft ingen brug af en krypteringsnøgle?</string>
|
||||||
<string name="configure_fingerprint">Fingeraftryksscanning understøttes, men er ikke sat op.</string>
|
<string name="configure_fingerprint">Fingeraftryksscanning understøttes, men er ikke sat op.</string>
|
||||||
@@ -240,7 +240,7 @@
|
|||||||
<string name="list_password_generator_options_summary">Angiv tilladte tegn for adgangskodegenerator</string>
|
<string name="list_password_generator_options_summary">Angiv tilladte tegn for adgangskodegenerator</string>
|
||||||
<string name="clipboard">Udklipsholder</string>
|
<string name="clipboard">Udklipsholder</string>
|
||||||
<string name="clipboard_notifications_title">Udklipsholdermeddelelser</string>
|
<string name="clipboard_notifications_title">Udklipsholdermeddelelser</string>
|
||||||
<string name="clipboard_notifications_summary">Aktivere meddelelser fra udklipsholder for at kopiere indtastningsfelter</string>
|
<string name="clipboard_notifications_summary">Aktivér udklipsholder for at kopiere felter når en post vises</string>
|
||||||
<string name="clipboard_warning">Hvis automatisk sletning af udklipsholder mislykkes, slet historikken manuelt.</string>
|
<string name="clipboard_warning">Hvis automatisk sletning af udklipsholder mislykkes, slet historikken manuelt.</string>
|
||||||
<string name="lock">Lås</string>
|
<string name="lock">Lås</string>
|
||||||
<string name="lock_database_screen_off_title">Skærmlås</string>
|
<string name="lock_database_screen_off_title">Skærmlås</string>
|
||||||
@@ -378,13 +378,13 @@
|
|||||||
<string name="keyboard_setting_label">Magikeyboard indstillinger</string>
|
<string name="keyboard_setting_label">Magikeyboard indstillinger</string>
|
||||||
<string name="keyboard_entry_category">Post</string>
|
<string name="keyboard_entry_category">Post</string>
|
||||||
<string name="keyboard_entry_timeout_title">Timeout</string>
|
<string name="keyboard_entry_timeout_title">Timeout</string>
|
||||||
<string name="keyboard_notification_entry_title">Meddelsesinformation</string>
|
<string name="keyboard_notification_entry_title">Meddelelsesinfo</string>
|
||||||
<string name="keyboard_notification_entry_summary">Vis en meddelelse, når en post er til rådighed</string>
|
<string name="keyboard_notification_entry_summary">Vis en meddelelse, når en post er til rådighed</string>
|
||||||
<string name="keyboard_notification_entry_content_title_text">Post</string>
|
<string name="keyboard_notification_entry_content_title_text">Post</string>
|
||||||
<string name="keyboard_notification_entry_content_title">%1$s til rådighed på Magikeyboard</string>
|
<string name="keyboard_notification_entry_content_title">%1$s til rådighed på Magikeyboard</string>
|
||||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||||
<string name="keyboard_notification_entry_clear_close_title">Ryd ved lukning</string>
|
<string name="keyboard_notification_entry_clear_close_title">Ryd ved lukning</string>
|
||||||
<string name="keyboard_notification_entry_clear_close_summary">Ryd tastatur post, når meddelse lukkes</string>
|
<string name="keyboard_notification_entry_clear_close_summary">Luk databasen, når meddelse lukkes</string>
|
||||||
<string name="keyboard_appearance_category">Udseende</string>
|
<string name="keyboard_appearance_category">Udseende</string>
|
||||||
<string name="keyboard_theme_title">Tastaturtema</string>
|
<string name="keyboard_theme_title">Tastaturtema</string>
|
||||||
<string name="keyboard_keys_category">Taster</string>
|
<string name="keyboard_keys_category">Taster</string>
|
||||||
@@ -392,4 +392,16 @@
|
|||||||
<string name="keyboard_key_sound_title">Lyd ved tastetryk</string>
|
<string name="keyboard_key_sound_title">Lyd ved tastetryk</string>
|
||||||
<string name="build_label">Build %1$s</string>
|
<string name="build_label">Build %1$s</string>
|
||||||
<string name="keyboard_entry_timeout_summary">Timeout for at rydde indtastning</string>
|
<string name="keyboard_entry_timeout_summary">Timeout for at rydde indtastning</string>
|
||||||
|
<string name="entry_notes">Noter</string>
|
||||||
|
<string name="selection_mode">Valgstilstand</string>
|
||||||
|
<string name="do_not_kill_app">Luk ikke programmet…</string>
|
||||||
|
<string name="lock_database_back_root_title">Lås ved retur</string>
|
||||||
|
<string name="lock_database_back_root_summary">Lås databasen, når brugeren klikker på tilbage-knappen fra startskærmen</string>
|
||||||
|
<string name="clear_clipboard_notification_title">Ryd ved lukning</string>
|
||||||
|
<string name="clear_clipboard_notification_summary">Luk databasen ved lukning af underretning</string>
|
||||||
|
<string name="recycle_bin">Papirkurv</string>
|
||||||
|
<string name="keyboard_selection_entry_title">Valg af indtastning</string>
|
||||||
|
<string name="keyboard_selection_entry_summary">Vis indtastningsfelter i Magikeyboard, når der vises en post</string>
|
||||||
|
<string name="delete_entered_password_title">Slet adgangskode</string>
|
||||||
|
<string name="delete_entered_password_summary">Sletter adgangskoden som er indtastet efter et forbindelsesforsøg</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
<string name="select_database_file">Ouvrir une base de données existante</string>
|
<string name="select_database_file">Ouvrir une base de données existante</string>
|
||||||
<string name="open_recent">Bases de données récentes</string>
|
<string name="open_recent">Bases de données récentes</string>
|
||||||
<string name="omitbackup_title">Ne pas rechercher dans les entrées de sauvegarde</string>
|
<string name="omitbackup_title">Ne pas rechercher dans les entrées de sauvegarde</string>
|
||||||
<string name="omitbackup_summary">Omet le groupe « Sauvegarde » des résultats de recherche (ne s’applique qu’aux fichiers .kdb)</string>
|
<string name="omitbackup_summary">Omet les groupes « Sauvegarde » et \"Corbeille\" des résultats de recherche</string>
|
||||||
<string name="progress_create">Création d’une nouvelle base de données…</string>
|
<string name="progress_create">Création d’une nouvelle base de données…</string>
|
||||||
<string name="progress_title">Traitement en cours …</string>
|
<string name="progress_title">Traitement en cours …</string>
|
||||||
<string name="protection">Protection</string>
|
<string name="protection">Protection</string>
|
||||||
@@ -206,7 +206,7 @@
|
|||||||
<string name="list_password_generator_options_summary">Définir les caractères autorisés du générateur de mot de passe</string>
|
<string name="list_password_generator_options_summary">Définir les caractères autorisés du générateur de mot de passe</string>
|
||||||
<string name="clipboard">Presse-papier</string>
|
<string name="clipboard">Presse-papier</string>
|
||||||
<string name="clipboard_notifications_title">Notifications du presse-papier</string>
|
<string name="clipboard_notifications_title">Notifications du presse-papier</string>
|
||||||
<string name="clipboard_notifications_summary">Activer les notifications du presse-papier pour copier les champs des entrées</string>
|
<string name="clipboard_notifications_summary">Activer les notifications du presse-papier pour copier les champs lors de l\'affichage d\'une entrée</string>
|
||||||
<string name="clipboard_warning">Si la suppression automatique du presse-papier échoue, supprimer son historique manuellement.</string>
|
<string name="clipboard_warning">Si la suppression automatique du presse-papier échoue, supprimer son historique manuellement.</string>
|
||||||
<string name="lock">Verrouiller</string>
|
<string name="lock">Verrouiller</string>
|
||||||
<string name="lock_database_screen_off_title">Verrouillage d’écran</string>
|
<string name="lock_database_screen_off_title">Verrouillage d’écran</string>
|
||||||
@@ -392,10 +392,21 @@
|
|||||||
<string name="keyboard_notification_entry_content_title">1$s disponible sur Magikeyboard</string>
|
<string name="keyboard_notification_entry_content_title">1$s disponible sur Magikeyboard</string>
|
||||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||||
<string name="keyboard_notification_entry_clear_close_title">Effacer à la fermeture</string>
|
<string name="keyboard_notification_entry_clear_close_title">Effacer à la fermeture</string>
|
||||||
<string name="keyboard_notification_entry_clear_close_summary">Effacer l’entrée au clavier lors de la fermeture de la notification</string>
|
<string name="keyboard_notification_entry_clear_close_summary">Fermer la base de données lors de la fermeture de la notification</string>
|
||||||
<string name="keyboard_appearance_category">Apparence</string>
|
<string name="keyboard_appearance_category">Apparence</string>
|
||||||
<string name="keyboard_theme_title">Thème du clavier</string>
|
<string name="keyboard_theme_title">Thème du clavier</string>
|
||||||
<string name="keyboard_keys_category">Touches</string>
|
<string name="keyboard_keys_category">Touches</string>
|
||||||
<string name="keyboard_key_vibrate_title">Vibrer au toucher</string>
|
<string name="keyboard_key_vibrate_title">Vibrer au toucher</string>
|
||||||
<string name="keyboard_key_sound_title">Son au toucher</string>
|
<string name="keyboard_key_sound_title">Son au toucher</string>
|
||||||
|
<string name="selection_mode">Mode sélection</string>
|
||||||
|
<string name="do_not_kill_app">Ne pas tuer l\'application…</string>
|
||||||
|
<string name="lock_database_back_root_title">Déverouillage de retour</string>
|
||||||
|
<string name="lock_database_back_root_summary">Verrouille la base de données lorsque l\'utilisateur clique sur le bouton Précédent de l\'écran racine</string>
|
||||||
|
<string name="clear_clipboard_notification_title">Suppression à la fermeture</string>
|
||||||
|
<string name="clear_clipboard_notification_summary">Ferme la base de données lors de la fermeture de notification</string>
|
||||||
|
<string name="recycle_bin">Corbeille</string>
|
||||||
|
<string name="keyboard_selection_entry_title">Sélection d\'entrée</string>
|
||||||
|
<string name="keyboard_selection_entry_summary">Afficher les champs de saisie dans Magikeyboard lors de l\'affichage d\'une entrée</string>
|
||||||
|
<string name="delete_entered_password_title">Supprimer le mot de passe</string>
|
||||||
|
<string name="delete_entered_password_summary">Supprime le mot de passe entré après une tentative de connexion</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -355,4 +355,15 @@
|
|||||||
<string name="keyboard_keys_category">Taster</string>
|
<string name="keyboard_keys_category">Taster</string>
|
||||||
<string name="keyboard_key_vibrate_title">Vibrer ved tastetrykk</string>
|
<string name="keyboard_key_vibrate_title">Vibrer ved tastetrykk</string>
|
||||||
<string name="keyboard_key_sound_title">Lyd ved tastetrykk</string>
|
<string name="keyboard_key_sound_title">Lyd ved tastetrykk</string>
|
||||||
|
<string name="selection_mode">Valgmodus</string>
|
||||||
|
<string name="do_not_kill_app">Ikke drep programmet…</string>
|
||||||
|
<string name="lock_database_back_root_title">Tilbakelås</string>
|
||||||
|
<string name="lock_database_back_root_summary">Lås databasen når brukeren klikker tilbakeknappen på root-skjermen</string>
|
||||||
|
<string name="clear_clipboard_notification_title">Tøm ved lukking</string>
|
||||||
|
<string name="clear_clipboard_notification_summary">Lukk databasen ved lukking av merknaden</string>
|
||||||
|
<string name="recycle_bin">Papirkurv</string>
|
||||||
|
<string name="keyboard_selection_entry_title">Oppføringsvalg</string>
|
||||||
|
<string name="keyboard_selection_entry_summary">Vis inndatafelter i Magikeyboard når en oppføring vises</string>
|
||||||
|
<string name="delete_entered_password_title">Slett passord</string>
|
||||||
|
<string name="delete_entered_password_summary">Sletter passord innskrevet etter et tilkoblingsforsøk</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
<string name="no_url_handler">Instale um navegador para abrir esta URL.</string>
|
<string name="no_url_handler">Instale um navegador para abrir esta URL.</string>
|
||||||
<string name="open_recent">Bancos de dados recentes</string>
|
<string name="open_recent">Bancos de dados recentes</string>
|
||||||
<string name="omitbackup_title">Não procurar por entradas no backup ou na lixeira</string>
|
<string name="omitbackup_title">Não procurar por entradas no backup ou na lixeira</string>
|
||||||
<string name="omitbackup_summary">Omite o grupo \"Backup\" dos resultados da busca (apenas se aplica a arquivos .kdb)</string>
|
<string name="omitbackup_summary">Omite os grupos \"Backup\" e \"Lixeira\" dos resultados da busca</string>
|
||||||
<string name="progress_create">Criando novo banco de dados…</string>
|
<string name="progress_create">Criando novo banco de dados…</string>
|
||||||
<string name="progress_title">Trabalhando…</string>
|
<string name="progress_title">Trabalhando…</string>
|
||||||
<string name="remember_keyfile_summary">Lembra o local dos arquivos-chave dos bancos de dados</string>
|
<string name="remember_keyfile_summary">Lembra o local dos arquivos-chave dos bancos de dados</string>
|
||||||
@@ -177,7 +177,7 @@
|
|||||||
<string name="invalid_algorithm">Algoritmo errado.</string>
|
<string name="invalid_algorithm">Algoritmo errado.</string>
|
||||||
<string name="keyfile_does_not_exist">Não existem arquivos-chave.</string>
|
<string name="keyfile_does_not_exist">Não existem arquivos-chave.</string>
|
||||||
<string name="keyfile_is_empty">O arquivo-chave está vazio.</string>
|
<string name="keyfile_is_empty">O arquivo-chave está vazio.</string>
|
||||||
<string name="copy_field">Copiado %1$s</string>
|
<string name="copy_field">Cópia de %1$s</string>
|
||||||
<string name="menu_form_filling_settings">Preenchimento de formulário</string>
|
<string name="menu_form_filling_settings">Preenchimento de formulário</string>
|
||||||
<string name="menu_copy">Cópia</string>
|
<string name="menu_copy">Cópia</string>
|
||||||
<string name="menu_move">Mover</string>
|
<string name="menu_move">Mover</string>
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
<string name="use_saf_summary">Use o framework de acesso de armazenamento (SAF) do Android para navegação de arquivos (KitKat e posterior)</string>
|
<string name="use_saf_summary">Use o framework de acesso de armazenamento (SAF) do Android para navegação de arquivos (KitKat e posterior)</string>
|
||||||
<string name="use_saf_title">Framework de acesso de armazenamento</string>
|
<string name="use_saf_title">Framework de acesso de armazenamento</string>
|
||||||
<string name="warning">Aviso</string>
|
<string name="warning">Aviso</string>
|
||||||
<string name="warning_password_encoding">Evite caracteres fora da tabela Latin-1 em arquivos .kdb, pois todos estes são convertidos para a mesma letra.</string>
|
<string name="warning_password_encoding">Evite caracteres fora do formato de codificação do arquivo do banco (todos os caracteres não reconhecidos são convertidos para a mesma letra).</string>
|
||||||
<string name="warning_empty_password">Você realmente não quer proteção por senha\?</string>
|
<string name="warning_empty_password">Você realmente não quer proteção por senha\?</string>
|
||||||
<string name="warning_no_encryption_key">Você tem certeza de que não quer usar uma chave de encriptação\?</string>
|
<string name="warning_no_encryption_key">Você tem certeza de que não quer usar uma chave de encriptação\?</string>
|
||||||
<string name="configure_fingerprint">Impressão digital é suportada, mas não está configurada.</string>
|
<string name="configure_fingerprint">Impressão digital é suportada, mas não está configurada.</string>
|
||||||
@@ -235,7 +235,7 @@
|
|||||||
<string name="list_password_generator_options_title">Caracteres da senha</string>
|
<string name="list_password_generator_options_title">Caracteres da senha</string>
|
||||||
<string name="list_password_generator_options_summary">Definir os caracteres padrão do gerador de senha</string>
|
<string name="list_password_generator_options_summary">Definir os caracteres padrão do gerador de senha</string>
|
||||||
<string name="clipboard_notifications_title">Notificações da área de transferência</string>
|
<string name="clipboard_notifications_title">Notificações da área de transferência</string>
|
||||||
<string name="clipboard_notifications_summary">Habilite notificações da área de transferência para copiar campos de entrada</string>
|
<string name="clipboard_notifications_summary">Habilite notificações da área de transferência para campos copiáveis quando estiver visualizando uma entrada</string>
|
||||||
<string name="clipboard_warning">Se a limpeza da área de transferência falhar, limpe seu histórico manualmente.</string>
|
<string name="clipboard_warning">Se a limpeza da área de transferência falhar, limpe seu histórico manualmente.</string>
|
||||||
<string name="lock">Bloquear</string>
|
<string name="lock">Bloquear</string>
|
||||||
<string name="lock_database_screen_off_title">Bloqueio de tela</string>
|
<string name="lock_database_screen_off_title">Bloqueio de tela</string>
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
<string name="education_entry_edit_title">Modifique a entrada</string>
|
<string name="education_entry_edit_title">Modifique a entrada</string>
|
||||||
<string name="education_entry_edit_summary">Edite a sua entrada com campos personalizados. Os conjuntos de dados podem ser referenciados entre campos de entradas diferentes.</string>
|
<string name="education_entry_edit_summary">Edite a sua entrada com campos personalizados. Os conjuntos de dados podem ser referenciados entre campos de entradas diferentes.</string>
|
||||||
<string name="education_generate_password_title">Crie uma senha forte para sua entrada.</string>
|
<string name="education_generate_password_title">Crie uma senha forte para sua entrada.</string>
|
||||||
<string name="education_generate_password_summary">Gere uma senha forte para associar a sua entrada, defina-a facilmente de acordo com os critérios do formulário e não se esqueça de tornar a senha segura.</string>
|
<string name="education_generate_password_summary">Gere uma senha forte para associar a sua entrada, defina-a facilmente de acordo com os critérios do formulário e não se esqueça de torná-la segura.</string>
|
||||||
<string name="education_entry_new_field_title">Adicione campos customizados</string>
|
<string name="education_entry_new_field_title">Adicione campos customizados</string>
|
||||||
<string name="education_entry_new_field_summary">Registre facilmente um campo básico não fornecido que você também pode proteger.</string>
|
<string name="education_entry_new_field_summary">Registre facilmente um campo básico não fornecido que você também pode proteger.</string>
|
||||||
<string name="education_unlock_title">Desbloqueie seu banco de dados</string>
|
<string name="education_unlock_title">Desbloqueie seu banco de dados</string>
|
||||||
@@ -353,7 +353,7 @@
|
|||||||
<string name="html_text_dev_feature">Esse recurso está <strong>em desenvolvimento</strong> e exige que sua <strong>contribuição</strong> para que esteja disponível em breve.</string>
|
<string name="html_text_dev_feature">Esse recurso está <strong>em desenvolvimento</strong> e exige que sua <strong>contribuição</strong> para que esteja disponível em breve.</string>
|
||||||
<string name="html_text_dev_feature_buy_pro">Ao comprar a versão <strong>pro</strong>,</string>
|
<string name="html_text_dev_feature_buy_pro">Ao comprar a versão <strong>pro</strong>,</string>
|
||||||
<string name="html_text_dev_feature_contibute">
|
<string name="html_text_dev_feature_contibute">
|
||||||
<strong>contribuindo </strong>,</string>
|
<strong>Contribuindo </strong>,</string>
|
||||||
<string name="html_text_dev_feature_encourage">Você está incentivando os desenvolvedores a criar <strong>novos recursos</strong> e a <strong>corrigir erros </strong> de acordo com suas observações.</string>
|
<string name="html_text_dev_feature_encourage">Você está incentivando os desenvolvedores a criar <strong>novos recursos</strong> e a <strong>corrigir erros </strong> de acordo com suas observações.</string>
|
||||||
<string name="html_text_dev_feature_thanks">Obrigado por sua contribuição.</string>
|
<string name="html_text_dev_feature_thanks">Obrigado por sua contribuição.</string>
|
||||||
<string name="html_text_dev_feature_work_hard">Estamos trabalhando duro para lançar esse recurso o mais rápido possível.</string>
|
<string name="html_text_dev_feature_work_hard">Estamos trabalhando duro para lançar esse recurso o mais rápido possível.</string>
|
||||||
@@ -387,10 +387,21 @@
|
|||||||
<string name="keyboard_notification_entry_content_title">%1$s disponível no Magikeyboard</string>
|
<string name="keyboard_notification_entry_content_title">%1$s disponível no Magikeyboard</string>
|
||||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||||
<string name="keyboard_notification_entry_clear_close_title">Limpar ao fechar</string>
|
<string name="keyboard_notification_entry_clear_close_title">Limpar ao fechar</string>
|
||||||
<string name="keyboard_notification_entry_clear_close_summary">Limpar a entrada do teclado ao fechar a notificação</string>
|
<string name="keyboard_notification_entry_clear_close_summary">Fecha a base de dados ao dispensar a notificação</string>
|
||||||
<string name="keyboard_appearance_category">Aparência</string>
|
<string name="keyboard_appearance_category">Aparência</string>
|
||||||
<string name="keyboard_theme_title">Tema do teclado</string>
|
<string name="keyboard_theme_title">Tema do teclado</string>
|
||||||
<string name="keyboard_keys_category">Teclas</string>
|
<string name="keyboard_keys_category">Teclas</string>
|
||||||
<string name="keyboard_key_vibrate_title">Vibrar ao clicar</string>
|
<string name="keyboard_key_vibrate_title">Vibrar ao clicar</string>
|
||||||
<string name="keyboard_key_sound_title">Som ao clicar</string>
|
<string name="keyboard_key_sound_title">Som ao clicar</string>
|
||||||
|
<string name="selection_mode">Modo de seleção</string>
|
||||||
|
<string name="do_not_kill_app">Não feche o aplicativo…</string>
|
||||||
|
<string name="lock_database_back_root_title">Trancar ao voltar</string>
|
||||||
|
<string name="lock_database_back_root_summary">Tranca a base de dados quando o usuário pressiona o botão Voltar na tela inicial</string>
|
||||||
|
<string name="clear_clipboard_notification_title">Limpar a Área de Transferência ao fechar</string>
|
||||||
|
<string name="clear_clipboard_notification_summary">Fecha a base de dados ao dispensar a notificação</string>
|
||||||
|
<string name="recycle_bin">Lixeira</string>
|
||||||
|
<string name="keyboard_selection_entry_title">Seleção de entrada</string>
|
||||||
|
<string name="keyboard_selection_entry_summary">Mostrar campos de entrada no Magikeyboard quando estiver visualizando uma Entrada</string>
|
||||||
|
<string name="delete_entered_password_title">Deletar senha</string>
|
||||||
|
<string name="delete_entered_password_summary">Deleta a senha inserida após uma tentativa de conexão</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
Copyright 2019 Jeremy Jamet / Kunzisoft.
|
Copyright 2019 Jeremy Jamet / Kunzisoft.
|
||||||
|
|
||||||
@@ -44,6 +44,7 @@
|
|||||||
<string name="clipboard_timeout">Clipboard timeout</string>
|
<string name="clipboard_timeout">Clipboard timeout</string>
|
||||||
<string name="clipboard_timeout_summary">Duration of storage in the clipboard</string>
|
<string name="clipboard_timeout_summary">Duration of storage in the clipboard</string>
|
||||||
<string name="clipboard_swipe_clean">Swipe to clear clipboard now</string>
|
<string name="clipboard_swipe_clean">Swipe to clear clipboard now</string>
|
||||||
|
|
||||||
<string name="content_description_open_file">Open file</string>
|
<string name="content_description_open_file">Open file</string>
|
||||||
<string name="content_description_show_file_link">Show file link</string>
|
<string name="content_description_show_file_link">Show file link</string>
|
||||||
<string name="content_description_open_file_link">Open file link</string>
|
<string name="content_description_open_file_link">Open file link</string>
|
||||||
@@ -61,7 +62,8 @@
|
|||||||
<string name="content_description_password_length">Password length</string>
|
<string name="content_description_password_length">Password length</string>
|
||||||
<string name="content_description_add_field">Add field</string>
|
<string name="content_description_add_field">Add field</string>
|
||||||
<string name="content_description_remove_field">Remove field</string>
|
<string name="content_description_remove_field">Remove field</string>
|
||||||
<!--%1$s is either \"Username\" or \"Password\".-->
|
|
||||||
|
<!--%1$s is either \"Username\" or \"Password\".-->
|
||||||
<string name="select_to_copy">Select to copy %1$s to clipboard</string>
|
<string name="select_to_copy">Select to copy %1$s to clipboard</string>
|
||||||
<string name="retrieving_db_key">Retrieving database key…</string>
|
<string name="retrieving_db_key">Retrieving database key…</string>
|
||||||
<string name="database">Database</string>
|
<string name="database">Database</string>
|
||||||
@@ -75,6 +77,7 @@
|
|||||||
<string name="entry_confpassword">Confirm password</string>
|
<string name="entry_confpassword">Confirm password</string>
|
||||||
<string name="entry_created">Created</string>
|
<string name="entry_created">Created</string>
|
||||||
<string name="entry_expires">Expires</string>
|
<string name="entry_expires">Expires</string>
|
||||||
|
<string name="entry_UUID">UUID</string>
|
||||||
<string name="entry_keyfile">Keyfile</string>
|
<string name="entry_keyfile">Keyfile</string>
|
||||||
<string name="entry_modified">Modified</string>
|
<string name="entry_modified">Modified</string>
|
||||||
<string name="entry_not_found">Could not find entry data.</string>
|
<string name="entry_not_found">Could not find entry data.</string>
|
||||||
@@ -106,6 +109,8 @@
|
|||||||
<string name="error_wrong_length">Enter a positive whole number in the \"Length\" field.</string>
|
<string name="error_wrong_length">Enter a positive whole number in the \"Length\" field.</string>
|
||||||
<string name="error_autofill_enable_service">Could not enable autofill service.</string>
|
<string name="error_autofill_enable_service">Could not enable autofill service.</string>
|
||||||
<string name="error_move_folder_in_itself">You can not move a group into itself.</string>
|
<string name="error_move_folder_in_itself">You can not move a group into itself.</string>
|
||||||
|
<string name="error_move_entry_here">You can not move an entry here.</string>
|
||||||
|
<string name="error_copy_entry_here">You can not copy an entry here.</string>
|
||||||
<string name="field_name">Field name</string>
|
<string name="field_name">Field name</string>
|
||||||
<string name="field_value">Field value</string>
|
<string name="field_value">Field value</string>
|
||||||
<string name="file_not_found">Could not find file.</string>
|
<string name="file_not_found">Could not find file.</string>
|
||||||
@@ -250,7 +255,7 @@
|
|||||||
<string name="lock">Lock</string>
|
<string name="lock">Lock</string>
|
||||||
<string name="lock_database_screen_off_title">Screen lock</string>
|
<string name="lock_database_screen_off_title">Screen lock</string>
|
||||||
<string name="lock_database_screen_off_summary">Lock the database when the screen is off</string>
|
<string name="lock_database_screen_off_summary">Lock the database when the screen is off</string>
|
||||||
<string name="lock_database_back_root_title">Back lock</string>
|
<string name="lock_database_back_root_title">Press Back on root to lock</string>
|
||||||
<string name="lock_database_back_root_summary">Lock the database when the user clicks the back button on the root screen</string>
|
<string name="lock_database_back_root_summary">Lock the database when the user clicks the back button on the root screen</string>
|
||||||
<string name="fingerprint_quick_unlock_title">How to set up fingerprint scanning for quick unlocking?</string>
|
<string name="fingerprint_quick_unlock_title">How to set up fingerprint scanning for quick unlocking?</string>
|
||||||
<string name="fingerprint_setting_text">Save your scanned fingerprint for your device in </string>
|
<string name="fingerprint_setting_text">Save your scanned fingerprint for your device in </string>
|
||||||
@@ -315,36 +320,25 @@
|
|||||||
<string name="keyboard_fill_field_text">Fill in your fields using the entry elements.</string>
|
<string name="keyboard_fill_field_text">Fill in your fields using the entry elements.</string>
|
||||||
<string name="keyboard_lock_database_text">Lock the database.</string>
|
<string name="keyboard_lock_database_text">Lock the database.</string>
|
||||||
<string name="keyboard_back_main_keyboard_text">Use default keyboard again.</string>
|
<string name="keyboard_back_main_keyboard_text">Use default keyboard again.</string>
|
||||||
|
|
||||||
<string name="keyboard_name">Magikeyboard</string>
|
<string name="keyboard_name">Magikeyboard</string>
|
||||||
<string name="keyboard_label">Magikeyboard (KeePass DX)</string>
|
<string name="keyboard_label">Magikeyboard (KeePass DX)</string>
|
||||||
<string name="keyboard_setting_label">Magikeyboard settings</string>
|
<string name="keyboard_setting_label">Magikeyboard settings</string>
|
||||||
|
|
||||||
<string name="keyboard_entry_category">Entry</string>
|
<string name="keyboard_entry_category">Entry</string>
|
||||||
|
|
||||||
<string name="keyboard_selection_entry_title">Entry selection</string>
|
<string name="keyboard_selection_entry_title">Entry selection</string>
|
||||||
<string name="keyboard_selection_entry_summary">Show input fields in Magikeyboard when viewing an entry</string>
|
<string name="keyboard_selection_entry_summary">Show input fields in Magikeyboard when viewing an entry</string>
|
||||||
|
<string name="keyboard_notification_entry_title">Notification info</string>
|
||||||
<string name="keyboard_notification_entry_title">Notification information</string>
|
|
||||||
<string name="keyboard_notification_entry_summary">Show a notification when an entry is available</string>
|
<string name="keyboard_notification_entry_summary">Show a notification when an entry is available</string>
|
||||||
|
|
||||||
<string name="keyboard_notification_entry_clear_close_title">Clear at closing</string>
|
<string name="keyboard_notification_entry_clear_close_title">Clear at closing</string>
|
||||||
<string name="keyboard_notification_entry_clear_close_summary">Close the database when closing the notification</string>
|
<string name="keyboard_notification_entry_clear_close_summary">Close the database when closing the notification</string>
|
||||||
|
|
||||||
<string name="keyboard_entry_timeout_title">Timeout</string>
|
<string name="keyboard_entry_timeout_title">Timeout</string>
|
||||||
<string name="keyboard_entry_timeout_summary">Timeout to clear the keyboard entry</string>
|
<string name="keyboard_entry_timeout_summary">Timeout to clear the keyboard entry</string>
|
||||||
|
|
||||||
<string name="keyboard_notification_entry_content_title_text">Entry</string>
|
<string name="keyboard_notification_entry_content_title_text">Entry</string>
|
||||||
<string name="keyboard_notification_entry_content_title">%1$s available on Magikeyboard</string>
|
<string name="keyboard_notification_entry_content_title">%1$s available on Magikeyboard</string>
|
||||||
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
<string name="keyboard_notification_entry_content_text">%1$s</string>
|
||||||
|
|
||||||
<string name="keyboard_appearance_category">Appearance</string>
|
<string name="keyboard_appearance_category">Appearance</string>
|
||||||
|
|
||||||
<string name="keyboard_theme_title">Keyboard theme</string>
|
<string name="keyboard_theme_title">Keyboard theme</string>
|
||||||
|
|
||||||
<string name="keyboard_keys_category">Keys</string>
|
<string name="keyboard_keys_category">Keys</string>
|
||||||
<string name="keyboard_key_vibrate_title">Vibrate on keypress</string>
|
<string name="keyboard_key_vibrate_title">Vibrate on keypress</string>
|
||||||
|
|
||||||
<string name="keyboard_key_sound_title">Sound on keypress</string>
|
<string name="keyboard_key_sound_title">Sound on keypress</string>
|
||||||
|
|
||||||
<string name="allow_no_password_title">Allow no master key</string>
|
<string name="allow_no_password_title">Allow no master key</string>
|
||||||
@@ -353,7 +347,6 @@
|
|||||||
<string name="enable_read_only_summary">Open your database read-only by default</string>
|
<string name="enable_read_only_summary">Open your database read-only by default</string>
|
||||||
<string name="delete_entered_password_title">Delete password</string>
|
<string name="delete_entered_password_title">Delete password</string>
|
||||||
<string name="delete_entered_password_summary">Deletes the password entered after a connection attempt</string>
|
<string name="delete_entered_password_summary">Deletes the password entered after a connection attempt</string>
|
||||||
|
|
||||||
<string name="enable_education_screens_title">Educational screens</string>
|
<string name="enable_education_screens_title">Educational screens</string>
|
||||||
<string name="enable_education_screens_summary">Highlight the elements to learn how the app works</string>
|
<string name="enable_education_screens_summary">Highlight the elements to learn how the app works</string>
|
||||||
<string name="reset_education_screens_title">Reset educational screens</string>
|
<string name="reset_education_screens_title">Reset educational screens</string>
|
||||||
@@ -390,12 +383,10 @@
|
|||||||
<string name="education_sort_summary">Choose how entries and groups are sorted.</string>
|
<string name="education_sort_summary">Choose how entries and groups are sorted.</string>
|
||||||
<string name="education_donation_title">Participate</string>
|
<string name="education_donation_title">Participate</string>
|
||||||
<string name="education_donation_summary">Help increase the stability, security and in adding more features.</string>
|
<string name="education_donation_summary">Help increase the stability, security and in adding more features.</string>
|
||||||
|
|
||||||
<string name="html_text_ad_free">Unlike many password management apps, this one is <strong>ad-free</strong>, <strong>copylefted libre software</strong> and does not collect personal data on its servers, no matter what version you use.</string>
|
<string name="html_text_ad_free">Unlike many password management apps, this one is <strong>ad-free</strong>, <strong>copylefted libre software</strong> and does not collect personal data on its servers, no matter what version you use.</string>
|
||||||
<string name="html_text_buy_pro">By buying the pro version, you will have access to this <strong>visual feature</strong> and you will especially help <strong>the realization of community projects.</strong></string>
|
<string name="html_text_buy_pro">By buying the pro version, you will have access to this <strong>visual feature</strong> and you will especially help <strong>the realization of community projects.</strong></string>
|
||||||
<string name="html_text_feature_generosity">This <strong>visual feature</strong> is available thanks to your generosity.</string>
|
<string name="html_text_feature_generosity">This <strong>visual feature</strong> is available thanks to your generosity.</string>
|
||||||
<string name="html_text_donation">In order to keep our freedom and to always be active, we count on your <strong>contribution.</strong></string>
|
<string name="html_text_donation">In order to keep our freedom and to always be active, we count on your <strong>contribution.</strong></string>
|
||||||
|
|
||||||
<string name="html_text_dev_feature">This feature is <strong>under development</strong> and requires your <strong>contribution</strong> to be available soon.</string>
|
<string name="html_text_dev_feature">This feature is <strong>under development</strong> and requires your <strong>contribution</strong> to be available soon.</string>
|
||||||
<string name="html_text_dev_feature_buy_pro">By buying the <strong>pro</strong> version,</string>
|
<string name="html_text_dev_feature_buy_pro">By buying the <strong>pro</strong> version,</string>
|
||||||
<string name="html_text_dev_feature_contibute">By <strong>contributing</strong>,</string>
|
<string name="html_text_dev_feature_contibute">By <strong>contributing</strong>,</string>
|
||||||
@@ -403,36 +394,31 @@
|
|||||||
<string name="html_text_dev_feature_thanks">Thanks a lot for your contribution.</string>
|
<string name="html_text_dev_feature_thanks">Thanks a lot for your contribution.</string>
|
||||||
<string name="html_text_dev_feature_work_hard">We are working hard to release this feature quickly.</string>
|
<string name="html_text_dev_feature_work_hard">We are working hard to release this feature quickly.</string>
|
||||||
<string name="html_text_dev_feature_upgrade">Do not forget to keep your app up to date by installing new versions.</string>
|
<string name="html_text_dev_feature_upgrade">Do not forget to keep your app up to date by installing new versions.</string>
|
||||||
|
|
||||||
<string name="download">Download</string>
|
<string name="download">Download</string>
|
||||||
<string name="contribute">Contribute</string>
|
<string name="contribute">Contribute</string>
|
||||||
|
|
||||||
<!-- Algorithms -->
|
<!-- Algorithms -->
|
||||||
<string name="encryption_rijndael">Rijndael (AES)</string>
|
<string name="encryption_rijndael">Rijndael (AES)</string>
|
||||||
<string name="encryption_twofish">Twofish</string>
|
<string name="encryption_twofish">Twofish</string>
|
||||||
<string name="encryption_chacha20">ChaCha20</string>
|
<string name="encryption_chacha20">ChaCha20</string>
|
||||||
|
|
||||||
<!-- Key Derivation Functions -->
|
<!-- Key Derivation Functions -->
|
||||||
<string name="kdf_AES">AES KDF</string>
|
<string name="kdf_AES">AES KDF</string>
|
||||||
<string name="kdf_Argon2">Argon2</string>
|
<string name="kdf_Argon2">Argon2</string>
|
||||||
|
|
||||||
<string-array name="timeout_options">
|
<string-array name="timeout_options">
|
||||||
<item>5 seconds</item>
|
<item>5 seconds</item>
|
||||||
<item>10 seconds</item>
|
<item>10 seconds</item>
|
||||||
<item>20 seconds</item>
|
<item>20 seconds</item>
|
||||||
<item>30 seconds</item>
|
<item>30 seconds</item>
|
||||||
<item>1 minute</item>
|
<item>1 minute</item>
|
||||||
<item>5 minutes</item>
|
<item>5 minutes</item>
|
||||||
<item>15 minutes</item>
|
<item>15 minutes</item>
|
||||||
<item>30 minutes</item>
|
<item>30 minutes</item>
|
||||||
<item>Never</item>
|
<item>Never</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="list_size_options">
|
<string-array name="list_size_options">
|
||||||
<item>Small</item>
|
<item>Small</item>
|
||||||
<item>Medium</item>
|
<item>Medium</item>
|
||||||
<item>Large</item>
|
<item>Large</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string name="style_choose_title">App theme</string>
|
<string name="style_choose_title">App theme</string>
|
||||||
<string name="style_choose_summary">Theme used in the app</string>
|
<string name="style_choose_summary">Theme used in the app</string>
|
||||||
<string-array name="list_style_names">
|
<string-array name="list_style_names">
|
||||||
@@ -445,5 +431,4 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
<string name="icon_pack_choose_title">Icon pack</string>
|
<string name="icon_pack_choose_title">Icon pack</string>
|
||||||
<string name="icon_pack_choose_summary">Icon pack used in the app</string>
|
<string name="icon_pack_choose_summary">Icon pack used in the app</string>
|
||||||
|
</resources>
|
||||||
</resources>
|
|
||||||
@@ -296,6 +296,12 @@
|
|||||||
<item name="backgroundTint">@color/background_button_color_accent</item>
|
<item name="backgroundTint">@color/background_button_color_accent</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<!-- Icon Style -->
|
||||||
|
<style name="KeepassDXStyle.Icon" parent="KeepassDXStyle.v21.Button">
|
||||||
|
<item name="android:background">@drawable/background_icon</item>
|
||||||
|
<item name="backgroundTint">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<!-- FAB -->
|
<!-- FAB -->
|
||||||
<style name="KeepassDXStyle.v21.Fab" parent="KeepassDXStyle.Light.v21" />
|
<style name="KeepassDXStyle.v21.Fab" parent="KeepassDXStyle.Light.v21" />
|
||||||
<style name="KeepassDXStyle.Fab" parent="KeepassDXStyle.v21.Fab">
|
<style name="KeepassDXStyle.Fab" parent="KeepassDXStyle.v21.Fab">
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ platform :android do
|
|||||||
lane :deploy_beta_free do
|
lane :deploy_beta_free do
|
||||||
upload_to_play_store(
|
upload_to_play_store(
|
||||||
track: "beta",
|
track: "beta",
|
||||||
skip_upload_metadata: "true",
|
skip_upload_metadata: "false",
|
||||||
skip_upload_images: "false",
|
skip_upload_images: "true",
|
||||||
skip_upload_screenshots: "true",
|
skip_upload_screenshots: "true",
|
||||||
apk: "./app/build/outputs/apk/free/release/app-free-release.apk",
|
apk: "./app/build/outputs/apk/free/release/app-free-release.apk",
|
||||||
validate_only: "false",
|
validate_only: "false",
|
||||||
@@ -62,11 +62,11 @@ platform :android do
|
|||||||
sh("cp", "-a", "./pro/.", "./")
|
sh("cp", "-a", "./pro/.", "./")
|
||||||
upload_to_play_store(
|
upload_to_play_store(
|
||||||
track: "beta",
|
track: "beta",
|
||||||
skip_upload_metadata: "true",
|
skip_upload_metadata: "false",
|
||||||
skip_upload_images: "false",
|
skip_upload_images: "true",
|
||||||
skip_upload_screenshots: "true",
|
skip_upload_screenshots: "true",
|
||||||
apk: "./app/build/outputs/apk/pro/release/app-pro-release.apk",
|
apk: "./app/build/outputs/apk/pro/release/app-pro-release.apk",
|
||||||
validate_only: "true",
|
validate_only: "false",
|
||||||
)
|
)
|
||||||
gradle(
|
gradle(
|
||||||
task: 'clean'
|
task: 'clean'
|
||||||
|
|||||||
5
fastlane/metadata/android/en-US/changelogs/22.txt
Normal file
5
fastlane/metadata/android/en-US/changelogs/22.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
* Rebuild code for actions
|
||||||
|
* Add UUID as entry view
|
||||||
|
* Fix bug with natural order
|
||||||
|
* Fix number of entries in databaseV1
|
||||||
|
* New entry views
|
||||||
5
fastlane/metadata/android/fr-FR/changelogs/22.txt
Normal file
5
fastlane/metadata/android/fr-FR/changelogs/22.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
* Recréation du code pour les actions
|
||||||
|
* Ajout de l'UUID comme vue d'entrée
|
||||||
|
* Correction d'un bug avec l'ordre naturel
|
||||||
|
* Correction du nombre d'entrée dans les bases de données V1 number of entries in databaseV1
|
||||||
|
* Nouvelles vues d'entrée
|
||||||
Reference in New Issue
Block a user