diff --git a/lib/providers/ThemeProvider.dart b/lib/providers/ThemeProvider.dart index 9f78521..c9a7b30 100644 --- a/lib/providers/ThemeProvider.dart +++ b/lib/providers/ThemeProvider.dart @@ -1,8 +1,18 @@ import 'package:flutter/material.dart'; - import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +final Map themeMap = { + 'f0ck': f0ckTheme, + 'P1nk': p1nkTheme, // done + 'Orange': orangeTheme, + 'Amoled': amoledTheme, + 'Paper': paperTheme, + //'Iced': icedTheme, + 'f0ck95': f0ck95Theme, + 'f0ck95d': f0ck95dTheme, +}; + class ThemeNotifier extends StateNotifier { final FlutterSecureStorage secureStorage; @@ -11,23 +21,24 @@ class ThemeNotifier extends StateNotifier { } Future _loadTheme() async { - String? savedThemeName = await secureStorage.read(key: 'theme'); - if (savedThemeName != null) { - final customTheme = themes.firstWhere( - (t) => t.name == savedThemeName, - orElse: () => CustomTheme(name: 'f0ck', theme: f0ckTheme), - ); - state = customTheme.theme; + try { + String? savedThemeName = await secureStorage.read(key: 'theme'); + if (savedThemeName != null && themeMap.containsKey(savedThemeName)) { + state = themeMap[savedThemeName]!; + } + } catch (error) { + debugPrint('Fehler beim Laden des Themes: $error'); + state = f0ckTheme; } } Future updateTheme(String themeName) async { - await secureStorage.write(key: 'theme', value: themeName); - final newTheme = themes.firstWhere( - (t) => t.name == themeName, - orElse: () => CustomTheme(name: 'f0ck', theme: f0ckTheme), - ); - state = newTheme.theme; + try { + await secureStorage.write(key: 'theme', value: themeName); + state = themeMap[themeName] ?? f0ckTheme; + } catch (error) { + debugPrint('Fehler beim Aktualisieren des Themes: $error'); + } } } @@ -35,28 +46,12 @@ final themeNotifierProvider = StateNotifierProvider(( ref, ) { return ThemeNotifier( - secureStorage: FlutterSecureStorage( + secureStorage: const FlutterSecureStorage( aOptions: AndroidOptions(encryptedSharedPreferences: true), ), ); }); -class CustomTheme { - final String name; - final ThemeData theme; - - CustomTheme({required this.name, required this.theme}); -} - -final List themes = [ - CustomTheme(name: 'f0ck', theme: f0ckTheme), - CustomTheme(name: 'Paper', theme: paperTheme), - CustomTheme(name: 'Orange', theme: orangeTheme), - CustomTheme(name: 'Amoled', theme: amoledTheme), - CustomTheme(name: 'f0ck95', theme: f0ck95Theme), - CustomTheme(name: 'f0ck95d', theme: f0ck95dTheme), -]; - final ThemeData f0ckTheme = ThemeData( brightness: Brightness.dark, primaryColor: const Color(0xFF9FFF00), @@ -78,13 +73,53 @@ final ThemeData f0ckTheme = ThemeData( bodyLarge: TextStyle(color: Colors.white), bodyMedium: TextStyle(color: Colors.white), ), - buttonTheme: ButtonThemeData( - buttonColor: const Color(0xFF9FFF00), - textTheme: ButtonTextTheme.primary, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: const Color(0xFF000000), + backgroundColor: const Color(0xFF9FFF00), + ), ), scrollbarTheme: ScrollbarThemeData( - thumbColor: WidgetStatePropertyAll(Color(0xFF2B2B2B)), - trackColor: WidgetStatePropertyAll(Color(0xFF424242)), + thumbColor: WidgetStateProperty.all(const Color(0xFF2B2B2B)), + trackColor: WidgetStateProperty.all(const Color(0xFF424242)), + ), +); + +final ThemeData p1nkTheme = ThemeData( + brightness: Brightness.dark, + primaryColor: const Color(0xFF171717), + scaffoldBackgroundColor: const Color(0xFF171717), + appBarTheme: const AppBarTheme( + color: Color(0xFF2B2B2B), + foregroundColor: Color(0xFFFF00D0), + elevation: 2, + ), + textTheme: const TextTheme( + bodyLarge: TextStyle(color: Color(0xFFFFFFFF)), + bodyMedium: TextStyle(color: Color(0xFFFFFFFF)), + titleLarge: TextStyle(color: Color(0xFFFFFFFF)), + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: const Color(0xFF000000), + backgroundColor: const Color(0xFFFF00D0), + ), + ), + progressIndicatorTheme: const ProgressIndicatorThemeData( + color: Color(0xFFFF00D0), + ), + scrollbarTheme: ScrollbarThemeData( + thumbColor: WidgetStateProperty.all(const Color(0xFF2B2B2B)), + trackColor: WidgetStateProperty.all(const Color(0xFF424242)), + ), + colorScheme: const ColorScheme.dark( + primary: Color(0xFF171717), + secondary: Color(0xFFFF00D0), + surface: Color(0xFF171717), + onPrimary: Color(0xFFFFFFFF), + onSecondary: Color(0xFF000000), + onSurface: Color(0xFFFFFFFF), + error: Color(0xFFA72828), ), ); @@ -109,9 +144,11 @@ final ThemeData paperTheme = ThemeData( bodyLarge: TextStyle(color: Color(0xFF000000)), bodyMedium: TextStyle(color: Color(0xFF000000)), ), - buttonTheme: ButtonThemeData( - buttonColor: const Color(0xFF000000), - textTheme: ButtonTextTheme.primary, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: const Color(0xFFFFFFFF), + backgroundColor: const Color(0xFF000000), + ), ), ); @@ -136,13 +173,15 @@ final ThemeData orangeTheme = ThemeData( bodyLarge: TextStyle(color: Colors.white), bodyMedium: TextStyle(color: Colors.white), ), - buttonTheme: ButtonThemeData( - buttonColor: const Color(0xFFFF6F00), - textTheme: ButtonTextTheme.primary, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + backgroundColor: const Color(0xFFFF6F00), + ), ), scrollbarTheme: ScrollbarThemeData( - thumbColor: WidgetStatePropertyAll(Color(0xFF2B2B2B)), - trackColor: WidgetStatePropertyAll(Color(0xFF424242)), + thumbColor: WidgetStateProperty.all(const Color(0xFF2B2B2B)), + trackColor: WidgetStateProperty.all(const Color(0xFF424242)), ), ); @@ -169,9 +208,11 @@ final ThemeData amoledTheme = ThemeData( bodyLarge: TextStyle(color: Colors.white), bodyMedium: TextStyle(color: Colors.white), ), - buttonTheme: ButtonThemeData( - buttonColor: const Color(0xFFFFFFFF), - textTheme: ButtonTextTheme.primary, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: const Color(0xFFFFFFFF), + ), ), scrollbarTheme: ScrollbarThemeData( thumbColor: WidgetStateProperty.all(const Color(0xFF1D1C1C)), @@ -199,13 +240,15 @@ final ThemeData f0ck95Theme = ThemeData( bodyLarge: TextStyle(color: Colors.black), bodyMedium: TextStyle(color: Colors.black), ), - buttonTheme: ButtonThemeData( - buttonColor: Colors.black, - textTheme: ButtonTextTheme.primary, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + backgroundColor: Colors.black, + ), ), scrollbarTheme: ScrollbarThemeData( - thumbColor: WidgetStatePropertyAll(Color(0xFF2B2B2B)), - trackColor: WidgetStatePropertyAll(Color(0xFF424242)), + thumbColor: WidgetStateProperty.all(const Color(0xFF2B2B2B)), + trackColor: WidgetStateProperty.all(const Color(0xFF424242)), ), ); @@ -229,12 +272,14 @@ final ThemeData f0ck95dTheme = ThemeData( bodyLarge: TextStyle(color: Colors.white), bodyMedium: TextStyle(color: Colors.white), ), - buttonTheme: ButtonThemeData( - buttonColor: Colors.white, - textTheme: ButtonTextTheme.primary, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Colors.white, + ), ), scrollbarTheme: ScrollbarThemeData( - thumbColor: WidgetStatePropertyAll(Color(0xFF2B2B2B)), - trackColor: WidgetStatePropertyAll(Color(0xFF424242)), + thumbColor: WidgetStateProperty.all(const Color(0xFF2B2B2B)), + trackColor: WidgetStateProperty.all(const Color(0xFF424242)), ), ); diff --git a/lib/screens/DetailView.dart b/lib/screens/DetailView.dart index 980f243..5f2ec5d 100644 --- a/lib/screens/DetailView.dart +++ b/lib/screens/DetailView.dart @@ -48,16 +48,13 @@ class _DetailViewState extends ConsumerState { void _preloadAdjacentMedia(int index) async { final mediaState = ref.read(mediaProvider); - if (index + 1 < mediaState.mediaItems.length) { - final nextUrl = mediaState.mediaItems[index + 1].mediaUrl; - if (await DefaultCacheManager().getFileFromCache(nextUrl) == null) { - await DefaultCacheManager().downloadFile(nextUrl); - } - } - if (index - 1 >= 0) { - final prevUrl = mediaState.mediaItems[index - 1].mediaUrl; - if (await DefaultCacheManager().getFileFromCache(prevUrl) == null) { - await DefaultCacheManager().downloadFile(prevUrl); + for (int offset in [-1, 1]) { + final adjacentIndex = index + offset; + if (adjacentIndex >= 0 && adjacentIndex < mediaState.mediaItems.length) { + final url = mediaState.mediaItems[adjacentIndex].mediaUrl; + if (await DefaultCacheManager().getFileFromCache(url) == null) { + await DefaultCacheManager().downloadFile(url); + } } } } diff --git a/lib/screens/MediaGrid.dart b/lib/screens/MediaGrid.dart index ea5ba9f..ff8e579 100644 --- a/lib/screens/MediaGrid.dart +++ b/lib/screens/MediaGrid.dart @@ -208,17 +208,19 @@ class _MediaGridState extends ConsumerState { Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( - children: themes.map((themeData) { + children: themeMap.entries.map((entry) { + final themeName = entry.key; + final themeData = entry.value; final currentTheme = ref.watch(themeNotifierProvider); - final isSelected = currentTheme == themeData.theme; + final isSelected = currentTheme == themeData; return ListTile( - title: Text(themeData.name), + title: Text(themeName), selected: isSelected, selectedTileColor: Colors.blue.withValues(alpha: 0.2), onTap: () async { await ref .read(themeNotifierProvider.notifier) - .updateTheme(themeData.name); + .updateTheme(themeName); }, ); }).toList(), @@ -226,7 +228,6 @@ class _MediaGridState extends ConsumerState { ), ], ), - ListTile( title: Text('v${AppVersion.version}'), onTap: () { diff --git a/lib/widgets/VideoOverlay.dart b/lib/widgets/VideoOverlay.dart index 4c02751..50af43b 100644 --- a/lib/widgets/VideoOverlay.dart +++ b/lib/widgets/VideoOverlay.dart @@ -89,7 +89,6 @@ class VideoControlsOverlay extends ConsumerWidget { bottom: 12, child: Text( '${_formatDuration(controller.value.position)} / ${_formatDuration(controller.value.duration)}', - style: TextStyle(color: Colors.white), ), ), Listener( @@ -153,7 +152,7 @@ class _ControlButton extends StatelessWidget { color: Colors.black.withValues(alpha: 0.4), ), child: IconButton( - icon: Icon(icon, color: Colors.white, size: size), + icon: Icon(icon, size: size), onPressed: onPressed, ), ); diff --git a/pubspec.yaml b/pubspec.yaml index beef52b..185fadf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.1.5+35 +version: 1.1.6+36 environment: sdk: ^3.9.0-100.2.beta