mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Merge icons
This commit is contained in:
@@ -35,6 +35,7 @@ import com.kunzisoft.keepass.database.element.Entry
|
||||
import com.kunzisoft.keepass.database.element.Group
|
||||
import com.kunzisoft.keepass.database.element.database.DatabaseKDB
|
||||
import com.kunzisoft.keepass.database.element.database.DatabaseKDBX
|
||||
import com.kunzisoft.keepass.database.element.icon.IconImageCustom
|
||||
import com.kunzisoft.keepass.database.search.SearchHelper
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.view.strikeOut
|
||||
@@ -112,7 +113,7 @@ class SearchEntryCursorAdapter(private val context: Context,
|
||||
database.getStandardIcon(standardIconId)
|
||||
},
|
||||
{ customIconId ->
|
||||
database.getCustomIcon(customIconId)
|
||||
database.getCustomIcon(customIconId) ?: IconImageCustom(customIconId)
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -122,7 +123,7 @@ class SearchEntryCursorAdapter(private val context: Context,
|
||||
database.getStandardIcon(standardIconId)
|
||||
},
|
||||
{ customIconId ->
|
||||
database.getCustomIcon(customIconId)
|
||||
database.getCustomIcon(customIconId) ?: IconImageCustom(customIconId)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ class Database {
|
||||
return iconsManager.doForEachCustomIcon(action)
|
||||
}
|
||||
|
||||
fun getCustomIcon(iconId: UUID): IconImageCustom {
|
||||
fun getCustomIcon(iconId: UUID): IconImageCustom? {
|
||||
return iconsManager.getIcon(iconId)
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ class Database {
|
||||
}
|
||||
|
||||
fun updateCustomIcon(customIcon: IconImageCustom) {
|
||||
iconsManager.getIcon(customIcon.uuid).updateWith(customIcon)
|
||||
iconsManager.getIcon(customIcon.uuid)?.updateWith(customIcon)
|
||||
}
|
||||
|
||||
fun getTemplates(templateCreation: Boolean): List<Template> {
|
||||
|
||||
@@ -347,7 +347,7 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
|
||||
return iconsManager.isCustomIconBinaryDuplicate(binary)
|
||||
}
|
||||
|
||||
fun getCustomIcon(iconUuid: UUID): IconImageCustom {
|
||||
fun getCustomIcon(iconUuid: UUID): IconImageCustom? {
|
||||
return this.iconsManager.getIcon(iconUuid)
|
||||
}
|
||||
|
||||
|
||||
@@ -58,12 +58,8 @@ class IconsManager {
|
||||
customCache.put(key, name, lastModificationTime, builder, result)
|
||||
}
|
||||
|
||||
fun getIcon(iconUuid: UUID): IconImageCustom {
|
||||
return customCache.getCustomIcon(iconUuid) ?: IconImageCustom(iconUuid)
|
||||
}
|
||||
|
||||
fun isCustomIconInCache(iconUuid: UUID): Boolean {
|
||||
return customCache.getCustomIcon(iconUuid) != null
|
||||
fun getIcon(iconUuid: UUID): IconImageCustom? {
|
||||
return customCache.getCustomIcon(iconUuid)
|
||||
}
|
||||
|
||||
fun isCustomIconBinaryDuplicate(binaryData: BinaryData): Boolean {
|
||||
|
||||
@@ -34,6 +34,7 @@ import com.kunzisoft.keepass.database.element.database.DatabaseKDBX.Companion.BA
|
||||
import com.kunzisoft.keepass.database.element.database.DatabaseVersioned
|
||||
import com.kunzisoft.keepass.database.element.entry.EntryKDBX
|
||||
import com.kunzisoft.keepass.database.element.group.GroupKDBX
|
||||
import com.kunzisoft.keepass.database.element.icon.IconImageCustom
|
||||
import com.kunzisoft.keepass.database.element.node.NodeIdUUID
|
||||
import com.kunzisoft.keepass.database.element.node.NodeKDBXInterface
|
||||
import com.kunzisoft.keepass.database.element.security.ProtectedString
|
||||
@@ -515,7 +516,8 @@ class DatabaseInputKDBX(database: DatabaseKDBX)
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemIcon, ignoreCase = true)) {
|
||||
ctxGroup?.icon?.standard = mDatabase.getStandardIcon(readUInt(xpp, UnsignedInt(0)).toKotlinInt())
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemCustomIconID, ignoreCase = true)) {
|
||||
ctxGroup?.icon?.custom = mDatabase.getCustomIcon(readUuid(xpp))
|
||||
val iconUUID = readUuid(xpp)
|
||||
ctxGroup?.icon?.custom = mDatabase.getCustomIcon(iconUUID) ?: IconImageCustom(iconUUID)
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemTags, ignoreCase = true)) {
|
||||
ctxGroup?.tags = readTags(xpp)
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemPreviousParentGroup, ignoreCase = true)) {
|
||||
@@ -574,7 +576,8 @@ class DatabaseInputKDBX(database: DatabaseKDBX)
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemIcon, ignoreCase = true)) {
|
||||
ctxEntry?.icon?.standard = mDatabase.getStandardIcon(readUInt(xpp, UnsignedInt(0)).toKotlinInt())
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemCustomIconID, ignoreCase = true)) {
|
||||
ctxEntry?.icon?.custom = mDatabase.getCustomIcon(readUuid(xpp))
|
||||
val iconUUID = readUuid(xpp)
|
||||
ctxEntry?.icon?.custom = mDatabase.getCustomIcon(iconUUID) ?: IconImageCustom(iconUUID)
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemFgColor, ignoreCase = true)) {
|
||||
ctxEntry?.foregroundColor = readString(xpp)
|
||||
} else if (name.equals(DatabaseKDBXXML.ElemBgColor, ignoreCase = true)) {
|
||||
|
||||
@@ -89,11 +89,13 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
|
||||
}
|
||||
)
|
||||
|
||||
// TODO Merge icons
|
||||
// TODO merge custom data
|
||||
|
||||
databaseToMerge.iconsManager.doForEachCustomIcon { iconImageCustom, binaryData ->
|
||||
val customIconUuid = iconImageCustom.uuid
|
||||
// If custom icon not present, add it
|
||||
if (!database.iconsManager.isCustomIconInCache(customIconUuid)) {
|
||||
val customIcon = database.iconsManager.getIcon(customIconUuid)
|
||||
if (customIcon == null) {
|
||||
database.addCustomIcon(
|
||||
customIconUuid,
|
||||
iconImageCustom.name,
|
||||
@@ -101,33 +103,33 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
|
||||
false
|
||||
) { _, newBinaryData ->
|
||||
binaryData.getInputDataStream(databaseToMerge.binaryCache).use { inputStream ->
|
||||
newBinaryData?.getOutputDataStream(database.binaryCache)
|
||||
.use { outputStream ->
|
||||
inputStream.readAllBytes { buffer ->
|
||||
outputStream?.write(buffer)
|
||||
}
|
||||
newBinaryData?.getOutputDataStream(database.binaryCache).use { outputStream ->
|
||||
inputStream.readAllBytes { buffer ->
|
||||
outputStream?.write(buffer)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
val customIconModification =
|
||||
database.getCustomIcon(customIconUuid).lastModificationTime
|
||||
val customIconModificationToMerge =
|
||||
databaseToMerge.getCustomIcon(customIconUuid).lastModificationTime
|
||||
val customIconModification = customIcon.lastModificationTime
|
||||
val customIconToMerge = databaseToMerge.iconsManager.getIcon(customIconUuid)
|
||||
val customIconModificationToMerge = customIconToMerge?.lastModificationTime
|
||||
if (customIconModification != null && customIconModificationToMerge != null) {
|
||||
if (customIconModification.date.before(customIconModificationToMerge.date)) {
|
||||
// TODO Update custom icon
|
||||
customIcon.updateWith(customIconToMerge)
|
||||
}
|
||||
} else if (customIconModificationToMerge != null) {
|
||||
customIcon.updateWith(customIconToMerge)
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO merge custom data
|
||||
|
||||
databaseToMerge.deletedObjects.forEach { deletedObject ->
|
||||
val deletedObjectId = deletedObject.uuid
|
||||
val databaseEntry = database.getEntryById(deletedObjectId)
|
||||
val databaseGroup = database.getGroupById(deletedObjectId)
|
||||
val databaseIconModificationTime = database.getCustomIcon(deletedObjectId).lastModificationTime
|
||||
val databaseIcon = database.iconsManager.getIcon(deletedObjectId)
|
||||
val databaseIconModificationTime = databaseIcon?.lastModificationTime
|
||||
if (databaseEntry != null
|
||||
&& deletedObject.deletionTime.date
|
||||
.after(databaseEntry.lastModificationTime.date)) {
|
||||
@@ -138,9 +140,12 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
|
||||
.after(databaseGroup.lastModificationTime.date)) {
|
||||
database.removeGroupFrom(databaseGroup, databaseGroup.parent)
|
||||
}
|
||||
if (databaseIconModificationTime != null
|
||||
&& deletedObject.deletionTime.date
|
||||
.after(databaseIconModificationTime.date)) {
|
||||
if (databaseIcon != null
|
||||
&& (
|
||||
databaseIconModificationTime == null
|
||||
|| (deletedObject.deletionTime.date.after(databaseIconModificationTime.date))
|
||||
)
|
||||
) {
|
||||
database.removeCustomIcon(deletedObjectId)
|
||||
}
|
||||
// Attachments are removed and optimized during the database save
|
||||
|
||||
Reference in New Issue
Block a user