From 97864f07f04af13f5af1fb13e3a2a22077334943 Mon Sep 17 00:00:00 2001 From: Krishna Teja Kanakagiri Date: Thu, 5 Mar 2026 03:49:43 -0700 Subject: [PATCH] mvvm: move network node actions to NetworkScreenViewModel --- .../viewModel/NetworkScreenViewModel.kt | 44 ++++++++++++++----- .../projectmesh/views/NetworkScreen.kt | 15 ++----- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/greybox/projectmesh/viewModel/NetworkScreenViewModel.kt b/app/src/main/java/com/greybox/projectmesh/viewModel/NetworkScreenViewModel.kt index 2c64e112..f34cb814 100644 --- a/app/src/main/java/com/greybox/projectmesh/viewModel/NetworkScreenViewModel.kt +++ b/app/src/main/java/com/greybox/projectmesh/viewModel/NetworkScreenViewModel.kt @@ -32,8 +32,10 @@ data class NetworkScreenModel( class NetworkScreenViewModel(di:DI, savedStateHandle: SavedStateHandle): ViewModel() { // _uiState will be updated whenever there is a change in the UI state private val _uiState = MutableStateFlow(NetworkScreenModel()) + // uiState is a read-only property that shows the current UI state val uiState: Flow = _uiState.asStateFlow() + // di is used to get the AndroidVirtualNode instance private val node: AndroidVirtualNode by di.instance() private val appServer: AppServer by di.instance() @@ -54,7 +56,8 @@ class NetworkScreenViewModel(di:DI, savedStateHandle: SavedStateHandle): ViewMod // For each disconnected node, notify DeviceStatusManager disconnectedNodes.forEach { nodeAddress -> - val ipAddress = InetAddress.getByAddress(nodeAddress.addressToByteArray()).hostAddress + val ipAddress = + InetAddress.getByAddress(nodeAddress.addressToByteArray()).hostAddress DeviceStatusManager.handleNetworkDisconnect(ipAddress) Log.d("NetworkScreenViewModel", "Detected disconnection of node: $ipAddress") } @@ -77,11 +80,11 @@ class NetworkScreenViewModel(di:DI, savedStateHandle: SavedStateHandle): ViewMod allNodes = allNodesWithTest, // update the ssid of the connecting station connectingInProgressSsid = - if (nodeState.wifiState.wifiStationState.status == WifiStationState.Status.CONNECTING) { - nodeState.wifiState.wifiStationState.config?.ssid - } else { - null - } + if (nodeState.wifiState.wifiStationState.status == WifiStationState.Status.CONNECTING) { + nodeState.wifiState.wifiStationState.config?.ssid + } else { + null + } ) } @@ -187,13 +190,30 @@ class NetworkScreenViewModel(di:DI, savedStateHandle: SavedStateHandle): ViewMod delay(30000) } } - } + */ - fun getDeviceName(wifiAddress: Int) { - viewModelScope.launch { - val inetAddress = InetAddress.getByAddress(wifiAddress.addressToByteArray()) - appServer.sendDeviceName(inetAddress) + } + + fun onNodeSelected(ipAddress: String) { + viewModelScope.launch { + try { + val addr = InetAddress.getByName(ipAddress) + appServer.requestRemoteUserInfo(addr) + appServer.pushUserInfoTo(addr) + } catch (e: Exception) { + Log.e("NetworkScreenViewModel", "Failed to request user info for $ipAddress", e) } } } -} \ No newline at end of file + + fun getDeviceName(wifiAddress: Int) { + viewModelScope.launch { + val inetAddress = InetAddress.getByAddress(wifiAddress.addressToByteArray()) + appServer.sendDeviceName(inetAddress) + } + } +} + + + + diff --git a/app/src/main/java/com/greybox/projectmesh/views/NetworkScreen.kt b/app/src/main/java/com/greybox/projectmesh/views/NetworkScreen.kt index d9ed3baa..16840385 100644 --- a/app/src/main/java/com/greybox/projectmesh/views/NetworkScreen.kt +++ b/app/src/main/java/com/greybox/projectmesh/views/NetworkScreen.kt @@ -9,14 +9,11 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalSavedStateRegistryOwner import androidx.lifecycle.viewmodel.compose.viewModel import com.greybox.projectmesh.ViewModelFactory -import com.greybox.projectmesh.viewModel.HomeScreenViewModel import com.greybox.projectmesh.viewModel.NetworkScreenModel import com.greybox.projectmesh.viewModel.NetworkScreenViewModel import org.kodein.di.compose.localDI import com.greybox.projectmesh.extension.WifiListItem -import com.greybox.projectmesh.server.AppServer -import java.net.InetAddress -import org.kodein.di.instance + @Composable fun NetworkScreen( @@ -30,8 +27,7 @@ fun NetworkScreen( ) { // declare the UI state, we can use the uiState to access the current state of the viewModel val uiState: NetworkScreenModel by viewModel.uiState.collectAsState(initial = NetworkScreenModel()) - val di = localDI() - val appServer: AppServer by di.instance() + // display all the connected station LazyColumn{ @@ -43,12 +39,7 @@ fun NetworkScreen( wifiAddress = eachItem.key, wifiEntry = eachItem.value, onClick = { ipAddress -> - //request user info when clicking - val addr = InetAddress.getByName(ipAddress) - appServer.requestRemoteUserInfo(addr) - appServer.pushUserInfoTo(addr) - - //Navigate to Ping Screen + viewModel.onNodeSelected(ipAddress) onNodeClick(ipAddress) } )