Fix navigation.

This commit is contained in:
Sylwester Zieliński
2022-01-21 13:31:14 +01:00
parent d8dce9a24c
commit 7541cc762a
25 changed files with 181 additions and 204 deletions

View File

@@ -35,6 +35,7 @@ import kotlinx.coroutines.flow.asStateFlow
import no.nordicsemi.android.ble.BleManager
import no.nordicsemi.android.log.ILogSession
import no.nordicsemi.android.log.Logger
import no.nordicsemi.ui.scanner.DiscoveredBluetoothDevice
@AndroidEntryPoint
abstract class BleProfileService : Service() {
@@ -104,7 +105,9 @@ abstract class BleProfileService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
manager.connect(intent!!.getParcelableExtra(DEVICE_DATA)!!)
val device = intent!!.getParcelableExtra<DiscoveredBluetoothDevice>(DEVICE_DATA)!!.device
manager.connect(device)
.useAutoConnect(shouldAutoConnect())
.retry(3, 100)
.enqueue()

View File

@@ -13,5 +13,5 @@
<string name="device_connecting">Connecting</string>
<string name="device_explanation">The mobile is trying to connect to peripheral device.</string>
<string name="device_please_wait">Please wait.</string>
<string name="device_please_wait">Please wait...</string>
</resources>

View File

@@ -2,7 +2,6 @@ package no.nordicsemi.android.bps.view
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
@@ -17,22 +16,13 @@ fun BPSScreen() {
val viewModel: BPSViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
LaunchedEffect(Unit) {
viewModel.connectDevice()
}
BPSView(state) { viewModel.onEvent(it) }
}
@Composable
private fun BPSView(state: BPSViewState, onEvent: (BPSScreenViewEvent) -> Unit) {
Column {
BackIconAppBar(stringResource(id = R.string.bps_title)) {
onEvent(DisconnectEvent)
viewModel.onEvent(DisconnectEvent)
}
when (state) {
is DisplayDataState -> BPSContentView(state.data) { onEvent(it) }
is DisplayDataState -> BPSContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}

View File

@@ -4,13 +4,10 @@ import android.bluetooth.BluetoothDevice
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.*
import no.nordicsemi.android.bps.data.BPSRepository
import no.nordicsemi.android.bps.repository.BPSManager
import no.nordicsemi.android.bps.repository.BPS_SERVICE_UUID
import no.nordicsemi.android.bps.view.BPSScreenViewEvent
import no.nordicsemi.android.bps.view.DisconnectEvent
import no.nordicsemi.android.bps.view.DisplayDataState
@@ -40,6 +37,8 @@ internal class BPSViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, BPS_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
@@ -70,11 +69,10 @@ internal class BPSViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult?) {
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> connectDevice(args.getDevice())
null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID))
}.exhaustive
}

View File

