diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/DevgroupRepository.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/DevgroupRepository.kt index 38668a38d..6252d47fe 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/DevgroupRepository.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/DevgroupRepository.kt @@ -10,6 +10,7 @@ data class DeviceInvitation(val id: String, val peer: String, val outgoing: Bool data class DevgroupState(val name: String = "", val member: Boolean = false, val invitations: List = emptyList(), val pin: String = "", val failed: Boolean = false, val outgoingVisible: Boolean = false, val leaving: Boolean = false, val leaveFailed: Boolean = false, + val renaming: Boolean = false, val renameFailed: Boolean = false, val outgoingId: String = "", val accepting: String = "", val dismissed: Set = emptySet()) /** Только main thread; PIN хранится до закрытия диалога, входящие/результаты не пишутся в лог. */ @@ -22,12 +23,15 @@ object DevgroupRepository { if (action == 0 && pending.containsValue(0)) return if (action == 1) mutable.value = mutable.value.copy(outgoingVisible = true, outgoingId = "", pin = "", failed = false) if (action == 2) mutable.value = mutable.value.copy(accepting = text, failed = false) + if (action == 3) mutable.value = mutable.value.copy(renaming = true, renameFailed = false) if (action == 4) mutable.value = mutable.value.copy(leaving = true, leaveFailed = false) val id = ++nextId if (NativeLib.devgroupCommand(action, group, peer, text, pin, id)) pending[id] = action - else { LogManager.addLog("WARN", "Devgroup", "Core rejected request action=$action"); mutable.value = mutable.value.copy(failed = true, accepting = "", leaving = false, leaveFailed = action == 4) } + else { LogManager.addLog("WARN", "Devgroup", "Core rejected request action=$action"); mutable.value = mutable.value.copy( + failed = true, accepting = "", leaving = false, leaveFailed = action == 4, renaming = false, renameFailed = action == 3) } } fun dismissLeaveError() { mutable.value = mutable.value.copy(leaveFailed = false) } + fun dismissRenameError() { mutable.value = mutable.value.copy(renameFailed = false) } fun closeOutgoing() { mutable.value = mutable.value.copy(outgoingVisible = false, outgoingId = "", pin = "", failed = false) } fun dismissIncoming(id: String) { mutable.value = mutable.value.copy(dismissed = mutable.value.dismissed + id, failed = false) } fun onEvent(type: Int, data: ByteArray?) { @@ -37,17 +41,23 @@ object DevgroupRepository { if (type != 71 || data == null || data.size < 9) return val id = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).long val action = pending.remove(id) ?: return - if (data[8].toInt() != 1) { mutable.value = mutable.value.copy(failed = true, accepting = "", leaving = false, leaveFailed = action == 4); return } + if (data[8].toInt() != 1) { + LogManager.addLog("WARN", "Devgroup", "Core operation failed action=$action") + mutable.value = mutable.value.copy(failed = true, accepting = "", leaving = false, leaveFailed = action == 4, + renaming = false, renameFailed = action == 3); return + } val json = JSONObject(String(data, 9, data.size - 9, Charsets.UTF_8)) if (action == 1) { if (mutable.value.outgoingVisible) mutable.value = mutable.value.copy(pin = json.getString("pin"), outgoingId = json.getString("id"), failed = false) return } val invitations = json.getJSONArray("invitations") + if (action == 3) LogManager.addLog("INFO", "Devgroup", "Device group renamed") mutable.value = mutable.value.copy(name = json.getString("name"), member = json.getString("group").isNotEmpty(), invitations = List(invitations.length()) { i -> val entry = invitations.getJSONObject(i) DeviceInvitation(entry.getString("id"), entry.getString("peer"), entry.getInt("outgoing") != 0, entry.getInt("state")) }, leaving = if (action == 4) false else mutable.value.leaving, + renaming = if (action == 3) false else mutable.value.renaming, accepting = if (action == 2) "" else mutable.value.accepting, failed = if (action == 0) mutable.value.failed else false) }