From 209b149a5014dfa8743c520e68fe53b1e76616c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sylwester=20Zieli=C5=84ski?= Date: Mon, 11 Apr 2022 13:08:08 +0200 Subject: [PATCH] Add sending plain text feature to UART profile --- .../android/uart/repository/UARTRepository.kt | 4 ++ .../android/uart/view/UARTContentView.kt | 72 ++++++++++++++++--- .../android/uart/view/UARTViewEvent.kt | 2 + .../android/uart/viewmodel/UARTViewModel.kt | 1 + profile_uart/src/main/res/values/strings.xml | 5 +- 5 files changed, 75 insertions(+), 9 deletions(-) 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 fb2b99e6..0469820d 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 @@ -55,6 +55,10 @@ class UARTRepository @Inject internal constructor( } } + fun sendText(text: String, newLineChar: MacroEol) { + manager?.send(text.parseWithNewLineChar(newLineChar)) + } + fun runMacro(macro: UARTMacro) { macro.command?.parseWithNewLineChar(macro.newLineChar)?.let { manager?.send(it) diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTContentView.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTContentView.kt index b3bd2704..a4b9259d 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTContentView.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTContentView.kt @@ -1,6 +1,5 @@ package no.nordicsemi.android.uart.view -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add @@ -15,11 +14,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import no.nordicsemi.android.material.you.ScreenSection +import no.nordicsemi.android.material.you.* import no.nordicsemi.android.theme.view.SectionTitle import no.nordicsemi.android.uart.R +import no.nordicsemi.android.uart.data.MacroEol import no.nordicsemi.android.uart.data.UARTData import no.nordicsemi.android.uart.data.UARTOutputRecord +import no.nordicsemi.android.utils.EMPTY import java.text.SimpleDateFormat import java.util.* @@ -33,13 +34,17 @@ internal fun UARTContentView( horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(16.dp) ) { - InputSection(viewState, onEvent) + InputSection(onEvent = onEvent) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.size(16.dp)) + + MacroSection(viewState, onEvent) + + Spacer(modifier = Modifier.size(16.dp)) OutputSection(state.displayMessages, onEvent) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.size(16.dp)) Button( onClick = { onEvent(DisconnectEvent) } @@ -50,7 +55,58 @@ internal fun UARTContentView( } @Composable -private fun InputSection(viewState: UARTViewState, onEvent: (UARTViewEvent) -> Unit) { +private fun InputSection(onEvent: (UARTViewEvent) -> Unit) { + val text = rememberSaveable { mutableStateOf(String.EMPTY) } + val hint = stringResource(id = R.string.uart_input_hint) + val checkedItem = rememberSaveable { mutableStateOf(MacroEol.values()[0]) } + + val items = MacroEol.values().map { + RadioButtonItem(it.toDisplayString(), it == checkedItem.value) + } + val viewEntity = RadioGroupViewEntity(items) + + ScreenSection { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + SectionTitle(resId = R.drawable.ic_input, title = stringResource(R.string.uart_input)) + + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = stringResource(id = R.string.uart_macro_dialog_eol), + style = MaterialTheme.typography.labelLarge + ) + + RadioButtonGroup(viewEntity) { + val i = items.indexOf(it) + checkedItem.value = MacroEol.values()[i] + } + } + + Spacer(modifier = Modifier.size(16.dp)) + + Row(verticalAlignment = Alignment.CenterVertically) { + Box(modifier = Modifier.weight(1f)) { + TextField(text = text.value, hint = hint) { + text.value = it + } + } + + Spacer(modifier = Modifier.size(16.dp)) + + Button( + onClick = { onEvent(OnRunInput(text.value, checkedItem.value)) }, + modifier = Modifier.padding(top = 6.dp) + ) { + Text(text = stringResource(id = R.string.uart_send)) + } + } + } + } +} + +@Composable +private fun MacroSection(viewState: UARTViewState, onEvent: (UARTViewEvent) -> Unit) { val showAddDialog = rememberSaveable { mutableStateOf(false) } val showDeleteDialog = rememberSaveable { mutableStateOf(false) } @@ -66,7 +122,7 @@ private fun InputSection(viewState: UARTViewState, onEvent: (UARTViewEvent) -> U Column( horizontalAlignment = Alignment.CenterHorizontally ) { - SectionTitle(resId = R.drawable.ic_input, title = stringResource(R.string.uart_input)) + SectionTitle(resId = R.drawable.ic_input, title = stringResource(R.string.uart_macros)) Spacer(modifier = Modifier.height(16.dp)) @@ -169,7 +225,7 @@ private fun OutputSection(records: List, onEvent: (UARTViewEve } } - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.size(16.dp)) Column(modifier = Modifier.fillMaxWidth()) { if (records.isEmpty()) { 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 754784bb..0fabc6e2 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 @@ -1,5 +1,6 @@ package no.nordicsemi.android.uart.view +import no.nordicsemi.android.uart.data.MacroEol import no.nordicsemi.android.uart.data.UARTConfiguration import no.nordicsemi.android.uart.data.UARTMacro @@ -15,6 +16,7 @@ internal data class OnAddConfiguration(val name: String) : UARTViewEvent() internal object OnEditConfiguration : UARTViewEvent() internal object OnDeleteConfiguration : UARTViewEvent() internal data class OnRunMacro(val macro: UARTMacro) : UARTViewEvent() +internal data class OnRunInput(val text: String, val newLineChar: MacroEol) : UARTViewEvent() internal object ClearOutputItems : UARTViewEvent() internal object DisconnectEvent : 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 dfe67c2c..3bfae508 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 @@ -82,6 +82,7 @@ internal class UARTViewModel @Inject constructor( OnEditConfiguration -> onEditConfiguration() ClearOutputItems -> repository.clearItems() OpenLogger -> repository.openLogger() + is OnRunInput -> repository.sendText(event.text, event.newLineChar) }.exhaustive } diff --git a/profile_uart/src/main/res/values/strings.xml b/profile_uart/src/main/res/values/strings.xml index a5f7862f..00bcf127 100644 --- a/profile_uart/src/main/res/values/strings.xml +++ b/profile_uart/src/main/res/values/strings.xml @@ -8,7 +8,10 @@ Delete selected configuration. Edit selected configuration. - Macros + Send + Input + Text to send + Macros Output Select configuration Not selected.