Include device-group operation state required by the Android member UI

This commit is contained in:
evgeny committed 2026-11-03 00:43:20 +01:00
1 parent 029ed59fbf
commit d8b63dfad8
1 file changed
+12 -2
@@ -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<DeviceInvitation> = 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<String> = 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)
}