diff --git a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/TopAppBar.kt b/lib_theme/src/main/java/no/nordicsemi/android/theme/view/TopAppBar.kt index f03b4059..1f5a48ff 100644 --- a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/TopAppBar.kt +++ b/lib_theme/src/main/java/no/nordicsemi/android/theme/view/TopAppBar.kt @@ -51,7 +51,7 @@ fun TitleAppBar(text: String) { } @Composable -fun BackIconAppBar(text: String, onClick: () -> Unit) { +fun LoggerBackIconAppBar(text: String, onClick: () -> Unit) { SmallTopAppBar( title = { Text(text) }, colors = TopAppBarDefaults.smallTopAppBarColors( @@ -83,6 +83,29 @@ fun BackIconAppBar(text: String, onClick: () -> Unit) { ) } +@Composable +fun BackIconAppBar(text: String, onClick: () -> 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, + tint = MaterialTheme.colorScheme.onPrimary, + contentDescription = stringResource(id = R.string.back_screen), + ) + } + }, + ) +} + @Composable fun LoggerIconAppBar(text: String, onClick: () -> Unit, onDisconnectClick: () -> Unit, onLoggerClick: () -> Unit) { SmallTopAppBar( diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/details/view/GLSDetailsScreen.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/details/view/GLSDetailsScreen.kt index 845f07f1..fd017a33 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/details/view/GLSDetailsScreen.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/details/view/GLSDetailsScreen.kt @@ -6,7 +6,7 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.gls.R import no.nordicsemi.android.gls.details.viewmodel.GLSDetailsViewModel -import no.nordicsemi.android.theme.view.BackIconAppBar +import no.nordicsemi.android.theme.view.LoggerBackIconAppBar @Composable internal fun GLSDetailsScreen() { @@ -14,7 +14,7 @@ internal fun GLSDetailsScreen() { val record = viewModel.record Column { - BackIconAppBar(stringResource(id = R.string.gls_title)) { + LoggerBackIconAppBar(stringResource(id = R.string.gls_title)) { viewModel.navigateBack() } 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 07a197c4..237274ae 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 @@ -23,7 +23,6 @@ class UARTRepository @Inject internal constructor( private val serviceManager: ServiceManager, private val configurationDataSource: ConfigurationDataSource, private val toolboxLoggerFactory: ToolboxLoggerFactory, - private val sp: UARTSharedPrefs ) { private var manager: UARTManager? = null private var logger: ToolboxLogger? = null @@ -31,11 +30,7 @@ class UARTRepository @Inject internal constructor( private val _data = MutableStateFlow>(IdleResult()) internal val data = _data.asStateFlow() - var showTutorial: Boolean - get() = sp.showTutorial - set(value) { - sp.showTutorial = value - } + var device: BluetoothDevice? = null val isRunning = data.map { it.isRunning() } val hasBeenDisconnected = data.map { it.hasBeenDisconnected() } @@ -47,6 +42,7 @@ class UARTRepository @Inject internal constructor( } fun start(device: BluetoothDevice, scope: CoroutineScope) { + this.device = device val createdLogger = toolboxLoggerFactory.create("UART", device.address).also { logger = it } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTSharedPrefs.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTSharedPrefs.kt deleted file mode 100644 index e1eab714..00000000 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTSharedPrefs.kt +++ /dev/null @@ -1,20 +0,0 @@ -package no.nordicsemi.android.uart.repository - -import android.content.Context -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject - -private const val FILE_NAME = "uart-sp" -private const val SHOW_TUTORIAL_FIELD = "show-tutorial" - -class UARTSharedPrefs @Inject constructor( - @ApplicationContext - private val context: Context -) { - - private val sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) - - var showTutorial: Boolean - get() = sp.getBoolean(SHOW_TUTORIAL_FIELD, true) - set(value) = sp.edit().putBoolean(SHOW_TUTORIAL_FIELD, value).apply() -} diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/TutorialScreen.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/TutorialScreen.kt deleted file mode 100644 index ef78c37d..00000000 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/TutorialScreen.kt +++ /dev/null @@ -1,36 +0,0 @@ -package no.nordicsemi.android.uart.view - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource -import no.nordicsemi.android.material.you.Tutorial -import no.nordicsemi.android.uart.R -import no.nordicsemi.android.uart.viewmodel.UARTViewModel - -@Composable -internal fun TutorialScreen(viewModel: UARTViewModel) { - - val page1: @Composable () -> Unit = { - Image( - painter = painterResource(id = R.drawable.tutorial_1), - contentDescription = "", - contentScale = ContentScale.Crop, - modifier = Modifier.fillMaxSize() - ) - } - val page2: @Composable () -> Unit = { - Image( - painter = painterResource(id = R.drawable.tutorial_2), - contentDescription = "", - contentScale = ContentScale.Crop, - modifier = Modifier.fillMaxSize() - ) - } - - Tutorial(listOf(page1, page2)) { - viewModel.onTutorialClose() - } -} 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 c9e63bf2..08e99f44 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt @@ -1,5 +1,6 @@ package no.nordicsemi.android.uart.view +import android.annotation.SuppressLint import androidx.compose.foundation.layout.Column import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -12,6 +13,7 @@ import no.nordicsemi.android.material.you.PagerView import no.nordicsemi.android.material.you.PagerViewEntity import no.nordicsemi.android.material.you.PagerViewItem import no.nordicsemi.android.service.* +import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar import no.nordicsemi.android.uart.R import no.nordicsemi.android.uart.data.UARTData @@ -22,6 +24,7 @@ import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason +@SuppressLint("MissingPermission") @Composable fun UARTScreen() { val viewModel: UARTViewModel = hiltViewModel() @@ -30,8 +33,24 @@ fun UARTScreen() { Column { val navigateUp = { viewModel.onEvent(NavigateUp) } - LoggerIconAppBar(stringResource(id = R.string.uart_title), navigateUp, { viewModel.onEvent(DisconnectEvent) }) { - viewModel.onEvent(OpenLogger) + Column(modifier = Modifier) { + when (state.uartManagerState) { + NoDeviceState -> BackIconAppBar(stringResource(id = R.string.uart_title), navigateUp) + is WorkingState -> when (state.uartManagerState.result) { + is IdleResult, + is DisconnectedResult, + is LinkLossResult, + is MissingServiceResult, + is UnknownErrorResult -> BackIconAppBar(stringResource(id = R.string.uart_title), navigateUp) + is ConnectingResult, + is SuccessResult -> { + val text = state.uartManagerState.device.name ?: state.uartManagerState.device.address ?: stringResource(id = R.string.uart_title) + LoggerIconAppBar(text, navigateUp, { viewModel.onEvent(DisconnectEvent) }) { + viewModel.onEvent(OpenLogger) + } + } + } + }.exhaustive } Column(modifier = Modifier) { @@ -46,7 +65,6 @@ fun UARTScreen() { is UnknownErrorResult -> Scroll { DeviceDisconnectedView(Reason.UNKNOWN, navigateUp) } is SuccessResult -> SuccessScreen(state.uartManagerState.result.data, state, viewModel) } - TutorialState -> TutorialScreen(viewModel) }.exhaustive } } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt index 4e4eff72..666b333d 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt @@ -1,5 +1,6 @@ package no.nordicsemi.android.uart.view +import android.bluetooth.BluetoothDevice import no.nordicsemi.android.service.BleManagerResult import no.nordicsemi.android.uart.data.UARTConfiguration import no.nordicsemi.android.uart.data.UARTData @@ -26,8 +27,9 @@ internal data class UARTViewState( internal sealed class HTSManagerState -internal data class WorkingState(val result: BleManagerResult) : HTSManagerState() +internal data class WorkingState( + val device: BluetoothDevice, + val result: BleManagerResult +) : HTSManagerState() internal object NoDeviceState : HTSManagerState() - -internal object TutorialState : HTSManagerState() 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 66133d8c..c3da2b1e 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 @@ -31,9 +31,7 @@ internal class UARTViewModel @Inject constructor( init { viewModelScope.launch { - if (repository.showTutorial) { - _state.value = _state.value.copy(uartManagerState = TutorialState) - } else if (repository.isRunning.firstOrNull() == false) { + if (repository.isRunning.firstOrNull() == false) { requestBluetoothDevice() } } @@ -42,7 +40,7 @@ internal class UARTViewModel @Inject constructor( if (it is IdleResult) { return@onEach } - _state.value = _state.value.copy(uartManagerState = WorkingState(it)) + _state.value = _state.value.copy(uartManagerState = WorkingState(repository.device!!, it)) }.launchIn(viewModelScope) dataSource.getConfigurations().onEach { @@ -93,16 +91,6 @@ internal class UARTViewModel @Inject constructor( }.exhaustive } - fun onTutorialClose() { - repository.showTutorial = false - _state.value = _state.value.copy(uartManagerState = NoDeviceState) - viewModelScope.launch { - if (repository.isRunning.firstOrNull() == false) { - requestBluetoothDevice() - } - } - } - private fun onMacroInputSwitch() { _state.value = _state.value.copy(isInputVisible = !state.value.isInputVisible) } diff --git a/profile_uart/src/main/res/drawable/tutorial_1.png b/profile_uart/src/main/res/drawable/tutorial_1.png deleted file mode 100644 index b94d1b79..00000000 Binary files a/profile_uart/src/main/res/drawable/tutorial_1.png and /dev/null differ diff --git a/profile_uart/src/main/res/drawable/tutorial_2.png b/profile_uart/src/main/res/drawable/tutorial_2.png deleted file mode 100644 index 5e598adb..00000000 Binary files a/profile_uart/src/main/res/drawable/tutorial_2.png and /dev/null differ