From 5a55619e55f47c192ea61d06809b384d28be63d4 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:46:41 +0200 Subject: [PATCH] feat: Make presets workable --- .../atoms/NotificationPresetSelect.kt | 4 +- .../atoms/PreviewIcon.kt | 2 +- .../molecules/EditNotificationInput.kt | 5 +- .../organisms/NotificationEditor.kt | 110 ++++++++++++++++++ .../CustomRecordingNotificationsScreen.kt | 43 ++----- app/src/main/res/values/strings.xml | 1 + 6 files changed, 127 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/organisms/NotificationEditor.kt diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/NotificationPresetSelect.kt b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/NotificationPresetSelect.kt index f90bbe2..3df2775 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/NotificationPresetSelect.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/NotificationPresetSelect.kt @@ -29,14 +29,14 @@ fun NotificationPresetSelect( horizontalArrangement = Arrangement.spacedBy(16.dp), modifier = Modifier .clip(MaterialTheme.shapes.large) + .then(modifier) .background(MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.4f)) .border( width = 1.dp, shape = MaterialTheme.shapes.large, color = MaterialTheme.colorScheme.outline.copy(alpha = 0.4f) ) - .padding(horizontal = 16.dp, vertical = 8.dp) - .then(modifier), + .padding(horizontal = 16.dp, vertical = 8.dp), ) { PreviewIcon( modifier = Modifier.size(32.dp), diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/PreviewIcon.kt b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/PreviewIcon.kt index 89b02dc..1e3c557 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/PreviewIcon.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/PreviewIcon.kt @@ -31,7 +31,7 @@ fun PreviewIcon( .then(modifier) .clip(CircleShape) .background(MaterialTheme.colorScheme.secondary) - .padding(1.dp) + .padding(2.dp) ) { Image( painter = painter, diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/EditNotificationInput.kt b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/EditNotificationInput.kt index 73e2960..1aab0de 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/EditNotificationInput.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/EditNotificationInput.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -54,9 +55,11 @@ fun EditNotificationInput( showOngoing: Boolean, title: String, description: String, + icon: Painter, onShowOngoingChange: (Boolean) -> Unit, onTitleChange: (String) -> Unit, onDescriptionChange: (String) -> Unit, + onIconChange: (Int) -> Unit, ) { var ongoingStartTime by remember { mutableStateOf(LocalDateTime.now()) } @@ -75,7 +78,7 @@ fun EditNotificationInput( PreviewIcon( modifier = Modifier.size(headlineSize), - painter = painterResource(id = R.drawable.launcher_foreground) + painter = icon, ) Column( diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/organisms/NotificationEditor.kt b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/organisms/NotificationEditor.kt new file mode 100644 index 0000000..685430c --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/organisms/NotificationEditor.kt @@ -0,0 +1,110 @@ +package app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.organisms + +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.scrollable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import app.myzel394.alibi.R +import app.myzel394.alibi.db.NotificationSettings +import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms.NotificationPresetSelect +import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.molecules.EditNotificationInput + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun NotificationEditor( + modifier: Modifier = Modifier, + scrollState: ScrollState, +) { + val defaultTitle = stringResource(R.string.ui_audioRecorder_state_recording_title) + val defaultDescription = stringResource(R.string.ui_audioRecorder_state_recording_description) + + var title: String by rememberSaveable { + mutableStateOf(defaultTitle) + } + var description: String by rememberSaveable { + mutableStateOf(defaultDescription) + } + var showOngoing: Boolean by rememberSaveable { + mutableStateOf(true) + } + var icon: Int by rememberSaveable { + mutableStateOf(R.drawable.launcher_monochrome_noopacity) + } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 16.dp) + .then(modifier), + verticalArrangement = Arrangement.SpaceBetween, + ) { + EditNotificationInput( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + showOngoing = true, + title = title, + description = description, + icon = painterResource(icon), + onShowOngoingChange = { + showOngoing = it + }, + onTitleChange = { + title = it + }, + onDescriptionChange = { + description = it + }, + onIconChange = { + icon = it + }, + ) + + Column( + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + for (preset in NotificationSettings.PRESETS) { + val label = stringResource( + R.string.ui_settings_customNotifications_preset_apply_label, + stringResource(preset.titleID) + ) + val presetTitle = stringResource(preset.titleID) + val presetDescription = stringResource(preset.messageID) + + NotificationPresetSelect( + modifier = Modifier + .fillMaxWidth() + .semantics { + contentDescription = label + } + .clickable { + title = presetTitle + description = presetDescription + icon = preset.iconID + showOngoing = preset.showOngoing + }, + preset = preset, + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/CustomRecordingNotificationsScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/CustomRecordingNotificationsScreen.kt index a2cc7a2..7add6e2 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/CustomRecordingNotificationsScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/CustomRecordingNotificationsScreen.kt @@ -1,13 +1,15 @@ package app.myzel394.alibi.ui.screens import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api @@ -32,6 +34,7 @@ import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.NotificationSettings import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms.NotificationPresetSelect import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.molecules.EditNotificationInput +import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.organisms.NotificationEditor @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -41,6 +44,7 @@ fun CustomRecordingNotificationsScreen( val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( rememberTopAppBarState() ) + val scrollState = rememberScrollState() val dataStore = LocalContext.current.dataStore val settings = dataStore @@ -70,40 +74,11 @@ fun CustomRecordingNotificationsScreen( ) { padding -> if (settings.notificationSettings == null) { } - Column( + NotificationEditor( modifier = Modifier - .fillMaxSize() .padding(padding) - .padding(vertical = 64.dp, horizontal = 16.dp), - verticalArrangement = Arrangement.SpaceBetween, - ) { - EditNotificationInput( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - showOngoing = true, - title = "Alibi", - description = "test", - onShowOngoingChange = {}, - onTitleChange = {}, - onDescriptionChange = {}, - ) - LazyColumn( - verticalArrangement = Arrangement.spacedBy(8.dp), - ) { - items(NotificationSettings.PRESETS.size) { - val preset = NotificationSettings.PRESETS[it] - - NotificationPresetSelect( - modifier = Modifier - .fillMaxWidth() - .clickable { - - }, - preset = preset, - ) - } - } - } + .verticalScroll(scrollState), + scrollState = scrollState, + ) } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2dbf736..8b75438 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,4 +84,5 @@ Downloading file... Connected to VPN Connection Secured + Apply Preset \"%s\" \ No newline at end of file