feat: implement episode spoiler protection - #112
Conversation
Adds a 'Hide Spoilers' toggle in Settings to blur/blackout unwatched episode thumbnails.
- Fixed duplicate declaration in SettingsViewModel\n- Restored autoPlaySingleSource in DetailsUiState\n- Fixed uiState reference out of scope in DetailsContent
|
Thanks for the PR. I tested the settings flow and also reviewed the implementation, and there are still a few issues that should be fixed before merge. 1.
|
|
Thanks for this PR — episode spoiler protection is a nice feature and CI is green. It cannot be merged yet, though, because of the issues @Himanth-reddy already raised on 2026-04-03. Posting them again so they're consolidated and easy to address: 1. 2. 3. Spoiler protection does not fully hide spoiler content 4. New preference isn't cloud-synced Once those four points are addressed this should be in good shape to merge. |
The movie budget line on the home hero banner makes the metadata row noisy, particularly on small screens where it pushes release date, runtime, and rating onto a second line. This adds a new Settings toggle (General > Show Budget on Home, default ON) so users who don't care about movie budgets can hide the field without losing the rest of the hero metadata. Scope of this feature was one of the multi-part requests in #72. Changes: - HomeUiState: new `showBudget: Boolean = true` field. - HomeViewModel.init: loads the new `_show_budget_on_home` key from DataStore alongside the existing trailer_auto_play load, with a default of true so existing users see no change until they explicitly disable it. - HomeScreen: wraps the existing "Budget $budgetText" Text (and its preceding `|` separator) in `if (uiState.showBudget && ...)`. No other visual changes. - SettingsUiState: new `showBudget: Boolean = true` field. - SettingsViewModel: new `showBudgetKey()` helper, loaded into UI state, and `setShowBudget(enabled)` mutator that persists + triggers cloud sync (matches the trailerAutoPlay pattern exactly). - SettingsScreen: new `SettingsToggleRow` for "Show Budget on Home" inserted at focusedIndex == 13 (immediately after "Skip Profile Selection" and before the Network section). DNS Provider shifted from focusedIndex == 13 to focusedIndex == 14, and the max-index clamp in BOTH the auto-scroll LaunchedEffect and the D-pad-down handler bumped from 13 to 14 so DNS Provider remains reachable via remote navigation. The Enter-handler switch now maps 13 -> setShowBudget and 14 -> openDnsProviderPicker. This is the recurring "settings row focus index" footgun that burned PRs #110 and #112 previously \u2014 I've updated both the dynamic max-index AND the scroll auto-scroll max AND the per-index action switch in the same commit. - CloudSyncRepository: adds `showBudget` to the `CloudProfileSettings` data class, `showBudgetKeyFor(profileId)` helper, and push/pull wiring so the setting syncs across devices via the existing account_sync_state snapshot path (the same plumbing that handles trailer_auto_play). Closes #72 (Show Budget part). The other two parts of #72 (auto-hide top bar, native debrid manager) are scoped separately as larger features and are not in this PR.
* feat: Show Budget on Home toggle in Settings (#72) The movie budget line on the home hero banner makes the metadata row noisy, particularly on small screens where it pushes release date, runtime, and rating onto a second line. This adds a new Settings toggle (General > Show Budget on Home, default ON) so users who don't care about movie budgets can hide the field without losing the rest of the hero metadata. Scope of this feature was one of the multi-part requests in #72. Changes: - HomeUiState: new `showBudget: Boolean = true` field. - HomeViewModel.init: loads the new `_show_budget_on_home` key from DataStore alongside the existing trailer_auto_play load, with a default of true so existing users see no change until they explicitly disable it. - HomeScreen: wraps the existing "Budget $budgetText" Text (and its preceding `|` separator) in `if (uiState.showBudget && ...)`. No other visual changes. - SettingsUiState: new `showBudget: Boolean = true` field. - SettingsViewModel: new `showBudgetKey()` helper, loaded into UI state, and `setShowBudget(enabled)` mutator that persists + triggers cloud sync (matches the trailerAutoPlay pattern exactly). - SettingsScreen: new `SettingsToggleRow` for "Show Budget on Home" inserted at focusedIndex == 13 (immediately after "Skip Profile Selection" and before the Network section). DNS Provider shifted from focusedIndex == 13 to focusedIndex == 14, and the max-index clamp in BOTH the auto-scroll LaunchedEffect and the D-pad-down handler bumped from 13 to 14 so DNS Provider remains reachable via remote navigation. The Enter-handler switch now maps 13 -> setShowBudget and 14 -> openDnsProviderPicker. This is the recurring "settings row focus index" footgun that burned PRs #110 and #112 previously \u2014 I've updated both the dynamic max-index AND the scroll auto-scroll max AND the per-index action switch in the same commit. - CloudSyncRepository: adds `showBudget` to the `CloudProfileSettings` data class, `showBudgetKeyFor(profileId)` helper, and push/pull wiring so the setting syncs across devices via the existing account_sync_state snapshot path (the same plumbing that handles trailer_auto_play). Closes #72 (Show Budget part). The other two parts of #72 (auto-hide top bar, native debrid manager) are scoped separately as larger features and are not in this PR. * fix: pass showBudget through to HeroSection composable (scope fix) * fix: thread showBudget through HomeHeroLayer too (second scope fix) --------- Co-authored-by: Arvin <arvin@arflix.local>
Adds a 'Hide Spoilers' toggle in Settings to blur/blackout unwatched episode thumbnails.