ref: reorganize settings page

This commit is contained in:
tapframe 2026-06-25 01:45:50 +05:30
parent d767f60d35
commit a2d3fda686
9 changed files with 74 additions and 90 deletions

View file

@ -436,7 +436,7 @@
<string name="compose_settings_root_account_section">ACCOUNT</string>
<string name="compose_settings_root_advanced_description">Startup and profile behavior.</string>
<string name="compose_settings_root_advanced_section">ADVANCED</string>
<string name="compose_settings_root_appearance_description">Home structure and poster styles</string>
<string name="compose_settings_root_appearance_description">Home, streams, collections, and detail pages</string>
<string name="compose_settings_root_check_updates_description">Download latest release</string>
<string name="compose_settings_root_check_updates_title">Check for updates</string>
<string name="compose_settings_root_content_discovery_description">Manage addons and discovery sources.</string>

View file

@ -20,9 +20,6 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.rounded.Language
import androidx.compose.material.icons.rounded.Style
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@ -50,8 +47,12 @@ import com.nuvio.app.core.ui.ThemeColors
import kotlinx.coroutines.launch
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.cd_selected
import nuvio.composeapp.generated.resources.collections_header
import nuvio.composeapp.generated.resources.compose_settings_page_continue_watching
import nuvio.composeapp.generated.resources.compose_settings_page_homescreen
import nuvio.composeapp.generated.resources.compose_settings_page_meta_screen
import nuvio.composeapp.generated.resources.compose_settings_page_poster_customization
import nuvio.composeapp.generated.resources.compose_settings_page_streams
import nuvio.composeapp.generated.resources.settings_appearance_app_language
import nuvio.composeapp.generated.resources.settings_appearance_app_language_sheet_title
import nuvio.composeapp.generated.resources.settings_appearance_amoled_black
@ -63,6 +64,10 @@ import nuvio.composeapp.generated.resources.settings_appearance_poster_customiza
import nuvio.composeapp.generated.resources.settings_appearance_section_display
import nuvio.composeapp.generated.resources.settings_appearance_section_home
import nuvio.composeapp.generated.resources.settings_appearance_section_theme
import nuvio.composeapp.generated.resources.settings_content_discovery_collections_description
import nuvio.composeapp.generated.resources.settings_content_discovery_homescreen_description
import nuvio.composeapp.generated.resources.settings_content_discovery_meta_screen_description
import nuvio.composeapp.generated.resources.compose_settings_root_streams_description
import org.jetbrains.compose.resources.StringResource
import org.jetbrains.compose.resources.stringResource
import androidx.compose.material3.ExperimentalMaterial3Api
@ -79,6 +84,10 @@ internal fun LazyListScope.appearanceSettingsContent(
onLiquidGlassNativeTabBarToggle: (Boolean) -> Unit,
selectedAppLanguage: AppLanguage,
onAppLanguageSelected: (AppLanguage) -> Unit,
onHomescreenClick: () -> Unit,
onMetaScreenClick: () -> Unit,
onStreamsClick: () -> Unit,
onCollectionsClick: () -> Unit,
onContinueWatchingClick: () -> Unit,
onPosterCustomizationClick: () -> Unit,
) {
@ -161,7 +170,6 @@ internal fun LazyListScope.appearanceSettingsContent(
SettingsNavigationRow(
title = stringResource(Res.string.settings_appearance_app_language),
description = stringResource(selectedAppLanguage.labelRes),
icon = Icons.Rounded.Language,
isTablet = isTablet,
onClick = { showLanguageSheet = true },
)
@ -186,10 +194,23 @@ internal fun LazyListScope.appearanceSettingsContent(
isTablet = isTablet,
) {
SettingsGroup(isTablet = isTablet) {
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_homescreen),
description = stringResource(Res.string.settings_content_discovery_homescreen_description),
isTablet = isTablet,
onClick = onHomescreenClick,
)
SettingsGroupDivider(isTablet = isTablet)
SettingsNavigationRow(
title = stringResource(Res.string.collections_header),
description = stringResource(Res.string.settings_content_discovery_collections_description),
isTablet = isTablet,
onClick = onCollectionsClick,
)
SettingsGroupDivider(isTablet = isTablet)
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_continue_watching),
description = stringResource(Res.string.settings_appearance_continue_watching_description),
icon = Icons.Rounded.Style,
isTablet = isTablet,
onClick = onContinueWatchingClick,
)
@ -197,13 +218,42 @@ internal fun LazyListScope.appearanceSettingsContent(
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_poster_customization),
description = stringResource(Res.string.settings_appearance_poster_customization_description),
icon = Icons.Rounded.Tune,
isTablet = isTablet,
onClick = onPosterCustomizationClick,
)
}
}
}
item {
SettingsSection(
title = stringResource(Res.string.compose_settings_page_streams),
isTablet = isTablet,
) {
SettingsGroup(isTablet = isTablet) {
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_streams),
description = stringResource(Res.string.compose_settings_root_streams_description),
isTablet = isTablet,
onClick = onStreamsClick,
)
}
}
}
item {
SettingsSection(
title = stringResource(Res.string.compose_settings_page_meta_screen),
isTablet = isTablet,
) {
SettingsGroup(isTablet = isTablet) {
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_meta_screen),
description = stringResource(Res.string.settings_content_discovery_meta_screen_description),
isTablet = isTablet,
onClick = onMetaScreenClick,
)
}
}
}
}
private data class AppLanguageSheetOption(

View file

@ -1,26 +1,13 @@
package com.nuvio.app.features.settings
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CollectionsBookmark
import androidx.compose.material.icons.rounded.Extension
import androidx.compose.material.icons.rounded.Home
import androidx.compose.material.icons.rounded.Hub
import androidx.compose.material.icons.rounded.Tune
import com.nuvio.app.core.build.AppFeaturePolicy
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.compose_settings_page_addons
import nuvio.composeapp.generated.resources.compose_settings_page_homescreen
import nuvio.composeapp.generated.resources.compose_settings_page_meta_screen
import nuvio.composeapp.generated.resources.compose_settings_page_plugins
import nuvio.composeapp.generated.resources.collections_header
import nuvio.composeapp.generated.resources.settings_content_discovery_addons_description
import nuvio.composeapp.generated.resources.settings_content_discovery_addons_description_appstore
import nuvio.composeapp.generated.resources.settings_content_discovery_collections_description
import nuvio.composeapp.generated.resources.settings_content_discovery_homescreen_description
import nuvio.composeapp.generated.resources.settings_content_discovery_meta_screen_description
import nuvio.composeapp.generated.resources.settings_content_discovery_plugins_description
import nuvio.composeapp.generated.resources.settings_content_discovery_section_home
import nuvio.composeapp.generated.resources.settings_content_discovery_section_sources
import org.jetbrains.compose.resources.stringResource
@ -29,9 +16,6 @@ internal fun LazyListScope.contentDiscoveryContent(
showPluginsEntry: Boolean,
onAddonsClick: () -> Unit,
onPluginsClick: () -> Unit,
onHomescreenClick: () -> Unit,
onMetaScreenClick: () -> Unit,
onCollectionsClick: () -> Unit = {},
) {
item {
SettingsSection(
@ -48,7 +32,6 @@ internal fun LazyListScope.contentDiscoveryContent(
Res.string.settings_content_discovery_addons_description
},
),
icon = Icons.Rounded.Extension,
isTablet = isTablet,
onClick = onAddonsClick,
)
@ -56,7 +39,6 @@ internal fun LazyListScope.contentDiscoveryContent(
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_plugins),
description = stringResource(Res.string.settings_content_discovery_plugins_description),
icon = Icons.Rounded.Hub,
isTablet = isTablet,
onClick = onPluginsClick,
)
@ -64,34 +46,4 @@ internal fun LazyListScope.contentDiscoveryContent(
}
}
}
item {
SettingsSection(
title = stringResource(Res.string.settings_content_discovery_section_home),
isTablet = isTablet,
) {
SettingsGroup(isTablet = isTablet) {
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_homescreen),
description = stringResource(Res.string.settings_content_discovery_homescreen_description),
icon = Icons.Rounded.Home,
isTablet = isTablet,
onClick = onHomescreenClick,
)
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_meta_screen),
description = stringResource(Res.string.settings_content_discovery_meta_screen_description),
icon = Icons.Rounded.Tune,
isTablet = isTablet,
onClick = onMetaScreenClick,
)
SettingsNavigationRow(
title = stringResource(Res.string.collections_header),
description = stringResource(Res.string.settings_content_discovery_collections_description),
icon = Icons.Rounded.CollectionsBookmark,
isTablet = isTablet,
onClick = onCollectionsClick,
)
}
}
}
}

