mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2025-12-21 16:34:23 +01:00
Fix toolbar title
This commit is contained in:
@@ -46,4 +46,5 @@ dependencies {
|
||||
implementation(libs.androidx.core.ktx)
|
||||
implementation(libs.androidx.compose.material3)
|
||||
implementation(libs.androidx.activity.compose)
|
||||
implementation("no.nordicsemi.android.kotlin.ble:client:0.0.1")
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
package no.nordicsemi.android.ui.view
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.ArrowBack
|
||||
@@ -43,6 +44,8 @@ import androidx.compose.ui.res.colorResource
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.ui.R
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@@ -168,3 +171,24 @@ fun LoggerIconAppBar(text: String, onClick: () -> Unit, onDisconnectClick: () ->
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ProfileAppBar(
|
||||
deviceName: String?,
|
||||
connectionState: GattConnectionStateWithStatus?,
|
||||
@StringRes
|
||||
title: Int,
|
||||
navigateUp: () -> Unit,
|
||||
disconnect: () -> Unit,
|
||||
openLogger: () -> Unit
|
||||
) {
|
||||
if (deviceName?.isNotBlank() == true) {
|
||||
if (connectionState?.state == GattConnectionState.STATE_DISCONNECTING || connectionState?.state == GattConnectionState.STATE_DISCONNECTED) {
|
||||
LoggerBackIconAppBar(deviceName, openLogger)
|
||||
} else {
|
||||
LoggerIconAppBar(deviceName, navigateUp, disconnect, openLogger)
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package no.nordicsemi.android.bps.data
|
||||
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.bps.data.BloodPressureMeasurementData
|
||||
import no.nordicsemi.android.kotlin.ble.profile.bps.data.IntermediateCuffPressureData
|
||||
|
||||
@@ -8,5 +8,5 @@ data class BPSServiceData (
|
||||
val bloodPressureMeasurement: BloodPressureMeasurementData? = null,
|
||||
val intermediateCuffPressure: IntermediateCuffPressureData? = null,
|
||||
val batteryLevel: Int? = null,
|
||||
val connectionState: GattConnectionState? = null
|
||||
val connectionState: GattConnectionStateWithStatus? = null
|
||||
)
|
||||
@@ -40,7 +40,6 @@ 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.bps.R
|
||||
@@ -49,9 +48,8 @@ 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.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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -62,7 +60,16 @@ fun BPSScreen() {
|
||||
val navigateUp = { viewModel.onEvent(DisconnectEvent) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state = state, navigateUp = navigateUp, viewModel = viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.result.connectionState,
|
||||
title = R.string.bps_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLoggerEvent) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -70,7 +77,7 @@ fun BPSScreen() {
|
||||
.padding(16.dp)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
when (state.result.connectionState) {
|
||||
when (state.result.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
@@ -82,16 +89,3 @@ fun BPSScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: BPSViewState, navigateUp: () -> Unit, viewModel: BPSViewModel) {
|
||||
if (state.deviceName == null) {
|
||||
BackIconAppBar(stringResource(id = R.string.bps_title), navigateUp)
|
||||
} else {
|
||||
LoggerIconAppBar(state.deviceName, {
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
}, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLoggerEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ import no.nordicsemi.android.kotlin.ble.client.main.connect
|
||||
import no.nordicsemi.android.kotlin.ble.client.main.service.BleGattServices
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.bps.BloodPressureMeasurementParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.bps.IntermediateCuffPressureParser
|
||||
@@ -122,11 +123,11 @@ internal class BPSViewModel @Inject constructor(
|
||||
|
||||
client = device.connect(context, logger = logger)
|
||||
|
||||
client.connectionState
|
||||
client.connectionStateWithStatus
|
||||
.filterNotNull()
|
||||
.onEach { onDataUpdate(it) }
|
||||
.onEach { stopIfDisconnected(it) }
|
||||
.onEach { logAnalytics(it) }
|
||||
.onEach { stopIfDisconnected(it.state) }
|
||||
.onEach { logAnalytics(it.state) }
|
||||
.launchIn(viewModelScope)
|
||||
|
||||
client.services
|
||||
@@ -158,7 +159,7 @@ internal class BPSViewModel @Inject constructor(
|
||||
?.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
private fun onDataUpdate(connectionState: GattConnectionState) {
|
||||
private fun onDataUpdate(connectionState: GattConnectionStateWithStatus) {
|
||||
val newResult = _state.value.result.copy(connectionState = connectionState)
|
||||
_state.value = _state.value.copy(result = newResult)
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
package no.nordicsemi.android.cgms.repository
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
@@ -87,6 +88,7 @@ class CGMRepository @Inject constructor(
|
||||
}
|
||||
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionStateWithStatus?) {
|
||||
Log.i("AAATESTAAA", "Connection state: $connectionState")
|
||||
_data.value = _data.value.copy(connectionState = connectionState)
|
||||
}
|
||||
|
||||
|
||||
@@ -48,12 +48,12 @@ import no.nordicsemi.android.cgms.data.CGMServiceData
|
||||
import no.nordicsemi.android.cgms.viewmodel.CGMViewModel
|
||||
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.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.ui.view.BackIconAppBar
|
||||
import no.nordicsemi.android.ui.view.LoggerBackIconAppBar
|
||||
import no.nordicsemi.android.ui.view.LoggerIconAppBar
|
||||
import no.nordicsemi.android.ui.view.NavigateUpButton
|
||||
import no.nordicsemi.android.ui.view.ProfileAppBar
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -64,7 +64,16 @@ fun CGMScreen() {
|
||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state = state, navigateUp = navigateUp, viewModel = viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.connectionState,
|
||||
title = R.string.cgms_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLoggerEvent) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -75,27 +84,14 @@ fun CGMScreen() {
|
||||
when (state.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
GattConnectionState.STATE_DISCONNECTING -> DeviceDisconnectedView(state.connectionState.status) {
|
||||
NavigateUpButton(navigateUp)
|
||||
}
|
||||
|
||||
GattConnectionState.STATE_CONNECTED -> CGMContentView(state) { viewModel.onEvent(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: CGMServiceData, navigateUp: () -> Unit, viewModel: CGMViewModel) {
|
||||
if (state.deviceName?.isNotBlank() == true) {
|
||||
if (state.connectionState?.state == GattConnectionState.STATE_DISCONNECTING || state.connectionState?.state == GattConnectionState.STATE_DISCONNECTED) {
|
||||
LoggerBackIconAppBar(state.deviceName) { viewModel.onEvent(OpenLoggerEvent) }
|
||||
} else {
|
||||
LoggerIconAppBar(state.deviceName, navigateUp, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLoggerEvent)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = R.string.cgms_title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package no.nordicsemi.android.csc.data
|
||||
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.csc.data.CSCData
|
||||
|
||||
internal data class CSCServiceData(
|
||||
val data: CSCData = CSCData(),
|
||||
val batteryLevel: Int? = null,
|
||||
val connectionState: GattConnectionState? = null,
|
||||
val connectionState: GattConnectionStateWithStatus? = null,
|
||||
val speedUnit: SpeedUnit = SpeedUnit.M_S,
|
||||
val deviceName: String? = null
|
||||
)
|
||||
|
||||
@@ -43,6 +43,7 @@ import no.nordicsemi.android.csc.data.CSCServiceData
|
||||
import no.nordicsemi.android.csc.data.SpeedUnit
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.csc.data.CSCData
|
||||
import no.nordicsemi.android.kotlin.ble.profile.csc.data.WheelSize
|
||||
import no.nordicsemi.android.kotlin.ble.profile.csc.data.WheelSizes
|
||||
@@ -70,7 +71,7 @@ class CSCRepository @Inject constructor(
|
||||
private val _loggerEvent = simpleSharedFlow<OpenLoggerEvent>()
|
||||
internal val loggerEvent = _loggerEvent.asSharedFlow()
|
||||
|
||||
val isRunning = data.map { it.connectionState == GattConnectionState.STATE_CONNECTED }
|
||||
val isRunning = data.map { it.connectionState?.state == GattConnectionState.STATE_CONNECTED }
|
||||
|
||||
fun launch(device: ServerDevice) {
|
||||
serviceManager.startService(CSCService::class.java, device)
|
||||
@@ -88,7 +89,7 @@ class CSCRepository @Inject constructor(
|
||||
_wheelSize.value = wheelSize
|
||||
}
|
||||
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionState?) {
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionStateWithStatus?) {
|
||||
_data.value = _data.value.copy(connectionState = connectionState)
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ import no.nordicsemi.android.kotlin.ble.client.main.connect
|
||||
import no.nordicsemi.android.kotlin.ble.client.main.service.BleGattServices
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.csc.CSCDataParser
|
||||
import no.nordicsemi.android.service.DEVICE_DATA
|
||||
@@ -95,7 +96,7 @@ internal class CSCService : NotificationService() {
|
||||
.onEach { logger.launch() }
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
client.connectionState
|
||||
client.connectionStateWithStatus
|
||||
.onEach { repository.onConnectionStateChanged(it) }
|
||||
.filterNotNull()
|
||||
.onEach { stopIfDisconnected(it) }
|
||||
@@ -127,8 +128,8 @@ internal class CSCService : NotificationService() {
|
||||
repository.onInitComplete(device)
|
||||
}
|
||||
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionState) {
|
||||
if (connectionState == GattConnectionState.STATE_DISCONNECTED) {
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionStateWithStatus) {
|
||||
if (connectionState.state == GattConnectionState.STATE_DISCONNECTED) {
|
||||
stopSelf()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,19 +40,16 @@ 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.csc.R
|
||||
import no.nordicsemi.android.csc.data.CSCServiceData
|
||||
import no.nordicsemi.android.csc.viewmodel.CSCViewModel
|
||||
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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -63,7 +60,16 @@ fun CSCScreen() {
|
||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state, navigateUp, viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.connectionState,
|
||||
title = R.string.csc_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(OnDisconnectButtonClick) },
|
||||
openLogger = { viewModel.onEvent(OpenLogger) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -71,7 +77,7 @@ fun CSCScreen() {
|
||||
.padding(16.dp)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
when (state.connectionState) {
|
||||
when (state.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
@@ -83,14 +89,3 @@ fun CSCScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: CSCServiceData, navigateUp: () -> Unit, viewModel: CSCViewModel) {
|
||||
if (state.deviceName?.isNotBlank() == true) {
|
||||
LoggerIconAppBar(state.deviceName, navigateUp, { viewModel.onEvent(OnDisconnectButtonClick) }) {
|
||||
viewModel.onEvent(OpenLogger)
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = R.string.csc_title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ internal class CSCViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
repository.data.onEach {
|
||||
if (it.connectionState == GattConnectionState.STATE_CONNECTED) {
|
||||
if (it.connectionState?.state == GattConnectionState.STATE_CONNECTED) {
|
||||
analytics.logEvent(ProfileConnectedEvent(Profile.CSC))
|
||||
}
|
||||
}.launchIn(viewModelScope)
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
package no.nordicsemi.android.gls.data
|
||||
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.data.GLSRecord
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.data.GLSMeasurementContext
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.data.RequestStatus
|
||||
@@ -39,6 +40,6 @@ import no.nordicsemi.android.kotlin.ble.profile.gls.data.RequestStatus
|
||||
internal data class GLSServiceData(
|
||||
val records: Map<GLSRecord, GLSMeasurementContext?> = mapOf(),
|
||||
val batteryLevel: Int? = null,
|
||||
val connectionState: GattConnectionState? = null,
|
||||
val connectionState: GattConnectionStateWithStatus? = null,
|
||||
val requestStatus: RequestStatus = RequestStatus.IDLE
|
||||
)
|
||||
|
||||
@@ -40,7 +40,6 @@ 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
|
||||
@@ -49,9 +48,8 @@ import no.nordicsemi.android.common.ui.scanner.view.Reason
|
||||
import no.nordicsemi.android.gls.R
|
||||
import no.nordicsemi.android.gls.main.viewmodel.GLSViewModel
|
||||
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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -62,7 +60,16 @@ fun GLSScreen() {
|
||||
val navigateUp = { viewModel.onEvent(DisconnectEvent) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state, navigateUp, viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.glsServiceData.connectionState,
|
||||
title = R.string.gls_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLoggerEvent) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -70,7 +77,7 @@ fun GLSScreen() {
|
||||
.padding(16.dp)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
when (state.glsServiceData.connectionState) {
|
||||
when (state.glsServiceData.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
@@ -82,16 +89,3 @@ fun GLSScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: GLSViewState, navigateUp: () -> Unit, viewModel: GLSViewModel) {
|
||||
if (state.deviceName == null) {
|
||||
BackIconAppBar(stringResource(id = R.string.gls_title), navigateUp)
|
||||
} else {
|
||||
LoggerIconAppBar(state.deviceName, {
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
}, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLoggerEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ package no.nordicsemi.android.gls.main.view
|
||||
|
||||
import no.nordicsemi.android.gls.data.GLSServiceData
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.data.GLSMeasurementContext
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.data.GLSRecord
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.data.RequestStatus
|
||||
@@ -42,7 +43,7 @@ internal data class GLSViewState(
|
||||
val deviceName: String? = null
|
||||
) {
|
||||
|
||||
fun copyWithNewConnectionState(connectionState: GattConnectionState): GLSViewState {
|
||||
fun copyWithNewConnectionState(connectionState: GattConnectionStateWithStatus): GLSViewState {
|
||||
return copy(glsServiceData = glsServiceData.copy(connectionState = connectionState))
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ import no.nordicsemi.android.kotlin.ble.client.main.service.BleGattCharacteristi
|
||||
import no.nordicsemi.android.kotlin.ble.client.main.service.BleGattServices
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.GlucoseMeasurementContextParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.gls.GlucoseMeasurementParser
|
||||
@@ -161,7 +162,7 @@ internal class GLSViewModel @Inject constructor(
|
||||
|
||||
client = device.connect(context, logger = logger)
|
||||
|
||||
client.connectionState
|
||||
client.connectionStateWithStatus
|
||||
.filterNotNull()
|
||||
.onEach { _state.value = _state.value.copyWithNewConnectionState(it) }
|
||||
.onEach { logAnalytics(it) }
|
||||
@@ -173,8 +174,8 @@ internal class GLSViewModel @Inject constructor(
|
||||
.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
private fun logAnalytics(connectionState: GattConnectionState) {
|
||||
if (connectionState == GattConnectionState.STATE_CONNECTED) {
|
||||
private fun logAnalytics(connectionState: GattConnectionStateWithStatus) {
|
||||
if (connectionState.state == GattConnectionState.STATE_CONNECTED) {
|
||||
analytics.logEvent(ProfileConnectedEvent(Profile.GLS))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,13 +32,14 @@
|
||||
package no.nordicsemi.android.hrs.data
|
||||
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.hrs.data.HRSData
|
||||
|
||||
internal data class HRSServiceData(
|
||||
val data: List<HRSData> = emptyList(),
|
||||
val bodySensorLocation: Int? = null,
|
||||
val batteryLevel: Int? = null,
|
||||
val connectionState: GattConnectionState? = null,
|
||||
val connectionState: GattConnectionStateWithStatus? = null,
|
||||
val zoomIn: Boolean = false,
|
||||
val deviceName: String? = null
|
||||
) {
|
||||
|
||||
@@ -42,6 +42,7 @@ import no.nordicsemi.android.common.logger.NordicBlekLogger
|
||||
import no.nordicsemi.android.hrs.data.HRSServiceData
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.hrs.data.HRSData
|
||||
import no.nordicsemi.android.service.DisconnectAndStopEvent
|
||||
import no.nordicsemi.android.service.OpenLoggerEvent
|
||||
@@ -66,7 +67,7 @@ class HRSRepository @Inject constructor(
|
||||
private val _loggerEvent = simpleSharedFlow<OpenLoggerEvent>()
|
||||
internal val loggerEvent = _loggerEvent.asSharedFlow()
|
||||
|
||||
val isRunning = data.map { it.connectionState == GattConnectionState.STATE_CONNECTED }
|
||||
val isRunning = data.map { it.connectionState?.state == GattConnectionState.STATE_CONNECTED }
|
||||
|
||||
fun launch(device: ServerDevice) {
|
||||
serviceManager.startService(HRSService::class.java, device)
|
||||
@@ -80,7 +81,7 @@ class HRSRepository @Inject constructor(
|
||||
_data.value = _data.value.copy(zoomIn = !_data.value.zoomIn)
|
||||
}
|
||||
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionState?) {
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionStateWithStatus?) {
|
||||
_data.value = _data.value.copy(connectionState = connectionState)
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ import no.nordicsemi.android.kotlin.ble.client.main.connect
|
||||
import no.nordicsemi.android.kotlin.ble.client.main.service.BleGattServices
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.hrs.BodySensorLocationParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.hrs.HRSDataParser
|
||||
@@ -97,7 +98,7 @@ internal class HRSService : NotificationService() {
|
||||
.onEach { logger.launch() }
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
client.connectionState
|
||||
client.connectionStateWithStatus
|
||||
.onEach { repository.onConnectionStateChanged(it) }
|
||||
.filterNotNull()
|
||||
.onEach { stopIfDisconnected(it) }
|
||||
@@ -132,8 +133,8 @@ internal class HRSService : NotificationService() {
|
||||
repository.onInitComplete(device)
|
||||
}
|
||||
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionState) {
|
||||
if (connectionState == GattConnectionState.STATE_DISCONNECTED) {
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionStateWithStatus) {
|
||||
if (connectionState.state == GattConnectionState.STATE_DISCONNECTED) {
|
||||
stopSelf()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,19 +40,16 @@ 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.hrs.R
|
||||
import no.nordicsemi.android.hrs.data.HRSServiceData
|
||||
import no.nordicsemi.android.hrs.viewmodel.HRSViewModel
|
||||
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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -63,7 +60,16 @@ fun HRSScreen() {
|
||||
val navigateUp = { viewModel.onEvent(NavigateUpEvent) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state, navigateUp, viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.connectionState,
|
||||
title = R.string.hrs_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLoggerEvent) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -71,7 +77,7 @@ fun HRSScreen() {
|
||||
.padding(16.dp)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
when (state.connectionState) {
|
||||
when (state.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
@@ -83,14 +89,3 @@ fun HRSScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: HRSServiceData, navigateUp: () -> Unit, viewModel: HRSViewModel) {
|
||||
if (state.deviceName?.isNotBlank() == true) {
|
||||
LoggerIconAppBar(state.deviceName, navigateUp, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLoggerEvent)
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = R.string.hrs_title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ internal class HRSViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
repository.data.onEach {
|
||||
if (it.connectionState == GattConnectionState.STATE_CONNECTED) {
|
||||
if (it.connectionState?.state == GattConnectionState.STATE_CONNECTED) {
|
||||
analytics.logEvent(ProfileConnectedEvent(Profile.HRS))
|
||||
}
|
||||
}.launchIn(viewModelScope)
|
||||
|
||||
@@ -33,12 +33,13 @@ package no.nordicsemi.android.hts.data
|
||||
|
||||
import no.nordicsemi.android.hts.view.TemperatureUnit
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.hts.data.HTSData
|
||||
|
||||
internal data class HTSServiceData(
|
||||
val data: HTSData = HTSData(),
|
||||
val batteryLevel: Int? = null,
|
||||
val connectionState: GattConnectionState? = null,
|
||||
val connectionState: GattConnectionStateWithStatus? = null,
|
||||
val temperatureUnit: TemperatureUnit = TemperatureUnit.CELSIUS,
|
||||
val deviceName: String? = null
|
||||
)
|
||||
|
||||
@@ -43,6 +43,7 @@ import no.nordicsemi.android.hts.data.HTSServiceData
|
||||
import no.nordicsemi.android.hts.view.TemperatureUnit
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.hts.data.HTSData
|
||||
import no.nordicsemi.android.service.DisconnectAndStopEvent
|
||||
import no.nordicsemi.android.service.OpenLoggerEvent
|
||||
@@ -67,7 +68,7 @@ class HTSRepository @Inject constructor(
|
||||
private val _loggerEvent = simpleSharedFlow<OpenLoggerEvent>()
|
||||
internal val loggerEvent = _loggerEvent.asSharedFlow()
|
||||
|
||||
val isRunning = data.map { it.connectionState == GattConnectionState.STATE_CONNECTED }
|
||||
val isRunning = data.map { it.connectionState?.state == GattConnectionState.STATE_CONNECTED }
|
||||
|
||||
fun launch(device: ServerDevice) {
|
||||
serviceManager.startService(HTSService::class.java, device)
|
||||
@@ -81,7 +82,7 @@ class HTSRepository @Inject constructor(
|
||||
_data.value = _data.value.copy(temperatureUnit = temperatureUnit)
|
||||
}
|
||||
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionState?) {
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionStateWithStatus?) {
|
||||
_data.value = _data.value.copy(connectionState = connectionState)
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ import no.nordicsemi.android.kotlin.ble.client.main.connect
|
||||
import no.nordicsemi.android.kotlin.ble.client.main.service.BleGattServices
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.hts.HTSDataParser
|
||||
import no.nordicsemi.android.service.DEVICE_DATA
|
||||
@@ -95,7 +96,7 @@ internal class HTSService : NotificationService() {
|
||||
.onEach { logger.launch() }
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
client.connectionState
|
||||
client.connectionStateWithStatus
|
||||
.onEach { repository.onConnectionStateChanged(it) }
|
||||
.filterNotNull()
|
||||
.onEach { stopIfDisconnected(it) }
|
||||
@@ -126,8 +127,8 @@ internal class HTSService : NotificationService() {
|
||||
repository.onInitComplete(device)
|
||||
}
|
||||
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionState) {
|
||||
if (connectionState == GattConnectionState.STATE_DISCONNECTED) {
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionStateWithStatus) {
|
||||
if (connectionState.state == GattConnectionState.STATE_DISCONNECTED) {
|
||||
stopSelf()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ 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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -63,7 +64,16 @@ fun HTSScreen() {
|
||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state, navigateUp, viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.connectionState,
|
||||
title = R.string.hts_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLoggerEvent) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -71,7 +81,7 @@ fun HTSScreen() {
|
||||
.padding(16.dp)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
when (state.connectionState) {
|
||||
when (state.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
@@ -83,14 +93,3 @@ fun HTSScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: HTSServiceData, navigateUp: () -> Unit, viewModel: HTSViewModel) {
|
||||
if (state.deviceName?.isNotBlank() == true) {
|
||||
LoggerIconAppBar(state.deviceName, navigateUp, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLoggerEvent)
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = R.string.hts_title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ internal class HTSViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
repository.data.onEach {
|
||||
if (it.connectionState == GattConnectionState.STATE_CONNECTED) {
|
||||
if (it.connectionState?.state == GattConnectionState.STATE_CONNECTED) {
|
||||
analytics.logEvent(ProfileConnectedEvent(Profile.HTS))
|
||||
}
|
||||
}.launchIn(viewModelScope)
|
||||
|
||||
@@ -39,7 +39,6 @@ import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import no.nordicsemi.android.common.core.simpleSharedFlow
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.BleGattConnectionStatus
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.prx.AlarmLevel
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
package no.nordicsemi.android.prx.view
|
||||
|
||||
import android.util.Log
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
@@ -40,19 +41,15 @@ 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.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.prx.R
|
||||
import no.nordicsemi.android.prx.data.PRXServiceData
|
||||
import no.nordicsemi.android.prx.viewmodel.PRXViewModel
|
||||
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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -63,7 +60,16 @@ fun PRXScreen() {
|
||||
val navigateUp = { viewModel.onEvent(NavigateUpEvent) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state, navigateUp, viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.connectionState,
|
||||
title = R.string.prx_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLoggerEvent) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -71,6 +77,7 @@ fun PRXScreen() {
|
||||
.padding(16.dp)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
Log.i("AAATESTAAA", "State: ${state.connectionState?.state}")
|
||||
when (state.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
@@ -83,22 +90,3 @@ fun PRXScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getReason(isLinkLoss: Boolean): Reason {
|
||||
return if (isLinkLoss) {
|
||||
Reason.LINK_LOSS
|
||||
} else {
|
||||
Reason.UNKNOWN
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: PRXServiceData, navigateUp: () -> Unit, viewModel: PRXViewModel) {
|
||||
if (state.deviceName?.isNotBlank() == true) {
|
||||
LoggerIconAppBar(state.deviceName, navigateUp, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLoggerEvent)
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = R.string.prx_title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,9 +121,9 @@ internal class PRXViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun disconnect() {
|
||||
repository.release()
|
||||
alarmHandler.pauseAlarm()
|
||||
navigationManager.navigateUp()
|
||||
repository.release()
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
|
||||
@@ -34,13 +34,14 @@ package no.nordicsemi.android.rscs.data
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.rscs.data.RSCSData
|
||||
import no.nordicsemi.android.rscs.R
|
||||
|
||||
internal data class RSCSServiceData(
|
||||
val data: RSCSData = RSCSData(),
|
||||
val batteryLevel: Int? = null,
|
||||
val connectionState: GattConnectionState? = null,
|
||||
val connectionState: GattConnectionStateWithStatus? = null,
|
||||
val deviceName: String? = null
|
||||
) {
|
||||
@Composable
|
||||
|
||||
@@ -41,6 +41,7 @@ import no.nordicsemi.android.common.core.simpleSharedFlow
|
||||
import no.nordicsemi.android.common.logger.NordicBlekLogger
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.rscs.data.RSCSData
|
||||
import no.nordicsemi.android.rscs.data.RSCSServiceData
|
||||
import no.nordicsemi.android.service.DisconnectAndStopEvent
|
||||
@@ -66,7 +67,7 @@ class RSCSRepository @Inject constructor(
|
||||
private val _loggerEvent = simpleSharedFlow<OpenLoggerEvent>()
|
||||
internal val loggerEvent = _loggerEvent.asSharedFlow()
|
||||
|
||||
val isRunning = data.map { it.connectionState == GattConnectionState.STATE_CONNECTED }
|
||||
val isRunning = data.map { it.connectionState?.state == GattConnectionState.STATE_CONNECTED }
|
||||
|
||||
fun launch(device: ServerDevice) {
|
||||
serviceManager.startService(RSCSService::class.java, device)
|
||||
@@ -76,7 +77,7 @@ class RSCSRepository @Inject constructor(
|
||||
_data.value = _data.value.copy(deviceName = device.name)
|
||||
}
|
||||
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionState?) {
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionStateWithStatus?) {
|
||||
_data.value = _data.value.copy(connectionState = connectionState)
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ import no.nordicsemi.android.kotlin.ble.client.main.connect
|
||||
import no.nordicsemi.android.kotlin.ble.client.main.service.BleGattServices
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
|
||||
import no.nordicsemi.android.kotlin.ble.profile.rscs.RSCSDataParser
|
||||
import no.nordicsemi.android.service.DEVICE_DATA
|
||||
@@ -95,7 +96,7 @@ internal class RSCSService : NotificationService() {
|
||||
.onEach { logger.launch() }
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
client.connectionState
|
||||
client.connectionStateWithStatus
|
||||
.onEach { repository.onConnectionStateChanged(it) }
|
||||
.filterNotNull()
|
||||
.onEach { stopIfDisconnected(it) }
|
||||
@@ -126,8 +127,8 @@ internal class RSCSService : NotificationService() {
|
||||
repository.onInitComplete(device)
|
||||
}
|
||||
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionState) {
|
||||
if (connectionState == GattConnectionState.STATE_DISCONNECTED) {
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionStateWithStatus) {
|
||||
if (connectionState.state == GattConnectionState.STATE_DISCONNECTED) {
|
||||
stopSelf()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@ 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
|
||||
@@ -48,11 +47,9 @@ import no.nordicsemi.android.common.ui.scanner.view.DeviceDisconnectedView
|
||||
import no.nordicsemi.android.common.ui.scanner.view.Reason
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.rscs.R
|
||||
import no.nordicsemi.android.rscs.data.RSCSServiceData
|
||||
import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel
|
||||
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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -63,7 +60,16 @@ fun RSCSScreen() {
|
||||
val navigateUp = { viewModel.onEvent(NavigateUpEvent) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state, navigateUp, viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.deviceName,
|
||||
connectionState = state.connectionState,
|
||||
title = R.string.rscs_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLoggerEvent) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -71,7 +77,7 @@ fun RSCSScreen() {
|
||||
.padding(16.dp)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
when (state.connectionState) {
|
||||
when (state.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) }
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
@@ -83,14 +89,3 @@ fun RSCSScreen() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: RSCSServiceData, navigateUp: () -> Unit, viewModel: RSCSViewModel) {
|
||||
if (state.deviceName?.isNotBlank() == true) {
|
||||
LoggerIconAppBar(state.deviceName, navigateUp, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLoggerEvent)
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = R.string.rscs_title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ internal class RSCSViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
repository.data.onEach {
|
||||
if (it.connectionState == GattConnectionState.STATE_CONNECTED) {
|
||||
if (it.connectionState?.state == GattConnectionState.STATE_CONNECTED) {
|
||||
analytics.logEvent(ProfileConnectedEvent(Profile.RSCS))
|
||||
}
|
||||
}.launchIn(viewModelScope)
|
||||
|
||||
@@ -32,10 +32,11 @@
|
||||
package no.nordicsemi.android.uart.data
|
||||
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
|
||||
internal data class UARTServiceData(
|
||||
val messages: List<UARTRecord> = emptyList(),
|
||||
val connectionState: GattConnectionState? = null,
|
||||
val connectionState: GattConnectionStateWithStatus? = null,
|
||||
val batteryLevel: Int? = null,
|
||||
val deviceName: String? = null
|
||||
) {
|
||||
|
||||
@@ -40,6 +40,7 @@ import kotlinx.coroutines.flow.map
|
||||
import no.nordicsemi.android.common.core.simpleSharedFlow
|
||||
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.service.DisconnectAndStopEvent
|
||||
import no.nordicsemi.android.service.OpenLoggerEvent
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
@@ -72,7 +73,7 @@ class UARTRepository @Inject internal constructor(
|
||||
private val _loggerEvent = simpleSharedFlow<OpenLoggerEvent>()
|
||||
internal val loggerEvent = _loggerEvent.asSharedFlow()
|
||||
|
||||
val isRunning = data.map { it.connectionState == GattConnectionState.STATE_CONNECTED }
|
||||
val isRunning = data.map { it.connectionState?.state == GattConnectionState.STATE_CONNECTED }
|
||||
|
||||
val lastConfigurationName = configurationDataSource.lastConfigurationName
|
||||
|
||||
@@ -80,7 +81,7 @@ class UARTRepository @Inject internal constructor(
|
||||
serviceManager.startService(UARTService::class.java, device)
|
||||
}
|
||||
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionState) {
|
||||
fun onConnectionStateChanged(connectionState: GattConnectionStateWithStatus?) {
|
||||
_data.value = _data.value.copy(connectionState = connectionState)
|
||||
}
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ import no.nordicsemi.android.kotlin.ble.core.ServerDevice
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.BleGattProperty
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.BleWriteType
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
|
||||
import no.nordicsemi.android.kotlin.ble.core.data.Mtu
|
||||
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
|
||||
import no.nordicsemi.android.service.DEVICE_DATA
|
||||
@@ -100,7 +101,7 @@ internal class UARTService : NotificationService() {
|
||||
.onEach { logger.launch() }
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
client.connectionState
|
||||
client.connectionStateWithStatus
|
||||
.onEach { repository.onConnectionStateChanged(it) }
|
||||
.filterNotNull()
|
||||
.onEach { stopIfDisconnected(it) }
|
||||
@@ -148,8 +149,8 @@ internal class UARTService : NotificationService() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionState) {
|
||||
if (connectionState == GattConnectionState.STATE_DISCONNECTED) {
|
||||
private fun stopIfDisconnected(connectionState: GattConnectionStateWithStatus) {
|
||||
if (connectionState.state == GattConnectionState.STATE_DISCONNECTED) {
|
||||
stopSelf()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ import no.nordicsemi.android.uart.viewmodel.UARTViewModel
|
||||
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
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -70,12 +71,21 @@ fun UARTScreen() {
|
||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
||||
|
||||
Scaffold(
|
||||
topBar = { AppBar(state, navigateUp, viewModel) }
|
||||
topBar = {
|
||||
ProfileAppBar(
|
||||
deviceName = state.uartManagerState.deviceName,
|
||||
connectionState = state.uartManagerState.connectionState,
|
||||
title = R.string.uart_title,
|
||||
navigateUp = navigateUp,
|
||||
disconnect = { viewModel.onEvent(DisconnectEvent) },
|
||||
openLogger = { viewModel.onEvent(OpenLogger) }
|
||||
)
|
||||
}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.padding(it)
|
||||
) {
|
||||
when (state.uartManagerState.connectionState) {
|
||||
when (state.uartManagerState.connectionState?.state) {
|
||||
null,
|
||||
GattConnectionState.STATE_CONNECTING -> PaddingBox { DeviceConnectingView { NavigateUpButton(navigateUp) } }
|
||||
GattConnectionState.STATE_DISCONNECTED,
|
||||
@@ -95,18 +105,6 @@ private fun PaddingBox(content: @Composable () -> Unit) {
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun AppBar(state: UARTViewState, navigateUp: () -> Unit, viewModel: UARTViewModel) {
|
||||
if (state.uartManagerState.deviceName?.isNotBlank() == true) {
|
||||
LoggerIconAppBar(state.uartManagerState.deviceName, navigateUp, { viewModel.onEvent(DisconnectEvent) }) {
|
||||
viewModel.onEvent(OpenLogger)
|
||||
}
|
||||
} else {
|
||||
BackIconAppBar(stringResource(id = R.string.uart_title), navigateUp)
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalPagerApi::class)
|
||||
@Composable
|
||||
private fun SuccessScreen() {
|
||||
val input = stringResource(id = R.string.uart_input)
|
||||
@@ -141,10 +139,3 @@ private fun MacroView() {
|
||||
val state = viewModel.state.collectAsState().value
|
||||
MacroSection(state) { viewModel.onEvent(it) }
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun Scroll(content: @Composable () -> Unit) {
|
||||
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||
content()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ internal class UARTViewModel @Inject constructor(
|
||||
repository.data.onEach {
|
||||
_state.value = _state.value.copy(uartManagerState = it)
|
||||
|
||||
if (it.connectionState == GattConnectionState.STATE_CONNECTED) {
|
||||
if (it.connectionState?.state == GattConnectionState.STATE_CONNECTED) {
|
||||
analytics.logEvent(ProfileConnectedEvent(Profile.UART))
|
||||
}
|
||||
}.launchIn(viewModelScope)
|
||||
|
||||
Reference in New Issue
Block a user