mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2025-12-20 07:54:20 +01:00
Merge pull request #108 from NordicSemiconductor/bug/logging
Bug/logging
This commit is contained in:
@@ -14,6 +14,7 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
|
import no.nordicsemi.android.logger.LoggerAppRunner
|
||||||
import no.nordicsemi.android.nrftoolbox.BuildConfig
|
import no.nordicsemi.android.nrftoolbox.BuildConfig
|
||||||
import no.nordicsemi.android.nrftoolbox.ProfileDestination
|
import no.nordicsemi.android.nrftoolbox.ProfileDestination
|
||||||
import no.nordicsemi.android.nrftoolbox.R
|
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 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_PACKAGE_NAME = "no.nordicsemi.android.log"
|
||||||
private const val LOGGER_LINK = "https://play.google.com/store/apps/details?id=no.nordicsemi.android.log"
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HomeScreen() {
|
fun HomeScreen() {
|
||||||
@@ -148,12 +148,7 @@ fun HomeScreen() {
|
|||||||
} ?: R.string.dfu_module_install
|
} ?: R.string.dfu_module_install
|
||||||
|
|
||||||
FeatureButton(R.drawable.ic_logger, R.string.logger_module, R.string.logger_module_full, null, loggerDescription) {
|
FeatureButton(R.drawable.ic_logger, R.string.logger_module, R.string.logger_module_full, null, loggerDescription) {
|
||||||
val intent = packageManger.getLaunchIntentForPackage(LOGGER_PACKAGE_NAME)
|
viewModel.openLogger()
|
||||||
if (intent != null) {
|
|
||||||
context.startActivity(intent)
|
|
||||||
} else {
|
|
||||||
uriHandler.openUri(LOGGER_LINK)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(16.dp))
|
Spacer(modifier = Modifier.height(16.dp))
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.cgms.repository.CGMRepository
|
|||||||
import no.nordicsemi.android.csc.repository.CSCRepository
|
import no.nordicsemi.android.csc.repository.CSCRepository
|
||||||
import no.nordicsemi.android.hrs.service.HRSRepository
|
import no.nordicsemi.android.hrs.service.HRSRepository
|
||||||
import no.nordicsemi.android.hts.repository.HTSRepository
|
import no.nordicsemi.android.hts.repository.HTSRepository
|
||||||
|
import no.nordicsemi.android.logger.LoggerAppRunner
|
||||||
import no.nordicsemi.android.navigation.NavigationManager
|
import no.nordicsemi.android.navigation.NavigationManager
|
||||||
import no.nordicsemi.android.nrftoolbox.ProfileDestination
|
import no.nordicsemi.android.nrftoolbox.ProfileDestination
|
||||||
import no.nordicsemi.android.nrftoolbox.repository.ActivitySignals
|
import no.nordicsemi.android.nrftoolbox.repository.ActivitySignals
|
||||||
@@ -32,6 +33,7 @@ class HomeViewModel @Inject constructor(
|
|||||||
prxRepository: PRXRepository,
|
prxRepository: PRXRepository,
|
||||||
rscsRepository: RSCSRepository,
|
rscsRepository: RSCSRepository,
|
||||||
uartRepository: UARTRepository,
|
uartRepository: UARTRepository,
|
||||||
|
private val loggerAppRunner: LoggerAppRunner
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
private val _state = MutableStateFlow(HomeViewState())
|
private val _state = MutableStateFlow(HomeViewState())
|
||||||
@@ -74,4 +76,8 @@ class HomeViewModel @Inject constructor(
|
|||||||
fun openProfile(destination: ProfileDestination) {
|
fun openProfile(destination: ProfileDestination) {
|
||||||
navigationManager.navigateTo(destination.destination.id)
|
navigationManager.navigateTo(destination.destination.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
loggerAppRunner.runLogger()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,9 @@ package no.nordicsemi.android.logger
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.Log
|
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.LogContract
|
||||||
import no.nordicsemi.android.log.LogSession
|
import no.nordicsemi.android.log.LogSession
|
||||||
import no.nordicsemi.android.log.Logger
|
import no.nordicsemi.android.log.Logger
|
||||||
@@ -9,8 +12,13 @@ import no.nordicsemi.android.log.annotation.LogLevel
|
|||||||
|
|
||||||
internal const val LOG_TAG = "nRF Toolbox"
|
internal const val LOG_TAG = "nRF Toolbox"
|
||||||
|
|
||||||
class ToolboxLogger(
|
class ToolboxLogger @AssistedInject constructor(
|
||||||
|
@ApplicationContext
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
|
private val appRunner: LoggerAppRunner,
|
||||||
|
@Assisted("profile")
|
||||||
|
private val profile: String,
|
||||||
|
@Assisted("key")
|
||||||
private val key: String,
|
private val key: String,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@@ -21,11 +29,17 @@ class ToolboxLogger(
|
|||||||
if (logSession != null) {
|
if (logSession != null) {
|
||||||
Logger.log(logSession, LogContract.Log.Level.fromPriority(level), message)
|
Logger.log(logSession, LogContract.Log.Level.fromPriority(level), message)
|
||||||
}
|
}
|
||||||
Log.println(level, LOG_TAG, message)
|
val logPriority = if (level <= Log.ASSERT) level else Log.INFO
|
||||||
|
Log.println(logPriority, LOG_TAG, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
appRunner.runLogger(logSession?.sessionUri)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getLogger(): LogSession? {
|
private fun getLogger(): LogSession? {
|
||||||
logSession = logSession ?: Logger.newSession(context, key, LOG_TAG)
|
logSession = logSession ?: Logger.newSession(context, profile, key, LOG_TAG)
|
||||||
|
logSession?.sessionsUri
|
||||||
return logSession
|
return logSession
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="1024dp"
|
android:width="80dp"
|
||||||
android:height="1024dp"
|
android:height="80dp"
|
||||||
android:viewportWidth="1024"
|
android:viewportWidth="1024"
|
||||||
android:viewportHeight="1024">
|
android:viewportHeight="1024">
|
||||||
<path
|
<path
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
apply from: rootProject.file("library.gradle")
|
apply from: rootProject.file("library.gradle")
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation project(":lib_log")
|
||||||
|
|
||||||
implementation libs.material
|
implementation libs.material
|
||||||
|
|
||||||
implementation libs.nordic.theme
|
implementation libs.nordic.theme
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package no.nordicsemi.android.theme.view
|
package no.nordicsemi.android.theme.view
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.ArrowBack
|
import androidx.compose.material.icons.filled.ArrowBack
|
||||||
import androidx.compose.material.icons.filled.Close
|
import androidx.compose.material.icons.filled.Close
|
||||||
@@ -10,8 +11,13 @@ import androidx.compose.material3.SmallTopAppBar
|
|||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.platform.LocalUriHandler
|
||||||
import androidx.compose.ui.res.colorResource
|
import androidx.compose.ui.res.colorResource
|
||||||
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import no.nordicsemi.android.theme.R
|
import no.nordicsemi.android.theme.R
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@@ -68,6 +74,48 @@ fun BackIconAppBar(text: String, onClick: () -> Unit) {
|
|||||||
contentDescription = stringResource(id = R.string.back_screen),
|
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)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,18 +12,25 @@ import kotlinx.coroutines.flow.onEach
|
|||||||
import no.nordicsemi.android.bps.data.BPSData
|
import no.nordicsemi.android.bps.data.BPSData
|
||||||
import no.nordicsemi.android.bps.data.BPSManager
|
import no.nordicsemi.android.bps.data.BPSManager
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
|
import no.nordicsemi.android.logger.ToolboxLoggerFactory
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ViewModelScoped
|
@ViewModelScoped
|
||||||
internal class BPSRepository @Inject constructor(
|
internal class BPSRepository @Inject constructor(
|
||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context
|
private val context: Context,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
fun downloadData(device: BluetoothDevice): Flow<BleManagerResult<BPSData>> = callbackFlow {
|
fun downloadData(device: BluetoothDevice): Flow<BleManagerResult<BPSData>> = callbackFlow {
|
||||||
val scope = this
|
val scope = this
|
||||||
val manager = BPSManager(context, scope, ToolboxLogger(context, "BPS"))
|
val createdLogger = toolboxLoggerFactory.create("BPS", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = BPSManager(context, scope, createdLogger)
|
||||||
|
|
||||||
manager.dataHolder.status.onEach {
|
manager.dataHolder.status.onEach {
|
||||||
trySend(it)
|
trySend(it)
|
||||||
@@ -36,6 +43,12 @@ internal class BPSRepository @Inject constructor(
|
|||||||
|
|
||||||
awaitClose {
|
awaitClose {
|
||||||
manager.disconnect().enqueue()
|
manager.disconnect().enqueue()
|
||||||
|
logger = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.bps.R
|
|||||||
import no.nordicsemi.android.bps.viewmodel.BPSViewModel
|
import no.nordicsemi.android.bps.viewmodel.BPSViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -26,8 +27,10 @@ fun BPSScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(DisconnectEvent) }
|
val navigateUp = { viewModel.onEvent(DisconnectEvent) }
|
||||||
|
|
||||||
BackIconAppBar(stringResource(id = R.string.bps_title)) {
|
LoggerIconAppBar(stringResource(id = R.string.bps_title), {
|
||||||
viewModel.onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
|
}) {
|
||||||
|
viewModel.onEvent(OpenLoggerEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
|
|||||||
@@ -3,3 +3,5 @@ package no.nordicsemi.android.bps.view
|
|||||||
internal sealed class BPSScreenViewEvent
|
internal sealed class BPSScreenViewEvent
|
||||||
|
|
||||||
internal object DisconnectEvent : BPSScreenViewEvent()
|
internal object DisconnectEvent : BPSScreenViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLoggerEvent : BPSScreenViewEvent()
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ internal class BPSViewModel @Inject constructor(
|
|||||||
fun onEvent(event: BPSScreenViewEvent) {
|
fun onEvent(event: BPSScreenViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> navigationManager.navigateUp()
|
DisconnectEvent -> navigationManager.navigateUp()
|
||||||
|
OpenLoggerEvent -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import no.nordicsemi.android.ble.ktx.suspend
|
|||||||
import no.nordicsemi.android.cgms.data.CGMData
|
import no.nordicsemi.android.cgms.data.CGMData
|
||||||
import no.nordicsemi.android.cgms.data.CGMManager
|
import no.nordicsemi.android.cgms.data.CGMManager
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
|
import no.nordicsemi.android.logger.ToolboxLoggerFactory
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
import no.nordicsemi.android.service.ConnectingResult
|
import no.nordicsemi.android.service.ConnectingResult
|
||||||
import no.nordicsemi.android.service.ServiceManager
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
@@ -20,9 +21,11 @@ import javax.inject.Singleton
|
|||||||
class CGMRepository @Inject constructor(
|
class CGMRepository @Inject constructor(
|
||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val serviceManager: ServiceManager
|
private val serviceManager: ServiceManager,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
private var manager: CGMManager? = null
|
private var manager: CGMManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
private val _data = MutableStateFlow<BleManagerResult<CGMData>>(ConnectingResult())
|
private val _data = MutableStateFlow<BleManagerResult<CGMData>>(ConnectingResult())
|
||||||
internal val data = _data.asStateFlow()
|
internal val data = _data.asStateFlow()
|
||||||
@@ -35,7 +38,10 @@ class CGMRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
||||||
val manager = CGMManager(context, scope, ToolboxLogger(context, "CGMS"))
|
val createdLogger = toolboxLoggerFactory.create("CGMS", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = CGMManager(context, scope, createdLogger)
|
||||||
this.manager = manager
|
this.manager = manager
|
||||||
|
|
||||||
manager.dataHolder.status.onEach {
|
manager.dataHolder.status.onEach {
|
||||||
@@ -70,8 +76,13 @@ class CGMRepository @Inject constructor(
|
|||||||
manager?.requestFirstRecord()
|
manager?.requestFirstRecord()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
fun release() {
|
fun release() {
|
||||||
manager?.disconnect()?.enqueue()
|
manager?.disconnect()?.enqueue()
|
||||||
|
logger = null
|
||||||
manager = null
|
manager = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.cgms.R
|
|||||||
import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel
|
import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -26,7 +27,9 @@ fun CGMScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
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())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
when (state) {
|
when (state) {
|
||||||
|
|||||||
@@ -9,3 +9,5 @@ internal data class OnWorkingModeSelected(val workingMode: CGMServiceCommand) :
|
|||||||
internal object NavigateUp : CGMViewEvent()
|
internal object NavigateUp : CGMViewEvent()
|
||||||
|
|
||||||
internal object DisconnectEvent : CGMViewEvent()
|
internal object DisconnectEvent : CGMViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLoggerEvent : CGMViewEvent()
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ internal class CGMScreenViewModel @Inject constructor(
|
|||||||
DisconnectEvent -> disconnect()
|
DisconnectEvent -> disconnect()
|
||||||
is OnWorkingModeSelected -> onCommandReceived(event.workingMode)
|
is OnWorkingModeSelected -> onCommandReceived(event.workingMode)
|
||||||
NavigateUp -> navigationManager.navigateUp()
|
NavigateUp -> navigationManager.navigateUp()
|
||||||
|
OpenLoggerEvent -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import no.nordicsemi.android.csc.data.CSCData
|
|||||||
import no.nordicsemi.android.csc.data.CSCManager
|
import no.nordicsemi.android.csc.data.CSCManager
|
||||||
import no.nordicsemi.android.csc.data.WheelSize
|
import no.nordicsemi.android.csc.data.WheelSize
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
|
import no.nordicsemi.android.logger.ToolboxLoggerFactory
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
import no.nordicsemi.android.service.ConnectingResult
|
import no.nordicsemi.android.service.ConnectingResult
|
||||||
import no.nordicsemi.android.service.ServiceManager
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
@@ -21,9 +22,11 @@ import javax.inject.Singleton
|
|||||||
class CSCRepository @Inject constructor(
|
class CSCRepository @Inject constructor(
|
||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val serviceManager: ServiceManager
|
private val serviceManager: ServiceManager,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
private var manager: CSCManager? = null
|
private var manager: CSCManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
private val _data = MutableStateFlow<BleManagerResult<CSCData>>(ConnectingResult())
|
private val _data = MutableStateFlow<BleManagerResult<CSCData>>(ConnectingResult())
|
||||||
internal val data = _data.asStateFlow()
|
internal val data = _data.asStateFlow()
|
||||||
@@ -36,7 +39,10 @@ class CSCRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
||||||
val manager = CSCManager(context, scope, ToolboxLogger(context, "CSC"))
|
val createdLogger = toolboxLoggerFactory.create("CSC", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = CSCManager(context, scope, createdLogger)
|
||||||
this.manager = manager
|
this.manager = manager
|
||||||
|
|
||||||
manager.dataHolder.status.onEach {
|
manager.dataHolder.status.onEach {
|
||||||
@@ -63,8 +69,13 @@ class CSCRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
fun release() {
|
fun release() {
|
||||||
manager?.disconnect()?.enqueue()
|
manager?.disconnect()?.enqueue()
|
||||||
|
logger = null
|
||||||
manager = null
|
manager = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.csc.R
|
|||||||
import no.nordicsemi.android.csc.viewmodel.CSCViewModel
|
import no.nordicsemi.android.csc.viewmodel.CSCViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -26,7 +27,9 @@ fun CSCScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
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())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
when (state.cscManagerState) {
|
when (state.cscManagerState) {
|
||||||
|
|||||||
@@ -11,3 +11,5 @@ internal data class OnSelectedSpeedUnitSelected(val selectedSpeedUnit: SpeedUnit
|
|||||||
internal object OnDisconnectButtonClick : CSCViewEvent()
|
internal object OnDisconnectButtonClick : CSCViewEvent()
|
||||||
|
|
||||||
internal object NavigateUp : CSCViewEvent()
|
internal object NavigateUp : CSCViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLogger : CSCViewEvent()
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ internal class CSCViewModel @Inject constructor(
|
|||||||
is OnWheelSizeSelected -> repository.setWheelSize(event.wheelSize)
|
is OnWheelSizeSelected -> repository.setWheelSize(event.wheelSize)
|
||||||
OnDisconnectButtonClick -> disconnect()
|
OnDisconnectButtonClick -> disconnect()
|
||||||
NavigateUp -> navigationManager.navigateUp()
|
NavigateUp -> navigationManager.navigateUp()
|
||||||
|
OpenLogger -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,8 +56,7 @@ private val BATTERY_SERVICE_UUID = UUID.fromString("0000180F-0000-1000-8000-0080
|
|||||||
private val BATTERY_LEVEL_CHARACTERISTIC_UUID =
|
private val BATTERY_LEVEL_CHARACTERISTIC_UUID =
|
||||||
UUID.fromString("00002A19-0000-1000-8000-00805f9b34fb")
|
UUID.fromString("00002A19-0000-1000-8000-00805f9b34fb")
|
||||||
|
|
||||||
internal class GLSManager @Inject constructor(
|
internal class GLSManager(
|
||||||
@ApplicationContext
|
|
||||||
context: Context,
|
context: Context,
|
||||||
private val scope: CoroutineScope,
|
private val scope: CoroutineScope,
|
||||||
private val logger: ToolboxLogger
|
private val logger: ToolboxLogger
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.gls.R
|
|||||||
import no.nordicsemi.android.gls.main.viewmodel.GLSViewModel
|
import no.nordicsemi.android.gls.main.viewmodel.GLSViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -26,8 +27,10 @@ fun GLSScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(DisconnectEvent) }
|
val navigateUp = { viewModel.onEvent(DisconnectEvent) }
|
||||||
|
|
||||||
BackIconAppBar(stringResource(id = R.string.gls_title)) {
|
LoggerIconAppBar(stringResource(id = R.string.gls_title), {
|
||||||
viewModel.onEvent(DisconnectEvent)
|
viewModel.onEvent(DisconnectEvent)
|
||||||
|
}) {
|
||||||
|
viewModel.onEvent(OpenLoggerEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
|
|||||||
@@ -10,3 +10,5 @@ internal data class OnWorkingModeSelected(val workingMode: WorkingMode) : GLSScr
|
|||||||
internal data class OnGLSRecordClick(val record: GLSRecord) : GLSScreenViewEvent()
|
internal data class OnGLSRecordClick(val record: GLSRecord) : GLSScreenViewEvent()
|
||||||
|
|
||||||
internal object DisconnectEvent : GLSScreenViewEvent()
|
internal object DisconnectEvent : GLSScreenViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLoggerEvent : GLSScreenViewEvent()
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ internal class GLSViewModel @Inject constructor(
|
|||||||
|
|
||||||
fun onEvent(event: GLSScreenViewEvent) {
|
fun onEvent(event: GLSScreenViewEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
|
OpenLoggerEvent -> repository.openLogger()
|
||||||
DisconnectEvent -> navigationManager.navigateUp()
|
DisconnectEvent -> navigationManager.navigateUp()
|
||||||
is OnWorkingModeSelected -> repository.requestMode(event.workingMode)
|
is OnWorkingModeSelected -> repository.requestMode(event.workingMode)
|
||||||
is OnGLSRecordClick -> navigationManager.navigateTo(GlsDetailsDestinationId, AnyArgument(event.record))
|
is OnGLSRecordClick -> navigationManager.navigateTo(GlsDetailsDestinationId, AnyArgument(event.record))
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import no.nordicsemi.android.gls.data.GLSData
|
|||||||
import no.nordicsemi.android.gls.data.GLSManager
|
import no.nordicsemi.android.gls.data.GLSManager
|
||||||
import no.nordicsemi.android.gls.data.WorkingMode
|
import no.nordicsemi.android.gls.data.WorkingMode
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
|
import no.nordicsemi.android.logger.ToolboxLoggerFactory
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -22,14 +23,19 @@ import javax.inject.Inject
|
|||||||
@ViewModelScoped
|
@ViewModelScoped
|
||||||
internal class GLSRepository @Inject constructor(
|
internal class GLSRepository @Inject constructor(
|
||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context
|
private val context: Context,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private var manager: GLSManager? = null
|
private var manager: GLSManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
fun downloadData(device: BluetoothDevice): Flow<BleManagerResult<GLSData>> = callbackFlow {
|
fun downloadData(device: BluetoothDevice): Flow<BleManagerResult<GLSData>> = callbackFlow {
|
||||||
val scope = this
|
val scope = this
|
||||||
val managerInstance = manager ?: GLSManager(context, scope, ToolboxLogger(context, "GLS")).apply {
|
val createdLogger = toolboxLoggerFactory.create("GLS", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val managerInstance = manager ?: GLSManager(context, scope, createdLogger).apply {
|
||||||
try {
|
try {
|
||||||
connect(device)
|
connect(device)
|
||||||
.useAutoConnect(false)
|
.useAutoConnect(false)
|
||||||
@@ -48,11 +54,16 @@ internal class GLSRepository @Inject constructor(
|
|||||||
awaitClose {
|
awaitClose {
|
||||||
launch {
|
launch {
|
||||||
manager?.disconnect()?.suspend()
|
manager?.disconnect()?.suspend()
|
||||||
|
logger = null
|
||||||
manager = null
|
manager = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
fun requestMode(workingMode: WorkingMode) {
|
fun requestMode(workingMode: WorkingMode) {
|
||||||
when (workingMode) {
|
when (workingMode) {
|
||||||
WorkingMode.ALL -> manager?.requestAllRecords()
|
WorkingMode.ALL -> manager?.requestAllRecords()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import no.nordicsemi.android.ble.ktx.suspend
|
|||||||
import no.nordicsemi.android.hrs.data.HRSData
|
import no.nordicsemi.android.hrs.data.HRSData
|
||||||
import no.nordicsemi.android.hrs.data.HRSManager
|
import no.nordicsemi.android.hrs.data.HRSManager
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
|
import no.nordicsemi.android.logger.ToolboxLoggerFactory
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
import no.nordicsemi.android.service.ConnectingResult
|
import no.nordicsemi.android.service.ConnectingResult
|
||||||
import no.nordicsemi.android.service.ServiceManager
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
@@ -20,9 +21,11 @@ import javax.inject.Singleton
|
|||||||
class HRSRepository @Inject constructor(
|
class HRSRepository @Inject constructor(
|
||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val serviceManager: ServiceManager
|
private val serviceManager: ServiceManager,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
private var manager: HRSManager? = null
|
private var manager: HRSManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
private val _data = MutableStateFlow<BleManagerResult<HRSData>>(ConnectingResult())
|
private val _data = MutableStateFlow<BleManagerResult<HRSData>>(ConnectingResult())
|
||||||
internal val data = _data.asStateFlow()
|
internal val data = _data.asStateFlow()
|
||||||
@@ -35,7 +38,10 @@ class HRSRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
||||||
val manager = HRSManager(context, scope, ToolboxLogger(context, "HRS"))
|
val createdLogger = toolboxLoggerFactory.create("HRS", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = HRSManager(context, scope, createdLogger)
|
||||||
this.manager = manager
|
this.manager = manager
|
||||||
|
|
||||||
manager.dataHolder.status.onEach {
|
manager.dataHolder.status.onEach {
|
||||||
@@ -47,6 +53,10 @@ class HRSRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun HRSManager.start(device: BluetoothDevice) {
|
private suspend fun HRSManager.start(device: BluetoothDevice) {
|
||||||
try {
|
try {
|
||||||
connect(device)
|
connect(device)
|
||||||
@@ -60,6 +70,7 @@ class HRSRepository @Inject constructor(
|
|||||||
|
|
||||||
fun release() {
|
fun release() {
|
||||||
manager?.disconnect()?.enqueue()
|
manager?.disconnect()?.enqueue()
|
||||||
|
logger = null
|
||||||
manager = null
|
manager = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.hrs.R
|
|||||||
import no.nordicsemi.android.hrs.viewmodel.HRSViewModel
|
import no.nordicsemi.android.hrs.viewmodel.HRSViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -26,7 +27,9 @@ fun HRSScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(NavigateUpEvent) }
|
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())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
when (state) {
|
when (state) {
|
||||||
|
|||||||
@@ -5,3 +5,5 @@ internal sealed class HRSScreenViewEvent
|
|||||||
internal object DisconnectEvent : HRSScreenViewEvent()
|
internal object DisconnectEvent : HRSScreenViewEvent()
|
||||||
|
|
||||||
internal object NavigateUpEvent : HRSScreenViewEvent()
|
internal object NavigateUpEvent : HRSScreenViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLoggerEvent : HRSScreenViewEvent()
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ internal class HRSViewModel @Inject constructor(
|
|||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> disconnect()
|
DisconnectEvent -> disconnect()
|
||||||
NavigateUpEvent -> navigationManager.navigateUp()
|
NavigateUpEvent -> navigationManager.navigateUp()
|
||||||
|
OpenLoggerEvent -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import no.nordicsemi.android.ble.ktx.suspend
|
|||||||
import no.nordicsemi.android.hts.data.HTSData
|
import no.nordicsemi.android.hts.data.HTSData
|
||||||
import no.nordicsemi.android.hts.data.HTSManager
|
import no.nordicsemi.android.hts.data.HTSManager
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
|
import no.nordicsemi.android.logger.ToolboxLoggerFactory
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
import no.nordicsemi.android.service.ConnectingResult
|
import no.nordicsemi.android.service.ConnectingResult
|
||||||
import no.nordicsemi.android.service.ServiceManager
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
@@ -20,9 +21,11 @@ import javax.inject.Singleton
|
|||||||
class HTSRepository @Inject constructor(
|
class HTSRepository @Inject constructor(
|
||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val serviceManager: ServiceManager
|
private val serviceManager: ServiceManager,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
private var manager: HTSManager? = null
|
private var manager: HTSManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
private val _data = MutableStateFlow<BleManagerResult<HTSData>>(ConnectingResult())
|
private val _data = MutableStateFlow<BleManagerResult<HTSData>>(ConnectingResult())
|
||||||
internal val data = _data.asStateFlow()
|
internal val data = _data.asStateFlow()
|
||||||
@@ -35,7 +38,10 @@ class HTSRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
||||||
val manager = HTSManager(context, scope, ToolboxLogger(context, "HTS"))
|
val createdLogger = toolboxLoggerFactory.create("HTS", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = HTSManager(context, scope, createdLogger)
|
||||||
this.manager = manager
|
this.manager = manager
|
||||||
|
|
||||||
manager.dataHolder.status.onEach {
|
manager.dataHolder.status.onEach {
|
||||||
@@ -47,6 +53,10 @@ class HTSRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun HTSManager.start(device: BluetoothDevice) {
|
private suspend fun HTSManager.start(device: BluetoothDevice) {
|
||||||
try {
|
try {
|
||||||
connect(device)
|
connect(device)
|
||||||
@@ -60,6 +70,7 @@ class HTSRepository @Inject constructor(
|
|||||||
|
|
||||||
fun release() {
|
fun release() {
|
||||||
manager?.disconnect()?.enqueue()
|
manager?.disconnect()?.enqueue()
|
||||||
|
logger = null
|
||||||
manager = null
|
manager = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.hts.R
|
|||||||
import no.nordicsemi.android.hts.viewmodel.HTSViewModel
|
import no.nordicsemi.android.hts.viewmodel.HTSViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -26,7 +27,9 @@ fun HTSScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
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())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
when (state.htsManagerState) {
|
when (state.htsManagerState) {
|
||||||
|
|||||||
@@ -7,3 +7,5 @@ internal data class OnTemperatureUnitSelected(val value: TemperatureUnit) : HTSS
|
|||||||
internal object DisconnectEvent : HTSScreenViewEvent()
|
internal object DisconnectEvent : HTSScreenViewEvent()
|
||||||
|
|
||||||
internal object NavigateUp : HTSScreenViewEvent()
|
internal object NavigateUp : HTSScreenViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLoggerEvent : HTSScreenViewEvent()
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ internal class HTSViewModel @Inject constructor(
|
|||||||
DisconnectEvent -> disconnect()
|
DisconnectEvent -> disconnect()
|
||||||
is OnTemperatureUnitSelected -> onTemperatureUnitSelected(event)
|
is OnTemperatureUnitSelected -> onTemperatureUnitSelected(event)
|
||||||
NavigateUp -> navigationManager.navigateUp()
|
NavigateUp -> navigationManager.navigateUp()
|
||||||
|
OpenLoggerEvent -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
|
|||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
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.AlarmLevel
|
||||||
import no.nordicsemi.android.prx.data.PRXData
|
import no.nordicsemi.android.prx.data.PRXData
|
||||||
import no.nordicsemi.android.prx.data.PRXManager
|
import no.nordicsemi.android.prx.data.PRXManager
|
||||||
@@ -20,10 +21,12 @@ class PRXRepository @Inject internal constructor(
|
|||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val serviceManager: ServiceManager,
|
private val serviceManager: ServiceManager,
|
||||||
private val proximityServerManager: ProximityServerManager,
|
private val proximityServerManager: ProximityServerManager,
|
||||||
private val alarmHandler: AlarmHandler
|
private val alarmHandler: AlarmHandler,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private var manager: PRXManager? = null
|
private var manager: PRXManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
private val _data = MutableStateFlow<BleManagerResult<PRXData>>(ConnectingResult())
|
private val _data = MutableStateFlow<BleManagerResult<PRXData>>(ConnectingResult())
|
||||||
internal val data = _data.asStateFlow()
|
internal val data = _data.asStateFlow()
|
||||||
@@ -37,7 +40,10 @@ class PRXRepository @Inject internal constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
||||||
val manager = PRXManager(context, scope, ToolboxLogger(context, "PRX"))
|
val createdLogger = toolboxLoggerFactory.create("PRX", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = PRXManager(context, scope, createdLogger)
|
||||||
this.manager = manager
|
this.manager = manager
|
||||||
manager.useServer(proximityServerManager)
|
manager.useServer(proximityServerManager)
|
||||||
|
|
||||||
@@ -73,9 +79,14 @@ class PRXRepository @Inject internal constructor(
|
|||||||
manager?.writeImmediateAlert(false)
|
manager?.writeImmediateAlert(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
fun release() {
|
fun release() {
|
||||||
alarmHandler.releaseAlarm()
|
alarmHandler.releaseAlarm()
|
||||||
manager?.disconnect()?.enqueue()
|
manager?.disconnect()?.enqueue()
|
||||||
manager = null
|
manager = null
|
||||||
|
logger = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import no.nordicsemi.android.prx.R
|
|||||||
import no.nordicsemi.android.prx.viewmodel.PRXViewModel
|
import no.nordicsemi.android.prx.viewmodel.PRXViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -27,7 +28,9 @@ fun PRXScreen() {
|
|||||||
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
val navigateUp = { viewModel.onEvent(NavigateUpEvent) }
|
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())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
when (state) {
|
when (state) {
|
||||||
|
|||||||
@@ -9,3 +9,5 @@ internal object TurnOnAlert : PRXScreenViewEvent()
|
|||||||
internal object TurnOffAlert : PRXScreenViewEvent()
|
internal object TurnOffAlert : PRXScreenViewEvent()
|
||||||
|
|
||||||
internal object DisconnectEvent : PRXScreenViewEvent()
|
internal object DisconnectEvent : PRXScreenViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLoggerEvent : PRXScreenViewEvent()
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ internal class PRXViewModel @Inject constructor(
|
|||||||
TurnOffAlert -> repository.disableAlarm()
|
TurnOffAlert -> repository.disableAlarm()
|
||||||
TurnOnAlert -> repository.enableAlarm()
|
TurnOnAlert -> repository.enableAlarm()
|
||||||
NavigateUpEvent -> navigationManager.navigateUp()
|
NavigateUpEvent -> navigationManager.navigateUp()
|
||||||
|
OpenLoggerEvent -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.*
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import no.nordicsemi.android.ble.ktx.suspend
|
import no.nordicsemi.android.ble.ktx.suspend
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
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.RSCSData
|
||||||
import no.nordicsemi.android.rscs.data.RSCSManager
|
import no.nordicsemi.android.rscs.data.RSCSManager
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
@@ -20,9 +21,11 @@ import javax.inject.Singleton
|
|||||||
class RSCSRepository @Inject constructor(
|
class RSCSRepository @Inject constructor(
|
||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val serviceManager: ServiceManager
|
private val serviceManager: ServiceManager,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
private var manager: RSCSManager? = null
|
private var manager: RSCSManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
private val _data = MutableStateFlow<BleManagerResult<RSCSData>>(ConnectingResult())
|
private val _data = MutableStateFlow<BleManagerResult<RSCSData>>(ConnectingResult())
|
||||||
internal val data = _data.asStateFlow()
|
internal val data = _data.asStateFlow()
|
||||||
@@ -35,7 +38,10 @@ class RSCSRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
||||||
val manager = RSCSManager(context, scope, ToolboxLogger(context, "RSCS"))
|
val createdLogger = toolboxLoggerFactory.create("RSCS", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = RSCSManager(context, scope, createdLogger)
|
||||||
this.manager = manager
|
this.manager = manager
|
||||||
|
|
||||||
manager.dataHolder.status.onEach {
|
manager.dataHolder.status.onEach {
|
||||||
@@ -47,6 +53,10 @@ class RSCSRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun RSCSManager.start(device: BluetoothDevice) {
|
private suspend fun RSCSManager.start(device: BluetoothDevice) {
|
||||||
try {
|
try {
|
||||||
connect(device)
|
connect(device)
|
||||||
@@ -61,5 +71,6 @@ class RSCSRepository @Inject constructor(
|
|||||||
fun release() {
|
fun release() {
|
||||||
manager?.disconnect()?.enqueue()
|
manager?.disconnect()?.enqueue()
|
||||||
manager = null
|
manager = null
|
||||||
|
logger = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import no.nordicsemi.android.rscs.R
|
|||||||
import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel
|
import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.utils.exhaustive
|
import no.nordicsemi.android.utils.exhaustive
|
||||||
@@ -26,7 +27,9 @@ fun RSCSScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(NavigateUpEvent) }
|
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())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
when (state) {
|
when (state) {
|
||||||
|
|||||||
@@ -5,3 +5,5 @@ internal sealed class RSCScreenViewEvent
|
|||||||
internal object NavigateUpEvent : RSCScreenViewEvent()
|
internal object NavigateUpEvent : RSCScreenViewEvent()
|
||||||
|
|
||||||
internal object DisconnectEvent : RSCScreenViewEvent()
|
internal object DisconnectEvent : RSCScreenViewEvent()
|
||||||
|
|
||||||
|
internal object OpenLoggerEvent : RSCScreenViewEvent()
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ internal class RSCSViewModel @Inject constructor(
|
|||||||
when (event) {
|
when (event) {
|
||||||
DisconnectEvent -> disconnect()
|
DisconnectEvent -> disconnect()
|
||||||
NavigateUpEvent -> navigationManager.navigateUp()
|
NavigateUpEvent -> navigationManager.navigateUp()
|
||||||
|
OpenLoggerEvent -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
package no.nordicsemi.android.uart.data
|
package no.nordicsemi.android.uart.data
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.bluetooth.BluetoothGatt
|
import android.bluetooth.BluetoothGatt
|
||||||
import android.bluetooth.BluetoothGattCharacteristic
|
import android.bluetooth.BluetoothGattCharacteristic
|
||||||
import android.bluetooth.BluetoothGattService
|
import android.bluetooth.BluetoothGattService
|
||||||
@@ -36,6 +37,7 @@ import no.nordicsemi.android.ble.WriteRequest
|
|||||||
import no.nordicsemi.android.ble.common.callback.battery.BatteryLevelResponse
|
import no.nordicsemi.android.ble.common.callback.battery.BatteryLevelResponse
|
||||||
import no.nordicsemi.android.ble.ktx.asFlow
|
import no.nordicsemi.android.ble.ktx.asFlow
|
||||||
import no.nordicsemi.android.ble.ktx.asValidResponseFlow
|
import no.nordicsemi.android.ble.ktx.asValidResponseFlow
|
||||||
|
import no.nordicsemi.android.ble.ktx.suspend
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
import no.nordicsemi.android.service.ConnectionObserverAdapter
|
import no.nordicsemi.android.service.ConnectionObserverAdapter
|
||||||
import no.nordicsemi.android.utils.EMPTY
|
import no.nordicsemi.android.utils.EMPTY
|
||||||
@@ -83,9 +85,11 @@ internal class UARTManager(
|
|||||||
|
|
||||||
private inner class UARTManagerGattCallback : BleManagerGattCallback() {
|
private inner class UARTManagerGattCallback : BleManagerGattCallback() {
|
||||||
|
|
||||||
|
@SuppressLint("WrongConstant")
|
||||||
override fun initialize() {
|
override fun initialize() {
|
||||||
setNotificationCallback(txCharacteristic).asFlow().onEach {
|
setNotificationCallback(txCharacteristic).asFlow().onEach {
|
||||||
val text: String = it.getStringValue(0) ?: String.EMPTY
|
val text: String = it.getStringValue(0) ?: String.EMPTY
|
||||||
|
log(10, "\"$text\" received")
|
||||||
data.value = data.value.copy(messages = data.value.messages + UARTOutputRecord(text))
|
data.value = data.value.copy(messages = data.value.messages + UARTOutputRecord(text))
|
||||||
}.launchIn(scope)
|
}.launchIn(scope)
|
||||||
|
|
||||||
@@ -134,6 +138,7 @@ internal class UARTManager(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("WrongConstant")
|
||||||
fun send(text: String) {
|
fun send(text: String) {
|
||||||
if (rxCharacteristic == null) return
|
if (rxCharacteristic == null) return
|
||||||
if (!TextUtils.isEmpty(text)) {
|
if (!TextUtils.isEmpty(text)) {
|
||||||
@@ -147,7 +152,8 @@ internal class UARTManager(
|
|||||||
if (!useLongWrite) {
|
if (!useLongWrite) {
|
||||||
request.split()
|
request.split()
|
||||||
}
|
}
|
||||||
request.enqueue()
|
request.suspend()
|
||||||
|
log(10, "\"$text\" sent")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.*
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import no.nordicsemi.android.ble.ktx.suspend
|
import no.nordicsemi.android.ble.ktx.suspend
|
||||||
import no.nordicsemi.android.logger.ToolboxLogger
|
import no.nordicsemi.android.logger.ToolboxLogger
|
||||||
|
import no.nordicsemi.android.logger.ToolboxLoggerFactory
|
||||||
import no.nordicsemi.android.service.BleManagerResult
|
import no.nordicsemi.android.service.BleManagerResult
|
||||||
import no.nordicsemi.android.service.ConnectingResult
|
import no.nordicsemi.android.service.ConnectingResult
|
||||||
import no.nordicsemi.android.service.ServiceManager
|
import no.nordicsemi.android.service.ServiceManager
|
||||||
@@ -20,9 +21,11 @@ class UARTRepository @Inject internal constructor(
|
|||||||
@ApplicationContext
|
@ApplicationContext
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val serviceManager: ServiceManager,
|
private val serviceManager: ServiceManager,
|
||||||
private val configurationDataSource: ConfigurationDataSource
|
private val configurationDataSource: ConfigurationDataSource,
|
||||||
|
private val toolboxLoggerFactory: ToolboxLoggerFactory
|
||||||
) {
|
) {
|
||||||
private var manager: UARTManager? = null
|
private var manager: UARTManager? = null
|
||||||
|
private var logger: ToolboxLogger? = null
|
||||||
|
|
||||||
private val _data = MutableStateFlow<BleManagerResult<UARTData>>(ConnectingResult())
|
private val _data = MutableStateFlow<BleManagerResult<UARTData>>(ConnectingResult())
|
||||||
internal val data = _data.asStateFlow()
|
internal val data = _data.asStateFlow()
|
||||||
@@ -37,7 +40,10 @@ class UARTRepository @Inject internal constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
fun start(device: BluetoothDevice, scope: CoroutineScope) {
|
||||||
val manager = UARTManager(context, scope, ToolboxLogger(context, "UART"))
|
val createdLogger = toolboxLoggerFactory.create("UART", device.address).also {
|
||||||
|
logger = it
|
||||||
|
}
|
||||||
|
val manager = UARTManager(context, scope, createdLogger)
|
||||||
this.manager = manager
|
this.manager = manager
|
||||||
|
|
||||||
manager.dataHolder.status.onEach {
|
manager.dataHolder.status.onEach {
|
||||||
@@ -59,6 +65,10 @@ class UARTRepository @Inject internal constructor(
|
|||||||
manager?.clearItems()
|
manager?.clearItems()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openLogger() {
|
||||||
|
logger?.openLogger()
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun saveConfigurationName(name: String) {
|
suspend fun saveConfigurationName(name: String) {
|
||||||
configurationDataSource.saveConfigurationName(name)
|
configurationDataSource.saveConfigurationName(name)
|
||||||
}
|
}
|
||||||
@@ -77,5 +87,6 @@ class UARTRepository @Inject internal constructor(
|
|||||||
fun release() {
|
fun release() {
|
||||||
manager?.disconnect()?.enqueue()
|
manager?.disconnect()?.enqueue()
|
||||||
manager = null
|
manager = null
|
||||||
|
logger = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import no.nordicsemi.android.service.*
|
import no.nordicsemi.android.service.*
|
||||||
import no.nordicsemi.android.theme.view.BackIconAppBar
|
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.DeviceConnectingView
|
||||||
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
import no.nordicsemi.ui.scanner.ui.NoDeviceView
|
||||||
import no.nordicsemi.android.uart.R
|
import no.nordicsemi.android.uart.R
|
||||||
@@ -30,7 +31,9 @@ fun UARTScreen() {
|
|||||||
Column {
|
Column {
|
||||||
val navigateUp = { viewModel.onEvent(NavigateUp) }
|
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())) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||||
when (state.uartManagerState) {
|
when (state.uartManagerState) {
|
||||||
|
|||||||
@@ -20,3 +20,4 @@ internal object ClearOutputItems : UARTViewEvent()
|
|||||||
internal object DisconnectEvent : UARTViewEvent()
|
internal object DisconnectEvent : UARTViewEvent()
|
||||||
|
|
||||||
internal object NavigateUp : UARTViewEvent()
|
internal object NavigateUp : UARTViewEvent()
|
||||||
|
internal object OpenLogger : UARTViewEvent()
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ internal class UARTViewModel @Inject constructor(
|
|||||||
OnDeleteConfiguration -> deleteConfiguration()
|
OnDeleteConfiguration -> deleteConfiguration()
|
||||||
OnEditConfiguration -> onEditConfiguration()
|
OnEditConfiguration -> onEditConfiguration()
|
||||||
ClearOutputItems -> repository.clearItems()
|
ClearOutputItems -> repository.clearItems()
|
||||||
|
OpenLogger -> repository.openLogger()
|
||||||
}.exhaustive
|
}.exhaustive
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user