diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt index d05454ca..dadf3b23 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt @@ -437,7 +437,7 @@ class AvatarRepository(context: Context) { 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 prepared=if (source==null) null else try { 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) } } - 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 (expectedAccount == 0L || expectedAccount != 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 } - if (account == 0L || _edits.value[key] == AvatarEditState.WORKING) return val epoch = generation; editTokens[key] = epoch _edits.value += key to AvatarEditState.WORKING scope.launch {