diff --git a/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt b/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt index be44487..a91b4ab 100644 --- a/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt +++ b/app/src/main/java/app/myzel394/alibi/db/AppSettings.kt @@ -8,7 +8,6 @@ import com.arthenica.ffmpegkit.FFmpegKit import com.arthenica.ffmpegkit.ReturnCode import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json -import org.json.JSONObject import java.io.File import java.time.LocalDateTime import java.time.format.DateTimeFormatter.ISO_DATE_TIME @@ -427,23 +426,41 @@ data class NotificationSettings( val titleID: Int, val messageID: Int, val showOngoing: Boolean, + val iconID: Int, ) { data object Default : Preset( R.string.ui_audioRecorder_state_recording_title, R.string.ui_audioRecorder_state_recording_description, true, + R.drawable.launcher_monochrome_noopacity, ) data object Weather : Preset( R.string.ui_audioRecorder_state_recording_fake_weather_title, R.string.ui_audioRecorder_state_recording_fake_weather_description, false, + R.drawable.ic_cloud ) data object Player : Preset( - R.string.ui_audioRecorder_state_recording_fake_weather_title, - R.string.ui_audioRecorder_state_recording_fake_weather_description, + R.string.ui_audioRecorder_state_recording_fake_player_title, + R.string.ui_audioRecorder_state_recording_fake_player_description, + true, + R.drawable.ic_note, + ) + + data object Browser : Preset( + R.string.ui_audioRecorder_state_recording_fake_browser_title, + R.string.ui_audioRecorder_state_recording_fake_browser_description, + true, + R.drawable.ic_download, + ) + + data object VPN : Preset( + R.string.ui_audioRecorder_state_recording_fake_vpn_title, + R.string.ui_audioRecorder_state_recording_fake_vpn_description, false, + R.drawable.ic_vpn, ) } @@ -456,5 +473,13 @@ data class NotificationSettings( preset = preset, ) } + + val PRESETS = listOf( + Preset.Default, + Preset.Weather, + Preset.Player, + Preset.Browser, + Preset.VPN, + ) } } 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 new file mode 100644 index 0000000..f90bbe2 --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/NotificationPresetSelect.kt @@ -0,0 +1,61 @@ +package app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import app.myzel394.alibi.db.NotificationSettings + +@Composable +fun NotificationPresetSelect( + modifier: Modifier = Modifier, + preset: NotificationSettings.Preset +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .clip(MaterialTheme.shapes.large) + .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), + ) { + PreviewIcon( + modifier = Modifier.size(32.dp), + painter = painterResource(id = preset.iconID), + ) + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = stringResource(preset.titleID), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold, + ) + Text( + text = stringResource(preset.messageID), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Normal, + ) + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..89b02dc --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/PreviewIcon.kt @@ -0,0 +1,42 @@ +package app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import app.myzel394.alibi.R + +@Composable +fun PreviewIcon( + modifier: Modifier = Modifier, + painter: Painter, +) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .then(modifier) + .clip(CircleShape) + .background(MaterialTheme.colorScheme.secondary) + .padding(1.dp) + ) { + Image( + painter = painter, + contentDescription = null, + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onPrimary), + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/EditNotificationInput.kt b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/EditNotificationInput.kt similarity index 93% rename from app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/EditNotificationInput.kt rename to app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/EditNotificationInput.kt index 1ae7f19..73e2960 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/atoms/EditNotificationInput.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/CustomRecordingNotificationsScreen/molecules/EditNotificationInput.kt @@ -1,4 +1,4 @@ -package app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms +package app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.molecules import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween @@ -41,6 +41,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import app.myzel394.alibi.R +import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms.PreviewIcon import app.myzel394.alibi.ui.effects.rememberForceUpdate import com.maxkeppeler.sheets.input.models.InputText import java.time.Duration @@ -72,19 +73,11 @@ fun EditNotificationInput( ) { val headlineSize = 22.dp - Box( - modifier = Modifier - .size(headlineSize) - .clip(CircleShape) - .background(MaterialTheme.colorScheme.secondary) - .padding(1.dp), - ) { - Image( - painter = painterResource(id = R.drawable.launcher_foreground), - contentDescription = null, - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onPrimary), - ) - } + PreviewIcon( + modifier = Modifier.size(headlineSize), + painter = painterResource(id = R.drawable.launcher_foreground) + ) + Column( horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.spacedBy(16.dp), 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 3dd8bcd..a2cc7a2 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,33 +1,25 @@ package app.myzel394.alibi.ui.screens -import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.clickable 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.rememberScrollState -import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.LargeTopAppBar -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.Snackbar -import androidx.compose.material3.SnackbarHost import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext @@ -37,24 +29,9 @@ import androidx.navigation.NavController import app.myzel394.alibi.R import app.myzel394.alibi.dataStore import app.myzel394.alibi.db.AppSettings -import app.myzel394.alibi.ui.SUPPORTS_DARK_MODE_NATIVELY -import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms.EditNotificationInput -import app.myzel394.alibi.ui.components.CustomRecordingNotificationsScreen.atoms.LandingElement -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.BitrateTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.CustomNotificationTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.EncoderTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ForceExactMaxDurationTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ImportExport -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.InAppLanguagePicker -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.IntervalDurationTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.MaxDurationTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.OutputFormatTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.SamplingRateTile -import app.myzel394.alibi.ui.components.SettingsScreen.atoms.ThemeSelector -import app.myzel394.alibi.ui.components.atoms.GlobalSwitch -import app.myzel394.alibi.ui.components.atoms.MessageBox -import app.myzel394.alibi.ui.components.atoms.MessageType -import kotlinx.coroutines.launch +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 @@ -93,10 +70,12 @@ fun CustomRecordingNotificationsScreen( ) { padding -> if (settings.notificationSettings == null) { } - Box( + Column( modifier = Modifier + .fillMaxSize() .padding(padding) - .padding(vertical = 64.dp) + .padding(vertical = 64.dp, horizontal = 16.dp), + verticalArrangement = Arrangement.SpaceBetween, ) { EditNotificationInput( modifier = Modifier @@ -109,7 +88,22 @@ fun CustomRecordingNotificationsScreen( onTitleChange = {}, onDescriptionChange = {}, ) + LazyColumn( + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + items(NotificationSettings.PRESETS.size) { + val preset = NotificationSettings.PRESETS[it] + NotificationPresetSelect( + modifier = Modifier + .fillMaxWidth() + .clickable { + + }, + preset = preset, + ) + } + } } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_cloud.xml b/app/src/main/res/drawable/ic_cloud.xml new file mode 100644 index 0000000..a860632 --- /dev/null +++ b/app/src/main/res/drawable/ic_cloud.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_download.xml b/app/src/main/res/drawable/ic_download.xml new file mode 100644 index 0000000..987f215 --- /dev/null +++ b/app/src/main/res/drawable/ic_download.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_note.xml b/app/src/main/res/drawable/ic_note.xml new file mode 100644 index 0000000..4bd8b20 --- /dev/null +++ b/app/src/main/res/drawable/ic_note.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_vpn.xml b/app/src/main/res/drawable/ic_vpn.xml new file mode 100644 index 0000000..1339fb3 --- /dev/null +++ b/app/src/main/res/drawable/ic_vpn.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/launcher_monochrome_noopacity.xml b/app/src/main/res/drawable/launcher_monochrome_noopacity.xml new file mode 100644 index 0000000..6bded29 --- /dev/null +++ b/app/src/main/res/drawable/launcher_monochrome_noopacity.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8397559..2dbf736 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,4 +78,10 @@ Due to Android\'s restrictions, Alibi has to show a notification while recording. To hide the fact that you\'re using Alibi, you can customize the notification. Alternatively, you can also simply disable notifications Create own notification + Playing Audio + Now playing: Despacito + Downloading attachments.zip + Downloading file... + Connected to VPN + Connection Secured \ No newline at end of file