diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/view/HomeView.kt b/app/src/main/java/no/nordicsemi/android/nrftoolbox/view/HomeView.kt index ddd4986b..65381141 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/view/HomeView.kt +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/view/HomeView.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import no.nordicsemi.android.logger.LoggerAppRunner import no.nordicsemi.android.nrftoolbox.BuildConfig import no.nordicsemi.android.nrftoolbox.ProfileDestination import no.nordicsemi.android.nrftoolbox.R @@ -24,7 +25,6 @@ private const val DFU_PACKAGE_NAME = "no.nordicsemi.android.dfu" private const val DFU_LINK = "https://play.google.com/store/apps/details?id=no.nordicsemi.android.dfu" private const val LOGGER_PACKAGE_NAME = "no.nordicsemi.android.log" -private const val LOGGER_LINK = "https://play.google.com/store/apps/details?id=no.nordicsemi.android.log" @Composable fun HomeScreen() { @@ -148,12 +148,7 @@ fun HomeScreen() { } ?: R.string.dfu_module_install FeatureButton(R.drawable.ic_logger, R.string.logger_module, R.string.logger_module_full, null, loggerDescription) { - val intent = packageManger.getLaunchIntentForPackage(LOGGER_PACKAGE_NAME) - if (intent != null) { - context.startActivity(intent) - } else { - uriHandler.openUri(LOGGER_LINK) - } + viewModel.openLogger() } Spacer(modifier = Modifier.height(16.dp)) diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/viewmodel/HomeViewModel.kt b/app/src/main/java/no/nordicsemi/android/nrftoolbox/viewmodel/HomeViewModel.kt index fd22f98f..27adb334 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/viewmodel/HomeViewModel.kt +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/viewmodel/HomeViewModel.kt @@ -12,6 +12,7 @@ import no.nordicsemi.android.cgms.repository.CGMRepository import no.nordicsemi.android.csc.repository.CSCRepository import no.nordicsemi.android.hrs.service.HRSRepository import no.nordicsemi.android.hts.repository.HTSRepository +import no.nordicsemi.android.logger.LoggerAppRunner import no.nordicsemi.android.navigation.NavigationManager import no.nordicsemi.android.nrftoolbox.ProfileDestination import no.nordicsemi.android.nrftoolbox.repository.ActivitySignals @@ -32,6 +33,7 @@ class HomeViewModel @Inject constructor( prxRepository: PRXRepository, rscsRepository: RSCSRepository, uartRepository: UARTRepository, + private val loggerAppRunner: LoggerAppRunner ) : ViewModel() { private val _state = MutableStateFlow(HomeViewState()) @@ -74,4 +76,8 @@ class HomeViewModel @Inject constructor( fun openProfile(destination: ProfileDestination) { navigationManager.navigateTo(destination.destination.id) } + + fun openLogger() { + loggerAppRunner.runLogger() + } } diff --git a/lib_log/src/main/java/no/nordicsemi/android/logger/LoggerAppRunner.kt b/lib_log/src/main/java/no/nordicsemi/android/logger/LoggerAppRunner.kt new file mode 100644 index 00000000..711698b9 --- /dev/null +++ b/lib_log/src/main/java/no/nordicsemi/android/logger/LoggerAppRunner.kt @@ -0,0 +1,44 @@ +package no.nordicsemi.android.logger + +import android.content.Context +import android.content.Intent +import android.net.Uri +import androidx.compose.ui.platform.AndroidUriHandler +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +private const val LOGGER_PACKAGE_NAME = "no.nordicsemi.android.log" +private const val LOGGER_LINK = "https://play.google.com/store/apps/details?id=no.nordicsemi.android.log" + +class LoggerAppRunner @Inject constructor( + @ApplicationContext + private val context: Context +) { + + fun runLogger() { + val packageManger = context.packageManager + val uriHandler = AndroidUriHandler(context) + + val intent = packageManger.getLaunchIntentForPackage(LOGGER_PACKAGE_NAME) + if (intent != null) { + context.startActivity(intent) + } else { + uriHandler.openUri(LOGGER_LINK) + } + } + + fun runLogger(uri: Uri?) { + val packageManger = context.packageManager + + val intent = packageManger.getLaunchIntentForPackage(LOGGER_PACKAGE_NAME) + + val targetUri = if (intent != null && uri != null) { + uri + } else { + Uri.parse(LOGGER_LINK) + } + val launchIntent = Intent(Intent.ACTION_VIEW, targetUri) + launchIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(launchIntent) + } +} diff --git a/lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLogger.kt b/lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLogger.kt index d0d2706e..cc66e512 100644 --- a/lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLogger.kt +++ b/lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLogger.kt @@ -1,7 +1,12 @@ package no.nordicsemi.android.logger import android.content.Context +import android.content.Intent +import android.net.Uri import android.util.Log +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import dagger.hilt.android.qualifiers.ApplicationContext import no.nordicsemi.android.log.LogContract import no.nordicsemi.android.log.LogSession import no.nordicsemi.android.log.Logger @@ -9,9 +14,13 @@ import no.nordicsemi.android.log.annotation.LogLevel internal const val LOG_TAG = "nRF Toolbox" -class ToolboxLogger( +class ToolboxLogger @AssistedInject constructor( + @ApplicationContext private val context: Context, + private val appRunner: LoggerAppRunner, + @Assisted("profile") private val profile: String, + @Assisted("key") private val key: String, ) { @@ -25,8 +34,13 @@ class ToolboxLogger( Log.println(level, LOG_TAG, message) } + fun openLogger() { + appRunner.runLogger(logSession?.sessionUri) + } + private fun getLogger(): LogSession? { logSession = logSession ?: Logger.newSession(context, profile, key, LOG_TAG) + logSession?.sessionsUri return logSession } } diff --git a/lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLoggerFactory.kt b/lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLoggerFactory.kt new file mode 100644 index 00000000..68057b1f --- /dev/null +++ b/lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLoggerFactory.kt @@ -0,0 +1,10 @@ +package no.nordicsemi.android.logger + +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory + +@AssistedFactory +interface ToolboxLoggerFactory { + + fun create(@Assisted("profile") profile: String, @Assisted("key") key: String): ToolboxLogger +} diff --git a/app/src/main/res/drawable/ic_logger.xml b/lib_log/src/main/res/drawable/ic_logger.xml similarity index 95% rename from app/src/main/res/drawable/ic_logger.xml rename to lib_log/src/main/res/drawable/ic_logger.xml index b9519eb1..49cc4bb2 100644 --- a/app/src/main/res/drawable/ic_logger.xml +++ b/lib_log/src/main/res/drawable/ic_logger.xml @@ -1,6 +1,6 @@ Unit) { contentDescription = stringResource(id = R.string.back_screen), ) } + }, + actions = { + IconButton(onClick = { onClick() }) { + Icon( + painterResource(id = R.drawable.ic_logger), + contentDescription = stringResource(id = R.string.back_screen), + tint = MaterialTheme.colorScheme.onPrimary, + modifier = Modifier.size(24.dp) + ) + } + } + ) +} + +@Composable +fun LoggerIconAppBar(text: String, onClick: () -> Unit, onLoggerClick: () -> Unit) { + SmallTopAppBar( + title = { Text(text) }, + colors = TopAppBarDefaults.smallTopAppBarColors( + scrolledContainerColor = MaterialTheme.colorScheme.primary, + containerColor = colorResource(id = R.color.appBarColor), + titleContentColor = MaterialTheme.colorScheme.onPrimary, + actionIconContentColor = MaterialTheme.colorScheme.onPrimary, + navigationIconContentColor = MaterialTheme.colorScheme.onPrimary, + ), + navigationIcon = { + IconButton(onClick = { onClick() }) { + Icon( + Icons.Default.ArrowBack, + contentDescription = stringResource(id = R.string.back_screen), + ) + } + }, + actions = { + IconButton(onClick = { onLoggerClick() }) { + Icon( + painterResource(id = R.drawable.ic_logger), + contentDescription = stringResource(id = R.string.back_screen), + tint = MaterialTheme.colorScheme.onPrimary, + modifier = Modifier.size(24.dp) + ) + } } ) } diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSRepository.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSRepository.kt index 8205663e..84c7486e 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSRepository.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSRepository.kt @@ -12,18 +12,25 @@ import kotlinx.coroutines.flow.onEach import no.nordicsemi.android.bps.data.BPSData import no.nordicsemi.android.bps.data.BPSManager import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult import javax.inject.Inject @ViewModelScoped internal class BPSRepository @Inject constructor( @ApplicationContext - private val context: Context + private val context: Context, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { + private var logger: ToolboxLogger? = null + fun downloadData(device: BluetoothDevice): Flow> = callbackFlow { val scope = this - val manager = BPSManager(context, scope, ToolboxLogger(context, "BPS", device.address)) + val createdLogger = toolboxLoggerFactory.create("BPS", device.address).also { + logger = it + } + val manager = BPSManager(context, scope, createdLogger) manager.dataHolder.status.onEach { trySend(it) @@ -36,6 +43,12 @@ internal class BPSRepository @Inject constructor( awaitClose { manager.disconnect().enqueue() + logger = null } } + + fun openLogger() { + logger?.openLogger() + } + } 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 32e3eeb7..a991dbef 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 @@ -12,6 +12,7 @@ import no.nordicsemi.android.bps.R import no.nordicsemi.android.bps.viewmodel.BPSViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -26,8 +27,10 @@ fun BPSScreen() { Column { val navigateUp = { viewModel.onEvent(DisconnectEvent) } - BackIconAppBar(stringResource(id = R.string.bps_title)) { + LoggerIconAppBar(stringResource(id = R.string.bps_title), { viewModel.onEvent(DisconnectEvent) + }) { + viewModel.onEvent(OpenLoggerEvent) } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreenViewEvent.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreenViewEvent.kt index 445a07e8..d057a27a 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreenViewEvent.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreenViewEvent.kt @@ -3,3 +3,5 @@ package no.nordicsemi.android.bps.view internal sealed class BPSScreenViewEvent internal object DisconnectEvent : BPSScreenViewEvent() + +internal object OpenLoggerEvent : BPSScreenViewEvent() 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 7199c064..1d031de8 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 @@ -46,6 +46,7 @@ internal class BPSViewModel @Inject constructor( fun onEvent(event: BPSScreenViewEvent) { when (event) { DisconnectEvent -> navigationManager.navigateUp() + OpenLoggerEvent -> repository.openLogger() }.exhaustive } diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt index 2948f526..10ea642d 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/repository/CGMRepository.kt @@ -10,6 +10,7 @@ import no.nordicsemi.android.ble.ktx.suspend import no.nordicsemi.android.cgms.data.CGMData import no.nordicsemi.android.cgms.data.CGMManager import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult import no.nordicsemi.android.service.ConnectingResult import no.nordicsemi.android.service.ServiceManager @@ -20,9 +21,11 @@ import javax.inject.Singleton class CGMRepository @Inject constructor( @ApplicationContext private val context: Context, - private val serviceManager: ServiceManager + private val serviceManager: ServiceManager, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: CGMManager? = null + private var logger: ToolboxLogger? = null private val _data = MutableStateFlow>(ConnectingResult()) internal val data = _data.asStateFlow() @@ -35,7 +38,10 @@ class CGMRepository @Inject constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { - val manager = CGMManager(context, scope, ToolboxLogger(context, "CGMS", device.address)) + val createdLogger = toolboxLoggerFactory.create("CGMS", device.address).also { + logger = it + } + val manager = CGMManager(context, scope, createdLogger) this.manager = manager manager.dataHolder.status.onEach { @@ -70,8 +76,13 @@ class CGMRepository @Inject constructor( manager?.requestFirstRecord() } + fun openLogger() { + logger?.openLogger() + } + fun release() { manager?.disconnect()?.enqueue() + logger = null manager = null } } 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 6c4ad27f..820c8e9b 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 @@ -12,6 +12,7 @@ import no.nordicsemi.android.cgms.R import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -26,7 +27,9 @@ fun CGMScreen() { Column { val navigateUp = { viewModel.onEvent(NavigateUp) } - BackIconAppBar(stringResource(id = R.string.cgms_title), navigateUp) + LoggerIconAppBar(stringResource(id = R.string.cgms_title), navigateUp) { + viewModel.onEvent(OpenLoggerEvent) + } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { when (state) { diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMViewEvent.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMViewEvent.kt index 3edc2976..ecec0144 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMViewEvent.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMViewEvent.kt @@ -9,3 +9,5 @@ internal data class OnWorkingModeSelected(val workingMode: CGMServiceCommand) : internal object NavigateUp : CGMViewEvent() internal object DisconnectEvent : CGMViewEvent() + +internal object OpenLoggerEvent : CGMViewEvent() 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 2dbc7f2c..06a3f954 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 @@ -41,6 +41,7 @@ internal class CGMScreenViewModel @Inject constructor( DisconnectEvent -> disconnect() is OnWorkingModeSelected -> onCommandReceived(event.workingMode) NavigateUp -> navigationManager.navigateUp() + OpenLoggerEvent -> repository.openLogger() }.exhaustive } diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt index a407bb46..2b80f735 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/repository/CSCRepository.kt @@ -11,6 +11,7 @@ import no.nordicsemi.android.csc.data.CSCData import no.nordicsemi.android.csc.data.CSCManager import no.nordicsemi.android.csc.data.WheelSize import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult import no.nordicsemi.android.service.ConnectingResult import no.nordicsemi.android.service.ServiceManager @@ -21,9 +22,11 @@ import javax.inject.Singleton class CSCRepository @Inject constructor( @ApplicationContext private val context: Context, - private val serviceManager: ServiceManager + private val serviceManager: ServiceManager, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: CSCManager? = null + private var logger: ToolboxLogger? = null private val _data = MutableStateFlow>(ConnectingResult()) internal val data = _data.asStateFlow() @@ -36,7 +39,10 @@ class CSCRepository @Inject constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { - val manager = CSCManager(context, scope, ToolboxLogger(context, "CSC", device.address)) + val createdLogger = toolboxLoggerFactory.create("CSC", device.address).also { + logger = it + } + val manager = CSCManager(context, scope, createdLogger) this.manager = manager manager.dataHolder.status.onEach { @@ -63,8 +69,13 @@ class CSCRepository @Inject constructor( } } + fun openLogger() { + logger?.openLogger() + } + fun release() { manager?.disconnect()?.enqueue() + logger = null manager = null } } diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt index 2c5f489a..33774a33 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt @@ -12,6 +12,7 @@ import no.nordicsemi.android.csc.R import no.nordicsemi.android.csc.viewmodel.CSCViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -26,7 +27,9 @@ fun CSCScreen() { Column { val navigateUp = { viewModel.onEvent(NavigateUp) } - BackIconAppBar(stringResource(id = R.string.csc_title), navigateUp) + LoggerIconAppBar(stringResource(id = R.string.csc_title), navigateUp) { + viewModel.onEvent(OpenLogger) + } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { when (state.cscManagerState) { diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCViewEvent.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCViewEvent.kt index 0a2bb233..32146e25 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCViewEvent.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCViewEvent.kt @@ -11,3 +11,5 @@ internal data class OnSelectedSpeedUnitSelected(val selectedSpeedUnit: SpeedUnit internal object OnDisconnectButtonClick : CSCViewEvent() internal object NavigateUp : CSCViewEvent() + +internal object OpenLogger : CSCViewEvent() 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 555630cc..0dd8b15d 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 @@ -58,6 +58,7 @@ internal class CSCViewModel @Inject constructor( is OnWheelSizeSelected -> repository.setWheelSize(event.wheelSize) OnDisconnectButtonClick -> disconnect() NavigateUp -> navigationManager.navigateUp() + OpenLogger -> repository.openLogger() }.exhaustive } diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSManager.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSManager.kt index 63cd83ab..5ede2603 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSManager.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSManager.kt @@ -56,8 +56,7 @@ private val BATTERY_SERVICE_UUID = UUID.fromString("0000180F-0000-1000-8000-0080 private val BATTERY_LEVEL_CHARACTERISTIC_UUID = UUID.fromString("00002A19-0000-1000-8000-00805f9b34fb") -internal class GLSManager @Inject constructor( - @ApplicationContext +internal class GLSManager( context: Context, private val scope: CoroutineScope, private val logger: ToolboxLogger diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt index 8b52e5b7..e39c952b 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt @@ -12,6 +12,7 @@ import no.nordicsemi.android.gls.R import no.nordicsemi.android.gls.main.viewmodel.GLSViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -26,8 +27,10 @@ fun GLSScreen() { Column { val navigateUp = { viewModel.onEvent(DisconnectEvent) } - BackIconAppBar(stringResource(id = R.string.gls_title)) { + LoggerIconAppBar(stringResource(id = R.string.gls_title), { viewModel.onEvent(DisconnectEvent) + }) { + viewModel.onEvent(OpenLoggerEvent) } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreenViewEvent.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreenViewEvent.kt index 7e921a07..317c2c5b 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreenViewEvent.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreenViewEvent.kt @@ -10,3 +10,5 @@ internal data class OnWorkingModeSelected(val workingMode: WorkingMode) : GLSScr internal data class OnGLSRecordClick(val record: GLSRecord) : GLSScreenViewEvent() internal object DisconnectEvent : GLSScreenViewEvent() + +internal object OpenLoggerEvent : GLSScreenViewEvent() diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt index 58adf875..bb002791 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt @@ -43,6 +43,7 @@ internal class GLSViewModel @Inject constructor( fun onEvent(event: GLSScreenViewEvent) { when (event) { + OpenLoggerEvent -> repository.openLogger() DisconnectEvent -> navigationManager.navigateUp() is OnWorkingModeSelected -> repository.requestMode(event.workingMode) is OnGLSRecordClick -> navigationManager.navigateTo(GlsDetailsDestinationId, AnyArgument(event.record)) diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/repository/GLSRepository.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/repository/GLSRepository.kt index 98f7cfa1..ac27ebf7 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/repository/GLSRepository.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/repository/GLSRepository.kt @@ -15,6 +15,7 @@ import no.nordicsemi.android.gls.data.GLSData import no.nordicsemi.android.gls.data.GLSManager import no.nordicsemi.android.gls.data.WorkingMode import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult import no.nordicsemi.android.utils.exhaustive import javax.inject.Inject @@ -22,14 +23,19 @@ import javax.inject.Inject @ViewModelScoped internal class GLSRepository @Inject constructor( @ApplicationContext - private val context: Context + private val context: Context, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: GLSManager? = null + private var logger: ToolboxLogger? = null fun downloadData(device: BluetoothDevice): Flow> = callbackFlow { val scope = this - val managerInstance = manager ?: GLSManager(context, scope, ToolboxLogger(context, "GLS", device.address)).apply { + val createdLogger = toolboxLoggerFactory.create("GLS", device.address).also { + logger = it + } + val managerInstance = manager ?: GLSManager(context, scope, createdLogger).apply { try { connect(device) .useAutoConnect(false) @@ -48,11 +54,16 @@ internal class GLSRepository @Inject constructor( awaitClose { launch { manager?.disconnect()?.suspend() + logger = null manager = null } } } + fun openLogger() { + logger?.openLogger() + } + fun requestMode(workingMode: WorkingMode) { when (workingMode) { WorkingMode.ALL -> manager?.requestAllRecords() diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt index 1416e50e..b5258e3d 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/service/HRSRepository.kt @@ -10,6 +10,7 @@ import no.nordicsemi.android.ble.ktx.suspend import no.nordicsemi.android.hrs.data.HRSData import no.nordicsemi.android.hrs.data.HRSManager import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult import no.nordicsemi.android.service.ConnectingResult import no.nordicsemi.android.service.ServiceManager @@ -20,9 +21,11 @@ import javax.inject.Singleton class HRSRepository @Inject constructor( @ApplicationContext private val context: Context, - private val serviceManager: ServiceManager + private val serviceManager: ServiceManager, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: HRSManager? = null + private var logger: ToolboxLogger? = null private val _data = MutableStateFlow>(ConnectingResult()) internal val data = _data.asStateFlow() @@ -35,7 +38,10 @@ class HRSRepository @Inject constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { - val manager = HRSManager(context, scope, ToolboxLogger(context, "HRS", device.address)) + val createdLogger = toolboxLoggerFactory.create("HRS", device.address).also { + logger = it + } + val manager = HRSManager(context, scope, createdLogger) this.manager = manager manager.dataHolder.status.onEach { @@ -47,6 +53,10 @@ class HRSRepository @Inject constructor( } } + fun openLogger() { + logger?.openLogger() + } + private suspend fun HRSManager.start(device: BluetoothDevice) { try { connect(device) @@ -60,6 +70,7 @@ class HRSRepository @Inject constructor( fun release() { manager?.disconnect()?.enqueue() + logger = null manager = null } } 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 207be2fc..97cd73b0 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 @@ -12,6 +12,7 @@ import no.nordicsemi.android.hrs.R import no.nordicsemi.android.hrs.viewmodel.HRSViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -26,7 +27,9 @@ fun HRSScreen() { Column { val navigateUp = { viewModel.onEvent(NavigateUpEvent) } - BackIconAppBar(stringResource(id = R.string.hrs_title), navigateUp) + LoggerIconAppBar(stringResource(id = R.string.hrs_title), navigateUp) { + viewModel.onEvent(OpenLoggerEvent) + } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { when (state) { diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreenViewEvent.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreenViewEvent.kt index 0daf3779..de5e973f 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreenViewEvent.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreenViewEvent.kt @@ -5,3 +5,5 @@ internal sealed class HRSScreenViewEvent internal object DisconnectEvent : HRSScreenViewEvent() internal object NavigateUpEvent : HRSScreenViewEvent() + +internal object OpenLoggerEvent : HRSScreenViewEvent() 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 6433889e..59fb62d5 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 @@ -56,6 +56,7 @@ internal class HRSViewModel @Inject constructor( when (event) { DisconnectEvent -> disconnect() NavigateUpEvent -> navigationManager.navigateUp() + OpenLoggerEvent -> repository.openLogger() }.exhaustive } diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt index 9a2d80fb..0d767b46 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/repository/HTSRepository.kt @@ -10,6 +10,7 @@ import no.nordicsemi.android.ble.ktx.suspend import no.nordicsemi.android.hts.data.HTSData import no.nordicsemi.android.hts.data.HTSManager import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult import no.nordicsemi.android.service.ConnectingResult import no.nordicsemi.android.service.ServiceManager @@ -20,9 +21,11 @@ import javax.inject.Singleton class HTSRepository @Inject constructor( @ApplicationContext private val context: Context, - private val serviceManager: ServiceManager + private val serviceManager: ServiceManager, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: HTSManager? = null + private var logger: ToolboxLogger? = null private val _data = MutableStateFlow>(ConnectingResult()) internal val data = _data.asStateFlow() @@ -35,7 +38,10 @@ class HTSRepository @Inject constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { - val manager = HTSManager(context, scope, ToolboxLogger(context, "HTS", device.address)) + val createdLogger = toolboxLoggerFactory.create("HTS", device.address).also { + logger = it + } + val manager = HTSManager(context, scope, createdLogger) this.manager = manager manager.dataHolder.status.onEach { @@ -47,6 +53,10 @@ class HTSRepository @Inject constructor( } } + fun openLogger() { + logger?.openLogger() + } + private suspend fun HTSManager.start(device: BluetoothDevice) { try { connect(device) @@ -60,6 +70,7 @@ class HTSRepository @Inject constructor( fun release() { manager?.disconnect()?.enqueue() + logger = null manager = null } } 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 deaddf43..bf25a839 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 @@ -12,6 +12,7 @@ import no.nordicsemi.android.hts.R import no.nordicsemi.android.hts.viewmodel.HTSViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -26,7 +27,9 @@ fun HTSScreen() { Column { val navigateUp = { viewModel.onEvent(NavigateUp) } - BackIconAppBar(stringResource(id = R.string.hts_title), navigateUp) + LoggerIconAppBar(stringResource(id = R.string.hts_title), navigateUp) { + viewModel.onEvent(OpenLoggerEvent) + } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { when (state.htsManagerState) { diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreenViewEvent.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreenViewEvent.kt index a2578ce0..32206ea3 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreenViewEvent.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreenViewEvent.kt @@ -7,3 +7,5 @@ internal data class OnTemperatureUnitSelected(val value: TemperatureUnit) : HTSS internal object DisconnectEvent : HTSScreenViewEvent() internal object NavigateUp : HTSScreenViewEvent() + +internal object OpenLoggerEvent : HTSScreenViewEvent() 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 62f9d532..9a7d3d8f 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 @@ -57,6 +57,7 @@ internal class HTSViewModel @Inject constructor( DisconnectEvent -> disconnect() is OnTemperatureUnitSelected -> onTemperatureUnitSelected(event) NavigateUp -> navigationManager.navigateUp() + OpenLoggerEvent -> repository.openLogger() }.exhaustive } diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt index f07018cc..9c4dae1e 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/repository/PRXRepository.kt @@ -6,6 +6,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.* import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.prx.data.AlarmLevel import no.nordicsemi.android.prx.data.PRXData import no.nordicsemi.android.prx.data.PRXManager @@ -20,10 +21,12 @@ class PRXRepository @Inject internal constructor( private val context: Context, private val serviceManager: ServiceManager, private val proximityServerManager: ProximityServerManager, - private val alarmHandler: AlarmHandler + private val alarmHandler: AlarmHandler, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: PRXManager? = null + private var logger: ToolboxLogger? = null private val _data = MutableStateFlow>(ConnectingResult()) internal val data = _data.asStateFlow() @@ -37,7 +40,10 @@ class PRXRepository @Inject internal constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { - val manager = PRXManager(context, scope, ToolboxLogger(context, "PRX", device.address)) + val createdLogger = toolboxLoggerFactory.create("PRX", device.address).also { + logger = it + } + val manager = PRXManager(context, scope, createdLogger) this.manager = manager manager.useServer(proximityServerManager) @@ -73,9 +79,14 @@ class PRXRepository @Inject internal constructor( manager?.writeImmediateAlert(false) } + fun openLogger() { + logger?.openLogger() + } + fun release() { alarmHandler.releaseAlarm() manager?.disconnect()?.enqueue() manager = null + logger = null } } 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 57eb2b26..ce53534e 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 @@ -13,6 +13,7 @@ import no.nordicsemi.android.prx.R import no.nordicsemi.android.prx.viewmodel.PRXViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -27,7 +28,9 @@ fun PRXScreen() { Column(horizontalAlignment = Alignment.CenterHorizontally) { val navigateUp = { viewModel.onEvent(NavigateUpEvent) } - BackIconAppBar(stringResource(id = R.string.prx_title), navigateUp) + LoggerIconAppBar(stringResource(id = R.string.prx_title), navigateUp) { + viewModel.onEvent(OpenLoggerEvent) + } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { when (state) { diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt index e9030ee9..c7cec508 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt @@ -9,3 +9,5 @@ internal object TurnOnAlert : PRXScreenViewEvent() internal object TurnOffAlert : PRXScreenViewEvent() internal object DisconnectEvent : PRXScreenViewEvent() + +internal object OpenLoggerEvent : PRXScreenViewEvent() 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 c788d9e7..786a9796 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 @@ -58,6 +58,7 @@ internal class PRXViewModel @Inject constructor( TurnOffAlert -> repository.disableAlarm() TurnOnAlert -> repository.enableAlarm() NavigateUpEvent -> navigationManager.navigateUp() + OpenLoggerEvent -> repository.openLogger() }.exhaustive } diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt index 8f54608d..15688907 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/repository/RSCSRepository.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import no.nordicsemi.android.ble.ktx.suspend import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.rscs.data.RSCSData import no.nordicsemi.android.rscs.data.RSCSManager import no.nordicsemi.android.service.BleManagerResult @@ -20,9 +21,11 @@ import javax.inject.Singleton class RSCSRepository @Inject constructor( @ApplicationContext private val context: Context, - private val serviceManager: ServiceManager + private val serviceManager: ServiceManager, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: RSCSManager? = null + private var logger: ToolboxLogger? = null private val _data = MutableStateFlow>(ConnectingResult()) internal val data = _data.asStateFlow() @@ -35,7 +38,10 @@ class RSCSRepository @Inject constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { - val manager = RSCSManager(context, scope, ToolboxLogger(context, "RSCS", device.address)) + val createdLogger = toolboxLoggerFactory.create("RSCS", device.address).also { + logger = it + } + val manager = RSCSManager(context, scope, createdLogger) this.manager = manager manager.dataHolder.status.onEach { @@ -47,6 +53,10 @@ class RSCSRepository @Inject constructor( } } + fun openLogger() { + logger?.openLogger() + } + private suspend fun RSCSManager.start(device: BluetoothDevice) { try { connect(device) @@ -61,5 +71,6 @@ class RSCSRepository @Inject constructor( fun release() { manager?.disconnect()?.enqueue() manager = null + logger = null } } 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 a04d4d0d..2f18abf2 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 @@ -12,6 +12,7 @@ import no.nordicsemi.android.rscs.R import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive @@ -26,7 +27,9 @@ fun RSCSScreen() { Column { val navigateUp = { viewModel.onEvent(NavigateUpEvent) } - BackIconAppBar(stringResource(id = R.string.rscs_title), navigateUp) + LoggerIconAppBar(stringResource(id = R.string.rscs_title), navigateUp) { + viewModel.onEvent(OpenLoggerEvent) + } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { when (state) { diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCScreenViewEvent.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCScreenViewEvent.kt index 97ad721d..d1272004 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCScreenViewEvent.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCScreenViewEvent.kt @@ -5,3 +5,5 @@ internal sealed class RSCScreenViewEvent internal object NavigateUpEvent : RSCScreenViewEvent() internal object DisconnectEvent : RSCScreenViewEvent() + +internal object OpenLoggerEvent : RSCScreenViewEvent() 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 c6b7a001..6977b1c8 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 @@ -56,6 +56,7 @@ internal class RSCSViewModel @Inject constructor( when (event) { DisconnectEvent -> disconnect() NavigateUpEvent -> navigationManager.navigateUp() + OpenLoggerEvent -> repository.openLogger() }.exhaustive } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt index 50175a99..fb2b99e6 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import no.nordicsemi.android.ble.ktx.suspend import no.nordicsemi.android.logger.ToolboxLogger +import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult import no.nordicsemi.android.service.ConnectingResult import no.nordicsemi.android.service.ServiceManager @@ -20,9 +21,11 @@ class UARTRepository @Inject internal constructor( @ApplicationContext private val context: Context, private val serviceManager: ServiceManager, - private val configurationDataSource: ConfigurationDataSource + private val configurationDataSource: ConfigurationDataSource, + private val toolboxLoggerFactory: ToolboxLoggerFactory ) { private var manager: UARTManager? = null + private var logger: ToolboxLogger? = null private val _data = MutableStateFlow>(ConnectingResult()) internal val data = _data.asStateFlow() @@ -37,7 +40,10 @@ class UARTRepository @Inject internal constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { - val manager = UARTManager(context, scope, ToolboxLogger(context, "UART", device.address)) + val createdLogger = toolboxLoggerFactory.create("UART", device.address).also { + logger = it + } + val manager = UARTManager(context, scope, createdLogger) this.manager = manager manager.dataHolder.status.onEach { @@ -59,6 +65,10 @@ class UARTRepository @Inject internal constructor( manager?.clearItems() } + fun openLogger() { + logger?.openLogger() + } + suspend fun saveConfigurationName(name: String) { configurationDataSource.saveConfigurationName(name) } @@ -77,5 +87,6 @@ class UARTRepository @Inject internal constructor( fun release() { manager?.disconnect()?.enqueue() manager = null + logger = null } } 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 d44035ce..43ef2738 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 @@ -10,6 +10,7 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.service.* import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.uart.R @@ -30,7 +31,9 @@ fun UARTScreen() { Column { val navigateUp = { viewModel.onEvent(NavigateUp) } - BackIconAppBar(stringResource(id = R.string.uart_title), navigateUp) + LoggerIconAppBar(stringResource(id = R.string.uart_title), navigateUp) { + viewModel.onEvent(OpenLogger) + } Column(modifier = Modifier.verticalScroll(rememberScrollState())) { when (state.uartManagerState) { diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTViewEvent.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTViewEvent.kt index 1445ed6b..754784bb 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTViewEvent.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTViewEvent.kt @@ -20,3 +20,4 @@ internal object ClearOutputItems : UARTViewEvent() internal object DisconnectEvent : UARTViewEvent() internal object NavigateUp : UARTViewEvent() +internal object OpenLogger : UARTViewEvent() 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 2901ffa5..dfe67c2c 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 @@ -81,6 +81,7 @@ internal class UARTViewModel @Inject constructor( OnDeleteConfiguration -> deleteConfiguration() OnEditConfiguration -> onEditConfiguration() ClearOutputItems -> repository.clearItems() + OpenLogger -> repository.openLogger() }.exhaustive }