diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index c5a5a565c..3875ee1ee 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -92,6 +92,7 @@ class Database { return mDatabaseKDB?.loadedCipherKey ?: mDatabaseKDBX?.loadedCipherKey } + // TODO private val iconsManager: IconsManager get() { return mDatabaseKDB?.iconsManager ?: mDatabaseKDBX?.iconsManager ?: IconsManager() @@ -102,6 +103,10 @@ class Database { ?: mDatabaseKDBX?.buildNewCustomIcon(cacheDirectory) } + fun removeCustomIcon(iconUUID: UUID) { + iconsManager.removeCustomIcon(iconUUID) + } + val allowName: Boolean get() = mDatabaseKDBX != null diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/BinaryPool.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/database/BinaryPool.kt index 9fd678cd5..aab31b3d1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/BinaryPool.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/database/BinaryPool.kt @@ -78,6 +78,15 @@ abstract class BinaryPool { return key } + /** + * Remove a binary from the pool with its [key], the file is not deleted + */ + @Throws(IOException::class) + fun remove(key: T) { + pool.remove(key) + // Don't clear attachment here because a file can be used in many BinaryAttachment + } + /** * Remove a binary from the pool, the file is not deleted */ diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt index ebc623d7f..4cbe9a2a1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt @@ -319,7 +319,7 @@ class DatabaseKDBX : DatabaseVersioned { } fun containsCustomIcons(): Boolean { - return this.iconsManager.containsCustomIcons() + return this.iconsManager.containsAnyCustomIcon() } fun putCustomData(label: String, value: String) { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt index 1598192ea..f8da1ae62 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt @@ -60,10 +60,20 @@ class IconsManager { return IconImageCustom(iconUuid) } - fun containsCustomIcons(): Boolean { + fun containsAnyCustomIcon(): Boolean { return !customCache.isEmpty() } + fun removeCustomIcon(iconUuid: UUID) { + val binary = customCache[iconUuid] + customCache.remove(iconUuid) + try { + binary?.clear() + } catch (e: Exception) { + Log.e(TAG, "Unable to remove custom icon binary", e) + } + } + fun getCustomIconList(): List { val list = ArrayList() customCache.doForEachBinary { key, binary -> diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/IconPickerViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/IconPickerViewModel.kt index fc6ebeb43..bd43cdffd 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/IconPickerViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/IconPickerViewModel.kt @@ -53,6 +53,10 @@ class IconPickerViewModel: ViewModel() { withContext(Dispatchers.Main) { asyncResult.await()?.let { customIcon -> iconCustomAdded.value = customIcon + // Remove icon if data cannot be saved + if (customIcon.binaryFile.length <= 0) { + database.removeCustomIcon(customIcon.uuid) + } } } }