diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt index 558b6e3ca..f8c7dc8e3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt @@ -10,7 +10,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.ContentAlpha -import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -103,7 +102,6 @@ fun RegularPreference( } } if (summary != null) { - Divider(modifier = Modifier.padding(vertical = 8.dp)) Text( text = summary, style = MaterialTheme.typography.body2, diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/SwitchPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/components/SwitchPreference.kt index d5b99deec..70cb25cc6 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/components/SwitchPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/components/SwitchPreference.kt @@ -1,24 +1,62 @@ package com.geeksville.mesh.ui.components +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.ContentAlpha +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.ListItem import androidx.compose.material.MaterialTheme import androidx.compose.material.Switch -import androidx.compose.material.SwitchDefaults import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.colorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.geeksville.mesh.R + +@OptIn(ExperimentalMaterialApi::class) +@Composable +fun SwitchPreference( + title: String, + summary: String, + checked: Boolean, + enabled: Boolean, + onCheckedChange: (Boolean) -> Unit, + modifier: Modifier = Modifier, +) { + val color = if (enabled) { + Color.Unspecified + } else { + MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled) + } + + ListItem( + modifier = modifier, + trailing = { + Switch( + enabled = enabled, + checked = checked, + onCheckedChange = onCheckedChange, + ) + }, + secondaryText = { + Text( + text = summary, + color = color, + ) + }, + ) { + Text( + text = title, + color = color, + ) + } +} @Composable fun SwitchPreference( @@ -34,6 +72,7 @@ fun SwitchPreference( .fillMaxWidth() .size(48.dp) .padding(padding), + horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Text( @@ -46,15 +85,9 @@ fun SwitchPreference( }, ) Switch( - modifier = modifier - .fillMaxWidth() - .wrapContentWidth(Alignment.End), enabled = enabled, checked = checked, onCheckedChange = onCheckedChange, - colors = SwitchDefaults.colors( - uncheckedThumbColor = colorResource(R.color.colourGrey) - ) ) } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/config/DeviceConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/components/config/DeviceConfigItemList.kt index 94c36bc52..6b5935da3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/components/config/DeviceConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/components/config/DeviceConfigItemList.kt @@ -101,8 +101,8 @@ fun DeviceConfigItemList( onItemSelected = { deviceInput = deviceInput.copy { role = it } }, summary = stringResource(id = deviceInput.role.stringRes), ) + Divider() } - item { Divider() } item { EditTextPreference(title = "Redefine PIN_BUTTON", @@ -132,8 +132,8 @@ fun DeviceConfigItemList( onItemSelected = { deviceInput = deviceInput.copy { rebroadcastMode = it } }, summary = stringResource(id = deviceInput.rebroadcastMode.stringRes), ) + Divider() } - item { Divider() } item { EditTextPreference(title = "NodeInfo broadcast interval (seconds)", @@ -146,24 +146,26 @@ fun DeviceConfigItemList( } item { - SwitchPreference(title = "Double tap as button press", + SwitchPreference( + title = "Double tap as button press", + summary = stringResource(id = R.string.config_device_doubleTapAsButtonPress_summary), checked = deviceInput.doubleTapAsButtonPress, enabled = enabled, - onCheckedChange = { - deviceInput = deviceInput.copy { doubleTapAsButtonPress = it } - }) + onCheckedChange = { deviceInput = deviceInput.copy { doubleTapAsButtonPress = it } } + ) + Divider() } - item { Divider() } item { - SwitchPreference(title = "Disable triple-click", + SwitchPreference( + title = "Disable triple-click", + summary = stringResource(id = R.string.config_device_disableTripleClick_summary), checked = deviceInput.disableTripleClick, enabled = enabled, - onCheckedChange = { - deviceInput = deviceInput.copy { disableTripleClick = it } - }) + onCheckedChange = { deviceInput = deviceInput.copy { disableTripleClick = it } } + ) + Divider() } - item { Divider() } item { EditTextPreference(title = "POSIX Timezone", @@ -182,18 +184,19 @@ fun DeviceConfigItemList( } item { - SwitchPreference(title = "Disable LED heartbeat", + SwitchPreference( + title = "Disable LED heartbeat", + summary = stringResource(id = R.string.config_device_ledHeartbeatDisabled_summary), checked = deviceInput.ledHeartbeatDisabled, enabled = enabled, - onCheckedChange = { - deviceInput = deviceInput.copy { ledHeartbeatDisabled = it } - }) + onCheckedChange = { deviceInput = deviceInput.copy { ledHeartbeatDisabled = it } } + ) + Divider() } - item { Divider() } item { PreferenceFooter( - enabled = deviceInput != deviceConfig, + enabled = enabled && deviceInput != deviceConfig, onCancelClicked = { focusManager.clearFocus() deviceInput = deviceConfig diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a0f586ad..e0f72389c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,6 +64,10 @@ Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role. Ignores packets from non-standard portnums such as: TAK, RangeTest, PaxCounter, etc. Only rebroadcasts packets with standard portnums: NodeInfo, Text, Position, Telemetry, and Routing. + Treat double tap on supported accelerometers as a user button press. + Disables the triple-press of user button to enable or disable GPS. + Controls the blinking LED on the device. For most devices this will control one of the up to 4 LEDs, the charger and GPS LEDs are not controllable. + MSL ChUtil %.1f%% AirUtilTX %.1f%%