feat: 连接状态

This commit is contained in:
yangxisong 2025-12-04 09:34:45 +08:00
parent 9c29fee24e
commit e1ddc14553
7 changed files with 42 additions and 14 deletions

View File

@ -18,6 +18,7 @@ import com.yuanxuan.rokid.databinding.ActivityMainBinding
import com.yuanxuan.rokid.extension.fadeIn import com.yuanxuan.rokid.extension.fadeIn
import com.yuanxuan.rokid.extension.fadeOut import com.yuanxuan.rokid.extension.fadeOut
import com.yuanxuan.rokid.keeplive.KeepLiveService import com.yuanxuan.rokid.keeplive.KeepLiveService
import com.yuanxuan.rokid.network.websocket.WebSocketConnectionState
import com.yuanxuan.rokid.network.websocket.WebSocketEvent import com.yuanxuan.rokid.network.websocket.WebSocketEvent
import com.yuanxuan.rokid.ui.NoticeFragment import com.yuanxuan.rokid.ui.NoticeFragment
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -47,8 +48,6 @@ class MainActivity : AppCompatActivity() {
* 拦截返回键事件防止返回到桌面 * 拦截返回键事件防止返回到桌面
*/ */
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
viewModel.wakeUp()
navigationToast("TestMessage")
} }
/** /**
* 这个服务保证心跳包准时发 * 这个服务保证心跳包准时发
@ -119,6 +118,13 @@ class MainActivity : AppCompatActivity() {
binding.lottieVoiceInput.cancelAnimation() binding.lottieVoiceInput.cancelAnimation()
binding.lottieVoiceInput.fadeOut(300) binding.lottieVoiceInput.fadeOut(300)
} }
if (uiState.connectStatus == WebSocketConnectionState.CONNECTED) {
binding.socketStatus.text =
resources.getString(R.string.socket_status_connected)
} else {
binding.socketStatus.text =
resources.getString(R.string.socket_status_connecting)
}
} }
} }
} }

View File

@ -2,9 +2,10 @@ package com.yuanxuan.rokid
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.yuanxuan.rokid.dependencies.AppDependencies import com.yuanxuan.rokid.dependencies.AppDependencies.webSocketManager
import com.yuanxuan.rokid.dependencies.AppDependencies.deviceServiceManager import com.yuanxuan.rokid.dependencies.AppDependencies.deviceServiceManager
import com.yuanxuan.rokid.device.DeviceServiceManager import com.yuanxuan.rokid.device.DeviceServiceManager
import com.yuanxuan.rokid.network.websocket.WebSocketConnectionState
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asSharedFlow
@ -21,24 +22,27 @@ class MainViewModel : ViewModel() {
val uiState = combine( val uiState = combine(
deviceServiceManager.batteryPercentage, deviceServiceManager.batteryPercentage,
deviceServiceManager.wifiState, deviceServiceManager.wifiState,
deviceServiceManager.instructState deviceServiceManager.instructState,
) { battery, wifi, instruct -> webSocketManager.connectFlow
) { battery, wifi, instruct, connect ->
MainUiState( MainUiState(
batteryLevel = battery, batteryLevel = battery,
wifiLevel = if (wifi is DeviceServiceManager.WifiState.Connected) wifi.level else 0, wifiLevel = if (wifi is DeviceServiceManager.WifiState.Connected) wifi.level else 0,
isVoiceInputVisible = instruct == DeviceServiceManager.InstructState.WaitingInstructState isVoiceInputVisible = instruct == DeviceServiceManager.InstructState.WaitingInstructState,
connectStatus = connect
) )
}.stateIn( }.stateIn(
scope = viewModelScope, scope = viewModelScope,
initialValue = MainUiState( initialValue = MainUiState(
batteryLevel = 0, batteryLevel = 0,
wifiLevel = 0, wifiLevel = 0,
isVoiceInputVisible = false isVoiceInputVisible = false,
connectStatus = WebSocketConnectionState.DISCONNECTED
), ),
started = SharingStarted.WhileSubscribed(5.seconds.inWholeMilliseconds), started = SharingStarted.WhileSubscribed(5.seconds.inWholeMilliseconds),
) )
val socketEvent = AppDependencies.webSocketManager.socketEventFlow val socketEvent = webSocketManager.socketEventFlow
fun quitInstructReceived() { fun quitInstructReceived() {
deviceServiceManager.quitInstructReceived() deviceServiceManager.quitInstructReceived()
@ -68,6 +72,7 @@ class MainViewModel : ViewModel() {
val batteryLevel: Int, val batteryLevel: Int,
val wifiLevel: Int, val wifiLevel: Int,
val isVoiceInputVisible: Boolean, val isVoiceInputVisible: Boolean,
val connectStatus: WebSocketConnectionState,
) )
} }

View File

@ -6,8 +6,8 @@ import java.net.NetworkInterface
object NetUtils { object NetUtils {
fun getBaseUrl() = "http://${getLocalIPV4address()}.70:7070" // fun getBaseUrl() = "http://${getLocalIPV4address()}.70:7070"
// fun getBaseUrl() = "http://${getLocalIPV4address()}.52:8765" fun getBaseUrl() = "http://${getLocalIPV4address()}.13:8765"
/** /**

View File

@ -11,6 +11,8 @@ class WebSocketManager(context: Context, scope: CoroutineScope) {
val socketEventFlow = webSocketConnection.eventFlow val socketEventFlow = webSocketConnection.eventFlow
val connectFlow = webSocketConnection.webSocketConnectionStateFlow
init { init {
scope.launch { scope.launch {
webSocketConnection.webSocketConnectionStateFlow.collectLatest { state -> webSocketConnection.webSocketConnectionStateFlow.collectLatest { state ->

View File

@ -12,20 +12,20 @@
android:name="androidx.navigation.fragment.NavHostFragment" android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/lottie_voice_input"
app:defaultNavHost="true" app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/lottie_voice_input"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/app_navigation" /> app:navGraph="@navigation/app_navigation" />
<TextView <TextView
android:id="@+id/battery_level" android:id="@+id/battery_level"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Hello World!"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/status_bar_text_size" android:textSize="@dimen/status_bar_text_size"
app:layout_constraintBottom_toTopOf="@id/bottom" app:layout_constraintBottom_toTopOf="@id/bottom"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent"
tools:text="50%" />
<ImageView <ImageView
android:id="@+id/wifi_iv" android:id="@+id/wifi_iv"
@ -50,6 +50,7 @@
app:layout_constraintTop_toTopOf="@id/battery_level" /> app:layout_constraintTop_toTopOf="@id/battery_level" />
<TextClock <TextClock
android:id="@+id/time"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/white" android:textColor="@color/white"
@ -57,6 +58,17 @@
app:layout_constraintBottom_toTopOf="@id/bottom" app:layout_constraintBottom_toTopOf="@id/bottom"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/socket_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:textColor="@color/white"
android:textSize="@dimen/status_bar_text_size"
app:layout_constraintBottom_toTopOf="@id/bottom"
app:layout_constraintStart_toEndOf="@id/time"
tools:text="已连接" />
<com.airbnb.lottie.LottieAnimationView <com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottie_voice_input" android:id="@+id/lottie_voice_input"
android:layout_width="150dp" android:layout_width="150dp"

View File

@ -12,6 +12,7 @@
android:paddingStart="30.dp" android:paddingStart="30.dp"
android:paddingEnd="30.dp" android:paddingEnd="30.dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View File

@ -11,4 +11,6 @@
<string name="status_bar_battery">%d%%</string> <string name="status_bar_battery">%d%%</string>
<string name="device_info_sn">设备SN:%s</string> <string name="device_info_sn">设备SN:%s</string>
<string name="device_info_app_version">APP版本:%s</string> <string name="device_info_app_version">APP版本:%s</string>
<string name="socket_status_connected">已连接</string>
<string name="socket_status_connecting">连接中</string>
</resources> </resources>