Fix state on HTS profile

This commit is contained in:
Sylwester Zielinski
2023-04-27 10:52:32 +02:00
parent 98ed08a037
commit 1d8181c968
5 changed files with 14 additions and 24 deletions

View File

@@ -40,6 +40,5 @@ internal data class HTSServiceData(
val data: HTSData = HTSData(),
val batteryLevel: Int? = null,
val connectionState: GattConnectionStateWithStatus? = null,
val temperatureUnit: TemperatureUnit = TemperatureUnit.CELSIUS,
val deviceName: String? = null
val temperatureUnit: TemperatureUnit = TemperatureUnit.CELSIUS
)

View File

@@ -74,10 +74,6 @@ class HTSRepository @Inject constructor(
serviceManager.startService(HTSService::class.java, device)
}
fun onInitComplete(device: ServerDevice) {
_data.value = _data.value.copy(deviceName = device.name)
}
internal fun setTemperatureUnit(temperatureUnit: TemperatureUnit) {
_data.value = _data.value.copy(temperatureUnit = temperatureUnit)
}

View File

@@ -33,6 +33,7 @@ package no.nordicsemi.android.hts.repository
import android.annotation.SuppressLint
import android.content.Intent
import android.util.Log
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.filterNotNull
@@ -94,20 +95,20 @@ internal class HTSService : NotificationService() {
client = device.connect(this@HTSService, logger = logger)
client.waitForBonding()
repository.loggerEvent
.onEach { logger.launch() }
.launchIn(lifecycleScope)
client.connectionStateWithStatus
.onEach { Log.d("AAATESTAAA", "Connection state: $it") }
.onEach { repository.onConnectionStateChanged(it) }
.filterNotNull()
.onEach { stopIfDisconnected(it) }
.onEach { unlockUiIfDisconnected(it, device) }
.launchIn(lifecycleScope)
if (!client.isConnected) {
hasBeenInitialized = true
repository.onInitComplete(device)
return@launch
}
@@ -132,9 +133,6 @@ internal class HTSService : NotificationService() {
.mapNotNull { HTSDataParser.parse(it) }
.onEach { repository.onHTSDataChanged(it) }
.launchIn(lifecycleScope)
hasBeenInitialized = true
repository.onInitComplete(device)
}
private fun stopIfDisconnected(connectionState: GattConnectionStateWithStatus) {
@@ -143,12 +141,6 @@ internal class HTSService : NotificationService() {
}
}
private fun unlockUiIfDisconnected(connectionState: GattConnectionStateWithStatus, device: ServerDevice) {
if (connectionState.state == GattConnectionState.STATE_DISCONNECTED && !hasBeenInitialized) {
repository.onInitComplete(device)
}
}
private fun disconnect() {
client.disconnect()
}

View File

@@ -40,18 +40,14 @@ import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.common.ui.scanner.view.DeviceConnectingView
import no.nordicsemi.android.common.ui.scanner.view.DeviceDisconnectedView
import no.nordicsemi.android.common.ui.scanner.view.Reason
import no.nordicsemi.android.hts.R
import no.nordicsemi.android.hts.data.HTSServiceData
import no.nordicsemi.android.hts.viewmodel.HTSViewModel
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
import no.nordicsemi.android.ui.view.BackIconAppBar
import no.nordicsemi.android.ui.view.LoggerIconAppBar
import no.nordicsemi.android.ui.view.NavigateUpButton
import no.nordicsemi.android.ui.view.ProfileAppBar
@@ -60,13 +56,14 @@ import no.nordicsemi.android.ui.view.ProfileAppBar
fun HTSScreen() {
val viewModel: HTSViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
val deviceName = viewModel.deviceName.collectAsState().value
val navigateUp = { viewModel.onEvent(NavigateUp) }
Scaffold(
topBar = {
ProfileAppBar(
deviceName = state.deviceName,
deviceName = deviceName,
connectionState = state.connectionState,
title = R.string.hts_title,
navigateUp = navigateUp,
@@ -81,7 +78,7 @@ fun HTSScreen() {
.verticalScroll(rememberScrollState())
.padding(16.dp)
) {
if (state.deviceName == null) {
if (deviceName == null) {
DeviceConnectingView { NavigateUpButton(navigateUp) }
} else when (state.connectionState?.state) {
null,

View File

@@ -35,6 +35,8 @@ import android.os.ParcelUuid
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@@ -65,6 +67,9 @@ internal class HTSViewModel @Inject constructor(
val state = repository.data
private val _deviceName = MutableStateFlow<String?>(null)
val deviceName = _deviceName.asStateFlow()
init {
viewModelScope.launch {
if (repository.isRunning.firstOrNull() == false) {
@@ -95,6 +100,7 @@ internal class HTSViewModel @Inject constructor(
}
private fun onDeviceSelected(device: ServerDevice) {
_deviceName.value = device.name
repository.launch(device)
}