diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/NotificationPresetsRoulette.kt b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/NotificationPresetsRoulette.kt
new file mode 100644
index 0000000..81bd4bc
--- /dev/null
+++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/NotificationPresetsRoulette.kt
@@ -0,0 +1,72 @@
+package app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.molecules
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalConfiguration
+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
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun NotificationPresetsRoulette(
+ onClick: (String, String, Int, Boolean) -> Unit,
+) {
+ val state = rememberLazyListState()
+
+ LazyRow(
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ state = state,
+ flingBehavior = rememberSnapFlingBehavior(lazyListState = state)
+ ) {
+ items(NotificationSettings.PRESETS.size) {
+ val preset = NotificationSettings.PRESETS[it]
+
+ val label = stringResource(
+ R.string.ui_settings_customNotifications_preset_apply_label,
+ stringResource(preset.titleID)
+ )
+ val presetTitle = stringResource(preset.titleID)
+ val presetDescription = stringResource(preset.messageID)
+
+ Box(
+ modifier = Modifier.width(
+ LocalConfiguration.current.screenWidthDp.dp,
+ )
+ ) {
+ NotificationPresetSelect(
+ modifier = Modifier
+ .fillMaxWidth(.95f)
+ .align(Alignment.Center)
+ .semantics {
+ contentDescription = label
+ }
+ .clickable {
+ onClick(
+ presetTitle,
+ presetDescription,
+ preset.iconID,
+ preset.showOngoing,
+ )
+ },
+ preset = preset,
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
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
index ee1e921..3396077 100644
--- 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
@@ -1,28 +1,49 @@
package app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.organisms
+import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior
import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Check
+import androidx.compose.material.icons.filled.CheckCircle
+import androidx.compose.material.icons.filled.Notifications
+import androidx.compose.material.icons.filled.Save
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CheckboxColors
import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
@@ -31,10 +52,14 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import app.myzel394.alibi.R
import app.myzel394.alibi.db.NotificationSettings
+import app.myzel394.alibi.ui.BIG_PRIMARY_BUTTON_SIZE
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.molecules.NotificationPresetsRoulette
-@OptIn(ExperimentalMaterial3Api::class)
+val HORIZONTAL_PADDING = 16.dp;
+
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
@Composable
fun NotificationEditor(
modifier: Modifier = Modifier,
@@ -53,93 +78,105 @@ fun NotificationEditor(
mutableStateOf(true)
}
var icon: Int by rememberSaveable {
- mutableStateOf(R.drawable.launcher_monochrome_noopacity)
+ mutableIntStateOf(R.drawable.launcher_monochrome_noopacity)
}
// TODO: Add Preview functionality
Column(
modifier = Modifier
.fillMaxSize()
- .padding(horizontal = 16.dp)
.then(modifier),
verticalArrangement = Arrangement.SpaceBetween,
) {
- EditNotificationInput(
+ Column(
modifier = Modifier
- .fillMaxWidth()
- .padding(horizontal = 16.dp),
- showOngoing = showOngoing,
- title = title,
- description = description,
- icon = painterResource(icon),
- onShowOngoingChange = {
- showOngoing = it
- },
- onTitleChange = {
- title = it
- },
- onDescriptionChange = {
- description = it
- },
- onIconChange = {
- icon = it
- },
- )
-
- Row(
- horizontalArrangement = Arrangement.spacedBy(8.dp),
- verticalAlignment = Alignment.CenterVertically,
- modifier = Modifier
- .fillMaxSize()
- .clip(MaterialTheme.shapes.medium)
- .clickable {
- showOngoing = showOngoing.not()
- }
- .background(MaterialTheme.colorScheme.tertiaryContainer)
- .padding(8.dp),
+ .padding(horizontal = HORIZONTAL_PADDING),
+ verticalArrangement = Arrangement.spacedBy(16.dp),
) {
- Checkbox(
- checked = showOngoing,
- onCheckedChange = {
+ EditNotificationInput(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp),
+ showOngoing = showOngoing,
+ title = title,
+ description = description,
+ icon = painterResource(icon),
+ onShowOngoingChange = {
showOngoing = it
},
- colors = CheckboxDefaults.colors(
- checkedColor = MaterialTheme.colorScheme.tertiary,
- checkmarkColor = MaterialTheme.colorScheme.onTertiary,
+ onTitleChange = {
+ title = it
+ },
+ onDescriptionChange = {
+ description = it
+ },
+ onIconChange = {
+ icon = it
+ },
+ )
+
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier
+ .fillMaxWidth()
+ .clip(MaterialTheme.shapes.medium)
+ .clickable {
+ showOngoing = showOngoing.not()
+ }
+ .background(MaterialTheme.colorScheme.tertiaryContainer)
+ .padding(8.dp),
+ ) {
+ Checkbox(
+ checked = showOngoing,
+ onCheckedChange = {
+ showOngoing = it
+ },
+ colors = CheckboxDefaults.colors(
+ checkedColor = MaterialTheme.colorScheme.tertiary,
+ checkmarkColor = MaterialTheme.colorScheme.onTertiary,
+ )
)
- )
- Text(
- text = stringResource(R.string.ui_settings_customNotifications_showOngoing_label),
- style = MaterialTheme.typography.bodyMedium,
- color = MaterialTheme.colorScheme.onTertiaryContainer,
- fontWeight = FontWeight.Bold,
- )
+ Text(
+ text = stringResource(R.string.ui_settings_customNotifications_showOngoing_label),
+ style = MaterialTheme.typography.bodyMedium,
+ color = MaterialTheme.colorScheme.onTertiaryContainer,
+ fontWeight = FontWeight.Bold,
+ )
+ }
}
Column(
- verticalArrangement = Arrangement.spacedBy(4.dp),
+ verticalArrangement = Arrangement.spacedBy(32.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)
+ NotificationPresetsRoulette(
+ onClick = { presetTitle, presetDescription, presetIcon, presetShowOngoing ->
+ title = presetTitle
+ description = presetDescription
+ icon = presetIcon
+ showOngoing = presetShowOngoing
+ }
+ )
- NotificationPresetSelect(
+ Button(
+ onClick = { /*TODO*/ },
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = HORIZONTAL_PADDING)
+ .height(48.dp),
+ ) {
+ Icon(
+ Icons.Default.CheckCircle,
+ contentDescription = null,
modifier = Modifier
- .fillMaxWidth()
- .semantics {
- contentDescription = label
- }
- .clickable {
- title = presetTitle
- description = presetDescription
- icon = preset.iconID
- showOngoing = preset.showOngoing
- },
- preset = preset,
+ .size(ButtonDefaults.IconSize)
+ )
+ Spacer(
+ modifier = Modifier
+ .width(ButtonDefaults.IconSpacing)
+ )
+ Text(
+ stringResource(R.string.ui_settings_customNotifications_save_label)
)
}
}
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 7add6e2..a574751 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
@@ -8,6 +8,7 @@ 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.lazy.LazyRow
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
@@ -26,6 +27,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
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 androidx.navigation.NavController
import app.myzel394.alibi.R
@@ -77,7 +80,7 @@ fun CustomRecordingNotificationsScreen(
NotificationEditor(
modifier = Modifier
.padding(padding)
- .verticalScroll(scrollState),
+ .padding(vertical = 16.dp),
scrollState = scrollState,
)
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3e5c185..40b54d9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -86,4 +86,5 @@
Connection Secured
Apply Preset \"%s\"
Show Duration
+ Update notification
\ No newline at end of file