diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 1a1be3b2..d19820e7 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -5,6 +5,7 @@ class SettingsProvider extends ChangeNotifier { late SettingsService _settingsService; LibraryDensity _libraryDensity = LibraryDensity.normal; bool _useSeasonPoster = false; + bool _showHeroSection = true; SettingsProvider() { _initializeSettings(); @@ -14,11 +15,13 @@ class SettingsProvider extends ChangeNotifier { _settingsService = await SettingsService.getInstance(); _libraryDensity = _settingsService.getLibraryDensity(); _useSeasonPoster = _settingsService.getUseSeasonPoster(); + _showHeroSection = _settingsService.getShowHeroSection(); notifyListeners(); } LibraryDensity get libraryDensity => _libraryDensity; bool get useSeasonPoster => _useSeasonPoster; + bool get showHeroSection => _showHeroSection; Future setLibraryDensity(LibraryDensity density) async { if (_libraryDensity != density) { @@ -36,6 +39,14 @@ class SettingsProvider extends ChangeNotifier { } } + Future setShowHeroSection(bool value) async { + if (_showHeroSection != value) { + _showHeroSection = value; + await _settingsService.setShowHeroSection(value); + notifyListeners(); + } + } + String get libraryDensityDisplayName { switch (_libraryDensity) { case LibraryDensity.compact: diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index 9cd7f601..4d7d11cc 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -16,6 +16,7 @@ import 'profile_switch_screen.dart'; import 'server_selection_screen.dart'; import 'hub_detail_screen.dart'; import '../providers/user_profile_provider.dart'; +import '../providers/settings_provider.dart'; import '../mixins/refreshable.dart'; import '../mixins/item_updatable.dart'; import '../utils/app_logger.dart'; @@ -559,7 +560,14 @@ class _DiscoverScreenState extends State ), if (!_isLoading && _errorMessage == null) ...[ // Hero Section (Continue Watching) - if (_onDeck.isNotEmpty) _buildHeroSection(), + Consumer( + builder: (context, settingsProvider, child) { + if (_onDeck.isNotEmpty && settingsProvider.showHeroSection) { + return _buildHeroSection(); + } + return const SliverToBoxAdapter(child: SizedBox.shrink()); + }, + ), // On Deck / Continue Watching if (_onDeck.isNotEmpty) ...[ diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 062aa633..08f1fb24 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -53,7 +53,6 @@ class _SettingsScreenState extends State { }); } - @override Widget build(BuildContext context) { if (_isLoading) { @@ -141,6 +140,21 @@ class _SettingsScreenState extends State { ); }, ), + Consumer( + builder: (context, settingsProvider, child) { + return SwitchListTile( + secondary: const Icon(Icons.featured_play_list), + title: const Text('Show Hero Section'), + subtitle: const Text( + 'Display featured content carousel on home screen', + ), + value: settingsProvider.showHeroSection, + onChanged: (value) async { + await settingsProvider.setShowHeroSection(value); + }, + ); + }, + ), ], ), ); @@ -280,10 +294,9 @@ class _SettingsScreenState extends State { padding: const EdgeInsets.all(16), child: Text( 'Updates', - style: Theme.of(context) - .textTheme - .titleMedium - ?.copyWith(fontWeight: FontWeight.bold), + style: Theme.of( + context, + ).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), ), ), ListTile( @@ -291,9 +304,7 @@ class _SettingsScreenState extends State { hasUpdate ? Icons.system_update : Icons.check_circle, color: hasUpdate ? Colors.orange : null, ), - title: Text( - hasUpdate ? 'Update Available' : 'Check for Updates', - ), + title: Text(hasUpdate ? 'Update Available' : 'Check for Updates'), subtitle: hasUpdate ? Text('Version ${_updateInfo!['latestVersion']} is available') : const Text('Check for the latest version on GitHub'), diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index c8cfb022..f491f781 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -21,6 +21,7 @@ class SettingsService { static const String _keySeekTimeSmall = 'seek_time_small'; static const String _keySeekTimeLarge = 'seek_time_large'; static const String _keyMediaVersionPreferences = 'media_version_preferences'; + static const String _keyShowHeroSection = 'show_hero_section'; static SettingsService? _instance; late SharedPreferences _prefs; @@ -117,7 +118,18 @@ class SettingsService { } bool getUseSeasonPoster() { - return _prefs.getBool(_keyUseSeasonPoster) ?? false; // Default: false (use series poster) + return _prefs.getBool(_keyUseSeasonPoster) ?? + false; // Default: false (use series poster) + } + + // Show Hero Section + Future setShowHeroSection(bool enabled) async { + await _prefs.setBool(_keyShowHeroSection, enabled); + } + + bool getShowHeroSection() { + return _prefs.getBool(_keyShowHeroSection) ?? + true; // Default: true (show hero section) } // Seek Time Small (in seconds) @@ -593,7 +605,10 @@ class SettingsService { /// Save media version preference for a series /// [seriesRatingKey] is the grandparentRatingKey for TV series, or ratingKey for movies /// [mediaIndex] is the index of the selected media version - Future setMediaVersionPreference(String seriesRatingKey, int mediaIndex) async { + Future setMediaVersionPreference( + String seriesRatingKey, + int mediaIndex, + ) async { final preferences = _getMediaVersionPreferences(); preferences[seriesRatingKey] = mediaIndex; @@ -643,6 +658,7 @@ class SettingsService { _prefs.remove(_keyPreferredAudioCodec), _prefs.remove(_keyLibraryDensity), _prefs.remove(_keyUseSeasonPoster), + _prefs.remove(_keyShowHeroSection), _prefs.remove(_keySeekTimeSmall), _prefs.remove(_keySeekTimeLarge), _prefs.remove(_keyMediaVersionPreferences),