Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
ffbde73300 | |||
836a0886e2 | |||
1cd10b3809 | |||
43c42ac0d5 |
@ -5,7 +5,6 @@
|
|||||||
android:label="f0ckapp"
|
android:label="f0ckapp"
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
|
||||||
android:enableOnBackInvokedCallback="true">
|
android:enableOnBackInvokedCallback="true">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@mipmap/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
|
||||||
|
</adaptive-icon>
|
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 3.5 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
Normal file
After Width: | Height: | Size: 839 B |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
Normal file
After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 4.5 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 1.9 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
Normal file
After Width: | Height: | Size: 446 B |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
Normal file
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 2.4 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 5.2 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
Normal file
After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 6.4 KiB |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 9.6 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 11 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 128 KiB |
After Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 17 KiB |
BIN
android/app/src/main/res/play_store_512.png
Normal file
After Width: | Height: | Size: 327 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 447 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 192 KiB |
Before Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 9.0 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 14 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 3.8 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 6.9 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png
Normal file
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 2.2 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png
Normal file
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png
Normal file
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 43 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png
Normal file
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 37 KiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png
Normal file
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 1.0 MiB |
BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png
Normal file
After Width: | Height: | Size: 11 KiB |
@ -1,8 +1,18 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
|
||||||
|
final Map<String, ThemeData> themeMap = {
|
||||||
|
'f0ck': f0ckTheme,
|
||||||
|
'P1nk': p1nkTheme, // done
|
||||||
|
'Orange': orangeTheme,
|
||||||
|
'Amoled': amoledTheme,
|
||||||
|
'Paper': paperTheme,
|
||||||
|
//'Iced': icedTheme,
|
||||||
|
'f0ck95': f0ck95Theme,
|
||||||
|
'f0ck95d': f0ck95dTheme,
|
||||||
|
};
|
||||||
|
|
||||||
class ThemeNotifier extends StateNotifier<ThemeData> {
|
class ThemeNotifier extends StateNotifier<ThemeData> {
|
||||||
final FlutterSecureStorage secureStorage;
|
final FlutterSecureStorage secureStorage;
|
||||||
|
|
||||||
@ -11,48 +21,37 @@ class ThemeNotifier extends StateNotifier<ThemeData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _loadTheme() async {
|
Future<void> _loadTheme() async {
|
||||||
|
try {
|
||||||
String? savedThemeName = await secureStorage.read(key: 'theme');
|
String? savedThemeName = await secureStorage.read(key: 'theme');
|
||||||
if (savedThemeName != null) {
|
if (savedThemeName != null && themeMap.containsKey(savedThemeName)) {
|
||||||
final customTheme = themes.firstWhere(
|
state = themeMap[savedThemeName]!;
|
||||||
(t) => t.name == savedThemeName,
|
}
|
||||||
orElse: () => CustomTheme(name: 'f0ck', theme: f0ckTheme),
|
} catch (error) {
|
||||||
);
|
debugPrint('Fehler beim Laden des Themes: $error');
|
||||||
state = customTheme.theme;
|
state = f0ckTheme;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateTheme(String themeName) async {
|
Future<void> updateTheme(String themeName) async {
|
||||||
|
try {
|
||||||
await secureStorage.write(key: 'theme', value: themeName);
|
await secureStorage.write(key: 'theme', value: themeName);
|
||||||
final newTheme = themes.firstWhere(
|
state = themeMap[themeName] ?? f0ckTheme;
|
||||||
(t) => t.name == themeName,
|
} catch (error) {
|
||||||
orElse: () => CustomTheme(name: 'f0ck', theme: f0ckTheme),
|
debugPrint('Fehler beim Aktualisieren des Themes: $error');
|
||||||
);
|
}
|
||||||
state = newTheme.theme;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final themeNotifierProvider = StateNotifierProvider<ThemeNotifier, ThemeData>((
|
final themeNotifierProvider = StateNotifierProvider<ThemeNotifier, ThemeData>((
|
||||||
ref,
|
ref,
|
||||||
) {
|
) {
|
||||||
return ThemeNotifier(secureStorage: FlutterSecureStorage());
|
return ThemeNotifier(
|
||||||
|
secureStorage: const FlutterSecureStorage(
|
||||||
|
aOptions: AndroidOptions(encryptedSharedPreferences: true),
|
||||||
|
),
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
class CustomTheme {
|
|
||||||
final String name;
|
|
||||||
final ThemeData theme;
|
|
||||||
|
|
||||||
CustomTheme({required this.name, required this.theme});
|
|
||||||
}
|
|
||||||
|
|
||||||
final List<CustomTheme> 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(
|
final ThemeData f0ckTheme = ThemeData(
|
||||||
brightness: Brightness.dark,
|
brightness: Brightness.dark,
|
||||||
primaryColor: const Color(0xFF9FFF00),
|
primaryColor: const Color(0xFF9FFF00),
|
||||||
@ -74,13 +73,53 @@ final ThemeData f0ckTheme = ThemeData(
|
|||||||
bodyLarge: TextStyle(color: Colors.white),
|
bodyLarge: TextStyle(color: Colors.white),
|
||||||
bodyMedium: TextStyle(color: Colors.white),
|
bodyMedium: TextStyle(color: Colors.white),
|
||||||
),
|
),
|
||||||
buttonTheme: ButtonThemeData(
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||||
buttonColor: const Color(0xFF9FFF00),
|
style: ElevatedButton.styleFrom(
|
||||||
textTheme: ButtonTextTheme.primary,
|
foregroundColor: const Color(0xFF000000),
|
||||||
|
backgroundColor: const Color(0xFF9FFF00),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
scrollbarTheme: ScrollbarThemeData(
|
scrollbarTheme: ScrollbarThemeData(
|
||||||
thumbColor: WidgetStatePropertyAll<Color>(Color(0xFF2B2B2B)),
|
thumbColor: WidgetStateProperty.all<Color>(const Color(0xFF2B2B2B)),
|
||||||
trackColor: WidgetStatePropertyAll<Color>(Color(0xFF424242)),
|
trackColor: WidgetStateProperty.all<Color>(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),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -105,9 +144,11 @@ final ThemeData paperTheme = ThemeData(
|
|||||||
bodyLarge: TextStyle(color: Color(0xFF000000)),
|
bodyLarge: TextStyle(color: Color(0xFF000000)),
|
||||||
bodyMedium: TextStyle(color: Color(0xFF000000)),
|
bodyMedium: TextStyle(color: Color(0xFF000000)),
|
||||||
),
|
),
|
||||||
buttonTheme: ButtonThemeData(
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||||
buttonColor: const Color(0xFF000000),
|
style: ElevatedButton.styleFrom(
|
||||||
textTheme: ButtonTextTheme.primary,
|
foregroundColor: const Color(0xFFFFFFFF),
|
||||||
|
backgroundColor: const Color(0xFF000000),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -132,13 +173,15 @@ final ThemeData orangeTheme = ThemeData(
|
|||||||
bodyLarge: TextStyle(color: Colors.white),
|
bodyLarge: TextStyle(color: Colors.white),
|
||||||
bodyMedium: TextStyle(color: Colors.white),
|
bodyMedium: TextStyle(color: Colors.white),
|
||||||
),
|
),
|
||||||
buttonTheme: ButtonThemeData(
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||||
buttonColor: const Color(0xFFFF6F00),
|
style: ElevatedButton.styleFrom(
|
||||||
textTheme: ButtonTextTheme.primary,
|
foregroundColor: Colors.white,
|
||||||
|
backgroundColor: const Color(0xFFFF6F00),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
scrollbarTheme: ScrollbarThemeData(
|
scrollbarTheme: ScrollbarThemeData(
|
||||||
thumbColor: WidgetStatePropertyAll<Color>(Color(0xFF2B2B2B)),
|
thumbColor: WidgetStateProperty.all<Color>(const Color(0xFF2B2B2B)),
|
||||||
trackColor: WidgetStatePropertyAll<Color>(Color(0xFF424242)),
|
trackColor: WidgetStateProperty.all<Color>(const Color(0xFF424242)),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -165,9 +208,11 @@ final ThemeData amoledTheme = ThemeData(
|
|||||||
bodyLarge: TextStyle(color: Colors.white),
|
bodyLarge: TextStyle(color: Colors.white),
|
||||||
bodyMedium: TextStyle(color: Colors.white),
|
bodyMedium: TextStyle(color: Colors.white),
|
||||||
),
|
),
|
||||||
buttonTheme: ButtonThemeData(
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||||
buttonColor: const Color(0xFFFFFFFF),
|
style: ElevatedButton.styleFrom(
|
||||||
textTheme: ButtonTextTheme.primary,
|
foregroundColor: Colors.black,
|
||||||
|
backgroundColor: const Color(0xFFFFFFFF),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
scrollbarTheme: ScrollbarThemeData(
|
scrollbarTheme: ScrollbarThemeData(
|
||||||
thumbColor: WidgetStateProperty.all<Color>(const Color(0xFF1D1C1C)),
|
thumbColor: WidgetStateProperty.all<Color>(const Color(0xFF1D1C1C)),
|
||||||
@ -195,13 +240,15 @@ final ThemeData f0ck95Theme = ThemeData(
|
|||||||
bodyLarge: TextStyle(color: Colors.black),
|
bodyLarge: TextStyle(color: Colors.black),
|
||||||
bodyMedium: TextStyle(color: Colors.black),
|
bodyMedium: TextStyle(color: Colors.black),
|
||||||
),
|
),
|
||||||
buttonTheme: ButtonThemeData(
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||||
buttonColor: Colors.black,
|
style: ElevatedButton.styleFrom(
|
||||||
textTheme: ButtonTextTheme.primary,
|
foregroundColor: Colors.white,
|
||||||
|
backgroundColor: Colors.black,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
scrollbarTheme: ScrollbarThemeData(
|
scrollbarTheme: ScrollbarThemeData(
|
||||||
thumbColor: WidgetStatePropertyAll<Color>(Color(0xFF2B2B2B)),
|
thumbColor: WidgetStateProperty.all<Color>(const Color(0xFF2B2B2B)),
|
||||||
trackColor: WidgetStatePropertyAll<Color>(Color(0xFF424242)),
|
trackColor: WidgetStateProperty.all<Color>(const Color(0xFF424242)),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -225,12 +272,14 @@ final ThemeData f0ck95dTheme = ThemeData(
|
|||||||
bodyLarge: TextStyle(color: Colors.white),
|
bodyLarge: TextStyle(color: Colors.white),
|
||||||
bodyMedium: TextStyle(color: Colors.white),
|
bodyMedium: TextStyle(color: Colors.white),
|
||||||
),
|
),
|
||||||
buttonTheme: ButtonThemeData(
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||||
buttonColor: Colors.white,
|
style: ElevatedButton.styleFrom(
|
||||||
textTheme: ButtonTextTheme.primary,
|
foregroundColor: Colors.black,
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
scrollbarTheme: ScrollbarThemeData(
|
scrollbarTheme: ScrollbarThemeData(
|
||||||
thumbColor: WidgetStatePropertyAll<Color>(Color(0xFF2B2B2B)),
|
thumbColor: WidgetStateProperty.all<Color>(const Color(0xFF2B2B2B)),
|
||||||
trackColor: WidgetStatePropertyAll<Color>(Color(0xFF424242)),
|
trackColor: WidgetStateProperty.all<Color>(const Color(0xFF424242)),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -48,17 +48,14 @@ class _DetailViewState extends ConsumerState<DetailView> {
|
|||||||
|
|
||||||
void _preloadAdjacentMedia(int index) async {
|
void _preloadAdjacentMedia(int index) async {
|
||||||
final mediaState = ref.read(mediaProvider);
|
final mediaState = ref.read(mediaProvider);
|
||||||
if (index + 1 < mediaState.mediaItems.length) {
|
for (int offset in [-1, 1]) {
|
||||||
final nextUrl = mediaState.mediaItems[index + 1].mediaUrl;
|
final adjacentIndex = index + offset;
|
||||||
if (await DefaultCacheManager().getFileFromCache(nextUrl) == null) {
|
if (adjacentIndex >= 0 && adjacentIndex < mediaState.mediaItems.length) {
|
||||||
await DefaultCacheManager().downloadFile(nextUrl);
|
final url = mediaState.mediaItems[adjacentIndex].mediaUrl;
|
||||||
|
if (await DefaultCacheManager().getFileFromCache(url) == null) {
|
||||||
|
await DefaultCacheManager().downloadFile(url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (index - 1 >= 0) {
|
|
||||||
final prevUrl = mediaState.mediaItems[index - 1].mediaUrl;
|
|
||||||
if (await DefaultCacheManager().getFileFromCache(prevUrl) == null) {
|
|
||||||
await DefaultCacheManager().downloadFile(prevUrl);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,9 +103,9 @@ class _DetailViewState extends ConsumerState<DetailView> {
|
|||||||
title: Text('f0ck #${mediaState.mediaItems[_currentIndex].id}'),
|
title: Text('f0ck #${mediaState.mediaItems[_currentIndex].id}'),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(mediaState.muted ? Icons.volume_off : Icons.volume_up),
|
icon: Icon(Icons.download),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
mediaNotifier.toggleMute();
|
// wip
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
PopupMenuButton<String>(
|
PopupMenuButton<String>(
|
||||||
@ -149,14 +146,14 @@ class _DetailViewState extends ConsumerState<DetailView> {
|
|||||||
value: 'direct_link',
|
value: 'direct_link',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: const Icon(Icons.link),
|
leading: const Icon(Icons.link),
|
||||||
title: const Text('Link zum Bild'),
|
title: const Text('Link zur Datei'),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
value: 'post_link',
|
value: 'post_link',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: const Icon(Icons.article),
|
leading: const Icon(Icons.article),
|
||||||
title: const Text('Link zum Post'),
|
title: const Text('Link zum f0ck'),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -182,15 +179,15 @@ class _DetailViewState extends ConsumerState<DetailView> {
|
|||||||
),
|
),
|
||||||
persistentFooterButtons: mediaState.tag != null
|
persistentFooterButtons: mediaState.tag != null
|
||||||
? [
|
? [
|
||||||
InputChip(
|
Center(
|
||||||
|
child: InputChip(
|
||||||
label: Text(mediaState.tag!),
|
label: Text(mediaState.tag!),
|
||||||
//backgroundColor: const Color(0xFF090909),
|
|
||||||
//labelStyle: const TextStyle(color: Colors.white),
|
|
||||||
onDeleted: () {
|
onDeleted: () {
|
||||||
mediaNotifier.setTag(null);
|
mediaNotifier.setTag(null);
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
: null,
|
: null,
|
||||||
);
|
);
|
||||||
|
@ -61,16 +61,22 @@ class _MediaGridState extends ConsumerState<MediaGrid> {
|
|||||||
return Scaffold(
|
return Scaffold(
|
||||||
key: _scaffoldKey,
|
key: _scaffoldKey,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Row(
|
title: GestureDetector(
|
||||||
spacing: 15,
|
child: Row(
|
||||||
|
spacing: 10,
|
||||||
children: [
|
children: [
|
||||||
Image.asset('assets/images/f0ck_small.webp', fit: BoxFit.fitHeight),
|
Image.asset(
|
||||||
Text(
|
'assets/images/f0ck_small.webp',
|
||||||
'fApp',
|
fit: BoxFit.fitHeight,
|
||||||
style: TextStyle(fontSize: 24),
|
|
||||||
),
|
),
|
||||||
|
Text('fApp', style: TextStyle(fontSize: 24)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
onTap: () {
|
||||||
|
mediaNotifier.setTag(null);
|
||||||
|
_scrollController.jumpTo(0);
|
||||||
|
},
|
||||||
|
),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
@ -202,17 +208,19 @@ class _MediaGridState extends ConsumerState<MediaGrid> {
|
|||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||||
child: Column(
|
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 currentTheme = ref.watch(themeNotifierProvider);
|
||||||
final isSelected = currentTheme == themeData.theme;
|
final isSelected = currentTheme == themeData;
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text(themeData.name),
|
title: Text(themeName),
|
||||||
selected: isSelected,
|
selected: isSelected,
|
||||||
selectedTileColor: Colors.blue.withValues(alpha: 0.2),
|
selectedTileColor: Colors.blue.withValues(alpha: 0.2),
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
await ref
|
await ref
|
||||||
.read(themeNotifierProvider.notifier)
|
.read(themeNotifierProvider.notifier)
|
||||||
.updateTheme(themeData.name);
|
.updateTheme(themeName);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}).toList(),
|
}).toList(),
|
||||||
@ -220,7 +228,6 @@ class _MediaGridState extends ConsumerState<MediaGrid> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text('v${AppVersion.version}'),
|
title: Text('v${AppVersion.version}'),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
@ -236,13 +243,15 @@ class _MediaGridState extends ConsumerState<MediaGrid> {
|
|||||||
),
|
),
|
||||||
persistentFooterButtons: mediaState.tag != null
|
persistentFooterButtons: mediaState.tag != null
|
||||||
? [
|
? [
|
||||||
InputChip(
|
Center(
|
||||||
|
child: InputChip(
|
||||||
label: Text(mediaState.tag!),
|
label: Text(mediaState.tag!),
|
||||||
onDeleted: () {
|
onDeleted: () {
|
||||||
mediaNotifier.setTag(null);
|
mediaNotifier.setTag(null);
|
||||||
_scrollController.jumpTo(0);
|
_scrollController.jumpTo(0);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
: null,
|
: null,
|
||||||
body: RefreshIndicator(
|
body: RefreshIndicator(
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:cached_video_player_plus/cached_video_player_plus.dart';
|
import 'package:cached_video_player_plus/cached_video_player_plus.dart';
|
||||||
|
|
||||||
class VideoControlsOverlay extends StatelessWidget {
|
import 'package:f0ckapp/providers/MediaProvider.dart';
|
||||||
|
|
||||||
|
class VideoControlsOverlay extends ConsumerWidget {
|
||||||
final CachedVideoPlayerPlusController controller;
|
final CachedVideoPlayerPlusController controller;
|
||||||
final VoidCallback button;
|
final VoidCallback button;
|
||||||
|
|
||||||
@ -13,10 +16,32 @@ class VideoControlsOverlay extends StatelessWidget {
|
|||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context, ref) {
|
||||||
|
final mediaState = ref.watch(mediaProvider);
|
||||||
|
final mediaNotifier = ref.read(mediaProvider.notifier);
|
||||||
|
|
||||||
return Stack(
|
return Stack(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
children: [
|
children: [
|
||||||
|
Positioned(
|
||||||
|
right: 12,
|
||||||
|
top: 12,
|
||||||
|
child: _ControlButton(
|
||||||
|
mediaState.muted ? Icons.volume_off : Icons.volume_up,
|
||||||
|
() {
|
||||||
|
button();
|
||||||
|
mediaNotifier.toggleMute();
|
||||||
|
},
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
right: 12,
|
||||||
|
bottom: 12,
|
||||||
|
child: _ControlButton(Icons.fullscreen, () {
|
||||||
|
button();
|
||||||
|
}, size: 16),
|
||||||
|
),
|
||||||
Center(
|
Center(
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
@ -64,7 +89,6 @@ class VideoControlsOverlay extends StatelessWidget {
|
|||||||
bottom: 12,
|
bottom: 12,
|
||||||
child: Text(
|
child: Text(
|
||||||
'${_formatDuration(controller.value.position)} / ${_formatDuration(controller.value.duration)}',
|
'${_formatDuration(controller.value.position)} / ${_formatDuration(controller.value.duration)}',
|
||||||
style: TextStyle(color: Colors.white),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Listener(
|
Listener(
|
||||||
@ -128,7 +152,7 @@ class _ControlButton extends StatelessWidget {
|
|||||||
color: Colors.black.withValues(alpha: 0.4),
|
color: Colors.black.withValues(alpha: 0.4),
|
||||||
),
|
),
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
icon: Icon(icon, color: Colors.white, size: size),
|
icon: Icon(icon, size: size),
|
||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -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
|
# 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
|
# 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.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.1.3+33
|
version: 1.1.6+36
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.9.0-100.2.beta
|
sdk: ^3.9.0-100.2.beta
|
||||||
|