mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2025-12-19 15:34:26 +01:00
Fix navigation.
This commit is contained in:
@@ -35,6 +35,7 @@ import kotlinx.coroutines.flow.asStateFlow
|
|||||||
import no.nordicsemi.android.ble.BleManager
|
import no.nordicsemi.android.ble.BleManager
|
||||||
import no.nordicsemi.android.log.ILogSession
|
import no.nordicsemi.android.log.ILogSession
|
||||||
import no.nordicsemi.android.log.Logger
|
import no.nordicsemi.android.log.Logger
|
||||||
|
import no.nordicsemi.ui.scanner.DiscoveredBluetoothDevice
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
abstract class BleProfileService : Service() {
|
abstract class BleProfileService : Service() {
|
||||||
@@ -104,7 +105,9 @@ abstract class BleProfileService : Service() {
|
|||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
super.onStartCommand(intent, flags, startId)
|
super.onStartCommand(intent, flags, startId)
|
||||||
|
|
||||||
manager.connect(intent!!.getParcelableExtra(DEVICE_DATA)!!)
|
val device = intent!!.getParcelableExtra<DiscoveredBluetoothDevice>(DEVICE_DATA)!!.device
|
||||||
|
|
||||||
|
manager.connect(device)
|
||||||
.useAutoConnect(shouldAutoConnect())
|
.useAutoConnect(shouldAutoConnect())
|
||||||
.retry(3, 100)
|
.retry(3, 100)
|
||||||
.enqueue()
|
.enqueue()
|
||||||
|
|||||||
@@ -13,5 +13,5 @@
|
|||||||
|
|
||||||
<string name="device_connecting">Connecting</string>
|
<string name="device_connecting">Connecting</string>
|
||||||
<string name="device_explanation">The mobile is trying to connect to peripheral device.</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>
|
</resources>
|
||||||
@@ -2,7 +2,6 @@ package no.nordicsemi.android.bps.view
|
|||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
@@ -17,22 +16,13 @@ fun BPSScreen() {
|
|||||||
val viewModel: BPSViewModel = hiltViewModel()
|
val viewModel: BPSViewModel = hiltViewModel()
|
||||||
val state = viewModel.state.collectAsState().value
|
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 {
|
Column {
|
||||||
BackIconAppBar(stringResource(id = R.string.bps_title)) {
|
BackIconAppBar(stringResource(id = R.string.bps_title)) {
|
||||||
onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> BPSContentView(state.data) { onEvent(it) }
|
is DisplayDataState -> BPSContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,10 @@ import android.bluetooth.BluetoothDevice
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.flow.combine
|
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.flow.stateIn
|
|
||||||
import no.nordicsemi.android.bps.data.BPSRepository
|
import no.nordicsemi.android.bps.data.BPSRepository
|
||||||
import no.nordicsemi.android.bps.repository.BPSManager
|
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.BPSScreenViewEvent
|
||||||
import no.nordicsemi.android.bps.view.DisconnectEvent
|
import no.nordicsemi.android.bps.view.DisconnectEvent
|
||||||
import no.nordicsemi.android.bps.view.DisplayDataState
|
import no.nordicsemi.android.bps.view.DisplayDataState
|
||||||
@@ -40,6 +37,8 @@ internal class BPSViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, BPS_SERVICE_UUID))
|
||||||
|
|
||||||
navigationManager.recentResult.onEach {
|
navigationManager.recentResult.onEach {
|
||||||
if (it.destinationId == ScannerDestinationId) {
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
handleArgs(it)
|
handleArgs(it)
|
||||||
@@ -70,11 +69,10 @@ internal class BPSViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.launchIn(viewModelScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleArgs(args: DestinationResult?) {
|
private fun handleArgs(args: DestinationResult) {
|
||||||
when (args) {
|
when (args) {
|
||||||
is CancelDestinationResult -> navigationManager.navigateUp()
|
is CancelDestinationResult -> navigationManager.navigateUp()
|
||||||
is SuccessDestinationResult -> connectDevice(args.getDevice())
|
is SuccessDestinationResult -> connectDevice(args.getDevice())
|
||||||
null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID))
|
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation libs.nordic.log
|
implementation libs.nordic.log
|
||||||
implementation libs.nordic.theme
|
implementation libs.nordic.theme
|
||||||
|
implementation libs.nordic.ui.scanner
|
||||||
implementation libs.nordic.navigation
|
implementation libs.nordic.navigation
|
||||||
|
|
||||||
implementation libs.bundles.compose
|
implementation libs.bundles.compose
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
package no.nordicsemi.android.cgms.view
|
package no.nordicsemi.android.cgms.view
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.cgms.R
|
import no.nordicsemi.android.cgms.R
|
||||||
import no.nordicsemi.android.cgms.repository.CGMService
|
|
||||||
import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel
|
import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
import no.nordicsemi.android.theme.view.BackIconAppBar
|
||||||
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
||||||
@@ -20,28 +16,14 @@ fun CGMScreen() {
|
|||||||
val viewModel: CGMScreenViewModel = hiltViewModel()
|
val viewModel: CGMScreenViewModel = hiltViewModel()
|
||||||
val state = viewModel.state.collectAsState().value
|
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 {
|
Column {
|
||||||
BackIconAppBar(stringResource(id = R.string.cgms_title)) {
|
BackIconAppBar(stringResource(id = R.string.cgms_title)) {
|
||||||
onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> CGMContentView(state.data, onEvent)
|
is DisplayDataState -> CGMContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,26 +3,24 @@ package no.nordicsemi.android.cgms.viewmodel
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.flow.combine
|
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.flow.stateIn
|
|
||||||
import no.nordicsemi.android.cgms.data.CGMRepository
|
import no.nordicsemi.android.cgms.data.CGMRepository
|
||||||
import no.nordicsemi.android.cgms.data.CGMServiceCommand
|
import no.nordicsemi.android.cgms.data.CGMServiceCommand
|
||||||
import no.nordicsemi.android.cgms.view.CGMViewEvent
|
import no.nordicsemi.android.cgms.repository.CGMS_SERVICE_UUID
|
||||||
import no.nordicsemi.android.cgms.view.DisconnectEvent
|
import no.nordicsemi.android.cgms.repository.CGMService
|
||||||
import no.nordicsemi.android.cgms.view.DisplayDataState
|
import no.nordicsemi.android.cgms.view.*
|
||||||
import no.nordicsemi.android.cgms.view.LoadingState
|
import no.nordicsemi.android.navigation.*
|
||||||
import no.nordicsemi.android.cgms.view.OnWorkingModeSelected
|
|
||||||
import no.nordicsemi.android.navigation.NavigationManager
|
|
||||||
import no.nordicsemi.android.service.BleManagerStatus
|
import no.nordicsemi.android.service.BleManagerStatus
|
||||||
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
|
import no.nordicsemi.android.utils.getDevice
|
||||||
|
import no.nordicsemi.ui.scanner.ScannerDestinationId
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
internal class CGMScreenViewModel @Inject constructor(
|
internal class CGMScreenViewModel @Inject constructor(
|
||||||
private val repository: CGMRepository,
|
private val repository: CGMRepository,
|
||||||
|
private val serviceManager: ServiceManager,
|
||||||
private val navigationManager: NavigationManager
|
private val navigationManager: NavigationManager
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
@@ -35,6 +33,14 @@ internal class CGMScreenViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CGMS_SERVICE_UUID))
|
||||||
|
|
||||||
|
navigationManager.recentResult.onEach {
|
||||||
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
|
handleArgs(it)
|
||||||
|
}
|
||||||
|
}.launchIn(viewModelScope)
|
||||||
|
|
||||||
repository.status.onEach {
|
repository.status.onEach {
|
||||||
if (it == BleManagerStatus.DISCONNECTED) {
|
if (it == BleManagerStatus.DISCONNECTED) {
|
||||||
navigationManager.navigateUp()
|
navigationManager.navigateUp()
|
||||||
@@ -42,6 +48,13 @@ internal class CGMScreenViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.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) {
|
fun onEvent(event: CGMViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> disconnect()
|
DisconnectEvent -> disconnect()
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ internal class CSCViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CSC_SERVICE_UUID))
|
||||||
|
|
||||||
navigationManager.recentResult.onEach {
|
navigationManager.recentResult.onEach {
|
||||||
if (it.destinationId == ScannerDestinationId) {
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
handleArgs(it)
|
handleArgs(it)
|
||||||
@@ -47,11 +49,10 @@ internal class CSCViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.launchIn(viewModelScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleArgs(args: DestinationResult?) {
|
private fun handleArgs(args: DestinationResult) {
|
||||||
when (args) {
|
when (args) {
|
||||||
is CancelDestinationResult -> navigationManager.navigateUp()
|
is CancelDestinationResult -> navigationManager.navigateUp()
|
||||||
is SuccessDestinationResult -> serviceManager.startService(CSCService::class.java, args.getDevice())
|
is SuccessDestinationResult -> serviceManager.startService(CSCService::class.java, args.getDevice())
|
||||||
null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CSC_SERVICE_UUID))
|
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.gls.R
|
import no.nordicsemi.android.gls.R
|
||||||
import no.nordicsemi.android.gls.viewmodel.DisconnectEvent
|
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.gls.viewmodel.GLSViewModel
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
import no.nordicsemi.android.theme.view.BackIconAppBar
|
||||||
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
||||||
@@ -21,20 +20,13 @@ fun GLSScreen() {
|
|||||||
|
|
||||||
Log.d("AAATESTAAA", "$viewModel") //TODO fix screen rotation
|
Log.d("AAATESTAAA", "$viewModel") //TODO fix screen rotation
|
||||||
|
|
||||||
GLSView(state) {
|
|
||||||
viewModel.onEvent(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
private fun GLSView(state: GLSViewState, onEvent: (GLSScreenViewEvent) -> Unit) {
|
|
||||||
Column {
|
Column {
|
||||||
BackIconAppBar(stringResource(id = R.string.gls_title)) {
|
BackIconAppBar(stringResource(id = R.string.gls_title)) {
|
||||||
onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> GLSContentView(state.data, onEvent)
|
is DisplayDataState -> GLSContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ internal class GLSViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID))
|
||||||
|
|
||||||
navigationManager.recentResult.onEach {
|
navigationManager.recentResult.onEach {
|
||||||
if (it.destinationId == ScannerDestinationId) {
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
handleArgs(it)
|
handleArgs(it)
|
||||||
@@ -66,11 +68,10 @@ internal class GLSViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.launchIn(viewModelScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleArgs(args: DestinationResult?) {
|
private fun handleArgs(args: DestinationResult) {
|
||||||
when (args) {
|
when (args) {
|
||||||
is CancelDestinationResult -> navigationManager.navigateUp()
|
is CancelDestinationResult -> navigationManager.navigateUp()
|
||||||
is SuccessDestinationResult -> connectDevice(args.getDevice())
|
is SuccessDestinationResult -> connectDevice(args.getDevice())
|
||||||
null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID))
|
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation libs.nordic.ble.common
|
implementation libs.nordic.ble.common
|
||||||
implementation libs.nordic.navigation
|
implementation libs.nordic.navigation
|
||||||
|
implementation libs.nordic.ui.scanner
|
||||||
|
|
||||||
implementation libs.nordic.log
|
implementation libs.nordic.log
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
package no.nordicsemi.android.hrs.view
|
package no.nordicsemi.android.hrs.view
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.hrs.R
|
import no.nordicsemi.android.hrs.R
|
||||||
import no.nordicsemi.android.hrs.service.HRSService
|
|
||||||
import no.nordicsemi.android.hrs.viewmodel.HRSViewModel
|
import no.nordicsemi.android.hrs.viewmodel.HRSViewModel
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
import no.nordicsemi.android.theme.view.BackIconAppBar
|
||||||
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
||||||
@@ -20,24 +16,13 @@ fun HRSScreen() {
|
|||||||
val viewModel: HRSViewModel = hiltViewModel()
|
val viewModel: HRSViewModel = hiltViewModel()
|
||||||
val state = viewModel.state.collectAsState().value
|
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 {
|
Column {
|
||||||
BackIconAppBar(stringResource(id = R.string.hrs_title)) {
|
BackIconAppBar(stringResource(id = R.string.hrs_title)) {
|
||||||
onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> HRSContentView(state.data) { onEvent(it) }
|
is DisplayDataState -> HRSContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,25 +3,23 @@ package no.nordicsemi.android.hrs.viewmodel
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.flow.combine
|
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.flow.stateIn
|
|
||||||
import no.nordicsemi.android.hrs.data.HRSRepository
|
import no.nordicsemi.android.hrs.data.HRSRepository
|
||||||
import no.nordicsemi.android.hrs.view.DisconnectEvent
|
import no.nordicsemi.android.hrs.service.HRSService
|
||||||
import no.nordicsemi.android.hrs.view.DisplayDataState
|
import no.nordicsemi.android.hrs.service.HRS_SERVICE_UUID
|
||||||
import no.nordicsemi.android.hrs.view.HRSScreenViewEvent
|
import no.nordicsemi.android.hrs.view.*
|
||||||
import no.nordicsemi.android.hrs.view.LoadingState
|
import no.nordicsemi.android.navigation.*
|
||||||
import no.nordicsemi.android.hrs.view.NavigateUpEvent
|
|
||||||
import no.nordicsemi.android.navigation.NavigationManager
|
|
||||||
import no.nordicsemi.android.service.BleManagerStatus
|
import no.nordicsemi.android.service.BleManagerStatus
|
||||||
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
|
import no.nordicsemi.android.utils.getDevice
|
||||||
|
import no.nordicsemi.ui.scanner.ScannerDestinationId
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
internal class HRSViewModel @Inject constructor(
|
internal class HRSViewModel @Inject constructor(
|
||||||
private val repository: HRSRepository,
|
private val repository: HRSRepository,
|
||||||
|
private val serviceManager: ServiceManager,
|
||||||
private val navigationManager: NavigationManager
|
private val navigationManager: NavigationManager
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
@@ -34,6 +32,14 @@ internal class HRSViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, HRS_SERVICE_UUID))
|
||||||
|
|
||||||
|
navigationManager.recentResult.onEach {
|
||||||
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
|
handleArgs(it)
|
||||||
|
}
|
||||||
|
}.launchIn(viewModelScope)
|
||||||
|
|
||||||
repository.status.onEach {
|
repository.status.onEach {
|
||||||
if (it == BleManagerStatus.DISCONNECTED) {
|
if (it == BleManagerStatus.DISCONNECTED) {
|
||||||
navigationManager.navigateUp()
|
navigationManager.navigateUp()
|
||||||
@@ -41,6 +47,13 @@ internal class HRSViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.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) {
|
fun onEvent(event: HRSScreenViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> onDisconnectButtonClick()
|
DisconnectEvent -> onDisconnectButtonClick()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation libs.nordic.log
|
implementation libs.nordic.log
|
||||||
implementation libs.nordic.theme
|
implementation libs.nordic.theme
|
||||||
|
implementation libs.nordic.ui.scanner
|
||||||
implementation libs.nordic.navigation
|
implementation libs.nordic.navigation
|
||||||
|
|
||||||
implementation libs.bundles.compose
|
implementation libs.bundles.compose
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
package no.nordicsemi.android.hts.view
|
package no.nordicsemi.android.hts.view
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.hts.R
|
import no.nordicsemi.android.hts.R
|
||||||
import no.nordicsemi.android.hts.repository.HTSService
|
|
||||||
import no.nordicsemi.android.hts.viewmodel.HTSViewModel
|
import no.nordicsemi.android.hts.viewmodel.HTSViewModel
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
import no.nordicsemi.android.theme.view.BackIconAppBar
|
||||||
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
||||||
@@ -20,24 +16,13 @@ fun HTSScreen() {
|
|||||||
val viewModel: HTSViewModel = hiltViewModel()
|
val viewModel: HTSViewModel = hiltViewModel()
|
||||||
val state = viewModel.state.collectAsState().value
|
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 {
|
Column {
|
||||||
BackIconAppBar(stringResource(id = R.string.hts_title)) {
|
BackIconAppBar(stringResource(id = R.string.hts_title)) {
|
||||||
onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> HTSContentView(state.data) { onEvent(it) }
|
is DisplayDataState -> HTSContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,25 +3,23 @@ package no.nordicsemi.android.hts.viewmodel
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.flow.combine
|
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.flow.stateIn
|
|
||||||
import no.nordicsemi.android.hts.data.HTSRepository
|
import no.nordicsemi.android.hts.data.HTSRepository
|
||||||
import no.nordicsemi.android.hts.view.DisconnectEvent
|
import no.nordicsemi.android.hts.repository.HTSService
|
||||||
import no.nordicsemi.android.hts.view.DisplayDataState
|
import no.nordicsemi.android.hts.repository.HTS_SERVICE_UUID
|
||||||
import no.nordicsemi.android.hts.view.HTSScreenViewEvent
|
import no.nordicsemi.android.hts.view.*
|
||||||
import no.nordicsemi.android.hts.view.LoadingState
|
import no.nordicsemi.android.navigation.*
|
||||||
import no.nordicsemi.android.hts.view.OnTemperatureUnitSelected
|
|
||||||
import no.nordicsemi.android.navigation.NavigationManager
|
|
||||||
import no.nordicsemi.android.service.BleManagerStatus
|
import no.nordicsemi.android.service.BleManagerStatus
|
||||||
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
|
import no.nordicsemi.android.utils.getDevice
|
||||||
|
import no.nordicsemi.ui.scanner.ScannerDestinationId
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
internal class HTSViewModel @Inject constructor(
|
internal class HTSViewModel @Inject constructor(
|
||||||
private val repository: HTSRepository,
|
private val repository: HTSRepository,
|
||||||
|
private val serviceManager: ServiceManager,
|
||||||
private val navigationManager: NavigationManager
|
private val navigationManager: NavigationManager
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
@@ -34,6 +32,14 @@ internal class HTSViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, HTS_SERVICE_UUID))
|
||||||
|
|
||||||
|
navigationManager.recentResult.onEach {
|
||||||
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
|
handleArgs(it)
|
||||||
|
}
|
||||||
|
}.launchIn(viewModelScope)
|
||||||
|
|
||||||
repository.status.onEach {
|
repository.status.onEach {
|
||||||
if (it == BleManagerStatus.DISCONNECTED) {
|
if (it == BleManagerStatus.DISCONNECTED) {
|
||||||
navigationManager.navigateUp()
|
navigationManager.navigateUp()
|
||||||
@@ -41,6 +47,13 @@ internal class HTSViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.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) {
|
fun onEvent(event: HTSScreenViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> onDisconnectButtonClick()
|
DisconnectEvent -> onDisconnectButtonClick()
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ dependencies {
|
|||||||
implementation libs.nordic.ble.common
|
implementation libs.nordic.ble.common
|
||||||
|
|
||||||
implementation libs.nordic.log
|
implementation libs.nordic.log
|
||||||
|
implementation libs.nordic.ui.scanner
|
||||||
implementation libs.nordic.navigation
|
implementation libs.nordic.navigation
|
||||||
|
|
||||||
implementation libs.bundles.compose
|
implementation libs.bundles.compose
|
||||||
|
|||||||
@@ -1,16 +1,12 @@
|
|||||||
package no.nordicsemi.android.prx.view
|
package no.nordicsemi.android.prx.view
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.prx.R
|
import no.nordicsemi.android.prx.R
|
||||||
import no.nordicsemi.android.prx.service.PRXService
|
|
||||||
import no.nordicsemi.android.prx.viewmodel.PRXViewModel
|
import no.nordicsemi.android.prx.viewmodel.PRXViewModel
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
import no.nordicsemi.android.theme.view.BackIconAppBar
|
||||||
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
||||||
@@ -21,24 +17,13 @@ fun PRXScreen() {
|
|||||||
val viewModel: PRXViewModel = hiltViewModel()
|
val viewModel: PRXViewModel = hiltViewModel()
|
||||||
val state = viewModel.state.collectAsState().value
|
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) {
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
BackIconAppBar(stringResource(id = R.string.prx_title)) {
|
BackIconAppBar(stringResource(id = R.string.prx_title)) {
|
||||||
onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> ContentView(state.data) { onEvent(it) }
|
is DisplayDataState -> ContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,29 +3,26 @@ package no.nordicsemi.android.prx.viewmodel
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.flow.combine
|
import no.nordicsemi.android.navigation.*
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.flow.stateIn
|
|
||||||
import no.nordicsemi.android.navigation.NavigationManager
|
|
||||||
import no.nordicsemi.android.prx.data.DisableAlarm
|
import no.nordicsemi.android.prx.data.DisableAlarm
|
||||||
import no.nordicsemi.android.prx.data.Disconnect
|
import no.nordicsemi.android.prx.data.Disconnect
|
||||||
import no.nordicsemi.android.prx.data.EnableAlarm
|
import no.nordicsemi.android.prx.data.EnableAlarm
|
||||||
import no.nordicsemi.android.prx.data.PRXRepository
|
import no.nordicsemi.android.prx.data.PRXRepository
|
||||||
import no.nordicsemi.android.prx.view.DisconnectEvent
|
import no.nordicsemi.android.prx.service.PRXService
|
||||||
import no.nordicsemi.android.prx.view.DisplayDataState
|
import no.nordicsemi.android.prx.service.PRX_SERVICE_UUID
|
||||||
import no.nordicsemi.android.prx.view.LoadingState
|
import no.nordicsemi.android.prx.view.*
|
||||||
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.service.BleManagerStatus
|
import no.nordicsemi.android.service.BleManagerStatus
|
||||||
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
|
import no.nordicsemi.android.utils.getDevice
|
||||||
|
import no.nordicsemi.ui.scanner.ScannerDestinationId
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
internal class PRXViewModel @Inject constructor(
|
internal class PRXViewModel @Inject constructor(
|
||||||
private val repository: PRXRepository,
|
private val repository: PRXRepository,
|
||||||
|
private val serviceManager: ServiceManager,
|
||||||
private val navigationManager: NavigationManager
|
private val navigationManager: NavigationManager
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
@@ -38,6 +35,14 @@ internal class PRXViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, PRX_SERVICE_UUID))
|
||||||
|
|
||||||
|
navigationManager.recentResult.onEach {
|
||||||
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
|
handleArgs(it)
|
||||||
|
}
|
||||||
|
}.launchIn(viewModelScope)
|
||||||
|
|
||||||
repository.status.onEach {
|
repository.status.onEach {
|
||||||
if (it == BleManagerStatus.DISCONNECTED) {
|
if (it == BleManagerStatus.DISCONNECTED) {
|
||||||
navigationManager.navigateUp()
|
navigationManager.navigateUp()
|
||||||
@@ -45,6 +50,13 @@ internal class PRXViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.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) {
|
fun onEvent(event: PRXScreenViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> onDisconnectButtonClick()
|
DisconnectEvent -> onDisconnectButtonClick()
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ dependencies {
|
|||||||
implementation libs.nordic.ble.common
|
implementation libs.nordic.ble.common
|
||||||
|
|
||||||
implementation libs.nordic.log
|
implementation libs.nordic.log
|
||||||
|
implementation libs.nordic.ui.scanner
|
||||||
implementation libs.nordic.navigation
|
implementation libs.nordic.navigation
|
||||||
|
|
||||||
implementation libs.bundles.compose
|
implementation libs.bundles.compose
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
package no.nordicsemi.android.rscs.view
|
package no.nordicsemi.android.rscs.view
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.rscs.R
|
import no.nordicsemi.android.rscs.R
|
||||||
import no.nordicsemi.android.rscs.service.RSCSService
|
|
||||||
import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel
|
import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
import no.nordicsemi.android.theme.view.BackIconAppBar
|
||||||
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
||||||
@@ -20,24 +16,13 @@ fun RSCSScreen() {
|
|||||||
val viewModel: RSCSViewModel = hiltViewModel()
|
val viewModel: RSCSViewModel = hiltViewModel()
|
||||||
val state = viewModel.state.collectAsState().value
|
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 {
|
Column {
|
||||||
BackIconAppBar(stringResource(id = R.string.rscs_title)) {
|
BackIconAppBar(stringResource(id = R.string.rscs_title)) {
|
||||||
onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> RSCSContentView(state.data) { onEvent(it) }
|
is DisplayDataState -> RSCSContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,24 +3,26 @@ package no.nordicsemi.android.rscs.viewmodel
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.flow.combine
|
import no.nordicsemi.android.navigation.*
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.flow.stateIn
|
|
||||||
import no.nordicsemi.android.navigation.NavigationManager
|
|
||||||
import no.nordicsemi.android.rscs.data.RSCSRepository
|
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.DisconnectEvent
|
||||||
import no.nordicsemi.android.rscs.view.DisplayDataState
|
import no.nordicsemi.android.rscs.view.DisplayDataState
|
||||||
import no.nordicsemi.android.rscs.view.LoadingState
|
import no.nordicsemi.android.rscs.view.LoadingState
|
||||||
import no.nordicsemi.android.rscs.view.RSCScreenViewEvent
|
import no.nordicsemi.android.rscs.view.RSCScreenViewEvent
|
||||||
import no.nordicsemi.android.service.BleManagerStatus
|
import no.nordicsemi.android.service.BleManagerStatus
|
||||||
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
|
import no.nordicsemi.android.utils.getDevice
|
||||||
|
import no.nordicsemi.ui.scanner.ScannerDestinationId
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
internal class RSCSViewModel @Inject constructor(
|
internal class RSCSViewModel @Inject constructor(
|
||||||
private val repository: RSCSRepository,
|
private val repository: RSCSRepository,
|
||||||
|
private val serviceManager: ServiceManager,
|
||||||
private val navigationManager: NavigationManager
|
private val navigationManager: NavigationManager
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
@@ -33,6 +35,14 @@ internal class RSCSViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, RSCS_SERVICE_UUID))
|
||||||
|
|
||||||
|
navigationManager.recentResult.onEach {
|
||||||
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
|
handleArgs(it)
|
||||||
|
}
|
||||||
|
}.launchIn(viewModelScope)
|
||||||
|
|
||||||
repository.status.onEach {
|
repository.status.onEach {
|
||||||
if (it == BleManagerStatus.DISCONNECTED) {
|
if (it == BleManagerStatus.DISCONNECTED) {
|
||||||
navigationManager.navigateUp()
|
navigationManager.navigateUp()
|
||||||
@@ -40,6 +50,13 @@ internal class RSCSViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.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) {
|
fun onEvent(event: RSCScreenViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> onDisconnectButtonClick()
|
DisconnectEvent -> onDisconnectButtonClick()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation libs.nordic.log
|
implementation libs.nordic.log
|
||||||
implementation libs.nordic.theme
|
implementation libs.nordic.theme
|
||||||
|
implementation libs.nordic.ui.scanner
|
||||||
implementation libs.nordic.navigation
|
implementation libs.nordic.navigation
|
||||||
|
|
||||||
implementation libs.bundles.compose
|
implementation libs.bundles.compose
|
||||||
|
|||||||
@@ -1,17 +1,13 @@
|
|||||||
package no.nordicsemi.android.uart.view
|
package no.nordicsemi.android.uart.view
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
import no.nordicsemi.android.theme.view.BackIconAppBar
|
||||||
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
import no.nordicsemi.android.theme.view.DeviceConnectingView
|
||||||
import no.nordicsemi.android.uart.R
|
import no.nordicsemi.android.uart.R
|
||||||
import no.nordicsemi.android.uart.repository.UARTService
|
|
||||||
import no.nordicsemi.android.uart.viewmodel.UARTViewModel
|
import no.nordicsemi.android.uart.viewmodel.UARTViewModel
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
|
|
||||||
@@ -20,24 +16,13 @@ fun UARTScreen() {
|
|||||||
val viewModel: UARTViewModel = hiltViewModel()
|
val viewModel: UARTViewModel = hiltViewModel()
|
||||||
val state = viewModel.state.collectAsState().value
|
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 {
|
Column {
|
||||||
BackIconAppBar(stringResource(id = R.string.uart_title)) {
|
BackIconAppBar(stringResource(id = R.string.uart_title)) {
|
||||||
onEvent(OnDisconnectButtonClick)
|
viewModel.onEvent(OnDisconnectButtonClick)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
is DisplayDataState -> UARTContentView(state.data) { onEvent(it) }
|
is DisplayDataState -> UARTContentView(state.data) { viewModel.onEvent(it) }
|
||||||
LoadingState -> DeviceConnectingView()
|
LoadingState -> DeviceConnectingView()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,29 +3,25 @@ package no.nordicsemi.android.uart.viewmodel
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.flow.combine
|
import no.nordicsemi.android.navigation.*
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.flow.stateIn
|
|
||||||
import no.nordicsemi.android.navigation.NavigationManager
|
|
||||||
import no.nordicsemi.android.service.BleManagerStatus
|
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.DisconnectCommand
|
||||||
import no.nordicsemi.android.uart.data.SendTextCommand
|
import no.nordicsemi.android.uart.data.SendTextCommand
|
||||||
import no.nordicsemi.android.uart.data.UARTRepository
|
import no.nordicsemi.android.uart.data.UARTRepository
|
||||||
import no.nordicsemi.android.uart.view.DisplayDataState
|
import no.nordicsemi.android.uart.repository.UARTService
|
||||||
import no.nordicsemi.android.uart.view.LoadingState
|
import no.nordicsemi.android.uart.repository.UART_SERVICE_UUID
|
||||||
import no.nordicsemi.android.uart.view.OnCreateMacro
|
import no.nordicsemi.android.uart.view.*
|
||||||
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.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
|
import no.nordicsemi.android.utils.getDevice
|
||||||
|
import no.nordicsemi.ui.scanner.ScannerDestinationId
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
internal class UARTViewModel @Inject constructor(
|
internal class UARTViewModel @Inject constructor(
|
||||||
private val repository: UARTRepository,
|
private val repository: UARTRepository,
|
||||||
|
private val serviceManager: ServiceManager,
|
||||||
private val navigationManager: NavigationManager
|
private val navigationManager: NavigationManager
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
@@ -38,6 +34,14 @@ internal class UARTViewModel @Inject constructor(
|
|||||||
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
}.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, UART_SERVICE_UUID))
|
||||||
|
|
||||||
|
navigationManager.recentResult.onEach {
|
||||||
|
if (it.destinationId == ScannerDestinationId) {
|
||||||
|
handleArgs(it)
|
||||||
|
}
|
||||||
|
}.launchIn(viewModelScope)
|
||||||
|
|
||||||
repository.status.onEach {
|
repository.status.onEach {
|
||||||
if (it == BleManagerStatus.DISCONNECTED) {
|
if (it == BleManagerStatus.DISCONNECTED) {
|
||||||
navigationManager.navigateUp()
|
navigationManager.navigateUp()
|
||||||
@@ -45,6 +49,13 @@ internal class UARTViewModel @Inject constructor(
|
|||||||
}.launchIn(viewModelScope)
|
}.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) {
|
fun onEvent(event: UARTViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
is OnCreateMacro -> repository.addNewMacro(event.macro)
|
is OnCreateMacro -> repository.addNewMacro(event.macro)
|
||||||
|
|||||||
Reference in New Issue
Block a user