From 06ea417cb7d7904ac583677ad11d475060a65de9 Mon Sep 17 00:00:00 2001 From: Sylwester Zielinski Date: Wed, 5 Apr 2023 16:44:24 +0200 Subject: [PATCH] Add experimental connection error message --- .../nordicsemi/android/cgms/data/CGMServiceData.kt | 4 ++-- .../android/cgms/repository/CGMRepository.kt | 5 +++-- .../android/cgms/repository/CGMService.kt | 13 +++++++------ .../no/nordicsemi/android/cgms/view/CGMScreen.kt | 6 +++--- .../android/cgms/viewmodel/CGMViewModel.kt | 4 +--- .../nordicsemi/android/prx/data/PRXServiceData.kt | 3 ++- .../android/prx/repository/PRXRepository.kt | 7 ++++--- .../nordicsemi/android/prx/repository/PRXService.kt | 2 +- .../no/nordicsemi/android/prx/view/PRXScreen.kt | 4 ++-- .../android/prx/viewmodel/PRXViewModel.kt | 2 +- 10 files changed, 26 insertions(+), 24 deletions(-) diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/data/CGMServiceData.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/data/CGMServiceData.kt index 5aab70a1..2307c447 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/data/CGMServiceData.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/data/CGMServiceData.kt @@ -1,13 +1,13 @@ package no.nordicsemi.android.cgms.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.cgm.data.CGMRecord import no.nordicsemi.android.kotlin.ble.profile.gls.data.RequestStatus internal data class CGMServiceData( val records: List = emptyList(), val batteryLevel: Int? = null, - val connectionState: GattConnectionState? = null, + val connectionState: GattConnectionStateWithStatus? = null, val requestStatus: RequestStatus = RequestStatus.IDLE, val deviceName: String? = null ) 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 7def0da5..c5438c0e 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 @@ -43,6 +43,7 @@ import no.nordicsemi.android.cgms.data.CGMServiceData 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.kotlin.ble.profile.gls.data.RequestStatus import no.nordicsemi.android.service.DisconnectAndStopEvent import no.nordicsemi.android.service.OpenLoggerEvent @@ -68,7 +69,7 @@ class CGMRepository @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 } val hasRecords = data.value.records.isNotEmpty() val highestSequenceNumber = data.value.records.maxOfOrNull { it.sequenceNumber } ?: -1 @@ -85,7 +86,7 @@ class CGMRepository @Inject constructor( _command.tryEmit(command) } - fun onConnectionStateChanged(connectionState: GattConnectionState?) { + fun onConnectionStateChanged(connectionState: GattConnectionStateWithStatus?) { _data.value = _data.value.copy(connectionState = connectionState) } diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMService.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMService.kt index 0b826c1a..fd25f815 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMService.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMService.kt @@ -50,6 +50,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.cgm.CGMFeatureParser import no.nordicsemi.android.kotlin.ble.profile.cgm.CGMMeasurementParser @@ -139,7 +140,7 @@ internal class CGMService : NotificationService() { .onEach { logger.launch() } .launchIn(lifecycleScope) - client.connectionState + client.connectionStateWithStatus .onEach { repository.onConnectionStateChanged(it) } .filterNotNull() .onEach { stopIfDisconnected(it) } @@ -187,10 +188,10 @@ internal class CGMService : NotificationService() { .mapNotNull { CGMSpecificOpsControlPointParser.parse(it) } .onEach { if (it.isOperationCompleted) { - if (it.requestCode == CGMOpCode.CGM_OP_CODE_START_SESSION) { - sessionStartTime = System.currentTimeMillis() + sessionStartTime = if (it.requestCode == CGMOpCode.CGM_OP_CODE_START_SESSION) { + System.currentTimeMillis() } else { - sessionStartTime = 0 + 0 } } else { if (it.requestCode == CGMOpCode.CGM_OP_CODE_START_SESSION && it.errorCode == CGMErrorCode.CGM_ERROR_PROCEDURE_NOT_COMPLETED) { @@ -298,8 +299,8 @@ internal class CGMService : NotificationService() { recordAccessControlPointCharacteristic.write(RecordAccessControlPointInputParser.reportNumberOfAllStoredRecords().value) } - 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_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 48132d7f..25edd66e 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 @@ -72,11 +72,11 @@ fun CGMScreen() { .padding(16.dp) .verticalScroll(rememberScrollState()) ) { - when (state.connectionState) { + when (state.connectionState?.state) { null, GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) } GattConnectionState.STATE_DISCONNECTED, - GattConnectionState.STATE_DISCONNECTING -> DeviceDisconnectedView(Reason.UNKNOWN) { + GattConnectionState.STATE_DISCONNECTING -> DeviceDisconnectedView(state.connectionState.status) { NavigateUpButton(navigateUp) } GattConnectionState.STATE_CONNECTED -> CGMContentView(state) { viewModel.onEvent(it) } @@ -88,7 +88,7 @@ fun CGMScreen() { @Composable private fun AppBar(state: CGMServiceData, navigateUp: () -> Unit, viewModel: CGMViewModel) { if (state.deviceName?.isNotBlank() == true) { - if (state.connectionState == GattConnectionState.STATE_DISCONNECTING || state.connectionState == GattConnectionState.STATE_DISCONNECTED) { + 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) }) { diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt index 96bbef5c..abe520d8 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt @@ -35,8 +35,6 @@ import android.os.ParcelUuid import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -76,7 +74,7 @@ internal class CGMViewModel @Inject constructor( } repository.data.onEach { - if (it.connectionState == GattConnectionState.STATE_CONNECTED) { + if (it.connectionState?.state == GattConnectionState.STATE_CONNECTED) { analytics.logEvent(ProfileConnectedEvent(Profile.CGMS)) } }.launchIn(viewModelScope) diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXServiceData.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXServiceData.kt index 36563a50..48e2a373 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXServiceData.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXServiceData.kt @@ -2,13 +2,14 @@ package no.nordicsemi.android.prx.data 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 data class PRXServiceData( val localAlarmLevel: AlarmLevel = AlarmLevel.NONE, val linkLossAlarmLevel: AlarmLevel = AlarmLevel.HIGH, val batteryLevel: Int? = null, - val connectionState: GattConnectionState? = null, + val connectionState: GattConnectionStateWithStatus? = null, val connectionStatus: BleGattConnectionStatus? = null, val isRemoteAlarm: Boolean = false, val deviceName: String? = null 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 755dbb03..13d72584 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 @@ -41,6 +41,7 @@ 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 import no.nordicsemi.android.prx.data.PRXServiceData import no.nordicsemi.android.service.DisconnectAndStopEvent @@ -68,7 +69,7 @@ class PRXRepository @Inject internal constructor( private val _remoteAlarmLevel = simpleSharedFlow() internal val remoteAlarmLevel = _remoteAlarmLevel.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(PRXService::class.java, device) @@ -78,8 +79,8 @@ class PRXRepository @Inject internal constructor( _data.value = _data.value.copy(deviceName = device.name) } - fun onConnectionStateChanged(connection: Pair) { - _data.value = _data.value.copy(connectionState = connection.first, connectionStatus = connection.second) + fun onConnectionStateChanged(connection: GattConnectionStateWithStatus) { + _data.value = _data.value.copy(connectionState = connection) } fun setLocalAlarmLevel(alarmLevel: AlarmLevel) { diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXService.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXService.kt index 93c79dde..9cef5629 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXService.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXService.kt @@ -173,7 +173,7 @@ internal class PRXService : NotificationService() { .filterNotNull() .onEach { repository.onConnectionStateChanged(it) } .filterNotNull() - .onEach { stopIfDisconnected(it.first, it.second) } + .onEach { stopIfDisconnected(it.state, it.status) } .launchIn(lifecycleScope) client.services 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 bf08e6c1..206d0297 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 @@ -71,11 +71,11 @@ fun PRXScreen() { .padding(16.dp) .verticalScroll(rememberScrollState()) ) { - when (state.connectionState) { + when (state.connectionState?.state) { null, GattConnectionState.STATE_CONNECTING -> DeviceConnectingView { NavigateUpButton(navigateUp) } GattConnectionState.STATE_DISCONNECTED, - GattConnectionState.STATE_DISCONNECTING -> DeviceDisconnectedView(getReason(state.isLinkLossDisconnected)) { + GattConnectionState.STATE_DISCONNECTING -> DeviceDisconnectedView(state.connectionState.status) { NavigateUpButton(navigateUp) } GattConnectionState.STATE_CONNECTED -> ContentView(state) { viewModel.onEvent(it) } 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 b56e7849..c2a30280 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 @@ -83,7 +83,7 @@ internal class PRXViewModel @Inject constructor( alarmHandler.playAlarm(it.linkLossAlarmLevel) } - if (it.connectionState == GattConnectionState.STATE_CONNECTED) { + if (it.connectionState?.state == GattConnectionState.STATE_CONNECTED) { analytics.logEvent(ProfileConnectedEvent(Profile.PRX)) } }.launchIn(viewModelScope)