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.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()

View File

@@ -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>

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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
} }
} }

View File

@@ -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()

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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()

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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()

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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()

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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()

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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)