diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/BasePreferenceWidget.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/BasePreferenceWidget.kt new file mode 100644 index 000000000..2a02183e5 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/BasePreferenceWidget.kt @@ -0,0 +1,128 @@ +package app.omnivore.omnivore.core.designsystem.component + +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.StartOffset +import androidx.compose.animation.core.StartOffsetType +import androidx.compose.animation.core.repeatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.sizeIn +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.runtime.structuralEqualityPolicy +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.composed +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import kotlinx.coroutines.delay +import kotlin.time.Duration.Companion.seconds + +val LocalPreferenceHighlighted = compositionLocalOf(structuralEqualityPolicy()) { false } +val LocalPreferenceMinHeight = compositionLocalOf(structuralEqualityPolicy()) { 56.dp } + +@Composable +internal fun BasePreferenceWidget( + modifier: Modifier = Modifier, + title: String? = null, + subcomponent: @Composable (ColumnScope.() -> Unit)? = null, + icon: @Composable (() -> Unit)? = null, + onClick: (() -> Unit)? = null, + widget: @Composable (() -> Unit)? = null, +) { + val highlighted = LocalPreferenceHighlighted.current + val minHeight = LocalPreferenceMinHeight.current + Row( + modifier = modifier + .highlightBackground(highlighted) + .sizeIn(minHeight = minHeight) + .clickable(enabled = onClick != null, onClick = { onClick?.invoke() }) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + if (icon != null) { + Box( + modifier = Modifier.padding(start = PrefsHorizontalPadding, end = 8.dp), + content = { icon() }, + ) + } + Column( + modifier = Modifier + .weight(1f) + .padding(vertical = PrefsVerticalPadding), + ) { + if (!title.isNullOrBlank()) { + Text( + modifier = Modifier.padding(horizontal = PrefsHorizontalPadding), + text = title, + overflow = TextOverflow.Ellipsis, + maxLines = 2, + style = MaterialTheme.typography.titleLarge, + fontSize = TitleFontSize, + ) + } + subcomponent?.invoke(this) + } + if (widget != null) { + Box( + modifier = Modifier.padding(end = PrefsHorizontalPadding), + content = { widget() }, + ) + } + } +} + +internal fun Modifier.highlightBackground(highlighted: Boolean): Modifier = composed { + var highlightFlag by remember { mutableStateOf(false) } + LaunchedEffect(Unit) { + if (highlighted) { + highlightFlag = true + delay(3.seconds) + highlightFlag = false + } + } + val highlight by animateColorAsState( + targetValue = if (highlightFlag) { + MaterialTheme.colorScheme.surfaceTint.copy(alpha = .12f) + } else { + Color.Transparent + }, + animationSpec = if (highlightFlag) { + repeatable( + iterations = 5, + animation = tween(durationMillis = 200), + repeatMode = RepeatMode.Reverse, + initialStartOffset = StartOffset( + offsetMillis = 600, + offsetType = StartOffsetType.Delay, + ), + ) + } else { + tween(200) + }, + label = "highlight", + ) + Modifier.background(color = highlight) +} + +internal val TrailingWidgetBuffer = 16.dp +internal val PrefsHorizontalPadding = 16.dp +internal val PrefsVerticalPadding = 16.dp +internal val TitleFontSize = 16.sp diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/SwitchPreferenceWidget.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/SwitchPreferenceWidget.kt new file mode 100644 index 000000000..616e39530 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/SwitchPreferenceWidget.kt @@ -0,0 +1,69 @@ +package app.omnivore.omnivore.core.designsystem.component + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Preview +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.tooling.preview.PreviewLightDark + +@Composable +fun SwitchPreferenceWidget( + modifier: Modifier = Modifier, + title: String, + subtitle: String? = null, + icon: ImageVector? = null, + checked: Boolean = false, + onCheckedChanged: (Boolean) -> Unit, +) { + TextPreferenceWidget( + modifier = modifier, + title = title, + subtitle = subtitle, + icon = icon, + widget = { + Switch( + checked = checked, + onCheckedChange = null, + modifier = Modifier.padding(start = TrailingWidgetBuffer), + ) + }, + onPreferenceClick = { onCheckedChanged(!checked) }, + ) +} + +@PreviewLightDark +@Composable +private fun SwitchPreferenceWidgetPreview() { + Surface { + Column { + SwitchPreferenceWidget( + title = "Text preference with icon", + subtitle = "Text preference summary", + icon = Icons.Filled.Preview, + checked = true, + onCheckedChanged = {}, + ) + SwitchPreferenceWidget( + title = "Text preference", + subtitle = "Text preference summary", + checked = false, + onCheckedChanged = {}, + ) + SwitchPreferenceWidget( + title = "Text preference no summary", + checked = false, + onCheckedChanged = {}, + ) + SwitchPreferenceWidget( + title = "Another text preference no summary", + checked = false, + onCheckedChanged = {}, + ) + } + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/TextPreferenceWidget.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/TextPreferenceWidget.kt new file mode 100644 index 000000000..f2fc7e3e7 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/component/TextPreferenceWidget.kt @@ -0,0 +1,79 @@ +package app.omnivore.omnivore.core.designsystem.component + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Preview +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.tooling.preview.PreviewLightDark +import app.omnivore.omnivore.core.designsystem.util.secondaryItemAlpha + +@Composable +fun TextPreferenceWidget( + modifier: Modifier = Modifier, + title: String? = null, + subtitle: String? = null, + icon: ImageVector? = null, + iconTint: Color = MaterialTheme.colorScheme.primary, + widget: @Composable (() -> Unit)? = null, + onPreferenceClick: (() -> Unit)? = null, +) { + BasePreferenceWidget( + modifier = modifier, + title = title, + subcomponent = if (!subtitle.isNullOrBlank()) { + { + Text( + text = subtitle, + modifier = Modifier + .padding(horizontal = PrefsHorizontalPadding) + .secondaryItemAlpha(), + style = MaterialTheme.typography.bodySmall, + maxLines = 10, + ) + } + } else { + null + }, + icon = if (icon != null) { + { + Icon( + imageVector = icon, + tint = iconTint, + contentDescription = null, + ) + } + } else { + null + }, + onClick = onPreferenceClick, + widget = widget, + ) +} + +@PreviewLightDark +@Composable +private fun TextPreferenceWidgetPreview() { + Surface { + Column { + TextPreferenceWidget( + title = "Text preference with icon", + subtitle = "Text preference summary", + icon = Icons.Filled.Preview, + onPreferenceClick = {}, + ) + TextPreferenceWidget( + title = "Text preference", + subtitle = "Text preference summary", + onPreferenceClick = {}, + ) + } + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/util/Constants.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/util/Constants.kt new file mode 100644 index 000000000..850706c17 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/util/Constants.kt @@ -0,0 +1,3 @@ +package app.omnivore.omnivore.core.designsystem.util + +const val SecondaryItemAlpha = .78f diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/util/Modifier.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/util/Modifier.kt new file mode 100644 index 000000000..a9487bc12 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/core/designsystem/util/Modifier.kt @@ -0,0 +1,6 @@ +package app.omnivore.omnivore.core.designsystem.util + +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha + +fun Modifier.secondaryItemAlpha(): Modifier = this.alpha(SecondaryItemAlpha) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/ProfileScreen.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/ProfileScreen.kt index 1f6e38612..d97b1f614 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/ProfileScreen.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/ProfileScreen.kt @@ -1,14 +1,10 @@ package app.omnivore.omnivore.feature.profile -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -17,18 +13,15 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.navigation.NavHostController import app.omnivore.omnivore.R +import app.omnivore.omnivore.core.designsystem.component.TextPreferenceWidget import app.omnivore.omnivore.feature.auth.LoginViewModel import app.omnivore.omnivore.navigation.Routes +internal const val RELEASE_URL = "https://github.com/omnivore-app/omnivore/releases" + @OptIn(ExperimentalMaterial3Api::class) @Composable internal fun SettingsScreen( @@ -67,23 +60,33 @@ fun SettingsViewContent( ) { item { - SettingRow(title = stringResource(R.string.about_manage_account)) { - navController.navigate(Routes.Account.route) - } + TextPreferenceWidget( + title = stringResource(R.string.profile_filters), + onPreferenceClick = { navController.navigate(Routes.Filters.route) }, + ) + } + + item { HorizontalDivider() } + + item { + TextPreferenceWidget( + title = stringResource(R.string.profile_manage_account), + onPreferenceClick = { navController.navigate(Routes.Account.route) }, + ) } item { - SettingRow( - title = stringResource(R.string.about_logout) - ) { - showLogoutDialog.value = true - } + TextPreferenceWidget( + title = stringResource(R.string.about_logout), + onPreferenceClick = { showLogoutDialog.value = true }, + ) } item { - SettingRow(title = stringResource(R.string.about_view_title)) { - navController.navigate(Routes.About.route) - } + TextPreferenceWidget( + title = stringResource(R.string.about_view_title), + onPreferenceClick = { navController.navigate(Routes.About.route) }, + ) } } @@ -97,46 +100,3 @@ fun SettingsViewContent( } } - -@Composable -internal fun SettingRow( - title: String, subtitle: String? = null, onClick: (() -> Unit)? -) { - Row( - modifier = Modifier - .clickable(enabled = onClick != null, onClick = { onClick?.invoke() }) - .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically - ) { - Column( - modifier = Modifier - .weight(1f) - .padding(vertical = SettingsVerticalPadding) - ) { - Text( - modifier = Modifier.padding(horizontal = SettingsHorizontalPadding), - text = title, - overflow = TextOverflow.Ellipsis, - maxLines = 2, - style = MaterialTheme.typography.titleLarge, - fontSize = SettingsTitleFontSize, - ) - if (!subtitle.isNullOrBlank()) { - Text( - text = subtitle, - modifier = Modifier - .padding(horizontal = SettingsHorizontalPadding) - .alpha(SettingsSecondaryItemAlpha), - style = MaterialTheme.typography.bodySmall, - maxLines = 10, - ) - } - } - } -} - -internal val SettingsHorizontalPadding = 16.dp -internal val SettingsVerticalPadding = 16.dp -internal const val SettingsSecondaryItemAlpha = .78f -internal val SettingsTitleFontSize = 16.sp - -internal const val RELEASE_URL = "https://github.com/omnivore-app/omnivore/releases" diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/about/AboutScreen.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/about/AboutScreen.kt index 752ae2b30..014eaf8bb 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/about/AboutScreen.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/about/AboutScreen.kt @@ -27,10 +27,10 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController import app.omnivore.omnivore.BuildConfig import app.omnivore.omnivore.R +import app.omnivore.omnivore.core.designsystem.component.TextPreferenceWidget import app.omnivore.omnivore.core.ui.LinkIcon -import app.omnivore.omnivore.feature.profile.RELEASE_URL -import app.omnivore.omnivore.feature.profile.SettingRow import app.omnivore.omnivore.feature.profile.ProfileViewModel +import app.omnivore.omnivore.feature.profile.RELEASE_URL import app.omnivore.omnivore.navigation.Routes @OptIn(ExperimentalMaterial3Api::class) @@ -68,41 +68,45 @@ internal fun AboutScreen( } item { - SettingRow( + TextPreferenceWidget( title = stringResource(R.string.about_view_row_whats_new), - onClick = { uriHandler.openUri(RELEASE_URL) }, + onPreferenceClick = { uriHandler.openUri(RELEASE_URL) }, ) } item { - SettingRow(title = stringResource(R.string.about_documentation)) { - navController.navigate(Routes.Documentation.route) - } + TextPreferenceWidget( + title = stringResource(R.string.about_documentation), + onPreferenceClick = { navController.navigate(Routes.Documentation.route) }, + ) } item { - SettingRow(title = stringResource(R.string.about_feedback)) { - settingsViewModel.presentIntercom() - } + TextPreferenceWidget( + title = stringResource(R.string.about_feedback), + onPreferenceClick = { settingsViewModel.presentIntercom() }, + ) } item { - SettingRow(title = stringResource(R.string.about_privacy_policy)) { - navController.navigate(Routes.PrivacyPolicy.route) - } + TextPreferenceWidget( + title = stringResource(R.string.about_privacy_policy), + onPreferenceClick = { navController.navigate(Routes.PrivacyPolicy.route) }, + ) } item { - SettingRow(title = stringResource(R.string.about_terms_and_conditions)) { - navController.navigate(Routes.TermsAndConditions.route) - } + TextPreferenceWidget( + title = stringResource(R.string.about_terms_and_conditions), + onPreferenceClick = { navController.navigate(Routes.TermsAndConditions.route) }, + ) } item { - SettingRow( + TextPreferenceWidget( title = stringResource(R.string.about_view_row_version), subtitle = getVersionName(), - onClick = { }, + onPreferenceClick = { }, ) } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/account/AccountScreen.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/account/AccountScreen.kt index ab004ef5a..95dc6c550 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/account/AccountScreen.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/account/AccountScreen.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController import app.omnivore.omnivore.R -import app.omnivore.omnivore.feature.profile.SettingRow +import app.omnivore.omnivore.core.designsystem.component.TextPreferenceWidget import app.omnivore.omnivore.feature.profile.ProfileViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -72,11 +72,9 @@ internal fun AccountScreen( contentPadding = contentPadding, ) { item { - SettingRow( + TextPreferenceWidget( title = stringResource(R.string.manage_account_action_reset_data_cache), - onClick = { - settingsViewModel.resetDataCache() - }, + onPreferenceClick = { settingsViewModel.resetDataCache() }, ) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/filters/FiltersScreen.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/filters/FiltersScreen.kt new file mode 100644 index 000000000..6dfcdd456 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/feature/profile/filters/FiltersScreen.kt @@ -0,0 +1,65 @@ +package app.omnivore.omnivore.feature.profile.filters + +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.res.stringResource +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.navigation.NavHostController +import app.omnivore.omnivore.R +import app.omnivore.omnivore.core.designsystem.component.SwitchPreferenceWidget +import app.omnivore.omnivore.feature.profile.ProfileViewModel + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun FiltersScreen( + navController: NavHostController, + settingsViewModel: ProfileViewModel = hiltViewModel() +) { + + Scaffold( + topBar = { + TopAppBar( + title = { Text(stringResource(R.string.profile_filters)) }, + navigationIcon = { + IconButton(onClick = { navController.navigateUp() }) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.ArrowBack, contentDescription = null + ) + } + + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.background + ), + ) + }, + ) { contentPadding -> + LazyColumn( + contentPadding = contentPadding, + ) { + item { + var checked by remember { mutableStateOf(true) } + + SwitchPreferenceWidget( + title = stringResource(R.string.hide_following_tab), + checked = checked, + onCheckedChanged = { checked = it }, + ) + } + } + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt index 929d8be28..d7a4eb90f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/navigation/Routes.kt @@ -5,6 +5,7 @@ sealed class Routes(val route: String) { data object Inbox : Routes("Inbox") data object Settings : Routes("Settings") data object About : Routes("About") + data object Filters : Routes("Filters") data object Account : Routes("Account") data object Search : Routes("Search") data object Documentation : Routes("Documentation") diff --git a/android/Omnivore/app/src/main/res/values-de/strings.xml b/android/Omnivore/app/src/main/res/values-de/strings.xml index 727a75a82..a613ffc21 100644 --- a/android/Omnivore/app/src/main/res/values-de/strings.xml +++ b/android/Omnivore/app/src/main/res/values-de/strings.xml @@ -205,7 +205,7 @@ Feedback Datenschutzerklärung Nutzungsbedingungen - Konto verwalten + Konto verwalten Abmelden diff --git a/android/Omnivore/app/src/main/res/values-zh-rCN/strings.xml b/android/Omnivore/app/src/main/res/values-zh-rCN/strings.xml index 9231c4c6c..50d49b110 100644 --- a/android/Omnivore/app/src/main/res/values-zh-rCN/strings.xml +++ b/android/Omnivore/app/src/main/res/values-zh-rCN/strings.xml @@ -205,7 +205,7 @@ 反馈 隐私策略 条款和条件 - 管理帐户 + 管理帐户 登出 diff --git a/android/Omnivore/app/src/main/res/values-zh-rTW/strings.xml b/android/Omnivore/app/src/main/res/values-zh-rTW/strings.xml index 68a2166ec..0565c5155 100644 --- a/android/Omnivore/app/src/main/res/values-zh-rTW/strings.xml +++ b/android/Omnivore/app/src/main/res/values-zh-rTW/strings.xml @@ -204,6 +204,6 @@ 回饋 隱私政策 條款和條件 - 管理帳戶 + 管理帳戶 登出 diff --git a/android/Omnivore/app/src/main/res/values/strings.xml b/android/Omnivore/app/src/main/res/values/strings.xml index fdc6a479c..289c0a675 100644 --- a/android/Omnivore/app/src/main/res/values/strings.xml +++ b/android/Omnivore/app/src/main/res/values/strings.xml @@ -201,6 +201,9 @@ Confirm Cancel + + Hide following tab + Manage Account Reset Data Cache @@ -214,7 +217,9 @@ Feedback Privacy Policy Terms and Conditions - Manage Account + + Filters + Manage Account Logout