diff --git a/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt b/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt index d2755791..3ee82e82 100644 --- a/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt +++ b/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt @@ -35,6 +35,7 @@ import kotlinx.coroutines.flow.asStateFlow import no.nordicsemi.android.ble.BleManager import no.nordicsemi.android.log.ILogSession import no.nordicsemi.android.log.Logger +import no.nordicsemi.ui.scanner.DiscoveredBluetoothDevice @AndroidEntryPoint abstract class BleProfileService : Service() { @@ -104,7 +105,9 @@ abstract class BleProfileService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) - manager.connect(intent!!.getParcelableExtra(DEVICE_DATA)!!) + val device = intent!!.getParcelableExtra(DEVICE_DATA)!!.device + + manager.connect(device) .useAutoConnect(shouldAutoConnect()) .retry(3, 100) .enqueue() diff --git a/lib_theme/src/main/res/values/strings.xml b/lib_theme/src/main/res/values/strings.xml index 570f2f80..dfccbcf1 100644 --- a/lib_theme/src/main/res/values/strings.xml +++ b/lib_theme/src/main/res/values/strings.xml @@ -13,5 +13,5 @@ Connecting The mobile is trying to connect to peripheral device. - Please wait. + Please wait... \ No newline at end of file diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt index 90cc6652..2aa1861e 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt @@ -2,7 +2,6 @@ package no.nordicsemi.android.bps.view import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel @@ -17,22 +16,13 @@ fun BPSScreen() { val viewModel: BPSViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - LaunchedEffect(Unit) { - viewModel.connectDevice() - } - - BPSView(state) { viewModel.onEvent(it) } -} - -@Composable -private fun BPSView(state: BPSViewState, onEvent: (BPSScreenViewEvent) -> Unit) { Column { BackIconAppBar(stringResource(id = R.string.bps_title)) { - onEvent(DisconnectEvent) + viewModel.onEvent(DisconnectEvent) } when (state) { - is DisplayDataState -> BPSContentView(state.data) { onEvent(it) } + is DisplayDataState -> BPSContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt index 4a0b0782..2e263027 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt @@ -4,13 +4,10 @@ import android.bluetooth.BluetoothDevice import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.* import no.nordicsemi.android.bps.data.BPSRepository import no.nordicsemi.android.bps.repository.BPSManager +import no.nordicsemi.android.bps.repository.BPS_SERVICE_UUID import no.nordicsemi.android.bps.view.BPSScreenViewEvent import no.nordicsemi.android.bps.view.DisconnectEvent import no.nordicsemi.android.bps.view.DisplayDataState @@ -40,6 +37,8 @@ internal class BPSViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, BPS_SERVICE_UUID)) + navigationManager.recentResult.onEach { if (it.destinationId == ScannerDestinationId) { handleArgs(it) @@ -70,11 +69,10 @@ internal class BPSViewModel @Inject constructor( }.launchIn(viewModelScope) } - private fun handleArgs(args: DestinationResult?) { + private fun handleArgs(args: DestinationResult) { when (args) { is CancelDestinationResult -> navigationManager.navigateUp() is SuccessDestinationResult -> connectDevice(args.getDevice()) - null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID)) }.exhaustive } diff --git a/profile_cgms/build.gradle b/profile_cgms/build.gradle index 93ecd6f0..7cc4f99e 100644 --- a/profile_cgms/build.gradle +++ b/profile_cgms/build.gradle @@ -10,6 +10,7 @@ dependencies { implementation libs.nordic.log implementation libs.nordic.theme + implementation libs.nordic.ui.scanner implementation libs.nordic.navigation implementation libs.bundles.compose diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt index 37615667..35cfbe4f 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt @@ -1,15 +1,11 @@ package no.nordicsemi.android.cgms.view -import android.content.Intent import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.cgms.R -import no.nordicsemi.android.cgms.repository.CGMService import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.DeviceConnectingView @@ -20,28 +16,14 @@ fun CGMScreen() { val viewModel: CGMScreenViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - val context = LocalContext.current - LaunchedEffect(Unit) { - val intent = Intent(context, CGMService::class.java) - context.startService(intent) - } - - CGMView(state) { - viewModel.onEvent(it) - } -} - -@Composable -private fun CGMView(state: CGMViewState, onEvent: (CGMViewEvent) -> Unit) { Column { BackIconAppBar(stringResource(id = R.string.cgms_title)) { - onEvent(DisconnectEvent) + viewModel.onEvent(DisconnectEvent) } when (state) { - is DisplayDataState -> CGMContentView(state.data, onEvent) + is DisplayDataState -> CGMContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } } - diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMScreenViewModel.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMScreenViewModel.kt index f3a3e30b..84fa7f6e 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMScreenViewModel.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMScreenViewModel.kt @@ -3,26 +3,24 @@ package no.nordicsemi.android.cgms.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.* import no.nordicsemi.android.cgms.data.CGMRepository import no.nordicsemi.android.cgms.data.CGMServiceCommand -import no.nordicsemi.android.cgms.view.CGMViewEvent -import no.nordicsemi.android.cgms.view.DisconnectEvent -import no.nordicsemi.android.cgms.view.DisplayDataState -import no.nordicsemi.android.cgms.view.LoadingState -import no.nordicsemi.android.cgms.view.OnWorkingModeSelected -import no.nordicsemi.android.navigation.NavigationManager +import no.nordicsemi.android.cgms.repository.CGMS_SERVICE_UUID +import no.nordicsemi.android.cgms.repository.CGMService +import no.nordicsemi.android.cgms.view.* +import no.nordicsemi.android.navigation.* import no.nordicsemi.android.service.BleManagerStatus +import no.nordicsemi.android.service.ServiceManager import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.android.utils.getDevice +import no.nordicsemi.ui.scanner.ScannerDestinationId import javax.inject.Inject @HiltViewModel internal class CGMScreenViewModel @Inject constructor( private val repository: CGMRepository, + private val serviceManager: ServiceManager, private val navigationManager: NavigationManager ) : ViewModel() { @@ -35,6 +33,14 @@ internal class CGMScreenViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CGMS_SERVICE_UUID)) + + navigationManager.recentResult.onEach { + if (it.destinationId == ScannerDestinationId) { + handleArgs(it) + } + }.launchIn(viewModelScope) + repository.status.onEach { if (it == BleManagerStatus.DISCONNECTED) { navigationManager.navigateUp() @@ -42,6 +48,13 @@ internal class CGMScreenViewModel @Inject constructor( }.launchIn(viewModelScope) } + private fun handleArgs(args: DestinationResult) { + when (args) { + is CancelDestinationResult -> navigationManager.navigateUp() + is SuccessDestinationResult -> serviceManager.startService(CGMService::class.java, args.getDevice()) + }.exhaustive + } + fun onEvent(event: CGMViewEvent) { when (event) { DisconnectEvent -> disconnect() diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt index e124daf0..64d37fff 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt @@ -34,6 +34,8 @@ internal class CSCViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CSC_SERVICE_UUID)) + navigationManager.recentResult.onEach { if (it.destinationId == ScannerDestinationId) { handleArgs(it) @@ -47,11 +49,10 @@ internal class CSCViewModel @Inject constructor( }.launchIn(viewModelScope) } - private fun handleArgs(args: DestinationResult?) { + private fun handleArgs(args: DestinationResult) { when (args) { is CancelDestinationResult -> navigationManager.navigateUp() is SuccessDestinationResult -> serviceManager.startService(CSCService::class.java, args.getDevice()) - null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, CSC_SERVICE_UUID)) }.exhaustive } diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSScreen.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSScreen.kt index 844cb0c5..29c9a530 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSScreen.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.gls.R import no.nordicsemi.android.gls.viewmodel.DisconnectEvent -import no.nordicsemi.android.gls.viewmodel.GLSScreenViewEvent import no.nordicsemi.android.gls.viewmodel.GLSViewModel import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.DeviceConnectingView @@ -21,20 +20,13 @@ fun GLSScreen() { Log.d("AAATESTAAA", "$viewModel") //TODO fix screen rotation - GLSView(state) { - viewModel.onEvent(it) - } -} - -@Composable -private fun GLSView(state: GLSViewState, onEvent: (GLSScreenViewEvent) -> Unit) { Column { BackIconAppBar(stringResource(id = R.string.gls_title)) { - onEvent(DisconnectEvent) + viewModel.onEvent(DisconnectEvent) } when (state) { - is DisplayDataState -> GLSContentView(state.data, onEvent) + is DisplayDataState -> GLSContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/viewmodel/GLSViewModel.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/viewmodel/GLSViewModel.kt index 9148c2a8..65e8c29f 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/viewmodel/GLSViewModel.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/viewmodel/GLSViewModel.kt @@ -36,6 +36,8 @@ internal class GLSViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID)) + navigationManager.recentResult.onEach { if (it.destinationId == ScannerDestinationId) { handleArgs(it) @@ -66,11 +68,10 @@ internal class GLSViewModel @Inject constructor( }.launchIn(viewModelScope) } - private fun handleArgs(args: DestinationResult?) { + private fun handleArgs(args: DestinationResult) { when (args) { is CancelDestinationResult -> navigationManager.navigateUp() is SuccessDestinationResult -> connectDevice(args.getDevice()) - null -> navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, GLS_SERVICE_UUID)) }.exhaustive } diff --git a/profile_hrs/build.gradle b/profile_hrs/build.gradle index d4d5d476..8d0cc6e7 100644 --- a/profile_hrs/build.gradle +++ b/profile_hrs/build.gradle @@ -10,6 +10,7 @@ dependencies { implementation libs.nordic.ble.common implementation libs.nordic.navigation + implementation libs.nordic.ui.scanner implementation libs.nordic.log diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt index b2cf2880..4cbcd667 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt @@ -1,15 +1,11 @@ package no.nordicsemi.android.hrs.view -import android.content.Intent import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.hrs.R -import no.nordicsemi.android.hrs.service.HRSService import no.nordicsemi.android.hrs.viewmodel.HRSViewModel import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.DeviceConnectingView @@ -20,24 +16,13 @@ fun HRSScreen() { val viewModel: HRSViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - val context = LocalContext.current - LaunchedEffect(Unit) { - val intent = Intent(context, HRSService::class.java) - context.startService(intent) - } - - HRSView(state) { viewModel.onEvent(it) } -} - -@Composable -private fun HRSView(state: HRSViewState, onEvent: (HRSScreenViewEvent) -> Unit) { Column { BackIconAppBar(stringResource(id = R.string.hrs_title)) { - onEvent(DisconnectEvent) + viewModel.onEvent(DisconnectEvent) } when (state) { - is DisplayDataState -> HRSContentView(state.data) { onEvent(it) } + is DisplayDataState -> HRSContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt index 42ded8c1..c9003ca5 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt @@ -3,25 +3,23 @@ package no.nordicsemi.android.hrs.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.* import no.nordicsemi.android.hrs.data.HRSRepository -import no.nordicsemi.android.hrs.view.DisconnectEvent -import no.nordicsemi.android.hrs.view.DisplayDataState -import no.nordicsemi.android.hrs.view.HRSScreenViewEvent -import no.nordicsemi.android.hrs.view.LoadingState -import no.nordicsemi.android.hrs.view.NavigateUpEvent -import no.nordicsemi.android.navigation.NavigationManager +import no.nordicsemi.android.hrs.service.HRSService +import no.nordicsemi.android.hrs.service.HRS_SERVICE_UUID +import no.nordicsemi.android.hrs.view.* +import no.nordicsemi.android.navigation.* import no.nordicsemi.android.service.BleManagerStatus +import no.nordicsemi.android.service.ServiceManager import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.android.utils.getDevice +import no.nordicsemi.ui.scanner.ScannerDestinationId import javax.inject.Inject @HiltViewModel internal class HRSViewModel @Inject constructor( private val repository: HRSRepository, + private val serviceManager: ServiceManager, private val navigationManager: NavigationManager ) : ViewModel() { @@ -34,6 +32,14 @@ internal class HRSViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, HRS_SERVICE_UUID)) + + navigationManager.recentResult.onEach { + if (it.destinationId == ScannerDestinationId) { + handleArgs(it) + } + }.launchIn(viewModelScope) + repository.status.onEach { if (it == BleManagerStatus.DISCONNECTED) { navigationManager.navigateUp() @@ -41,6 +47,13 @@ internal class HRSViewModel @Inject constructor( }.launchIn(viewModelScope) } + private fun handleArgs(args: DestinationResult) { + when (args) { + is CancelDestinationResult -> navigationManager.navigateUp() + is SuccessDestinationResult -> serviceManager.startService(HRSService::class.java, args.getDevice()) + }.exhaustive + } + fun onEvent(event: HRSScreenViewEvent) { when (event) { DisconnectEvent -> onDisconnectButtonClick() diff --git a/profile_hts/build.gradle b/profile_hts/build.gradle index 93ecd6f0..7cc4f99e 100644 --- a/profile_hts/build.gradle +++ b/profile_hts/build.gradle @@ -10,6 +10,7 @@ dependencies { implementation libs.nordic.log implementation libs.nordic.theme + implementation libs.nordic.ui.scanner implementation libs.nordic.navigation implementation libs.bundles.compose diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt index 51bf987b..d2b10fbc 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt @@ -1,15 +1,11 @@ package no.nordicsemi.android.hts.view -import android.content.Intent import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.hts.R -import no.nordicsemi.android.hts.repository.HTSService import no.nordicsemi.android.hts.viewmodel.HTSViewModel import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.DeviceConnectingView @@ -20,24 +16,13 @@ fun HTSScreen() { val viewModel: HTSViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - val context = LocalContext.current - LaunchedEffect(Unit) { - val intent = Intent(context, HTSService::class.java) - context.startService(intent) - } - - HTSView(state) { viewModel.onEvent(it) } -} - -@Composable -private fun HTSView(state: HTSViewState, onEvent: (HTSScreenViewEvent) -> Unit) { Column { BackIconAppBar(stringResource(id = R.string.hts_title)) { - onEvent(DisconnectEvent) + viewModel.onEvent(DisconnectEvent) } when (state) { - is DisplayDataState -> HTSContentView(state.data) { onEvent(it) } + is DisplayDataState -> HTSContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt index 3399abc4..d0da1148 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt @@ -3,25 +3,23 @@ package no.nordicsemi.android.hts.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.* import no.nordicsemi.android.hts.data.HTSRepository -import no.nordicsemi.android.hts.view.DisconnectEvent -import no.nordicsemi.android.hts.view.DisplayDataState -import no.nordicsemi.android.hts.view.HTSScreenViewEvent -import no.nordicsemi.android.hts.view.LoadingState -import no.nordicsemi.android.hts.view.OnTemperatureUnitSelected -import no.nordicsemi.android.navigation.NavigationManager +import no.nordicsemi.android.hts.repository.HTSService +import no.nordicsemi.android.hts.repository.HTS_SERVICE_UUID +import no.nordicsemi.android.hts.view.* +import no.nordicsemi.android.navigation.* import no.nordicsemi.android.service.BleManagerStatus +import no.nordicsemi.android.service.ServiceManager import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.android.utils.getDevice +import no.nordicsemi.ui.scanner.ScannerDestinationId import javax.inject.Inject @HiltViewModel internal class HTSViewModel @Inject constructor( private val repository: HTSRepository, + private val serviceManager: ServiceManager, private val navigationManager: NavigationManager ) : ViewModel() { @@ -34,6 +32,14 @@ internal class HTSViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, HTS_SERVICE_UUID)) + + navigationManager.recentResult.onEach { + if (it.destinationId == ScannerDestinationId) { + handleArgs(it) + } + }.launchIn(viewModelScope) + repository.status.onEach { if (it == BleManagerStatus.DISCONNECTED) { navigationManager.navigateUp() @@ -41,6 +47,13 @@ internal class HTSViewModel @Inject constructor( }.launchIn(viewModelScope) } + private fun handleArgs(args: DestinationResult) { + when (args) { + is CancelDestinationResult -> navigationManager.navigateUp() + is SuccessDestinationResult -> serviceManager.startService(HTSService::class.java, args.getDevice()) + }.exhaustive + } + fun onEvent(event: HTSScreenViewEvent) { when (event) { DisconnectEvent -> onDisconnectButtonClick() diff --git a/profile_prx/build.gradle b/profile_prx/build.gradle index 857c71f1..c8350305 100644 --- a/profile_prx/build.gradle +++ b/profile_prx/build.gradle @@ -9,6 +9,7 @@ dependencies { implementation libs.nordic.ble.common implementation libs.nordic.log + implementation libs.nordic.ui.scanner implementation libs.nordic.navigation implementation libs.bundles.compose diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt index 061e5b84..80d9238f 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt @@ -1,16 +1,12 @@ package no.nordicsemi.android.prx.view -import android.content.Intent import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.prx.R -import no.nordicsemi.android.prx.service.PRXService import no.nordicsemi.android.prx.viewmodel.PRXViewModel import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.DeviceConnectingView @@ -21,24 +17,13 @@ fun PRXScreen() { val viewModel: PRXViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - val context = LocalContext.current - LaunchedEffect(Unit) { - val intent = Intent(context, PRXService::class.java) - context.startService(intent) - } - - PRXView(state) { viewModel.onEvent(it) } -} - -@Composable -private fun PRXView(state: PRXViewState, onEvent: (PRXScreenViewEvent) -> Unit) { Column(horizontalAlignment = Alignment.CenterHorizontally) { BackIconAppBar(stringResource(id = R.string.prx_title)) { - onEvent(DisconnectEvent) + viewModel.onEvent(DisconnectEvent) } when (state) { - is DisplayDataState -> ContentView(state.data) { onEvent(it) } + is DisplayDataState -> ContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt index 517e0504..36e8b3bc 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt @@ -3,29 +3,26 @@ package no.nordicsemi.android.prx.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn -import no.nordicsemi.android.navigation.NavigationManager +import kotlinx.coroutines.flow.* +import no.nordicsemi.android.navigation.* import no.nordicsemi.android.prx.data.DisableAlarm import no.nordicsemi.android.prx.data.Disconnect import no.nordicsemi.android.prx.data.EnableAlarm import no.nordicsemi.android.prx.data.PRXRepository -import no.nordicsemi.android.prx.view.DisconnectEvent -import no.nordicsemi.android.prx.view.DisplayDataState -import no.nordicsemi.android.prx.view.LoadingState -import no.nordicsemi.android.prx.view.PRXScreenViewEvent -import no.nordicsemi.android.prx.view.TurnOffAlert -import no.nordicsemi.android.prx.view.TurnOnAlert +import no.nordicsemi.android.prx.service.PRXService +import no.nordicsemi.android.prx.service.PRX_SERVICE_UUID +import no.nordicsemi.android.prx.view.* import no.nordicsemi.android.service.BleManagerStatus +import no.nordicsemi.android.service.ServiceManager import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.android.utils.getDevice +import no.nordicsemi.ui.scanner.ScannerDestinationId import javax.inject.Inject @HiltViewModel internal class PRXViewModel @Inject constructor( private val repository: PRXRepository, + private val serviceManager: ServiceManager, private val navigationManager: NavigationManager ) : ViewModel() { @@ -38,6 +35,14 @@ internal class PRXViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, PRX_SERVICE_UUID)) + + navigationManager.recentResult.onEach { + if (it.destinationId == ScannerDestinationId) { + handleArgs(it) + } + }.launchIn(viewModelScope) + repository.status.onEach { if (it == BleManagerStatus.DISCONNECTED) { navigationManager.navigateUp() @@ -45,6 +50,13 @@ internal class PRXViewModel @Inject constructor( }.launchIn(viewModelScope) } + private fun handleArgs(args: DestinationResult) { + when (args) { + is CancelDestinationResult -> navigationManager.navigateUp() + is SuccessDestinationResult -> serviceManager.startService(PRXService::class.java, args.getDevice()) + }.exhaustive + } + fun onEvent(event: PRXScreenViewEvent) { when (event) { DisconnectEvent -> onDisconnectButtonClick() diff --git a/profile_rscs/build.gradle b/profile_rscs/build.gradle index 857c71f1..c8350305 100644 --- a/profile_rscs/build.gradle +++ b/profile_rscs/build.gradle @@ -9,6 +9,7 @@ dependencies { implementation libs.nordic.ble.common implementation libs.nordic.log + implementation libs.nordic.ui.scanner implementation libs.nordic.navigation implementation libs.bundles.compose diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt index 802ef968..633e8154 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt @@ -1,15 +1,11 @@ package no.nordicsemi.android.rscs.view -import android.content.Intent import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.rscs.R -import no.nordicsemi.android.rscs.service.RSCSService import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.DeviceConnectingView @@ -20,24 +16,13 @@ fun RSCSScreen() { val viewModel: RSCSViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - val context = LocalContext.current - LaunchedEffect(Unit) { - val intent = Intent(context, RSCSService::class.java) - context.startService(intent) - } - - RSCSView(state) { viewModel.onEvent(it) } -} - -@Composable -private fun RSCSView(state: RSCSViewState, onEvent: (RSCScreenViewEvent) -> Unit) { Column { BackIconAppBar(stringResource(id = R.string.rscs_title)) { - onEvent(DisconnectEvent) + viewModel.onEvent(DisconnectEvent) } when (state) { - is DisplayDataState -> RSCSContentView(state.data) { onEvent(it) } + is DisplayDataState -> RSCSContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt index b7c3aa09..dd414bb2 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt @@ -3,24 +3,26 @@ package no.nordicsemi.android.rscs.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn -import no.nordicsemi.android.navigation.NavigationManager +import kotlinx.coroutines.flow.* +import no.nordicsemi.android.navigation.* import no.nordicsemi.android.rscs.data.RSCSRepository +import no.nordicsemi.android.rscs.service.RSCSService +import no.nordicsemi.android.rscs.service.RSCS_SERVICE_UUID import no.nordicsemi.android.rscs.view.DisconnectEvent import no.nordicsemi.android.rscs.view.DisplayDataState import no.nordicsemi.android.rscs.view.LoadingState import no.nordicsemi.android.rscs.view.RSCScreenViewEvent import no.nordicsemi.android.service.BleManagerStatus +import no.nordicsemi.android.service.ServiceManager import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.android.utils.getDevice +import no.nordicsemi.ui.scanner.ScannerDestinationId import javax.inject.Inject @HiltViewModel internal class RSCSViewModel @Inject constructor( private val repository: RSCSRepository, + private val serviceManager: ServiceManager, private val navigationManager: NavigationManager ) : ViewModel() { @@ -33,6 +35,14 @@ internal class RSCSViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, RSCS_SERVICE_UUID)) + + navigationManager.recentResult.onEach { + if (it.destinationId == ScannerDestinationId) { + handleArgs(it) + } + }.launchIn(viewModelScope) + repository.status.onEach { if (it == BleManagerStatus.DISCONNECTED) { navigationManager.navigateUp() @@ -40,6 +50,13 @@ internal class RSCSViewModel @Inject constructor( }.launchIn(viewModelScope) } + private fun handleArgs(args: DestinationResult) { + when (args) { + is CancelDestinationResult -> navigationManager.navigateUp() + is SuccessDestinationResult -> serviceManager.startService(RSCSService::class.java, args.getDevice()) + }.exhaustive + } + fun onEvent(event: RSCScreenViewEvent) { when (event) { DisconnectEvent -> onDisconnectButtonClick() diff --git a/profile_uart/build.gradle b/profile_uart/build.gradle index f85ed147..18e90c33 100644 --- a/profile_uart/build.gradle +++ b/profile_uart/build.gradle @@ -10,6 +10,7 @@ dependencies { implementation libs.nordic.log implementation libs.nordic.theme + implementation libs.nordic.ui.scanner implementation libs.nordic.navigation implementation libs.bundles.compose diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt index 35353201..0c82f365 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt @@ -1,17 +1,13 @@ package no.nordicsemi.android.uart.view -import android.content.Intent import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.DeviceConnectingView import no.nordicsemi.android.uart.R -import no.nordicsemi.android.uart.repository.UARTService import no.nordicsemi.android.uart.viewmodel.UARTViewModel import no.nordicsemi.android.utils.exhaustive @@ -20,24 +16,13 @@ fun UARTScreen() { val viewModel: UARTViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - val context = LocalContext.current - LaunchedEffect(Unit) { - val intent = Intent(context, UARTService::class.java) - context.startService(intent) - } - - UARTView(state) { viewModel.onEvent(it) } -} - -@Composable -private fun UARTView(state: UARTViewState, onEvent: (UARTViewEvent) -> Unit) { Column { BackIconAppBar(stringResource(id = R.string.uart_title)) { - onEvent(OnDisconnectButtonClick) + viewModel.onEvent(OnDisconnectButtonClick) } when (state) { - is DisplayDataState -> UARTContentView(state.data) { onEvent(it) } + is DisplayDataState -> UARTContentView(state.data) { viewModel.onEvent(it) } LoadingState -> DeviceConnectingView() }.exhaustive } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt index 0d725e67..ea15c5d3 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt @@ -3,29 +3,25 @@ package no.nordicsemi.android.uart.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn -import no.nordicsemi.android.navigation.NavigationManager +import kotlinx.coroutines.flow.* +import no.nordicsemi.android.navigation.* import no.nordicsemi.android.service.BleManagerStatus +import no.nordicsemi.android.service.ServiceManager import no.nordicsemi.android.uart.data.DisconnectCommand import no.nordicsemi.android.uart.data.SendTextCommand import no.nordicsemi.android.uart.data.UARTRepository -import no.nordicsemi.android.uart.view.DisplayDataState -import no.nordicsemi.android.uart.view.LoadingState -import no.nordicsemi.android.uart.view.OnCreateMacro -import no.nordicsemi.android.uart.view.OnDeleteMacro -import no.nordicsemi.android.uart.view.OnDisconnectButtonClick -import no.nordicsemi.android.uart.view.OnRunMacro -import no.nordicsemi.android.uart.view.UARTViewEvent +import no.nordicsemi.android.uart.repository.UARTService +import no.nordicsemi.android.uart.repository.UART_SERVICE_UUID +import no.nordicsemi.android.uart.view.* import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.android.utils.getDevice +import no.nordicsemi.ui.scanner.ScannerDestinationId import javax.inject.Inject @HiltViewModel internal class UARTViewModel @Inject constructor( private val repository: UARTRepository, + private val serviceManager: ServiceManager, private val navigationManager: NavigationManager ) : ViewModel() { @@ -38,6 +34,14 @@ internal class UARTViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.Lazily, LoadingState) init { + navigationManager.navigateTo(ForwardDestination(ScannerDestinationId), UUIDArgument(ScannerDestinationId, UART_SERVICE_UUID)) + + navigationManager.recentResult.onEach { + if (it.destinationId == ScannerDestinationId) { + handleArgs(it) + } + }.launchIn(viewModelScope) + repository.status.onEach { if (it == BleManagerStatus.DISCONNECTED) { navigationManager.navigateUp() @@ -45,6 +49,13 @@ internal class UARTViewModel @Inject constructor( }.launchIn(viewModelScope) } + private fun handleArgs(args: DestinationResult) { + when (args) { + is CancelDestinationResult -> navigationManager.navigateUp() + is SuccessDestinationResult -> serviceManager.startService(UARTService::class.java, args.getDevice()) + }.exhaustive + } + fun onEvent(event: UARTViewEvent) { when (event) { is OnCreateMacro -> repository.addNewMacro(event.macro)