diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.kt index 8e0996ae5..f22e4cb88 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.kt @@ -142,6 +142,7 @@ class NodeAdapter Log.e(TAG, "Can't add node elements to the list", e) Toast.makeText(context, "Can't add node elements to the list : " + e.message, Toast.LENGTH_LONG).show() } + notifyDataSetChanged() } fun contains(node: NodeVersioned): Boolean { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt index 042729e97..0f663149f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt @@ -33,22 +33,17 @@ class UpdateEntryRunnable constructor( finishRunnable: AfterActionNodeFinishRunnable?) : ActionNodeDatabaseRunnable(context, database, finishRunnable, save) { - // Keep backup of original values in case save fails - private var mBackupEntryHistory: EntryVersioned = EntryVersioned(mOldEntry) - override fun nodeAction() { // Update entry with new values - mOldEntry.updateWith(mNewEntry) mNewEntry.touch(modified = true, touchParents = true) // Create an entry history (an entry history don't have history) - mOldEntry.addEntryToHistory(EntryVersioned(mBackupEntryHistory, copyHistory = false)) + mNewEntry.addEntryToHistory(EntryVersioned(mOldEntry, copyHistory = false)) - database.removeOldestHistory(mOldEntry) + database.removeOldestHistory(mNewEntry) // Only change data un index - // TODO - database.updateEntry(mOldEntry) + database.updateEntry(mNewEntry) } override fun nodeFinish(result: Result): ActionNodeValues { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt index 1fec741e1..ccc68963c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt @@ -38,12 +38,10 @@ class UpdateGroupRunnable constructor( override fun nodeAction() { // Update group with new values - mOldGroup.updateWith(mNewGroup) - mOldGroup.touch(modified = true, touchParents = true) + mNewGroup.touch(modified = true, touchParents = true) // Only change data un index - // TODO - database.updateGroup(mOldGroup) + database.updateGroup(mNewGroup) } override fun nodeFinish(result: Result): ActionNodeValues { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.kt b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.kt index 67f89fd51..e9f59624b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.kt @@ -2,12 +2,11 @@ package com.kunzisoft.keepass.database.cursor import android.database.MatrixCursor import android.provider.BaseColumns +import com.kunzisoft.keepass.database.element.PwEntry +import com.kunzisoft.keepass.database.element.PwIconFactory +import com.kunzisoft.keepass.database.element.PwNodeId -import com.kunzisoft.keepass.database.element.* - -import java.util.UUID - -abstract class EntryCursor> : MatrixCursor(arrayOf( +abstract class EntryCursor> : MatrixCursor(arrayOf( _ID, COLUMN_INDEX_UUID_MOST_SIGNIFICANT_BITS, COLUMN_INDEX_UUID_LEAST_SIGNIFICANT_BITS, @@ -25,10 +24,10 @@ abstract class EntryCursor> : MatrixCursor(arrayOf( abstract fun addEntry(entry: PwEntryV) + abstract fun getPwNodeId(): PwNodeId + open fun populateEntry(pwEntry: PwEntryV, iconFactory: PwIconFactory) { - pwEntry.nodeId = PwNodeIdUUID( - UUID(getLong(getColumnIndex(COLUMN_INDEX_UUID_MOST_SIGNIFICANT_BITS)), - getLong(getColumnIndex(COLUMN_INDEX_UUID_LEAST_SIGNIFICANT_BITS)))) + pwEntry.nodeId = getPwNodeId() pwEntry.title = getString(getColumnIndex(COLUMN_INDEX_TITLE)) val iconStandard = iconFactory.getIcon(getInt(getColumnIndex(COLUMN_INDEX_ICON_STANDARD))) @@ -53,5 +52,4 @@ abstract class EntryCursor> : MatrixCursor(arrayOf( const val COLUMN_INDEX_URL = "URL" const val COLUMN_INDEX_NOTES = "notes" } - } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorUUID.kt b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorUUID.kt new file mode 100644 index 000000000..95be574a9 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorUUID.kt @@ -0,0 +1,15 @@ +package com.kunzisoft.keepass.database.cursor + +import com.kunzisoft.keepass.database.element.PwEntry +import com.kunzisoft.keepass.database.element.PwNodeId +import com.kunzisoft.keepass.database.element.PwNodeIdUUID +import java.util.* + +abstract class EntryCursorUUID>: EntryCursor() { + + override fun getPwNodeId(): PwNodeId { + return PwNodeIdUUID( + UUID(getLong(getColumnIndex(COLUMN_INDEX_UUID_MOST_SIGNIFICANT_BITS)), + getLong(getColumnIndex(COLUMN_INDEX_UUID_LEAST_SIGNIFICANT_BITS)))) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV3.kt b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV3.kt index 9ef52fbe5..f50b65388 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV3.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV3.kt @@ -3,7 +3,7 @@ package com.kunzisoft.keepass.database.cursor import com.kunzisoft.keepass.database.element.PwDatabase import com.kunzisoft.keepass.database.element.PwEntryV3 -class EntryCursorV3 : EntryCursor() { +class EntryCursorV3 : EntryCursorUUID() { override fun addEntry(entry: PwEntryV3) { addRow(arrayOf( diff --git a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV4.kt b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV4.kt index d4b1c02dd..f4fcbb3a1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV4.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursorV4.kt @@ -5,7 +5,7 @@ import com.kunzisoft.keepass.database.element.PwIconFactory import java.util.UUID -class EntryCursorV4 : EntryCursor() { +class EntryCursorV4 : EntryCursorUUID() { private val extraFieldCursor: ExtraFieldCursor = ExtraFieldCursor() diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt index 78e64fd0c..6a3e7eab9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt @@ -30,8 +30,9 @@ import java.util.* abstract class PwDatabase< GroupId, - Group : PwGroup, - Entry : PwEntry + EntryId, + Group : PwGroup, + Entry : PwEntry > { // Algorithm used to encrypt the database @@ -51,7 +52,7 @@ abstract class PwDatabase< var changeDuplicateId = false private var groupIndexes = LinkedHashMap, Group>() - private var entryIndexes = LinkedHashMap, Entry>() + private var entryIndexes = LinkedHashMap, Entry>() abstract val version: String @@ -193,7 +194,7 @@ abstract class PwDatabase< abstract fun newGroupId(): PwNodeId - abstract fun newEntryId(): PwNodeId + abstract fun newEntryId(): PwNodeId abstract fun createGroup(): Group @@ -274,7 +275,7 @@ abstract class PwDatabase< } } - fun isEntryIdUsed(id: PwNodeId): Boolean { + fun isEntryIdUsed(id: PwNodeId): Boolean { return entryIndexes.containsKey(id) } @@ -282,7 +283,7 @@ abstract class PwDatabase< return entryIndexes.values } - fun getEntryById(id: PwNodeId): Entry? { + fun getEntryById(id: PwNodeId): Entry? { return this.entryIndexes[id] } @@ -340,6 +341,7 @@ abstract class PwDatabase< } fun updateGroup(group: Group) { + getGroupById(group.nodeId)?.parent?.updateChildGroup(group) updateGroupIndex(group) } @@ -357,6 +359,7 @@ abstract class PwDatabase< } fun updateEntry(entry: Entry) { + getEntryById(entry.nodeId)?.parent?.updateChildEntry(entry) updateEntryIndex(entry) } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV3.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV3.kt index 58e8b0027..2af4ff0f3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV3.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV3.kt @@ -28,8 +28,10 @@ import java.io.InputStream import java.security.DigestOutputStream import java.security.MessageDigest import java.security.NoSuchAlgorithmException +import java.util.* +import kotlin.collections.ArrayList -class PwDatabaseV3 : PwDatabase() { +class PwDatabaseV3 : PwDatabase() { private var numKeyEncRounds: Int = 0 diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt index ce0d56591..31b11f8e1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt @@ -41,7 +41,7 @@ import javax.xml.parsers.DocumentBuilderFactory import javax.xml.parsers.ParserConfigurationException -class PwDatabaseV4 : PwDatabase { +class PwDatabaseV4 : PwDatabase { var hmacKey: ByteArray? = null private set diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntry.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntry.kt index 1b27ce15d..e5a1067ae 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntry.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntry.kt @@ -5,10 +5,12 @@ import java.util.* abstract class PwEntry < - ParentGroup: PwGroupInterface, - Entry: PwEntryInterface + GroupId, + EntryId, + ParentGroup: PwGroup, + Entry: PwEntry > - : PwNode, PwEntryInterface { + : PwNode, PwEntryInterface { constructor() : super() diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV3.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV3.kt index 589c62778..9c69dfd6c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV3.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV3.kt @@ -48,7 +48,7 @@ import java.util.UUID * @author Dominik Reichl @t-online.de> * @author Jeremy Jamet @kunzisoft.com> */ -class PwEntryV3 : PwEntry, PwNodeV3Interface { +class PwEntryV3 : PwEntry, PwNodeV3Interface { /** A string describing what is in pBinaryData */ var binaryDesc = "" diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV4.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV4.kt index 42aef5204..b07d9b867 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV4.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwEntryV4.kt @@ -26,7 +26,7 @@ import com.kunzisoft.keepass.database.element.security.ProtectedString import com.kunzisoft.keepass.utils.MemoryUtil import java.util.* -class PwEntryV4 : PwEntry, PwNodeV4Interface { +class PwEntryV4 : PwEntry, PwNodeV4Interface { // To decode each field not parcelable @Transient diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroup.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroup.kt index 07914a44a..4eed467c1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroup.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroup.kt @@ -4,11 +4,12 @@ import android.os.Parcel abstract class PwGroup < - Id, - Group: PwGroupInterface, - Entry: PwEntryInterface + GroupId, + EntryId, + Group: PwGroup, + Entry: PwEntry > - : PwNode, PwGroupInterface { + : PwNode, PwGroupInterface { private var titleGroup = "" @Transient @@ -27,7 +28,7 @@ abstract class PwGroup dest.writeString(titleGroup) } - protected fun updateWith(source: PwGroup) { + protected fun updateWith(source: PwGroup) { super.updateWith(source) titleGroup = source.titleGroup childGroups.clear() diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV3.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV3.kt index 1c66ad913..ed2aaec3d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV3.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV3.kt @@ -22,8 +22,9 @@ package com.kunzisoft.keepass.database.element import android.os.Parcel import android.os.Parcelable +import java.util.* -class PwGroupV3 : PwGroup, PwNodeV3Interface { +class PwGroupV3 : PwGroup, PwNodeV3Interface { var level = 0 // short /** Used by KeePass internally, don't use */ diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV4.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV4.kt index c8980f9f2..e7eee8abc 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV4.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwGroupV4.kt @@ -25,7 +25,7 @@ import android.os.Parcelable import java.util.HashMap import java.util.UUID -class PwGroupV4 : PwGroup, PwNodeV4Interface { +class PwGroupV4 : PwGroup, PwNodeV4Interface { // TODO Encapsulate override var icon: PwIcon diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/load/Importer.kt b/app/src/main/java/com/kunzisoft/keepass/database/file/load/Importer.kt index d10d234cb..8743eb855 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/file/load/Importer.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/file/load/Importer.kt @@ -24,7 +24,7 @@ import com.kunzisoft.keepass.database.exception.LoadDatabaseException import com.kunzisoft.keepass.tasks.ProgressTaskUpdater import java.io.InputStream -abstract class Importer> { +abstract class Importer> { /** * Load a versioned database file, return contents in a new PwDatabase.