Skip to content

Commit ea71565

Browse files
Merge pull request #108 from NordicSemiconductor/bug/logging
Bug/logging
2 parents b5d542f + 4009379 commit ea71565

File tree

46 files changed

+320
-42
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+320
-42
lines changed

app/src/main/java/no/nordicsemi/android/nrftoolbox/view/HomeView.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.ui.res.stringResource
1414
import androidx.compose.ui.text.style.TextAlign
1515
import androidx.compose.ui.unit.dp
1616
import androidx.hilt.navigation.compose.hiltViewModel
17+
import no.nordicsemi.android.logger.LoggerAppRunner
1718
import no.nordicsemi.android.nrftoolbox.BuildConfig
1819
import no.nordicsemi.android.nrftoolbox.ProfileDestination
1920
import no.nordicsemi.android.nrftoolbox.R
@@ -24,7 +25,6 @@ private const val DFU_PACKAGE_NAME = "no.nordicsemi.android.dfu"
2425
private const val DFU_LINK = "https://play.google.com/store/apps/details?id=no.nordicsemi.android.dfu"
2526

2627
private const val LOGGER_PACKAGE_NAME = "no.nordicsemi.android.log"
27-
private const val LOGGER_LINK = "https://play.google.com/store/apps/details?id=no.nordicsemi.android.log"
2828