@@ -10,6 +10,7 @@ dependencies {
implementation libs.nordic.log
implementation libs.nordic.theme
implementation libs.nordic.ui.scanner
implementation libs.nordic.navigation
implementation libs.bundles.compose

View File

@@ -1,15 +1,11 @@
package no.nordicsemi.android.cgms.view
import android.content.Intent
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.cgms.R
import no.nordicsemi.android.cgms.repository.CGMService
import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel
import no.nordicsemi.android.theme.view.BackIconAppBar
import no.nordicsemi.android.theme.view.DeviceConnectingView
@@ -20,28 +16,14 @@ fun CGMScreen() {
val viewModel: CGMScreenViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
val context = LocalContext.current
LaunchedEffect(Unit) {
val intent = Intent(context, CGMService::class.java)
context.startService(intent)
}
CGMView(state) {
viewModel.onEvent(it)
}
}
@Composable
private fun CGMView(state: CGMViewState, onEvent: (CGMViewEvent) -> Unit) {
Column {
BackIconAppBar(stringResource(id = R.string.cgms_title)) {
onEvent(DisconnectEvent)
viewModel.onEvent(DisconnectEvent)
}
when (state) {
is DisplayDataState -> CGMContentView(state.data, onEvent)
is DisplayDataState -> CGMContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}
}

View File

@@ -3,26 +3,24 @@ package no.nordicsemi.android.cgms.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.*
import no.nordicsemi.android.cgms.data.CGMRepository
import no.nordicsemi.android.cgms.data.CGMServiceCommand
import no.nordicsemi.android.cgms.view.CGMViewEvent
import no.nordicsemi.android.cgms.view.DisconnectEvent
import no.nordicsemi.android.cgms.view.DisplayDataState
import no.nordicsemi.android.cgms.view.LoadingState
import no.nordicsemi.android.cgms.view.OnWorkingModeSelected
import no.nordicsemi.android.navigation.NavigationManager
import no.nordicsemi.android.cgms.repository.CGMS_SERVICE_UUID
import no.nordicsemi.android.cgms.repository.CGMService
import no.nordicsemi.android.cgms.view.*
import no.nordicsemi.android.navigation.*
import no.nordicsemi.android.service.BleManagerStatus
import no.nordicsemi.android.service.ServiceManager
import no.nordicsemi.android.utils.exhaustive
import no.nordicsemi.android.utils.getDevice
import no.nordicsemi.ui.scanner.ScannerDestinationId
import javax.inject.Inject
@HiltViewModel
internal class CGMScreenViewModel @Inject constructor(
private val repository: CGMRepository,
private val serviceManager: ServiceManager,
private val navigationManager: NavigationManager
) : ViewModel() {
@@ -35,6 +33,14 @@ internal class CGMScreenViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CGMS_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
}
}.launchIn(viewModelScope)
repository.status.onEach {
if (it == BleManagerStatus.DISCONNECTED) {
navigationManager.navigateUp()
@@ -42,6 +48,13 @@ internal class CGMScreenViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> serviceManager.startService(CGMService::class.java, args.getDevice())
}.exhaustive
}
fun onEvent(event: CGMViewEvent) {
when (event) {
DisconnectEvent -> disconnect()

View File

@@ -34,6 +34,8 @@ internal class CSCViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CSC_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
@@ -47,11 +49,10 @@ internal class CSCViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult?) {
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> serviceManager.startService(CSCService::class.java, args.getDevice())
null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CSC_SERVICE_UUID))
}.exhaustive
}

View File

@@ -8,7 +8,6 @@ import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.gls.R
import no.nordicsemi.android.gls.viewmodel.DisconnectEvent
import no.nordicsemi.android.gls.viewmodel.GLSScreenViewEvent
import no.nordicsemi.android.gls.viewmodel.GLSViewModel
import no.nordicsemi.android.theme.view.BackIconAppBar
import no.nordicsemi.android.theme.view.DeviceConnectingView
@@ -21,20 +20,13 @@ fun GLSScreen() {
Log.d("AAATESTAAA", "$viewModel") //TODO fix screen rotation
GLSView(state) {
viewModel.onEvent(it)
}
}
@Composable
private fun GLSView(state: GLSViewState, onEvent: (GLSScreenViewEvent) -> Unit) {
Column {
BackIconAppBar(stringResource(id = R.string.gls_title)) {
onEvent(DisconnectEvent)
viewModel.onEvent(DisconnectEvent)
}
when (state) {
is DisplayDataState -> GLSContentView(state.data, onEvent)
is DisplayDataState -> GLSContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}

View File

@@ -36,6 +36,8 @@ internal class GLSViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
@@ -66,11 +68,10 @@ internal class GLSViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult?) {
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> connectDevice(args.getDevice())
null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID))
}.exhaustive
}

View File