View file

@ -1,7 +1,5 @@
package com.nuvio.app.features.settings
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CloudQueue
import androidx.compose.foundation.lazy.LazyListScope
import nuvio.composeapp.generated.resources.compose_settings_page_debrid
import nuvio.composeapp.generated.resources.Res
@ -44,7 +42,6 @@ internal fun LazyListScope.integrationsContent(
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_debrid),
description = stringResource(Res.string.settings_integrations_debrid_description),
icon = Icons.Rounded.CloudQueue,
isTablet = isTablet,
onClick = onDebridClick,
)

View file

@ -74,16 +74,16 @@ internal enum class SettingsPage(
category = SettingsCategory.General,
parentPage = Root,
),
Streams(
titleRes = Res.string.compose_settings_page_streams,
category = SettingsCategory.General,
parentPage = Root,
),
Appearance(
titleRes = Res.string.compose_settings_page_appearance,
category = SettingsCategory.General,
parentPage = Root,
),
Streams(
titleRes = Res.string.compose_settings_page_streams,
category = SettingsCategory.General,
parentPage = Appearance,
),
Advanced(
titleRes = Res.string.compose_settings_page_advanced,
category = SettingsCategory.Advanced,
@ -122,12 +122,12 @@ internal enum class SettingsPage(
Homescreen(
titleRes = Res.string.compose_settings_page_homescreen,
category = SettingsCategory.General,
parentPage = ContentDiscovery,
parentPage = Appearance,
),
MetaScreen(
titleRes = Res.string.compose_settings_page_meta_screen,
category = SettingsCategory.General,
parentPage = ContentDiscovery,
parentPage = Appearance,
),
Integrations(
titleRes = Res.string.compose_settings_page_integrations,

View file

@ -14,7 +14,6 @@ import androidx.compose.material.icons.rounded.Notifications
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material.icons.rounded.People
import androidx.compose.material.icons.rounded.PlayArrow
import androidx.compose.material.icons.rounded.Style
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@ -32,7 +31,6 @@ import nuvio.composeapp.generated.resources.compose_settings_page_integrations
import nuvio.composeapp.generated.resources.compose_settings_page_licenses_attributions
import nuvio.composeapp.generated.resources.compose_settings_page_notifications
import nuvio.composeapp.generated.resources.compose_settings_page_playback
import nuvio.composeapp.generated.resources.compose_settings_page_streams
import nuvio.composeapp.generated.resources.compose_settings_page_supporters_contributors
import nuvio.composeapp.generated.resources.compose_settings_root_account_description
import nuvio.composeapp.generated.resources.compose_settings_root_appearance_description
@ -44,7 +42,6 @@ import nuvio.composeapp.generated.resources.compose_settings_root_downloads_titl
import nuvio.composeapp.generated.resources.compose_settings_root_general_section
import nuvio.composeapp.generated.resources.compose_settings_root_integrations_description
import nuvio.composeapp.generated.resources.compose_settings_root_notifications_description
import nuvio.composeapp.generated.resources.compose_settings_root_streams_description
import nuvio.composeapp.generated.resources.compose_settings_root_switch_profile_description
import nuvio.composeapp.generated.resources.compose_settings_root_switch_profile_title
import nuvio.composeapp.generated.resources.compose_settings_root_trakt_description
@ -62,7 +59,6 @@ import org.jetbrains.compose.resources.stringResource
internal fun LazyListScope.settingsRootContent(
isTablet: Boolean,
onPlaybackClick: () -> Unit,
onStreamsClick: () -> Unit,
onAppearanceClick: () -> Unit,
onAdvancedClick: () -> Unit,
onNotificationsClick: () -> Unit,
@ -156,14 +152,6 @@ internal fun LazyListScope.settingsRootContent(
onClick = onPlaybackClick,
)
SettingsGroupDivider(isTablet = isTablet)
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_streams),
description = stringResource(Res.string.compose_settings_root_streams_description),
icon = Icons.Rounded.Style,
isTablet = isTablet,
onClick = onStreamsClick,
)
SettingsGroupDivider(isTablet = isTablet)
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_integrations),
description = stringResource(Res.string.compose_settings_root_integrations_description),

View file

@ -545,7 +545,6 @@ private fun MobileSettingsScreen(
settingsRootContent(
isTablet = false,
onPlaybackClick = { onPageChange(SettingsPage.Playback) },
onStreamsClick = { onPageChange(SettingsPage.Streams) },
onAppearanceClick = { onPageChange(SettingsPage.Appearance) },
onAdvancedClick = { onPageChange(SettingsPage.Advanced) },
onNotificationsClick = { onPageChange(SettingsPage.Notifications) },
@ -609,6 +608,10 @@ private fun MobileSettingsScreen(
onLiquidGlassNativeTabBarToggle = onLiquidGlassNativeTabBarToggle,
selectedAppLanguage = selectedAppLanguage,
onAppLanguageSelected = onAppLanguageSelected,
onHomescreenClick = onHomescreenClick,
onMetaScreenClick = onMetaScreenClick,
onStreamsClick = { onPageChange(SettingsPage.Streams) },
onCollectionsClick = onCollectionsClick,
onContinueWatchingClick = onContinueWatchingClick,
onPosterCustomizationClick = { onPageChange(SettingsPage.PosterCustomization) },
)
@ -640,9 +643,6 @@ private fun MobileSettingsScreen(
showPluginsEntry = AppFeaturePolicy.pluginsEnabled,
onAddonsClick = onAddonsClick,
onPluginsClick = onPluginsClick,
onHomescreenClick = onHomescreenClick,
onMetaScreenClick = onMetaScreenClick,
onCollectionsClick = onCollectionsClick,
)
SettingsPage.Addons -> addonsSettingsContent()
SettingsPage.Plugins -> if (AppFeaturePolicy.pluginsEnabled) pluginsSettingsContent() else addonsSettingsContent()
@ -944,7 +944,6 @@ private fun TabletSettingsScreen(
settingsRootContent(
isTablet = true,
onPlaybackClick = { openInlinePage(SettingsPage.Playback) },
onStreamsClick = { openInlinePage(SettingsPage.Streams) },
onAppearanceClick = { openInlinePage(SettingsPage.Appearance) },
onAdvancedClick = { openInlinePage(SettingsPage.Advanced) },
onNotificationsClick = { openInlinePage(SettingsPage.Notifications) },
@ -1012,6 +1011,10 @@ private fun TabletSettingsScreen(
onLiquidGlassNativeTabBarToggle = onLiquidGlassNativeTabBarToggle,
selectedAppLanguage = selectedAppLanguage,
onAppLanguageSelected = onAppLanguageSelected,
onHomescreenClick = { openInlinePage(SettingsPage.Homescreen) },
onMetaScreenClick = { openInlinePage(SettingsPage.MetaScreen) },
onStreamsClick = { openInlinePage(SettingsPage.Streams) },
onCollectionsClick = onCollectionsClick,
onContinueWatchingClick = { openInlinePage(SettingsPage.ContinueWatching) },
onPosterCustomizationClick = { openInlinePage(SettingsPage.PosterCustomization) },
)
@ -1043,9 +1046,6 @@ private fun TabletSettingsScreen(
showPluginsEntry = AppFeaturePolicy.pluginsEnabled,
onAddonsClick = { openInlinePage(SettingsPage.Addons) },
onPluginsClick = { openInlinePage(SettingsPage.Plugins) },
onHomescreenClick = { openInlinePage(SettingsPage.Homescreen) },
onMetaScreenClick = { openInlinePage(SettingsPage.MetaScreen) },
onCollectionsClick = onCollectionsClick,
)
SettingsPage.Addons -> addonsSettingsContent()
SettingsPage.Plugins -> if (AppFeaturePolicy.pluginsEnabled) pluginsSettingsContent() else addonsSettingsContent()

View file

@ -471,8 +471,8 @@ internal fun settingsSearchEntries(
key = "collections",
title = collectionsPage,
description = stringResource(Res.string.settings_content_discovery_collections_description),
page = contentDiscoveryPage,
section = stringResource(Res.string.settings_content_discovery_section_home),
page = layoutPage,
section = stringResource(Res.string.settings_appearance_section_home),
category = generalCategory,
icon = Icons.Rounded.CollectionsBookmark,
target = SettingsSearchTarget.Collections,

View file

@ -18,7 +18,6 @@ import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.Style
import androidx.compose.material.icons.rounded.Visibility
import androidx.compose.material3.BasicAlertDialog
import androidx.compose.material3.Button
@ -118,14 +117,12 @@ internal fun LazyListScope.streamsSettingsContent(isTablet: Boolean) {
SettingsNavigationRow(
title = stringResource(Res.string.settings_stream_badge_position_title),
description = badgePlacementLabel,
icon = Icons.Rounded.Style,
isTablet = isTablet,
onClick = { showBadgePositionDialog = true },
)
SettingsNavigationRow(
title = stringResource(Res.string.settings_stream_badge_urls_title),
description = badgeRulesPreview(currentRules),
icon = Icons.Rounded.Style,
isTablet = isTablet,
onClick = { showBadgeImportDialog = true },
)