2929
@Composable
3030
fun HomeScreen() {
@@ -148,12 +148,7 @@ fun HomeScreen() {
148148
} ?: R.string.dfu_module_install
149149

150150
FeatureButton(R.drawable.ic_logger, R.string.logger_module, R.string.logger_module_full, null, loggerDescription) {
151-
val intent = packageManger.getLaunchIntentForPackage(LOGGER_PACKAGE_NAME)
152-
if (intent != null) {
153-
context.startActivity(intent)
154-
} else {
155-
uriHandler.openUri(LOGGER_LINK)
156-
}
151+
viewModel.openLogger()
157152
}
158153

159154
Spacer(modifier = Modifier.height(16.dp))

app/src/main/java/no/nordicsemi/android/nrftoolbox/viewmodel/HomeViewModel.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import no.nordicsemi.android.cgms.repository.CGMRepository
1212
import no.nordicsemi.android.csc.repository.CSCRepository
1313
import no.nordicsemi.android.hrs.service.HRSRepository
1414
import no.nordicsemi.android.hts.repository.HTSRepository
15+
import no.nordicsemi.android.logger.LoggerAppRunner
1516
import no.nordicsemi.android.navigation.NavigationManager
1617
import no.nordicsemi.android.nrftoolbox.ProfileDestination
1718
import no.nordicsemi.android.nrftoolbox.repository.ActivitySignals
@@ -32,6 +33,7 @@ class HomeViewModel @Inject constructor(
3233
prxRepository: PRXRepository,
3334
rscsRepository: RSCSRepository,
3435
uartRepository: UARTRepository,
36+
private val loggerAppRunner: LoggerAppRunner
3537
) : ViewModel() {
3638

3739
private val _state = MutableStateFlow(HomeViewState())
@@ -74,4 +76,8 @@ class HomeViewModel @Inject constructor(
7476
fun openProfile(destination: ProfileDestination) {
7577
navigationManager.navigateTo(destination.destination.id)
7678
}
79+
80+
fun openLogger() {
81+
loggerAppRunner.runLogger()
82+
}
7783
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package no.nordicsemi.android.logger
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
import android.net.Uri
6+
import androidx.compose.ui.platform.AndroidUriHandler
7+
import dagger.hilt.android.qualifiers.ApplicationContext
8+
import javax.inject.Inject
9+
10+
private const val LOGGER_PACKAGE_NAME = "no.nordicsemi.android.log"
11+
private const val LOGGER_LINK = "https://play.google.com/store/apps/details?id=no.nordicsemi.android.log"
12+
13+
class LoggerAppRunner @Inject constructor(
14+
@ApplicationContext
15+
private val context: Context
16+
) {
17+
18+
fun runLogger() {
19+
val packageManger = context.packageManager
20+
val uriHandler = AndroidUriHandler(context)
21+
22+
val intent = packageManger.getLaunchIntentForPackage(LOGGER_PACKAGE_NAME)
23+
if (intent != null) {
24+
context.startActivity(intent)
25+
} else {
26+
uriHandler.openUri(LOGGER_LINK)
27+
}
28+
}
29+
30+
fun runLogger(uri: Uri?) {
31+
val packageManger = context.packageManager
32+
33+
val intent = packageManger.getLaunchIntentForPackage(LOGGER_PACKAGE_NAME)
34+
35+
val targetUri = if (intent != null && uri != null) {
36+
uri
37+
} else {
38+
Uri.parse(LOGGER_LINK)
39+
}
40+
val launchIntent = Intent(Intent.ACTION_VIEW, targetUri)
41+
launchIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
42+
context.startActivity(launchIntent)
43+
}
44+
}

lib_log/src/main/java/no/nordicsemi/android/logger/ToolboxLogger.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@ package no.nordicsemi.android.logger
22

33
import android.content.Context
44
import android.util.Log
5+
import dagger.assisted.Assisted
6+
import dagger.assisted.AssistedInject
7+
import dagger.hilt.android.qualifiers.ApplicationContext
58
import no.nordicsemi.android.log.LogContract
69
import no.nordicsemi.android.log.LogSession
710
import no.nordicsemi.android.log.Logger
811
import no.nordicsemi.android.log.annotation.LogLevel
912

1013
internal const val LOG_TAG = "nRF Toolbox"
1114

12-
class ToolboxLogger(
15+
class ToolboxLogger @AssistedInject constructor(
16+
@ApplicationContext
1317
private val context: Context,
18+
private val appRunner: LoggerAppRunner,
19+
@Assisted("profile")
20+
private val profile: String,
21+
@Assisted("key")
1422
private val key: String,
1523
) {
1624

@@ -21,11 +29,17 @@ class ToolboxLogger(
2129
if (logSession != null) {
2230
Logger.log(logSession, LogContract.Log.Level.fromPriority(level), message)
2331
}
24-
Log.println(level, LOG_TAG, message)
32+
val logPriority = if (level <= Log.ASSERT) level else Log.INFO
33+
Log.println(logPriority, LOG_TAG, message)
34+
}
35+
36+
fun openLogger() {
37+
appRunner.runLogger(logSession?.sessionUri)
2538
}
2639

2740
private fun getLogger(): LogSession? {
28-
logSession = logSession ?: Logger.newSession(context, key, LOG_TAG)
41+
logSession = logSession ?: Logger.newSession(context, profile, key, LOG_TAG)
42+
logSession?.sessionsUri
2943
return logSession
3044
}
3145
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package no.nordicsemi.android.logger
2+
3+
import dagger.assisted.Assisted
4+
import dagger.assisted.AssistedFactory
5+
6+
@AssistedFactory
7+
interface ToolboxLoggerFactory {
8+
9+
fun create(@Assisted("profile") profile: String, @Assisted("key") key: String): ToolboxLogger
10+
}

app/src/main/res/drawable/ic_logger.xml renamed to lib_log/src/main/res/drawable/ic_logger.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2-
android:width="1024dp"
3-
android:height="1024dp"
2+
android:width="80dp"
3+
android:height="80dp"
44
android:viewportWidth="1024"
55
android:viewportHeight="1024">
66
<path

lib_theme/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
apply from: rootProject.file("library.gradle")
22

33
dependencies {
4+
implementation project(":lib_log")
5+
46
implementation libs.material
57

68
implementation libs.nordic.theme

lib_theme/src/main/java/no/nordicsemi/android/theme/view/TopAppBar.kt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package no.nordicsemi.android.theme.view
22

3+
import androidx.compose.foundation.layout.size
34
import androidx.compose.material.icons.Icons
45
import androidx.compose.material.icons.filled.ArrowBack
56
import androidx.compose.material.icons.filled.Close
@@ -10,8 +11,13 @@ import androidx.compose.material3.SmallTopAppBar
1011
import androidx.compose.material3.Text
1112
import androidx.compose.material3.TopAppBarDefaults
1213
import androidx.compose.runtime.Composable
14+
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.platform.LocalContext
16+
import androidx.compose.ui.platform.LocalUriHandler
1317
import androidx.compose.ui.res.colorResource
18+
import androidx.compose.ui.res.painterResource
1419
import androidx.compose.ui.res.stringResource
20+
import androidx.compose.ui.unit.dp
1521
import no.nordicsemi.android.theme.R
1622

1723
@Composable
@@ -68,6 +74,48 @@ fun BackIconAppBar(text: String, onClick: () -> Unit) {
6874
contentDescription = stringResource(id = R.string.back_screen),
6975
)
7076
}
77+
},
78+
actions = {
79+
IconButton(onClick = { onClick() }) {
80+
Icon(
81+
painterResource(id = R.drawable.ic_logger),
82+
contentDescription = stringResource(id = R.string.back_screen),
83+
tint = MaterialTheme.colorScheme.onPrimary,
84+
modifier = Modifier.size(24.dp)
85+
)
86+
}
87+
}
88+
)
89+
}
90+
91+
@Composable
92+
fun LoggerIconAppBar(text: String, onClick: () -> Unit, onLoggerClick: () -> Unit) {
93+
SmallTopAppBar(
94+
title = { Text(text) },
95+
colors = TopAppBarDefaults.smallTopAppBarColors(
96+
scrolledContainerColor = MaterialTheme.colorScheme.primary,
97+
containerColor = colorResource(id = R.color.appBarColor),
98+
titleContentColor = MaterialTheme.colorScheme.onPrimary,
99+
actionIconContentColor = MaterialTheme.colorScheme.onPrimary,
100+
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
101+
),
102+
navigationIcon = {
103+
IconButton(onClick = { onClick() }) {
104+
Icon(
105+
Icons.Default.ArrowBack,
106+
contentDescription = stringResource(id = R.string.back_screen),
107+
)
108+
}
109+
},
110+
actions = {
111+
IconButton(onClick = { onLoggerClick() }) {
112+
Icon(
113+
painterResource(id = R.drawable.ic_logger),
114+
contentDescription = stringResource(id = R.string.back_screen),
115+
tint = MaterialTheme.colorScheme.onPrimary,
116+
modifier = Modifier.size(24.dp)
117+
)
118+
}
71119
}
72120
)
73121
}

profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSRepository.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,25 @@ import kotlinx.coroutines.flow.onEach
1212
import no.nordicsemi.android.bps.data.BPSData
1313
import no.nordicsemi.android.bps.data.BPSManager
1414
import no.nordicsemi.android.logger.ToolboxLogger
15+
import no.nordicsemi.android.logger.ToolboxLoggerFactory
1516
import no.nordicsemi.android.service.BleManagerResult
1617
import javax.inject.Inject
1718

1819
@ViewModelScoped
1920
internal class BPSRepository @Inject constructor(
2021
@ApplicationContext
21-
private val context: Context
22+
private val context: Context,
23+
private val toolboxLoggerFactory: ToolboxLoggerFactory
2224
) {
2325

26+
private var logger: ToolboxLogger? = null
27+
2428
fun downloadData(device: BluetoothDevice): Flow<BleManagerResult<BPSData>> = callbackFlow {
2529
val scope = this
26-
val manager = BPSManager(context, scope, ToolboxLogger(context, "BPS"))
30+
val createdLogger = toolboxLoggerFactory.create("BPS", device.address).also {
31+
logger = it
32+
}
33+
val manager = BPSManager(context, scope, createdLogger)
2734

2835
manager.dataHolder.status.onEach {
2936
trySend(it)
@@ -36,6 +43,12 @@ internal class BPSRepository @Inject constructor(
3643

3744
awaitClose {
3845
manager.disconnect().enqueue()
46+
logger = null
3947
}
4048
}
49+
50+
fun openLogger() {
51+
logger?.openLogger()
52+
}
53+
4154
}

profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import no.nordicsemi.android.bps.R
1212
import no.nordicsemi.android.bps.viewmodel.BPSViewModel
1313
import no.nordicsemi.android.service.*
1414
import no.nordicsemi.android.theme.view.BackIconAppBar
15+
import no.nordicsemi.android.theme.view.LoggerIconAppBar
1516
import no.nordicsemi.ui.scanner.ui.DeviceConnectingView
1617
import no.nordicsemi.ui.scanner.ui.NoDeviceView
1718
import no.nordicsemi.android.utils.exhaustive
@@ -26,8 +27,10 @@ fun BPSScreen() {
2627
Column {
2728
val navigateUp = { viewModel.onEvent(DisconnectEvent) }
2829

29-
BackIconAppBar(stringResource(id = R.string.bps_title)) {
30+
LoggerIconAppBar(stringResource(id = R.string.bps_title), {
3031
viewModel.onEvent(DisconnectEvent)
32+
}) {
33+
viewModel.onEvent(OpenLoggerEvent)
3134
}
3235

3336
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {

0 commit comments

Comments
 (0)