diff --git a/core/strings/src/main/res/values/strings.xml b/core/strings/src/main/res/values/strings.xml index 395896378..8ab0db0d2 100644 --- a/core/strings/src/main/res/values/strings.xml +++ b/core/strings/src/main/res/values/strings.xml @@ -186,7 +186,7 @@ Allow analytics and crash reporting. Accept Cancel - Discard changes + Discard Save New Channel URL received Meshtastic needs location permissions enabled to find new devices via Bluetooth. You can disable when not in use. diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt index a72f4ec38..7bf1a2420 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt @@ -23,8 +23,8 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.ElevatedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -63,14 +63,22 @@ fun PreferenceFooter( modifier: Modifier = Modifier, ) { Row( - modifier = modifier.fillMaxWidth().padding(16.dp), + modifier = modifier.fillMaxWidth().padding(horizontal = 24.dp, vertical = 16.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { - OutlinedButton(modifier = Modifier.height(48.dp).weight(1f), onClick = onNegativeClicked) { + ElevatedButton( + modifier = Modifier.height(48.dp).weight(1f), + colors = ButtonDefaults.filledTonalButtonColors(), + onClick = onNegativeClicked, + ) { Text(text = negativeText) } - Button(modifier = Modifier.height(48.dp).weight(1f), enabled = enabled, onClick = onPositiveClicked) { + ElevatedButton( + modifier = Modifier.height(48.dp).weight(1f), + colors = ButtonDefaults.buttonColors(), + onClick = { if (enabled) onPositiveClicked() }, + ) { Text(text = positiveText) } } diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt index a037c1462..dc0df3340 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt @@ -17,14 +17,24 @@ package org.meshtastic.feature.settings.radio.component -import androidx.compose.foundation.layout.Column +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandIn +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource @@ -65,24 +75,44 @@ fun RadioConfigScreenList( ) }, ) { innerPadding -> - Column(modifier = Modifier.padding(innerPadding)) { - LazyColumn(modifier = Modifier.fillMaxSize().weight(1f), contentPadding = PaddingValues(16.dp)) { + val showFooterButtons = configState.isDirty + + Box(modifier = Modifier.padding(innerPadding)) { + LazyColumn(modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(16.dp)) { content() + + item { + AnimatedVisibility( + visible = showFooterButtons, + modifier = Modifier.align(Alignment.BottomCenter), + enter = expandIn(), + exit = shrinkOut(), + ) { + Spacer(modifier = Modifier.height(64.dp)) + } + } } - PreferenceFooter( - enabled = enabled && configState.isDirty, - negativeText = stringResource(R.string.discard_changes), - onNegativeClicked = { - focusManager.clearFocus() - configState.reset() - }, - positiveText = stringResource(R.string.save_changes), - onPositiveClicked = { - focusManager.clearFocus() - onSave(configState.value) - }, - ) + AnimatedVisibility( + visible = showFooterButtons, + modifier = Modifier.align(Alignment.BottomCenter), + enter = fadeIn() + slideInVertically(initialOffsetY = { it }), + exit = fadeOut() + slideOutVertically(targetOffsetY = { it }), + ) { + PreferenceFooter( + enabled = enabled && configState.isDirty, + negativeText = stringResource(R.string.discard_changes), + onNegativeClicked = { + focusManager.clearFocus() + configState.reset() + }, + positiveText = stringResource(R.string.save_changes), + onPositiveClicked = { + focusManager.clearFocus() + onSave(configState.value) + }, + ) + } } } }