Browse Source

Keep avatar cache pruning tied to the originating Android account

master
evgeny 6 days ago
parent
commit
b0933eb282
  1. 8
      tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt

8
tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt

@ -342,13 +342,13 @@ class AvatarRepository(context: Context) {
} }
suspend fun loadAvatar(group: String, m: ChatMember, original: Boolean): Bitmap { suspend fun loadAvatar(group: String, m: ChatMember, original: Boolean): Bitmap {
val epoch=generation; val root=directory(account) val epoch=generation; val root=directory(account); val pinnedIntent=defaultAvatar
if (!original) cache.get(m.avatarFile)?.let { return it } if (!original) cache.get(m.avatarFile)?.let { return it }
objectFile(group,m,m.avatarFile,AvatarProtocol.MAX_MANIFEST) objectFile(group,m,m.avatarFile,AvatarProtocol.MAX_MANIFEST)
val record=withContext(Dispatchers.IO) { AvatarAssets.record(root,m.avatarFile) } val record=withContext(Dispatchers.IO) { AvatarAssets.record(root,m.avatarFile) }
objectFile(group,m,if (original) record.original else record.preview, objectFile(group,m,if (original) record.original else record.preview,
if (original) AvatarProtocol.MAX_ORIGINAL else AvatarProtocol.MAX_USER) if (original) AvatarProtocol.MAX_ORIGINAL else AvatarProtocol.MAX_USER)
val bitmap=withContext(Dispatchers.IO) { AvatarAssets.image(root,record,original).also { prune(root) } } val bitmap=withContext(Dispatchers.IO) { AvatarAssets.image(root,record,original).also { prune(root,pinnedIntent) } }
alive(epoch); if (!original) { cache.put(m.avatarFile,bitmap); changed() } alive(epoch); if (!original) { cache.put(m.avatarFile,bitmap); changed() }
return bitmap return bitmap
} }
@ -396,9 +396,9 @@ class AvatarRepository(context: Context) {
} }
return BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: throw IOException("image decode failed") return BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: throw IOException("image decode failed")
} }
private fun prune(root: File) { private fun prune(root: File, pinnedIntent: String?) {
val pinned=mutableSetOf<String>() val pinned=mutableSetOf<String>()
defaultAvatar?.substringAfter('/')?.takeIf { AvatarProtocol.validFile(it) }?.let { name -> pinnedIntent?.substringAfter('/')?.takeIf { AvatarProtocol.validFile(it) }?.let { name ->
pinned+=name pinned+=name
try { val r=AvatarAssets.record(root,name); pinned+=r.original; pinned+=r.preview } try { val r=AvatarAssets.record(root,name); pinned+=r.original; pinned+=r.preview }
catch (e: Exception) { log("WARN", "Cannot pin profile bundle=$name: ${e.message}") } catch (e: Exception) { log("WARN", "Cannot pin profile bundle=$name: ${e.message}") }

Loading…
Cancel
Save