From d0aeefb0105866976d906dc80de801fc8aa6ecd2 Mon Sep 17 00:00:00 2001 From: Sylwester Zielinski Date: Tue, 18 Apr 2023 12:52:18 +0200 Subject: [PATCH] Fix toolbar title --- lib_ui/build.gradle.kts | 1 + .../nordicsemi/android/ui/view/TopAppBar.kt | 24 ++++++++++++ .../android/bps/data/BPSServiceData.kt | 4 +- .../nordicsemi/android/bps/view/BPSScreen.kt | 30 ++++++--------- .../android/bps/viewmodel/BPSViewModel.kt | 9 +++-- .../android/cgms/repository/CGMRepository.kt | 2 + .../nordicsemi/android/cgms/view/CGMScreen.kt | 30 +++++++-------- .../android/csc/data/CSCServiceData.kt | 4 +- .../android/csc/repository/CSCRepository.kt | 5 ++- .../android/csc/repository/CSCService.kt | 7 ++-- .../nordicsemi/android/csc/view/CSCScreen.kt | 29 ++++++-------- .../android/csc/viewmodel/CSCViewModel.kt | 2 +- .../android/gls/data/GLSServiceData.kt | 3 +- .../android/gls/main/view/GLSScreen.kt | 30 ++++++--------- .../android/gls/main/view/GLSViewState.kt | 3 +- .../gls/main/viewmodel/GLSViewModel.kt | 7 ++-- .../android/hrs/data/HRSServiceData.kt | 3 +- .../android/hrs/service/HRSRepository.kt | 5 ++- .../android/hrs/service/HRSService.kt | 7 ++-- .../nordicsemi/android/hrs/view/HRSScreen.kt | 29 ++++++-------- .../android/hrs/viewmodel/HRSViewModel.kt | 2 +- .../android/hts/data/HTSServiceData.kt | 3 +- .../android/hts/repository/HTSRepository.kt | 5 ++- .../android/hts/repository/HTSService.kt | 7 ++-- .../nordicsemi/android/hts/view/HTSScreen.kt | 25 ++++++------ .../android/hts/viewmodel/HTSViewModel.kt | 2 +- .../android/prx/repository/PRXRepository.kt | 1 - .../nordicsemi/android/prx/view/PRXScreen.kt | 38 +++++++------------ .../android/prx/viewmodel/PRXViewModel.kt | 2 +- .../android/rscs/data/RSCSServiceData.kt | 3 +- .../android/rscs/repository/RSCSRepository.kt | 5 ++- .../android/rscs/repository/RSCSService.kt | 7 ++-- .../android/rscs/view/RSCSScreen.kt | 29 ++++++-------- .../android/rscs/viewmodel/RSCSViewModel.kt | 2 +- .../android/uart/data/UARTServiceData.kt | 3 +- .../android/uart/repository/UARTRepository.kt | 5 ++- .../android/uart/repository/UARTService.kt | 7 ++-- .../android/uart/view/UARTScreen.kt | 33 ++++++---------- .../android/uart/viewmodel/UARTViewModel.kt | 2 +- 39 files changed, 203 insertions(+), 212 deletions(-) diff --git a/lib_ui/build.gradle.kts b/lib_ui/build.gradle.kts index 86970f79..7fb83133 100644 --- a/lib_ui/build.gradle.kts +++ b/lib_ui/build.gradle.kts @@ -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") } diff --git a/lib_ui/src/main/java/no/nordicsemi/android/ui/view/TopAppBar.kt b/lib_ui/src/main/java/no/nordicsemi/android/ui/view/TopAppBar.kt index b89a039e..95b3974c 100644 --- a/lib_ui/src/main/java/no/nordicsemi/android/ui/view/TopAppBar.kt +++ b/lib_ui/src/main/java/no/nordicsemi/android/ui/view/TopAppBar.kt @@ -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) + } +} diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSServiceData.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSServiceData.kt index b1608080..4c254197 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSServiceData.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSServiceData.kt @@ -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 ) \ No newline at end of file diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt index 4239dad2..1218c4cf 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt @@ -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) - } - } -} diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt index b150a969..bcb7e1e9 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt @@ -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) } diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt index c5438c0e..713a1bf5 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt @@ -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) } diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt index 25edd66e..8555c10c 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt @@ -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) - } -} diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCServiceData.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCServiceData.kt index 635fb318..917c90df 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCServiceData.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCServiceData.kt @@ -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 ) diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt index 9a7b20c7..8b1b36ac 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt @@ -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() 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) } diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCService.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCService.kt index 7d175df5..fc357958 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCService.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCService.kt @@ -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() } } diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt index 2c3bcbbc..47a8a668 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt @@ -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) - } -} diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt index 19fb8c6c..47e61ed5 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt @@ -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) diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSServiceData.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSServiceData.kt index f5a5cb0a..a5077951 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSServiceData.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSServiceData.kt @@ -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 = mapOf(), val batteryLevel: Int? = null, - val connectionState: GattConnectionState? = null, + val connectionState: GattConnectionStateWithStatus? = null, val requestStatus: RequestStatus = RequestStatus.IDLE ) diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt index 25c091cb..1aeece97 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt @@ -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) - } - } -} diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSViewState.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSViewState.kt index b77e792c..2f04e457 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSViewState.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSViewState.kt @@ -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)) } diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt index 3a35766a..03fd40e3 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt @@ -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)) } } diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/data/HRSServiceData.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/data/HRSServiceData.kt index 81a23ac0..89f5cebf 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/data/HRSServiceData.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/data/HRSServiceData.kt @@ -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 = 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 ) { diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt index 94cee9ae..47d84a69 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt @@ -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() 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) } diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSService.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSService.kt index b5c05088..5248a3c4 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSService.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSService.kt @@ -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() } } diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt index f3669480..36394e06 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt @@ -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) - } -} diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt index 5de6a338..3168334b 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt @@ -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) diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSServiceData.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSServiceData.kt index 210c4b8c..750fd306 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSServiceData.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSServiceData.kt @@ -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 ) diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt index 1cc7c7e8..89322d7d 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt @@ -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() 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) } diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSService.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSService.kt index 9e86d0a3..3fe6d797 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSService.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSService.kt @@ -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() } } diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt index 2d396cd9..3d320130 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt @@ -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) - } -} diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt index e9d516ad..8d28b961 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt @@ -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) diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt index 13d72584..183a53af 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt @@ -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 diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt index 206d0297..23cc17f7 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt @@ -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) - } -} diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt index c2a30280..53e86ce7 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt @@ -121,9 +121,9 @@ internal class PRXViewModel @Inject constructor( } private fun disconnect() { - repository.release() alarmHandler.pauseAlarm() navigationManager.navigateUp() + repository.release() } override fun onCleared() { diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/data/RSCSServiceData.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/data/RSCSServiceData.kt index f98884f8..5ffb23b6 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/data/RSCSServiceData.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/data/RSCSServiceData.kt @@ -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 diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt index f1654fe8..1d1950d0 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt @@ -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() 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) } diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSService.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSService.kt index e0874334..a3cc54cd 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSService.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSService.kt @@ -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() } } diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt index 643bd3cc..dd4d4983 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt @@ -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) - } -} diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt index 50d6d80a..57d912ac 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt @@ -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) diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/data/UARTServiceData.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/data/UARTServiceData.kt index ea24e58c..51df55e0 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/data/UARTServiceData.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/data/UARTServiceData.kt @@ -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 = emptyList(), - val connectionState: GattConnectionState? = null, + val connectionState: GattConnectionStateWithStatus? = null, val batteryLevel: Int? = null, val deviceName: String? = null ) { diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt index 45a706e2..e59d2c79 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt @@ -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() 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) } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTService.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTService.kt index e3aeeeb5..44303127 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTService.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTService.kt @@ -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() } } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt index 9623917b..aab035c0 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt @@ -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() - } -} diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt index 69dce4b8..30e79922 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt @@ -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)