|
|
|
@ -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 { |
|
|
|
|