diff --git a/app/src/main/java/com/xinto/opencord/ui/AppActivity.kt b/app/src/main/java/com/xinto/opencord/ui/AppActivity.kt index 5e378236..6377fcab 100644 --- a/app/src/main/java/com/xinto/opencord/ui/AppActivity.kt +++ b/app/src/main/java/com/xinto/opencord/ui/AppActivity.kt @@ -18,6 +18,7 @@ import com.xinto.opencord.gateway.DiscordGateway import com.xinto.opencord.ui.navigation.AppDestination import com.xinto.opencord.ui.navigation.back import com.xinto.opencord.ui.screens.Settings +import com.xinto.opencord.ui.screens.SettingsCategory import com.xinto.opencord.ui.screens.home.HomeScreen import com.xinto.opencord.ui.screens.pins.PinsScreen import com.xinto.opencord.ui.theme.OpenCordTheme @@ -96,15 +97,21 @@ class AppActivity : ComponentActivity() { onPinsClick = { nav.navigate(AppDestination.Pins(data = it)) }, ) - AppDestination.Settings -> Settings( + is AppDestination.Pins -> PinsScreen( + data = dest.data, modifier = Modifier.fillMaxSize(), onBackClick = { nav.back() }, ) - is AppDestination.Pins -> PinsScreen( - data = dest.data, + AppDestination.Settings -> Settings( modifier = Modifier.fillMaxSize(), onBackClick = { nav.back() }, + onCategoryClick = { nav.navigate(it) }, + ) + + is AppDestination.Settings -> SettingsCategory( + dest = dest, + onClickBack = { nav.back() }, ) } } diff --git a/app/src/main/java/com/xinto/opencord/ui/navigation/AppDestination.kt b/app/src/main/java/com/xinto/opencord/ui/navigation/AppDestination.kt index 3b7ccffe..1100fb79 100644 --- a/app/src/main/java/com/xinto/opencord/ui/navigation/AppDestination.kt +++ b/app/src/main/java/com/xinto/opencord/ui/navigation/AppDestination.kt @@ -2,7 +2,10 @@ package com.xinto.opencord.ui.navigation import android.app.Activity import android.os.Parcelable +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes import androidx.compose.runtime.Immutable +import com.xinto.opencord.R import com.xinto.opencord.ui.util.topDestination import dev.olshevski.navigation.reimagined.NavController import dev.olshevski.navigation.reimagined.pop @@ -14,8 +17,28 @@ sealed interface AppDestination : Parcelable { @Parcelize object Main : AppDestination + @Suppress("PROPERTY_WONT_BE_SERIALIZED") @Parcelize - object Settings : AppDestination + enum class Settings( + @StringRes val label: Int, + @DrawableRes val icon: Int, + ) : AppDestination { + ACCOUNT(R.string.account, R.drawable.ic_account_circle), + USER_PROFILE(R.string.user_profile, R.drawable.ic_edit), + PRIVACY_SAFETY(R.string.privacy_safety, R.drawable.ic_security), + DEVICES(R.string.devices, R.drawable.ic_devices), + CONNECTIONS(R.string.connections, R.drawable.ic_link), + FRIEND_REQUESTS(R.string.friend_requests, R.drawable.ic_person_add), + VOICE_VIDEO(R.string.voice_video, R.drawable.ic_settings_voice), + APPEARANCE(R.string.appearance, R.drawable.ic_palette), + ACCESSIBILITY(R.string.accessibility, R.drawable.ic_settings_accessibility), + LANGUAGE(R.string.language, R.drawable.ic_language), + WEB_BROWSER(R.string.web_browser, R.drawable.ic_web), + NOTIFICATIONS(R.string.notifications, R.drawable.ic_notifications); + + @Parcelize + companion object : AppDestination + } @Parcelize data class Pins(val data: PinsScreenData) : AppDestination diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/SettingsScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/SettingsScreen.kt index 86964ccf..f6f4be44 100644 --- a/app/src/main/java/com/xinto/opencord/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/xinto/opencord/ui/screens/SettingsScreen.kt @@ -1,19 +1,60 @@ package com.xinto.opencord.ui.screens +import androidx.annotation.DrawableRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +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.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material3.* +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Divider +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Slider +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import com.xinto.opencord.R +import com.xinto.opencord.ui.navigation.AppDestination.Settings +import com.xinto.opencord.ui.screens.settings.accessibilityScreen +import com.xinto.opencord.ui.screens.settings.accountScreen +import com.xinto.opencord.ui.screens.settings.appearanceScreen +import com.xinto.opencord.ui.screens.settings.connectionsScreen +import com.xinto.opencord.ui.screens.settings.devicesScreen +import com.xinto.opencord.ui.screens.settings.friendRequestsScreen +import com.xinto.opencord.ui.screens.settings.languageScreen +import com.xinto.opencord.ui.screens.settings.notificationScreen +import com.xinto.opencord.ui.screens.settings.privacySafetyScreen +import com.xinto.opencord.ui.screens.settings.userProfileScreen +import com.xinto.opencord.ui.screens.settings.voiceScreen +import com.xinto.opencord.ui.screens.settings.webBrowserScreen +import com.xinto.opencord.util.ifNotNullComposable +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf @Composable fun Settings( - onBackClick: () -> Unit, modifier: Modifier = Modifier, + onBackClick: () -> Unit, + onCategoryClick: (Settings) -> Unit, ) { Scaffold( modifier = modifier, @@ -36,7 +77,264 @@ fun Settings( .fillMaxSize() .padding(paddingValues), ) { + fun section(label: String, categories: ImmutableList) { + section(label) { + items(categories) { category -> + ListItem( + modifier = Modifier.clickable { onCategoryClick(category) }, + leadingContent = { + Icon( + painter = painterResource(category.icon), + contentDescription = null, + ) + }, + headlineText = { + Text(stringResource(category.label)) + }, + ) + } + } + } + + section( + label = "User Settings", + categories = persistentListOf( + Settings.ACCOUNT, + Settings.USER_PROFILE, + Settings.PRIVACY_SAFETY, + Settings.DEVICES, + Settings.CONNECTIONS, + Settings.FRIEND_REQUESTS, + ), + ) + section( + label = "App Settings", + categories = persistentListOf( + Settings.APPEARANCE, + Settings.VOICE_VIDEO, + Settings.NOTIFICATIONS, + Settings.WEB_BROWSER, + Settings.ACCESSIBILITY, + Settings.LANGUAGE, + ), + ) + + item { + Box( + modifier = Modifier + .fillParentMaxWidth() + .padding(16.dp), + contentAlignment = Alignment.Center + ) { + FilledTonalButton( + onClick = { /*TODO*/ }, + contentPadding = ButtonDefaults.ButtonWithIconContentPadding + ) { + Icon( + painter = painterResource(R.drawable.ic_logout), + contentDescription = null, + ) + + Spacer(Modifier.width(ButtonDefaults.IconSpacing)) + + Text(stringResource(R.string.logout)) + } + } + } + } + } +} + +@Composable +fun SettingsCategory( + dest: Settings, + onClickBack: () -> Unit +) { + Scaffold( + topBar = { + TopAppBar( + navigationIcon = { + IconButton(onClick = onClickBack) { + Icon( + painter = painterResource(R.drawable.ic_arrow_back), + contentDescription = null, + ) + } + }, + title = { + Text(stringResource(dest.label)) + }, + ) + }, + ) { paddingValues -> + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + ) { + when (dest) { + Settings.ACCOUNT -> accountScreen() + Settings.USER_PROFILE -> userProfileScreen() + Settings.PRIVACY_SAFETY -> privacySafetyScreen() + Settings.DEVICES -> devicesScreen() + Settings.CONNECTIONS -> connectionsScreen() + Settings.FRIEND_REQUESTS -> friendRequestsScreen() + Settings.VOICE_VIDEO -> voiceScreen() + Settings.WEB_BROWSER -> webBrowserScreen() + Settings.NOTIFICATIONS -> notificationScreen() + Settings.APPEARANCE -> appearanceScreen() + Settings.ACCESSIBILITY -> accessibilityScreen() + Settings.LANGUAGE -> languageScreen() + } + } + } +} + +context(LazyListScope) +fun setting( + label: String, + description: String? = null, + onClick: () -> Unit, + trailingContent: (@Composable () -> Unit)? = null, +) { + item { + ListItem( + modifier = Modifier.clickable(onClick = onClick), + headlineText = { Text(label) }, + supportingText = description.ifNotNullComposable { Text(it) }, + trailingContent = trailingContent, + ) + } +} + +context(LazyListScope) +fun switchSetting( + label: String, + description: String? = null, + checked: Boolean, + onCheckedChange: (Boolean) -> Unit, +) { + setting( + label = label, + description = description, + onClick = { onCheckedChange(!checked) }, + ) { + Switch( + checked = checked, + onCheckedChange = onCheckedChange, + ) + } +} + +context(LazyListScope) +fun section( + label: String, + content: () -> Unit +) { + item { + Text( + modifier = Modifier.padding( + start = 16.dp, + end = 16.dp, + top = 18.dp, + ), + text = label, + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.secondary, + ) + } + + content() + + // divider() +} + +context(LazyListScope) +fun divider() { + item { + Box( + modifier = Modifier.fillMaxWidth(), + ) { + Divider( + modifier = Modifier + .padding( + start = 12.dp, + end = 12.dp, + top = 8.dp, + ) + .align(Alignment.Center), + ) + } + } +} + +context(LazyListScope) +fun sliderSetting( + value: Float, + valueRange: ClosedFloatingPointRange = 0f..1f, + steps: Int = 0, + onValueChange: (Float) -> Unit, + @DrawableRes leadingIcon: Int, + @DrawableRes trailingIcon: Int, +) { + item { + Row( + modifier = Modifier + .fillParentMaxWidth() + .padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + painter = painterResource(leadingIcon), + contentDescription = null, + ) + + Slider( + modifier = Modifier.weight(1f, true), + value = value, + onValueChange = onValueChange, + valueRange = valueRange, + steps = steps, + ) + + Icon( + painter = painterResource(trailingIcon), + contentDescription = null, + ) + } + } +} + +interface RadioSetting { + val label: String + val description: String? +} + +context(LazyListScope) +inline fun radioSection( + label: String, + value: T, + crossinline onOptionClick: (T) -> Unit, +) where T : Enum, T : RadioSetting { + section(label) { + items(enumValues()) { option -> + ListItem( + modifier = Modifier.clickable { + onOptionClick(option) + }, + headlineText = { + Text(option.label) + }, + supportingText = option.description?.let { { Text(it) } }, + trailingContent = { + RadioButton( + selected = value == option, + onClick = null, + ) + }, + ) } } } diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/AccessibilityScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/AccessibilityScreen.kt new file mode 100644 index 00000000..4a148351 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/AccessibilityScreen.kt @@ -0,0 +1,8 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope + +context(LazyListScope) +fun accessibilityScreen() { + +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/AccountScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/AccountScreen.kt new file mode 100644 index 00000000..92823520 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/AccountScreen.kt @@ -0,0 +1,81 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.xinto.opencord.ui.screens.section +import com.xinto.opencord.ui.screens.setting + +context(LazyListScope) +fun accountScreen() { + section("Account Information") { + setting( + label = "Username", + onClick = {}, + ) { + Text("opencord#1234") + } + setting( + label = "Email", + onClick = {}, + ) { + Text("opencord@gmail.com") + } + setting( + label = "Phone", + onClick = {}, + ) { + + } + setting( + label = "Password", + onClick = {}, + ) + + setting( + label = "Two-factor authentication", + onClick = {}, + trailingContent = { + OutlinedButton(onClick = {}) { + Text("Enable") + } + }, + ) + } + + section("Account Management") { + item { + Row( + modifier = Modifier + .fillParentMaxWidth() + .padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + ) { + Button( + onClick = { /*TODO show confirm dialog*/ }, + ) { + Text("Disable Account") + } + + FilledTonalButton( + onClick = { /*TODO show confirm dialog*/ }, + colors = ButtonDefaults.filledTonalButtonColors( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.onErrorContainer, + ), + ) { + Text("Delete Account") + } + } + } + } +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/AppearanceScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/AppearanceScreen.kt new file mode 100644 index 00000000..5b8e571b --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/AppearanceScreen.kt @@ -0,0 +1,44 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.R +import com.xinto.opencord.ui.screens.section +import com.xinto.opencord.ui.screens.sliderSetting +import com.xinto.opencord.ui.screens.switchSetting + +context(LazyListScope) +fun appearanceScreen() { + section("Theme") { + switchSetting( + label = "Dark mode", + description = "Use dark mode for the app", + checked = true, + onCheckedChange = {}, + ) + + switchSetting( + label = "Dynamic colors", + description = "Use dynamic colors for the app", + checked = true, + onCheckedChange = {}, + ) + } + + section("Zoom level") { + sliderSetting( + value = 1f, + valueRange = 0.75f..2f, + onValueChange = {}, + leadingIcon = R.drawable.ic_zoom_out, + trailingIcon = R.drawable.ic_zoom_in, + ) + } + + section("Sync") { + switchSetting( + label = "Sync across clients", + checked = true, + onCheckedChange = {}, + ) + } +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/ConnectionsScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/ConnectionsScreen.kt new file mode 100644 index 00000000..b0099c91 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/ConnectionsScreen.kt @@ -0,0 +1,8 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope + +context(LazyListScope) +fun connectionsScreen() { + +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/DevicesScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/DevicesScreen.kt new file mode 100644 index 00000000..6c44ef30 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/DevicesScreen.kt @@ -0,0 +1,15 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.ui.screens.section + +context(LazyListScope) +fun devicesScreen() { + section("Current Device") { + + } + + section("Other Devices") { + + } +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/FriendRequestsScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/FriendRequestsScreen.kt new file mode 100644 index 00000000..b0cdab55 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/FriendRequestsScreen.kt @@ -0,0 +1,26 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.ui.screens.section +import com.xinto.opencord.ui.screens.switchSetting + +context(LazyListScope) +fun friendRequestsScreen() { + section("Who Can Send You A Friend Request") { + switchSetting( + label = "Everyone", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Friends of Friends", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Server Members", + checked = true, + onCheckedChange = {}, + ) + } +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/LanguageScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/LanguageScreen.kt new file mode 100644 index 00000000..7f47e739 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/LanguageScreen.kt @@ -0,0 +1,21 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.ui.screens.setting +import com.xinto.opencord.ui.screens.switchSetting + +context(LazyListScope) +fun languageScreen() { + setting( + label = "Language", + description = "English (United States)", + onClick = {}, + ) + + switchSetting( + label = "Sync across clients", + description = "Sync your language settings across all your devices", + checked = true, + onCheckedChange = { /*TODO*/ }, + ) +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/NotificationsScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/NotificationsScreen.kt new file mode 100644 index 00000000..421476a7 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/NotificationsScreen.kt @@ -0,0 +1,24 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.ui.screens.setting +import com.xinto.opencord.ui.screens.switchSetting + +context(LazyListScope) +fun notificationScreen() { + switchSetting( + label = "In-app notifications", + description = "Show notifications in the app", + checked = true, + onCheckedChange = {}, + ) + setting( + label = "System notifications", + onClick = { /*TODO*/ }, + ) + switchSetting( + label = "Get notifications when your friends stream", + checked = false, + onCheckedChange = {}, + ) +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/PrivacySafetyScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/PrivacySafetyScreen.kt new file mode 100644 index 00000000..95d79b66 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/PrivacySafetyScreen.kt @@ -0,0 +1,97 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.ui.screens.RadioSetting +import com.xinto.opencord.ui.screens.radioSection +import com.xinto.opencord.ui.screens.section +import com.xinto.opencord.ui.screens.switchSetting + +enum class PrivacySafetyOption( + override val label: String, + override val description: String +) : RadioSetting { + KEEP_ME_SAFE("Keep me safe", "Scan direct messages from everyone"), + FRIENDS_ONLY("My friends are nice", "Scan direct messages from everyone unless they are a friend"), + DO_NOT_SCAN("Do not scan", "Direct messages will not be scanned for explicit content"), +} + +context(LazyListScope) +fun privacySafetyScreen() { + radioSection( + label = "Safe Direct Messaging", + value = PrivacySafetyOption.FRIENDS_ONLY, + onOptionClick = { }, + ) + + section("Server Privacy Defaults") { + switchSetting( + label = "Allow direct messages from server members", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Allow access to age-restricted commands from apps in Direct Messages", + checked = true, + onCheckedChange = {}, + ) + } + + section("Activity Status") { + switchSetting( + label = "Display current activity as status message", + description = "Discord will automatically update your status if you're attending a public stage", + checked = true, + onCheckedChange = {}, + ) + } + + section("Message Requests") { + switchSetting( + label = "Enable message requests from server members you may not know", + checked = true, + onCheckedChange = {}, + ) + } + + section("Find Your Friends") { + switchSetting( + label = "Sync Contacts", + description = "Sync your contacts to find friends on Discord", + checked = true, + onCheckedChange = {}, + ) + } + + section("Discovery Permissions") { + switchSetting( + label = "Phone Number", + description = "People can add you by phone number", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Email Address", + description = "People can add you by email address", + checked = true, + onCheckedChange = {}, + ) + } + + section("How We Use Your Data") { + switchSetting( + label = "Use data to improve Discord", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Use data to customize my Discord experience", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Allow Discord to track screen reader usage", + checked = true, + onCheckedChange = {}, + ) + } +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/TextMediaScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/TextMediaScreen.kt new file mode 100644 index 00000000..5717d29f --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/TextMediaScreen.kt @@ -0,0 +1,86 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.ui.screens.RadioSetting +import com.xinto.opencord.ui.screens.radioSection +import com.xinto.opencord.ui.screens.section +import com.xinto.opencord.ui.screens.switchSetting + +private enum class VideoUpload(override val label: String, override val description: String? = null) : RadioSetting { + BEST_QUALITY("Best Quality"), + STANDARD("Standard (recommended)"), + DATA_SAVER("Data Saver") +} + +context(LazyListScope) +fun textMediaScreen() { + section("Display Images, Videos, and Lolcats") { + switchSetting( + label = "When posted as links to chat", + checked = true, + onCheckedChange = {}, + ) + + switchSetting( + label = "When uploaded directly to Discord", + description = "Images larger than 8MB will not be previewed", + checked = true, + onCheckedChange = {}, + ) + + switchSetting( + label = "With image descriptions", + description = "Image descriptions are used to describe images for screenreaders", + checked = true, + onCheckedChange = {}, + ) + } + + radioSection( + label = "Video Uploads", + value = VideoUpload.STANDARD, + onOptionClick = { }, + ) + + section("Data Consumption") { + switchSetting( + label = "Data saving mode", + description = "Images and videos will be sent in lower quality on cellular networks to reduce data usage", + checked = true, + onCheckedChange = {}, + ) + } + + section("Embeds and Link Previews") { + switchSetting( + label = "Show embeds and preview website links pasted into chat", + checked = true, + onCheckedChange = {}, + ) + } + + section("Emoji") { + switchSetting( + label = "Show emoji reactions on messages", + checked = true, + onCheckedChange = {}, + ) + } + + section("Stickers") { + switchSetting( + label = "Sticker suggestions", + description = "Allow sticker suggestions to appear when typing messages", + checked = true, + onCheckedChange = {}, + ) + } + + section("Sync") { + switchSetting( + label = "Sync across clients", + checked = true, + onCheckedChange = {}, + ) + } +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/UserProfileScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/UserProfileScreen.kt new file mode 100644 index 00000000..6942e9c4 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/UserProfileScreen.kt @@ -0,0 +1,176 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.IconButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +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.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.dp +import coil.size.Size +import com.xinto.opencord.R +import com.xinto.opencord.ui.components.OCAsyncImage +import com.xinto.opencord.ui.screens.divider +import com.xinto.opencord.ui.screens.section + +context(LazyListScope) + +@OptIn(ExperimentalLayoutApi::class) +fun userProfileScreen() { + item { + BoxWithConstraints( + modifier = Modifier + .fillParentMaxWidth() + .heightIn(min = 240.dp, max = 600.dp), + ) { + OCAsyncImage( + modifier = Modifier + .align(Alignment.TopCenter) + .fillParentMaxWidth() + .height(minHeight / 2), + url = "https://pbs.twimg.com/media/FUNI2HbXwAAEtyp.jpg", + contentScale = ContentScale.Crop, + ) + + Box( + modifier = Modifier + .padding(16.dp) + .align(Alignment.CenterStart), + ) { + Box( + modifier = Modifier + .background(MaterialTheme.colorScheme.surface, CircleShape) + .padding(8.dp) + ) { + OCAsyncImage( + modifier = Modifier + .clip(CircleShape) + .size(100.dp) + .clickable { + // Show a bottom sheet + }, + size = Size(256, 256), + url = "https://pbs.twimg.com/media/FUNI2HbXwAAEtyp.jpg", + ) + } + + IconButton( + modifier = Modifier.align(Alignment.TopEnd), + onClick = { /*TODO*/ }, + colors = IconButtonDefaults.iconButtonColors( + contentColor = MaterialTheme.colorScheme.onSurface, + containerColor = MaterialTheme.colorScheme.surface, + ) + ) { + Icon( + painter = painterResource(R.drawable.ic_edit), + contentDescription = null, + ) + } + } + + Text( + modifier = Modifier + .padding(16.dp) + .align(Alignment.BottomStart), + text = buildAnnotatedString { + withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { + append("opencord") + } + withStyle( + style = SpanStyle( + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.65f) + ) + ) { + append("#1234") + } + }, + style = MaterialTheme.typography.titleLarge, + ) + + IconButton( + modifier = Modifier + .padding(8.dp) + .align(Alignment.TopEnd), + onClick = { /*TODO*/ }, + colors = IconButtonDefaults.iconButtonColors( + contentColor = MaterialTheme.colorScheme.onSurface, + containerColor = MaterialTheme.colorScheme.surface, + ), + ) { + Icon( + painter = painterResource(R.drawable.ic_edit), + contentDescription = null, + ) + } + + // Badges + FlowRow( + modifier = Modifier + .padding(16.dp) + .align(Alignment.BottomEnd), + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.Bottom, + maxItemsInEachRow = 4, + ) { + @Composable + fun badge(url: String) { + OCAsyncImage( + modifier = Modifier + .size(32.dp) + .padding(4.dp) + .clip(CircleShape), + url = url, + ) + } + + badge("https://preview.redd.it/0oaxe7asyw461.jpg?auto=webp&s=f88005a202db447bc1029ac97f161b3d37666693") + badge("https://pbs.twimg.com/profile_images/1584258394977931265/lrZvCd27_400x400.jpg") + badge("https://i.redd.it/hexrtw5zxk541.jpg") + badge("https://preview.redd.it/38m4cld3cyt41.png?width=640&crop=smart&auto=webp&v=enabled&s=b5536900fc8abbab49ee851260d9c157d4ff2d66") + } + } + } + + divider() + + section("About Me") { + item { + TextField( + modifier = Modifier + .fillParentMaxWidth() + .padding(16.dp), + value = "", + onValueChange = {}, + placeholder = { + Text("Tap to add an about me") + }, + minLines = 5, + ) + } + } +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/VoiceScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/VoiceScreen.kt new file mode 100644 index 00000000..c44057d3 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/VoiceScreen.kt @@ -0,0 +1,88 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.Slider +import androidx.compose.material3.Text +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.xinto.opencord.R +import com.xinto.opencord.ui.screens.section +import com.xinto.opencord.ui.screens.setting +import com.xinto.opencord.ui.screens.sliderSetting +import com.xinto.opencord.ui.screens.switchSetting + +context(LazyListScope) +fun voiceScreen() { + section("Input") { + setting( + label = "Input Mode", + onClick = {}, + ) { + Text("Voice Activity") + } + + switchSetting( + label = "Auto Sensitivity", + description = "Automatically adjust sensitivity based on your voice", + checked = false, + onCheckedChange = {}, + ) + + item { + Slider( + modifier = Modifier + .fillParentMaxWidth() + .padding(horizontal = 16.dp), + value = 0.8f, + onValueChange = {}, + ) + } + } + + section("Output") { + sliderSetting( + value = 0.6f, + valueRange = 0f..1f, + onValueChange = {}, + leadingIcon = R.drawable.ic_volume_mute, + trailingIcon = R.drawable.ic_volume_up, + ) + } + + section("Overlay") { + switchSetting( + label = "Show overlay", + description = "See who's talking and access shortcuts while using other apps when connected to voice", + checked = true, + onCheckedChange = {}, + ) + } + + section("Voice Processing") { + switchSetting( + label = "Echo Cancellation", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Noise Suppression", + description = "Reduces background noise", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Automatic Gain Control", + description = "Automatically adjusts your microphone's volume", + checked = true, + onCheckedChange = {}, + ) + switchSetting( + label = "Advanced Voice Activity", + description = "Detects when you're talking and when you're not", + checked = true, + onCheckedChange = {}, + ) + } + +} diff --git a/app/src/main/java/com/xinto/opencord/ui/screens/settings/WebBrowserScreen.kt b/app/src/main/java/com/xinto/opencord/ui/screens/settings/WebBrowserScreen.kt new file mode 100644 index 00000000..ad029063 --- /dev/null +++ b/app/src/main/java/com/xinto/opencord/ui/screens/settings/WebBrowserScreen.kt @@ -0,0 +1,14 @@ +package com.xinto.opencord.ui.screens.settings + +import androidx.compose.foundation.lazy.LazyListScope +import com.xinto.opencord.ui.screens.switchSetting + +context(LazyListScope) +fun webBrowserScreen() { + switchSetting( + label = "Open links in the app", + description = "Links will open in the app instead of your default browser", + checked = true, + onCheckedChange = {}, + ) +} diff --git a/app/src/main/res/drawable/ic_account_circle.xml b/app/src/main/res/drawable/ic_account_circle.xml new file mode 100644 index 00000000..839101bd --- /dev/null +++ b/app/src/main/res/drawable/ic_account_circle.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_forward.xml b/app/src/main/res/drawable/ic_arrow_forward.xml new file mode 100644 index 00000000..301c7cd6 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_forward.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_devices.xml b/app/src/main/res/drawable/ic_devices.xml new file mode 100644 index 00000000..2d0ff188 --- /dev/null +++ b/app/src/main/res/drawable/ic_devices.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_language.xml b/app/src/main/res/drawable/ic_language.xml new file mode 100644 index 00000000..0335ca0b --- /dev/null +++ b/app/src/main/res/drawable/ic_language.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_link.xml b/app/src/main/res/drawable/ic_link.xml new file mode 100644 index 00000000..1e1b4667 --- /dev/null +++ b/app/src/main/res/drawable/ic_link.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_logout.xml b/app/src/main/res/drawable/ic_logout.xml new file mode 100644 index 00000000..5f818ab1 --- /dev/null +++ b/app/src/main/res/drawable/ic_logout.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_notifications.xml b/app/src/main/res/drawable/ic_notifications.xml new file mode 100644 index 00000000..538f5818 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_palette.xml b/app/src/main/res/drawable/ic_palette.xml new file mode 100644 index 00000000..00e3ee37 --- /dev/null +++ b/app/src/main/res/drawable/ic_palette.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_person_add.xml b/app/src/main/res/drawable/ic_person_add.xml new file mode 100644 index 00000000..2a9a71b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_person_add.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_security.xml b/app/src/main/res/drawable/ic_security.xml new file mode 100644 index 00000000..2d367847 --- /dev/null +++ b/app/src/main/res/drawable/ic_security.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_accessibility.xml b/app/src/main/res/drawable/ic_settings_accessibility.xml new file mode 100644 index 00000000..d00a72ec --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_accessibility.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_voice.xml b/app/src/main/res/drawable/ic_settings_voice.xml new file mode 100644 index 00000000..9f0716ab --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_voice.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_volume_mute.xml b/app/src/main/res/drawable/ic_volume_mute.xml new file mode 100644 index 00000000..9769000e --- /dev/null +++ b/app/src/main/res/drawable/ic_volume_mute.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_web.xml b/app/src/main/res/drawable/ic_web.xml new file mode 100644 index 00000000..1217c34b --- /dev/null +++ b/app/src/main/res/drawable/ic_web.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_zoom_in.xml b/app/src/main/res/drawable/ic_zoom_in.xml new file mode 100644 index 00000000..b8629b64 --- /dev/null +++ b/app/src/main/res/drawable/ic_zoom_in.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_zoom_out.xml b/app/src/main/res/drawable/ic_zoom_out.xml new file mode 100644 index 00000000..0f257c8c --- /dev/null +++ b/app/src/main/res/drawable/ic_zoom_out.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 88d73b6c..483ea0fc 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -36,4 +36,18 @@ تعيين حالة مخصصة مسح الحالة فتح مبدل الحساب + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index c67d3a31..30cca697 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -36,4 +36,18 @@ Nastavit vlastní status Smazat status Otevřít přepínač účtů + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 3e0db809..985a0109 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -36,4 +36,18 @@ Stelle einen Status ein Status löschen Account Switcher öffnen + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index 3182d269..1990fd1d 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -36,4 +36,18 @@ Ορίστε μια προσαρμοσμένη κατάσταση Εκκαθάριση κατάστασης Άνοιγμα εναλλαγής λογαριασμού + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 6f6f0540..19a2290e 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -36,4 +36,18 @@ Establecer estado personalizado Borrar el estado Abrir el cambiador de cuenta + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index e5d41ab2..cc4f4b96 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -36,4 +36,18 @@ Aseta oma tila Tyhjennä tila Avaa tilin valitsin + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index ab89a6a0..70a12b14 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -36,4 +36,18 @@ Définir un statut personnalisé Effacer le statut Ouverture d\'un compte commutateur + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index f58ed37c..186abbd7 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -36,4 +36,18 @@ Egyedi állapot beállítása Állapot kitörlése Felhasználó váltó megnyitása + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index b7ceac32..35bbdd2b 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -36,4 +36,18 @@ Tetapkan status khusus Hapus status Buka pengalih akun + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 30f6bc3c..5f97aeb6 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -36,4 +36,18 @@ Imposta uno stato personalizzato Pulisci stato Apri l\'account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index f8bd056a..c2833526 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -36,4 +36,18 @@ カスタムステータスを設定 ステータスをクリア アカウントスイッチャーを開く + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 9b208ebf..7d67177b 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -36,4 +36,18 @@ 사용자 지정 상태를 설정해 보세요 상태 초기화 계정 전환기 열기 + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index ac5b0eec..48733f9e 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 50dee703..e40d9d70 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -36,4 +36,18 @@ Ustaw własny status Wyczyść status Otwórz przełącznik kont + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9e624f86..b644fc79 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -36,4 +36,18 @@ Definir um status personalizado Limpar status Abrir alternador de contas + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 5635dbcd..0fb1f569 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -36,4 +36,18 @@ Definir um status personalizado Limpar status Abrir alternador de contas + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index f386cfb1..559d2c9a 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -36,4 +36,18 @@ Установить пользовательский статус Очистить статус Открыть переключение аккаунтов + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index d926959c..04349121 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 2d7a45f9..a4b0daa4 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -36,4 +36,18 @@ Set a custom status Rensa status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index c930eb5b..5c237812 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -36,4 +36,18 @@ Bir özel durum belirle Durumu temizle Hesap değiştiricisini aç + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index d3eeade9..00b7950f 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -36,4 +36,18 @@ Встановити користувацький статус Очистити статус Відкрити перемикач акаунтів + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 23fb3c47..ee660929 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -36,4 +36,18 @@ Đặt trạng thái tuỳ chọn Xoá trạng thái Mở trình đổi tài khoản + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b6d6bd04..f713a79a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -36,4 +36,18 @@ Set a custom status Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ff810cf3..6ca2e312 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -36,4 +36,18 @@ 設定自訂狀態 清除狀態 打開帳戶切換 + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 827de25c..2fd31223 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,4 +49,18 @@ Clear status Open account switcher + Notifications + Connections + Appearance + Accessibility + Language + + User profile + + Account + Sync across clients + Devices + Friend Requests + Logout + Web Browser