@@ -10,6 +10,7 @@ dependencies {
implementation libs.nordic.ble.common
implementation libs.nordic.navigation
implementation libs.nordic.ui.scanner
implementation libs.nordic.log

View File

@@ -1,15 +1,11 @@
package no.nordicsemi.android.hrs.view
import android.content.Intent
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.hrs.R
import no.nordicsemi.android.hrs.service.HRSService
import no.nordicsemi.android.hrs.viewmodel.HRSViewModel
import no.nordicsemi.android.theme.view.BackIconAppBar
import no.nordicsemi.android.theme.view.DeviceConnectingView
@@ -20,24 +16,13 @@ fun HRSScreen() {
val viewModel: HRSViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
val context = LocalContext.current
LaunchedEffect(Unit) {
val intent = Intent(context, HRSService::class.java)
context.startService(intent)
}
HRSView(state) { viewModel.onEvent(it) }
}
@Composable
private fun HRSView(state: HRSViewState, onEvent: (HRSScreenViewEvent) -> Unit) {
Column {
BackIconAppBar(stringResource(id = R.string.hrs_title)) {
onEvent(DisconnectEvent)
viewModel.onEvent(DisconnectEvent)
}
when (state) {
is DisplayDataState -> HRSContentView(state.data) { onEvent(it) }
is DisplayDataState -> HRSContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}

View File

@@ -3,25 +3,23 @@ package no.nordicsemi.android.hrs.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.*
import no.nordicsemi.android.hrs.data.HRSRepository
import no.nordicsemi.android.hrs.view.DisconnectEvent
import no.nordicsemi.android.hrs.view.DisplayDataState
import no.nordicsemi.android.hrs.view.HRSScreenViewEvent
import no.nordicsemi.android.hrs.view.LoadingState
import no.nordicsemi.android.hrs.view.NavigateUpEvent
import no.nordicsemi.android.navigation.NavigationManager
import no.nordicsemi.android.hrs.service.HRSService
import no.nordicsemi.android.hrs.service.HRS_SERVICE_UUID
import no.nordicsemi.android.hrs.view.*
import no.nordicsemi.android.navigation.*
import no.nordicsemi.android.service.BleManagerStatus
import no.nordicsemi.android.service.ServiceManager
import no.nordicsemi.android.utils.exhaustive
import no.nordicsemi.android.utils.getDevice
import no.nordicsemi.ui.scanner.ScannerDestinationId
import javax.inject.Inject
@HiltViewModel
internal class HRSViewModel @Inject constructor(
private val repository: HRSRepository,
private val serviceManager: ServiceManager,
private val navigationManager: NavigationManager
) : ViewModel() {
@@ -34,6 +32,14 @@ internal class HRSViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, HRS_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
}
}.launchIn(viewModelScope)
repository.status.onEach {
if (it == BleManagerStatus.DISCONNECTED) {
navigationManager.navigateUp()
@@ -41,6 +47,13 @@ internal class HRSViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> serviceManager.startService(HRSService::class.java, args.getDevice())
}.exhaustive
}
fun onEvent(event: HRSScreenViewEvent) {
when (event) {
DisconnectEvent -> onDisconnectButtonClick()

View File

@@ -10,6 +10,7 @@ dependencies {
implementation libs.nordic.log
implementation libs.nordic.theme
implementation libs.nordic.ui.scanner
implementation libs.nordic.navigation
implementation libs.bundles.compose

View File

@@ -1,15 +1,11 @@
package no.nordicsemi.android.hts.view
import android.content.Intent
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.hts.R
import no.nordicsemi.android.hts.repository.HTSService
import no.nordicsemi.android.hts.viewmodel.HTSViewModel
import no.nordicsemi.android.theme.view.BackIconAppBar
import no.nordicsemi.android.theme.view.DeviceConnectingView
@@ -20,24 +16,13 @@ fun HTSScreen() {
val viewModel: HTSViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
val context = LocalContext.current
LaunchedEffect(Unit) {
val intent = Intent(context, HTSService::class.java)
context.startService(intent)
}
HTSView(state) { viewModel.onEvent(it) }
}
@Composable
private fun HTSView(state: HTSViewState, onEvent: (HTSScreenViewEvent) -> Unit) {
Column {
BackIconAppBar(stringResource(id = R.string.hts_title)) {
onEvent(DisconnectEvent)
viewModel.onEvent(DisconnectEvent)
}
when (state) {
is DisplayDataState -> HTSContentView(state.data) { onEvent(it) }
is DisplayDataState -> HTSContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}

View File

@@ -3,25 +3,23 @@ package no.nordicsemi.android.hts.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.*
import no.nordicsemi.android.hts.data.HTSRepository
import no.nordicsemi.android.hts.view.DisconnectEvent
import no.nordicsemi.android.hts.view.DisplayDataState
import no.nordicsemi.android.hts.view.HTSScreenViewEvent
import no.nordicsemi.android.hts.view.LoadingState
import no.nordicsemi.android.hts.view.OnTemperatureUnitSelected
import no.nordicsemi.android.navigation.NavigationManager
import no.nordicsemi.android.hts.repository.HTSService
import no.nordicsemi.android.hts.repository.HTS_SERVICE_UUID
import no.nordicsemi.android.hts.view.*
import no.nordicsemi.android.navigation.*
import no.nordicsemi.android.service.BleManagerStatus
import no.nordicsemi.android.service.ServiceManager
import no.nordicsemi.android.utils.exhaustive
import no.nordicsemi.android.utils.getDevice
import no.nordicsemi.ui.scanner.ScannerDestinationId
import javax.inject.Inject
@HiltViewModel
internal class HTSViewModel @Inject constructor(
private val repository: HTSRepository,
private val serviceManager: ServiceManager,
private val navigationManager: NavigationManager
) : ViewModel() {
@@ -34,6 +32,14 @@ internal class HTSViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, HTS_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
}
}.launchIn(viewModelScope)
repository.status.onEach {
if (it == BleManagerStatus.DISCONNECTED) {
navigationManager.navigateUp()
@@ -41,6 +47,13 @@ internal class HTSViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> serviceManager.startService(HTSService::class.java, args.getDevice())
}.exhaustive
}
fun onEvent(event: HTSScreenViewEvent) {
when (event) {
DisconnectEvent -> onDisconnectButtonClick()

View File

@@ -9,6 +9,7 @@ dependencies {
implementation libs.nordic.ble.common
implementation libs.nordic.log
implementation libs.nordic.ui.scanner
implementation libs.nordic.navigation
implementation libs.bundles.compose

View File

@@ -1,16 +1,12 @@
package no.nordicsemi.android.prx.view
import android.content.Intent
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.prx.R
import no.nordicsemi.android.prx.service.PRXService
import no.nordicsemi.android.prx.viewmodel.PRXViewModel
import no.nordicsemi.android.theme.view.BackIconAppBar
import no.nordicsemi.android.theme.view.DeviceConnectingView
@@ -21,24 +17,13 @@ fun PRXScreen() {
val viewModel: PRXViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
val context = LocalContext.current
LaunchedEffect(Unit) {
val intent = Intent(context, PRXService::class.java)
context.startService(intent)
}
PRXView(state) { viewModel.onEvent(it) }
}
@Composable
private fun PRXView(state: PRXViewState, onEvent: (PRXScreenViewEvent) -> Unit) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
BackIconAppBar(stringResource(id = R.string.prx_title)) {
onEvent(DisconnectEvent)
viewModel.onEvent(DisconnectEvent)
}
when (state) {
is DisplayDataState -> ContentView(state.data) { onEvent(it) }
is DisplayDataState -> ContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}

View File

@@ -3,29 +3,26 @@ package no.nordicsemi.android.prx.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import no.nordicsemi.android.navigation.NavigationManager
import kotlinx.coroutines.flow.*
import no.nordicsemi.android.navigation.*
import no.nordicsemi.android.prx.data.DisableAlarm
import no.nordicsemi.android.prx.data.Disconnect
import no.nordicsemi.android.prx.data.EnableAlarm
import no.nordicsemi.android.prx.data.PRXRepository
import no.nordicsemi.android.prx.view.DisconnectEvent
import no.nordicsemi.android.prx.view.DisplayDataState
import no.nordicsemi.android.prx.view.LoadingState
import no.nordicsemi.android.prx.view.PRXScreenViewEvent
import no.nordicsemi.android.prx.view.TurnOffAlert
import no.nordicsemi.android.prx.view.TurnOnAlert
import no.nordicsemi.android.prx.service.PRXService
import no.nordicsemi.android.prx.service.PRX_SERVICE_UUID
import no.nordicsemi.android.prx.view.*
import no.nordicsemi.android.service.BleManagerStatus
import no.nordicsemi.android.service.ServiceManager
import no.nordicsemi.android.utils.exhaustive
import no.nordicsemi.android.utils.getDevice
import no.nordicsemi.ui.scanner.ScannerDestinationId
import javax.inject.Inject
@HiltViewModel
internal class PRXViewModel @Inject constructor(
private val repository: PRXRepository,
private val serviceManager: ServiceManager,
private val navigationManager: NavigationManager
) : ViewModel() {
@@ -38,6 +35,14 @@ internal class PRXViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, PRX_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
}
}.launchIn(viewModelScope)
repository.status.onEach {
if (it == BleManagerStatus.DISCONNECTED) {
navigationManager.navigateUp()
@@ -45,6 +50,13 @@ internal class PRXViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> serviceManager.startService(PRXService::class.java, args.getDevice())
}.exhaustive
}
fun onEvent(event: PRXScreenViewEvent) {
when (event) {
DisconnectEvent -> onDisconnectButtonClick()

View File

@@ -9,6 +9,7 @@ dependencies {
implementation libs.nordic.ble.common
implementation libs.nordic.log
implementation libs.nordic.ui.scanner
implementation libs.nordic.navigation
implementation libs.bundles.compose

View File

@@ -1,15 +1,11 @@
package no.nordicsemi.android.rscs.view
import android.content.Intent
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.rscs.R
import no.nordicsemi.android.rscs.service.RSCSService
import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel
import no.nordicsemi.android.theme.view.BackIconAppBar
import no.nordicsemi.android.theme.view.DeviceConnectingView
@@ -20,24 +16,13 @@ fun RSCSScreen() {
val viewModel: RSCSViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
val context = LocalContext.current
LaunchedEffect(Unit) {
val intent = Intent(context, RSCSService::class.java)
context.startService(intent)
}
RSCSView(state) { viewModel.onEvent(it) }
}
@Composable
private fun RSCSView(state: RSCSViewState, onEvent: (RSCScreenViewEvent) -> Unit) {
Column {
BackIconAppBar(stringResource(id = R.string.rscs_title)) {
onEvent(DisconnectEvent)
viewModel.onEvent(DisconnectEvent)
}
when (state) {
is DisplayDataState -> RSCSContentView(state.data) { onEvent(it) }
is DisplayDataState -> RSCSContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}

View File

@@ -3,24 +3,26 @@ package no.nordicsemi.android.rscs.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import no.nordicsemi.android.navigation.NavigationManager
import kotlinx.coroutines.flow.*
import no.nordicsemi.android.navigation.*
import no.nordicsemi.android.rscs.data.RSCSRepository
import no.nordicsemi.android.rscs.service.RSCSService
import no.nordicsemi.android.rscs.service.RSCS_SERVICE_UUID
import no.nordicsemi.android.rscs.view.DisconnectEvent
import no.nordicsemi.android.rscs.view.DisplayDataState
import no.nordicsemi.android.rscs.view.LoadingState
import no.nordicsemi.android.rscs.view.RSCScreenViewEvent
import no.nordicsemi.android.service.BleManagerStatus
import no.nordicsemi.android.service.ServiceManager
import no.nordicsemi.android.utils.exhaustive
import no.nordicsemi.android.utils.getDevice
import no.nordicsemi.ui.scanner.ScannerDestinationId
import javax.inject.Inject
@HiltViewModel
internal class RSCSViewModel @Inject constructor(
private val repository: RSCSRepository,
private val serviceManager: ServiceManager,
private val navigationManager: NavigationManager
) : ViewModel() {
@@ -33,6 +35,14 @@ internal class RSCSViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, RSCS_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
}
}.launchIn(viewModelScope)
repository.status.onEach {
if (it == BleManagerStatus.DISCONNECTED) {
navigationManager.navigateUp()
@@ -40,6 +50,13 @@ internal class RSCSViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> serviceManager.startService(RSCSService::class.java, args.getDevice())
}.exhaustive
}
fun onEvent(event: RSCScreenViewEvent) {
when (event) {
DisconnectEvent -> onDisconnectButtonClick()

View File

@@ -10,6 +10,7 @@ dependencies {
implementation libs.nordic.log
implementation libs.nordic.theme
implementation libs.nordic.ui.scanner
implementation libs.nordic.navigation
implementation libs.bundles.compose

View File

@@ -1,17 +1,13 @@
package no.nordicsemi.android.uart.view
import android.content.Intent
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import no.nordicsemi.android.theme.view.BackIconAppBar
import no.nordicsemi.android.theme.view.DeviceConnectingView
import no.nordicsemi.android.uart.R
import no.nordicsemi.android.uart.repository.UARTService
import no.nordicsemi.android.uart.viewmodel.UARTViewModel
import no.nordicsemi.android.utils.exhaustive
@@ -20,24 +16,13 @@ fun UARTScreen() {
val viewModel: UARTViewModel = hiltViewModel()
val state = viewModel.state.collectAsState().value
val context = LocalContext.current
LaunchedEffect(Unit) {
val intent = Intent(context, UARTService::class.java)
context.startService(intent)
}
UARTView(state) { viewModel.onEvent(it) }
}
@Composable
private fun UARTView(state: UARTViewState, onEvent: (UARTViewEvent) -> Unit) {
Column {
BackIconAppBar(stringResource(id = R.string.uart_title)) {
onEvent(OnDisconnectButtonClick)
viewModel.onEvent(OnDisconnectButtonClick)
}
when (state) {
is DisplayDataState -> UARTContentView(state.data) { onEvent(it) }
is DisplayDataState -> UARTContentView(state.data) { viewModel.onEvent(it) }
LoadingState -> DeviceConnectingView()
}.exhaustive
}

View File

@@ -3,29 +3,25 @@ package no.nordicsemi.android.uart.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import no.nordicsemi.android.navigation.NavigationManager
import kotlinx.coroutines.flow.*
import no.nordicsemi.android.navigation.*
import no.nordicsemi.android.service.BleManagerStatus
import no.nordicsemi.android.service.ServiceManager
import no.nordicsemi.android.uart.data.DisconnectCommand
import no.nordicsemi.android.uart.data.SendTextCommand
import no.nordicsemi.android.uart.data.UARTRepository
import no.nordicsemi.android.uart.view.DisplayDataState
import no.nordicsemi.android.uart.view.LoadingState
import no.nordicsemi.android.uart.view.OnCreateMacro
import no.nordicsemi.android.uart.view.OnDeleteMacro
import no.nordicsemi.android.uart.view.OnDisconnectButtonClick
import no.nordicsemi.android.uart.view.OnRunMacro
import no.nordicsemi.android.uart.view.UARTViewEvent
import no.nordicsemi.android.uart.repository.UARTService
import no.nordicsemi.android.uart.repository.UART_SERVICE_UUID
import no.nordicsemi.android.uart.view.*
import no.nordicsemi.android.utils.exhaustive
import no.nordicsemi.android.utils.getDevice
import no.nordicsemi.ui.scanner.ScannerDestinationId
import javax.inject.Inject
@HiltViewModel
internal class UARTViewModel @Inject constructor(
private val repository: UARTRepository,
private val serviceManager: ServiceManager,
private val navigationManager: NavigationManager
) : ViewModel() {
@@ -38,6 +34,14 @@ internal class UARTViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
init {
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, UART_SERVICE_UUID))
navigationManager.recentResult.onEach {
if (it.destinationId == ScannerDestinationId) {
handleArgs(it)
}
}.launchIn(viewModelScope)
repository.status.onEach {
if (it == BleManagerStatus.DISCONNECTED) {
navigationManager.navigateUp()
@@ -45,6 +49,13 @@ internal class UARTViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
private fun handleArgs(args: DestinationResult) {
when (args) {
is CancelDestinationResult -> navigationManager.navigateUp()
is SuccessDestinationResult -> serviceManager.startService(UARTService::class.java, args.getDevice())
}.exhaustive
}
fun onEvent(event: UARTViewEvent) {
when (event) {
is OnCreateMacro -> repository.addNewMacro(event.macro)