feat(ui): extend ROYGBIV accent color to all button/chip focus states#227
Conversation
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Renames the "Focus Border Color" setting to "Accent Color" and broadens its application from just D-pad focus rings to also include buttons and selected items (e.g., sidebar, top bar, action buttons, group rail items).
Changes:
- Rename
FOCUS_BORDER_COLOR_KEY/focusBorderColor*symbols, strings, and APIs toACCENT_COLOR_KEY/accentColor*. - Apply the accent color to additional UI surfaces (sidebar selected icon, top bar nav/settings icons, premium action buttons, catalog action chips, group rail item background).
- Update settings UI and view model to expose the renamed accent color setting.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated 25 comments.
Show a summary per file
| File | Description |
|---|---|
| app/src/main/res/values/strings.xml | Rename strings to accent color. |
| app/src/main/kotlin/com/arflix/tv/util/DeviceType.kt | Rename preferences key. |
| app/src/main/kotlin/com/arflix/tv/ui/theme/Theme.kt | Rename theme parameter and composition local. |
| app/src/main/kotlin/com/arflix/tv/ui/skin/ArvioSkin.kt | Rename override local, resolver, and color name mapper. |
| app/src/main/kotlin/com/arflix/tv/ui/skin/ArvioFocus.kt | Use renamed accent override. |
| app/src/main/kotlin/com/arflix/tv/ui/screens/tv/TvScreen.kt | Apply accent to focused group rail item background. |
| app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsViewModel.kt | Rename state and persistence; non-ASCII content corrupted. |
| app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsScreen.kt | Wire UI to renamed APIs; non-ASCII content corrupted. |
| app/src/main/kotlin/com/arflix/tv/ui/screens/search/SearchScreen.kt | Use renamed accent resolver; non-ASCII corrupted. |
| app/src/main/kotlin/com/arflix/tv/ui/screens/player/PlayerScreen.kt | Use renamed override local; non-ASCII corrupted. |
| app/src/main/kotlin/com/arflix/tv/ui/screens/details/DetailsScreen.kt | Apply accent to PremiumActionButton; non-ASCII corrupted. |
| app/src/main/kotlin/com/arflix/tv/ui/components/Sidebar.kt | Apply accent to selected sidebar icon. |
| app/src/main/kotlin/com/arflix/tv/ui/components/PersonModal.kt | Use renamed accent resolver. |
| app/src/main/kotlin/com/arflix/tv/ui/components/AppTopBar.kt | Apply accent to selected top bar items; non-ASCII corrupted. |
| app/src/main/kotlin/com/arflix/tv/MainActivity.kt | Read renamed pref and pass to theme. |
Comments suppressed due to low confidence (1)
app/src/main/kotlin/com/arflix/tv/ui/screens/details/DetailsScreen.kt:1
- Mojibake in
episodeCode(andMobileMetadataSeparatorlooks intact in the diff but the file has BOM/other corruptions). The episode code rendered to the user will readS1 • E01. Restore the bullet character.
package com.arflix.tv.ui.screens.details
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| _uiState.value = _uiState.value.copy( | ||
| isForceCloudSyncing = false, | ||
| toastMessage = "Cloud sync upload timed out — try again", | ||
| toastMessage = "Cloud sync upload timed out — try again", |
| com.arflix.tv.ui.screens.player.SubtitleAiModel.GROQ_LLAMA_70B -> "Groq – Llama 3.3 70B" | ||
| com.arflix.tv.ui.screens.player.SubtitleAiModel.GEMINI_FLASH_25 -> "Google – Gemini 2.5 Flash" |
| trimmed.startsWith("gsk_") -> "Groq · " | ||
| trimmed.startsWith("AIzaSy") -> "Gemini · " | ||
| else -> "" | ||
| } | ||
| val masked = if (trimmed.length <= 4) "••••" else "••••${trimmed.takeLast(4)}" | ||
| val masked = if (trimmed.length <= 4) "••••" else "••••${trimmed.takeLast(4)}" |
| Spacer(modifier = Modifier.height(16.dp)) | ||
| Text( | ||
| text = "Press Enter to select • Navigate with D-pad", | ||
| text = "Press Enter to select • Navigate with D-pad", |
| <string name="accent_color">Accent Color</string> | ||
| <string name="accent_color_desc">Choose the accent color for focus rings, buttons, and selected items</string> |
| /** Key for the user-selected accent colour (e.g. "White", "Red", "Blue") */ | ||
| val ACCENT_COLOR_KEY = stringPreferencesKey("accent_color") |
| @@ -1056,16 +1056,16 @@ class SettingsViewModel @Inject constructor( | |||
|
|
|||
| /** | |||
| * Cycle the focus border color through the rainbow palette. | |||
| else -> TextSecondary | ||
| } | ||
| val accentColor = resolveFocusBorderColor(fallback = Pink) | ||
| val accentColor = resolveAccentColor(fallback = Pink) |
| } | ||
|
|
||
| // ── AI Subtitles ────────────────────────────────────────────────────────── | ||
| // ── AI Subtitles ────────────────────────────────────────────────────────── |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…import, add DataStore key migration
|
Good feature direction, but I would not merge this yet. It merges cleanly and compile passes, but there are a few UI issues to fix first:
After those are fixed, I think this can be a nice polish feature. |
|
@ProdigyV21 do you mind checking this now? |
|
I verified against latest main:
A few things still need cleanup before merge:
|
|
Done @ProdigyV21 |



Title: Extend ROYGBIV Accent Color to Button Focus States & Rename Setting
Summary
Extends the user-configurable ROYGBIV accent colour (from Settings → Appearance → Accent Color) beyond focus border highlights to include full button/chip focus backgrounds and selected text/icon colours. Also renames the setting from "Focus Border Color" → "Accent Color" to reflect its expanded role.
Changes
ROYGBIV Accent Extension (6 Composables)
DetailsScreen.kt:3120SettingsScreen.kt:6880TvScreen.kt:1500AppTopBar.kt:196AppTopBar.kt:275Sidebar.kt:215Design decisions:
isSelectedtext/icon gets the accent colour;isFocusedremains white. Background chips/rings are unchanged (keeps the subtle transparent ring).Rename: "Focus Border Color" → "Accent Color"
Since the colour now affects borders, backgrounds, and text, the old name was misleading.
LocalFocusBorderColorOverrideLocalAccentColorOverrideArvioSkin.kt,ArvioFocus.kt,PlayerScreen.ktresolveFocusBorderColor()resolveAccentColor()focusBorderColorFromName()accentColorFromName()ArvioSkin.kt,Theme.ktFOCUS_BORDER_COLOR_KEYACCENT_COLOR_KEYDeviceType.kt,MainActivity.kt,SettingsViewModel.kt"focus_border_color"(DataStore)"accent_color"DeviceType.ktR.string.focus_border_colorR.string.accent_colorstrings.xml,SettingsScreen.kt"Focus Border Color"(label)"Accent Color"strings.xml"Choose the D-pad focus ring color""Choose the accent color for focus rings, buttons, and selected items"strings.xmlSettingsUiState.focusBorderColorSettingsUiState.accentColorSettingsViewModel.ktcycleFocusBorderColor()cycleAccentColor()SettingsViewModel.kt,SettingsScreen.ktFiles Changed (15)
app/src/main/res/values/strings.xmlapp/src/main/kotlin/com/arflix/tv/util/DeviceType.ktapp/src/main/kotlin/com/arflix/tv/ui/skin/ArvioSkin.ktapp/src/main/kotlin/com/arflix/tv/ui/skin/ArvioFocus.ktapp/src/main/kotlin/com/arflix/tv/ui/theme/Theme.ktapp/src/main/kotlin/com/arflix/tv/MainActivity.ktapp/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsViewModel.ktapp/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsScreen.ktapp/src/main/kotlin/com/arflix/tv/ui/components/AppTopBar.ktapp/src/main/kotlin/com/arflix/tv/ui/components/Sidebar.ktapp/src/main/kotlin/com/arflix/tv/ui/screens/details/DetailsScreen.ktapp/src/main/kotlin/com/arflix/tv/ui/screens/tv/TvScreen.ktapp/src/main/kotlin/com/arflix/tv/ui/screens/search/SearchScreen.ktapp/src/main/kotlin/com/arflix/tv/ui/components/PersonModal.ktapp/src/main/kotlin/com/arflix/tv/ui/screens/player/PlayerScreen.ktTesting Notes
"focus_border_color"migrates cleanly — users who previously set a colour will need to re-select it under the new"accent_color"key