From 48e20d54641bbffe5c8ae1e2952e899e21037838 Mon Sep 17 00:00:00 2001 From: Infi Date: Fri, 4 Oct 2024 19:19:51 +0200 Subject: [PATCH] feat: special embeds control UI Signed-off-by: Infi --- .../chat/specialembeds/SpecialEmbedSwitch.kt | 15 ++++- .../screens/settings/ChatSettingsScreen.kt | 64 +++++++++++++++++++ app/src/main/res/values/strings.xml | 4 ++ 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/chat/revolt/components/chat/specialembeds/SpecialEmbedSwitch.kt b/app/src/main/java/chat/revolt/components/chat/specialembeds/SpecialEmbedSwitch.kt index 20320b14..6ba57915 100644 --- a/app/src/main/java/chat/revolt/components/chat/specialembeds/SpecialEmbedSwitch.kt +++ b/app/src/main/java/chat/revolt/components/chat/specialembeds/SpecialEmbedSwitch.kt @@ -3,12 +3,21 @@ package chat.revolt.components.chat.specialembeds import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import chat.revolt.api.schemas.Special +import chat.revolt.api.settings.LoadedSettings @Composable fun SpecialEmbedSwitch(special: Special, modifier: Modifier = Modifier) { - when (special.type) { - "YouTube" -> YoutubeEmbedSwitch(special, modifier) - "AppleMusic" -> AppleMusicEmbed(special, modifier) + when { + (special.type == "YouTube") && LoadedSettings.specialEmbedSettings.embedYouTube -> YoutubeEmbedSwitch( + special, + modifier + ) + + (special.type == "AppleMusic") && LoadedSettings.specialEmbedSettings.embedAppleMusic -> AppleMusicEmbed( + special, + modifier + ) + else -> {} } } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/screens/settings/ChatSettingsScreen.kt b/app/src/main/java/chat/revolt/screens/settings/ChatSettingsScreen.kt index 19a9f4d5..b0a30184 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ChatSettingsScreen.kt +++ b/app/src/main/java/chat/revolt/screens/settings/ChatSettingsScreen.kt @@ -1,5 +1,6 @@ package chat.revolt.screens.settings +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding @@ -13,7 +14,9 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LargeTopAppBar +import androidx.compose.material3.ListItem import androidx.compose.material3.Scaffold +import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable @@ -21,6 +24,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel @@ -28,6 +32,7 @@ import androidx.navigation.NavController import chat.revolt.R import chat.revolt.api.settings.LoadedSettings import chat.revolt.api.settings.MessageReplyStyle +import chat.revolt.api.settings.SpecialEmbedSettings import chat.revolt.api.settings.SyncedSettings import chat.revolt.components.generic.ListHeader import chat.revolt.components.generic.RadioItem @@ -40,6 +45,13 @@ class ChatSettingsScreenViewModel : ViewModel() { LoadedSettings.messageReplyStyle = next } } + + fun updateSpecialEmbedSettings(next: SpecialEmbedSettings) { + viewModelScope.launch { + SyncedSettings.updateAndroid(SyncedSettings.android.copy(specialEmbedSettings = next)) + LoadedSettings.specialEmbedSettings = next + } + } } @OptIn(ExperimentalMaterial3Api::class) @@ -106,6 +118,58 @@ fun ChatSettingsScreen( label = { Text(text = stringResource(R.string.settings_chat_quick_reply_double_tap)) } ) } + + ListHeader { + Text( + text = stringResource(R.string.settings_chat_interactive_embeds) + ) + } + + Text( + stringResource(R.string.settings_chat_interactive_embeds_description), + modifier = Modifier + .padding(vertical = 8.dp, horizontal = 16.dp), + ) + + Column { + ListItem( + headlineContent = { + Text(stringResource(R.string.settings_chat_interactive_embeds_youtube)) + }, + trailingContent = { + Switch( + checked = LoadedSettings.specialEmbedSettings.embedYouTube, + onCheckedChange = null + ) + }, + modifier = Modifier.clickable { + viewModel.updateSpecialEmbedSettings( + LoadedSettings.specialEmbedSettings.copy( + embedYouTube = !LoadedSettings.specialEmbedSettings.embedYouTube + ) + ) + } + ) + + ListItem( + headlineContent = { + Text(stringResource(R.string.settings_chat_interactive_embeds_apple_music)) + }, + trailingContent = { + Switch( + checked = LoadedSettings.specialEmbedSettings.embedAppleMusic, + onCheckedChange = null + ) + }, + modifier = Modifier.clickable { + viewModel.updateSpecialEmbedSettings( + LoadedSettings.specialEmbedSettings.copy( + embedAppleMusic = !LoadedSettings.specialEmbedSettings.embedAppleMusic + ) + ) + } + ) + } } } } \ 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 cce70f1e..2e0b8f16 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -615,6 +615,10 @@ Long press to reply Swipe to reply Double tap to reply + Interactive Embeds + Interactive Embeds allow you to interact with some types of links directly inside chat. For example, you can play YouTube videos or preview albums from Apple Music. + YouTube + Apple Music Feedback Join the Revolt server to give feedback or suggestions and report bugs.