Browse Source

Release Android crop sources rejected after account changes

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

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

@ -437,7 +437,7 @@ class AvatarRepository(context: Context) {
ensureGroup(group, true) ensureGroup(group, true)
} }
fun editProfile(server: Long, source: File?, expectedAccount: Long, crop: AvatarCrop? = null) = edit("profile", expectedAccount) { epoch -> fun editProfile(server: Long, source: File?, expectedAccount: Long, crop: AvatarCrop? = null) = edit("profile", expectedAccount,source) { epoch ->
val uid = account val uid = account
val prepared=if (source==null) null else try { val prepared=if (source==null) null else try {
withContext(Dispatchers.IO) { AvatarAssets.prepare(source,directory(uid),requireNotNull(crop)) } withContext(Dispatchers.IO) { AvatarAssets.prepare(source,directory(uid),requireNotNull(crop)) }
@ -462,13 +462,22 @@ class AvatarRepository(context: Context) {
_members.value.keys.map { it.group }.distinct().forEach { replicate(it) } _members.value.keys.map { it.group }.distinct().forEach { replicate(it) }
} }
private fun edit(key: String, expectedAccount: Long, block: suspend (Long) -> Unit) { private fun edit(key: String, expectedAccount: Long, rejectedSource: File? = null, block: suspend (Long) -> Unit) {
if (account == 0L) start() if (account == 0L) start()
if (expectedAccount == 0L || expectedAccount != account) { if (expectedAccount == 0L || expectedAccount != account) {
log("WARN", "Ignored stale picker result target=$key expected=${AvatarProtocol.hex(expectedAccount)} actual=${AvatarProtocol.hex(account)}") log("WARN", "Ignored stale picker result target=$key expected=${AvatarProtocol.hex(expectedAccount)} actual=${AvatarProtocol.hex(account)}")
rejectedSource?.let { file -> scope.launch(Dispatchers.IO) {
if (!file.delete()) log("WARN", "Cannot remove stale editor source=$file")
} }
return
}
if (account == 0L || _edits.value[key] == AvatarEditState.WORKING) {
log("WARN", "Rejected concurrent avatar edit target=$key")
rejectedSource?.let { file -> scope.launch(Dispatchers.IO) {
if (!file.delete()) log("WARN", "Cannot remove rejected editor source=$file")
} }
return return
} }
if (account == 0L || _edits.value[key] == AvatarEditState.WORKING) return
val epoch = generation; editTokens[key] = epoch val epoch = generation; editTokens[key] = epoch
_edits.value += key to AvatarEditState.WORKING _edits.value += key to AvatarEditState.WORKING
scope.launch { scope.launch {

Loading…
Cancel
Save