From feb441bf48534eed4c84dc05d72d191b6160df97 Mon Sep 17 00:00:00 2001 From: Florent CHAMPIGNY Date: Sun, 19 Oct 2025 21:20:05 +0200 Subject: [PATCH] refact: [DASHBOARD] removed java code (#367) Co-authored-by: Florent Champigny --- .../dashboard/FloconDashboardPlugin.kt | 98 +++++++++++-------- .../network/FloconNetworkPluginImpl.kt | 1 - .../websocket/FloconWebSocketClientImpl.kt | 2 - 3 files changed, 56 insertions(+), 45 deletions(-) diff --git a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt index bfe8e49c..d1e15e60 100644 --- a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt @@ -11,46 +11,54 @@ import io.github.openflocon.flocon.plugins.dashboard.model.DashboardConfig import io.github.openflocon.flocon.plugins.dashboard.model.todevice.ToDeviceCheckBoxValueChangedMessage import io.github.openflocon.flocon.plugins.dashboard.model.todevice.ToDeviceSubmittedFormMessage import io.github.openflocon.flocon.plugins.dashboard.model.todevice.ToDeviceSubmittedTextFieldMessage -import java.util.concurrent.ConcurrentHashMap +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch internal class FloconDashboardPluginImpl( private val sender: FloconMessageSender, ) : FloconPlugin, FloconDashboardPlugin { - private val dashboards = ConcurrentHashMap() - private val callbackMap: MutableMap = ConcurrentHashMap() + private val DashboardDispatcher = Dispatchers.Default.limitedParallelism(1) + + private val scope = CoroutineScope(DashboardDispatcher + SupervisorJob()) + + private val dashboards = mutableMapOf() + private val callbackMap = mutableMapOf() override fun onMessageReceived( messageFromServer: FloconMessageFromServer, ) { - when (messageFromServer.method) { - Protocol.ToDevice.Dashboard.Method.OnClick -> { - val id = messageFromServer.body - - callbackMap[id]?.let { it as? DashboardCallback.ButtonCallback }?.action?.invoke() - } - - Protocol.ToDevice.Dashboard.Method.OnFormSubmitted -> { - ToDeviceSubmittedFormMessage.fromJson(messageFromServer.body)?.let { - callbackMap[it.id]?.let { it as? DashboardCallback.FormCallback }?.actions?.invoke( - it.values - ) + scope.launch { + when (messageFromServer.method) { + Protocol.ToDevice.Dashboard.Method.OnClick -> { + val id = messageFromServer.body + callbackMap[id]?.let { it as? DashboardCallback.ButtonCallback }?.action?.invoke() } - } - Protocol.ToDevice.Dashboard.Method.OnTextFieldSubmitted -> { - ToDeviceSubmittedTextFieldMessage.fromJson(messageFromServer.body)?.let { - callbackMap[it.id]?.let { it as? DashboardCallback.TextFieldCallback }?.action?.invoke( - it.value - ) + Protocol.ToDevice.Dashboard.Method.OnFormSubmitted -> { + ToDeviceSubmittedFormMessage.fromJson(messageFromServer.body)?.let { + callbackMap[it.id]?.let { it as? DashboardCallback.FormCallback }?.actions?.invoke( + it.values + ) + } } - } - Protocol.ToDevice.Dashboard.Method.OnCheckBoxValueChanged -> { - ToDeviceCheckBoxValueChangedMessage.fromJson(messageFromServer.body)?.let { - callbackMap[it.id]?.let { it as? DashboardCallback.CheckBoxCallback }?.action?.invoke( - it.value - ) + Protocol.ToDevice.Dashboard.Method.OnTextFieldSubmitted -> { + ToDeviceSubmittedTextFieldMessage.fromJson(messageFromServer.body)?.let { + callbackMap[it.id]?.let { it as? DashboardCallback.TextFieldCallback }?.action?.invoke( + it.value + ) + } + } + + Protocol.ToDevice.Dashboard.Method.OnCheckBoxValueChanged -> { + ToDeviceCheckBoxValueChangedMessage.fromJson(messageFromServer.body)?.let { + callbackMap[it.id]?.let { it as? DashboardCallback.CheckBoxCallback }?.action?.invoke( + it.value + ) + } } } } @@ -59,27 +67,33 @@ internal class FloconDashboardPluginImpl( override fun onConnectedToServer() { // on connected, send known dashboards dashboards.values.takeIf { it.isNotEmpty() }?.forEach { dashboardConfig -> - registerDashboard(dashboardConfig) + registerDashboardInternal(dashboardConfig) } } override fun registerDashboard(dashboardConfig: DashboardConfig) { - val dashboardJson = dashboardConfig.toJson( - registerCallback = { callback -> - callbackMap[callback.id] = callback - }, - ) + registerDashboardInternal(dashboardConfig) + } - dashboards.put(dashboardConfig.id, dashboardConfig) - - try { - sender.send( - plugin = Protocol.FromDevice.Dashboard.Plugin, - method = Protocol.FromDevice.Dashboard.Method.Update, - body = dashboardJson.toString() + private fun registerDashboardInternal(dashboardConfig: DashboardConfig) { + scope.launch { + val dashboardJson = dashboardConfig.toJson( + registerCallback = { callback -> + callbackMap[callback.id] = callback + }, ) - } catch (t: Throwable) { - FloconLogger.logError("dashboard error", t) + + dashboards.put(dashboardConfig.id, dashboardConfig) + + try { + sender.send( + plugin = Protocol.FromDevice.Dashboard.Plugin, + method = Protocol.FromDevice.Dashboard.Method.Update, + body = dashboardJson.toString() + ) + } catch (t: Throwable) { + FloconLogger.logError("dashboard error", t) + } } } } diff --git a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPluginImpl.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPluginImpl.kt index 3dd717f7..af4997b8 100644 --- a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPluginImpl.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPluginImpl.kt @@ -25,7 +25,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlinx.serialization.json.Json import java.io.File import java.io.FileInputStream import java.io.FileOutputStream diff --git a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt index 558ce987..32428a0d 100644 --- a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt @@ -1,7 +1,6 @@ package io.github.openflocon.flocon.websocket import io.github.openflocon.flocon.FloconLogger -import io.github.openflocon.flocon.plugins.network.model.FloconNetworkCallRequest import kotlinx.coroutines.suspendCancellableCoroutine import okhttp3.OkHttpClient import okhttp3.Request @@ -9,7 +8,6 @@ import okhttp3.Response import okhttp3.WebSocket import okhttp3.WebSocketListener import java.io.EOFException -import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.TimeUnit import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException