- download button lel
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 | 
					<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 | 
				
			||||||
    <uses-permission android:name="android.permission.INTERNET"/>
 | 
					    <uses-permission android:name="android.permission.INTERNET"/>
 | 
				
			||||||
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 | 
					    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <application
 | 
					    <application
 | 
				
			||||||
        android:label="f0ckapp"
 | 
					        android:label="f0ckapp"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import 'package:go_router/go_router.dart';
 | 
					import 'package:go_router/go_router.dart';
 | 
				
			||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
					import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
				
			||||||
 | 
					import 'package:flutter_downloader/flutter_downloader.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'package:f0ckapp/screens/mediagrid_screen.dart';
 | 
					import 'package:f0ckapp/screens/mediagrid_screen.dart';
 | 
				
			||||||
import 'package:f0ckapp/screens/detailview_screen.dart';
 | 
					import 'package:f0ckapp/screens/detailview_screen.dart';
 | 
				
			||||||
@@ -13,6 +14,7 @@ import 'package:f0ckapp/providers/theme_provider.dart';
 | 
				
			|||||||
void main() async {
 | 
					void main() async {
 | 
				
			||||||
  WidgetsFlutterBinding.ensureInitialized();
 | 
					  WidgetsFlutterBinding.ensureInitialized();
 | 
				
			||||||
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
 | 
					  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
 | 
				
			||||||
 | 
					  await FlutterDownloader.initialize();
 | 
				
			||||||
  await AppVersion.init();
 | 
					  await AppVersion.init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  runApp(ProviderScope(child: F0ckApp()));
 | 
					  runApp(ProviderScope(child: F0ckApp()));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,9 @@ import 'package:cached_network_image/cached_network_image.dart';
 | 
				
			|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
					import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
				
			||||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
 | 
					import 'package:flutter_cache_manager/flutter_cache_manager.dart';
 | 
				
			||||||
import 'package:go_router/go_router.dart';
 | 
					import 'package:go_router/go_router.dart';
 | 
				
			||||||
 | 
					import 'package:permission_handler/permission_handler.dart';
 | 
				
			||||||
 | 
					import 'package:flutter_downloader/flutter_downloader.dart';
 | 
				
			||||||
 | 
					import 'package:path_provider/path_provider.dart';
 | 
				
			||||||
import 'package:share_plus/share_plus.dart';
 | 
					import 'package:share_plus/share_plus.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'package:f0ckapp/models/mediaitem_model.dart';
 | 
					import 'package:f0ckapp/models/mediaitem_model.dart';
 | 
				
			||||||
@@ -66,6 +69,55 @@ class _DetailViewState extends ConsumerState<DetailView> {
 | 
				
			|||||||
      ..showSnackBar(SnackBar(content: Text(message)));
 | 
					      ..showSnackBar(SnackBar(content: Text(message)));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<void> _downloadMedia() async {
 | 
				
			||||||
 | 
					    final mediaState = ref.read(mediaProvider);
 | 
				
			||||||
 | 
					    final currentItem = mediaState.mediaItems[_currentIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Platform.isAndroid || Platform.isIOS) {
 | 
				
			||||||
 | 
					      var status = await Permission.storage.status;
 | 
				
			||||||
 | 
					      if (!status.isGranted) {
 | 
				
			||||||
 | 
					        status = await Permission.storage.request();
 | 
				
			||||||
 | 
					        if (!status.isGranted) {
 | 
				
			||||||
 | 
					          _showError("Speicherberechtigung wurde nicht erteilt.");
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    String localPath;
 | 
				
			||||||
 | 
					    if (Platform.isAndroid) {
 | 
				
			||||||
 | 
					      final directory = await getExternalStorageDirectory();
 | 
				
			||||||
 | 
					      localPath = "${directory!.path}/Download/fApp";
 | 
				
			||||||
 | 
					    } else if (Platform.isIOS) {
 | 
				
			||||||
 | 
					      final directory = await getApplicationDocumentsDirectory();
 | 
				
			||||||
 | 
					      localPath = directory.path;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      final directory = await getTemporaryDirectory();
 | 
				
			||||||
 | 
					      localPath = directory.path;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    final savedDir = Directory(localPath);
 | 
				
			||||||
 | 
					    if (!await savedDir.exists()) {
 | 
				
			||||||
 | 
					      await savedDir.create(recursive: true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      await FlutterDownloader.enqueue(
 | 
				
			||||||
 | 
					        url: currentItem.mediaUrl,
 | 
				
			||||||
 | 
					        savedDir: localPath,
 | 
				
			||||||
 | 
					        fileName: currentItem.mediaUrl.split('/').last,
 | 
				
			||||||
 | 
					        showNotification: true,
 | 
				
			||||||
 | 
					        openFileFromNotification: true,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (mounted) {
 | 
				
			||||||
 | 
					        _showError('Download gestartet: ${currentItem.mediaUrl}');
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					      _showError('Download fehlgeschlagen: $e');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void dispose() {
 | 
					  void dispose() {
 | 
				
			||||||
    _pageController?.dispose();
 | 
					    _pageController?.dispose();
 | 
				
			||||||
@@ -78,6 +130,7 @@ class _DetailViewState extends ConsumerState<DetailView> {
 | 
				
			|||||||
    final int itemIndex = mediaState.mediaItems.indexWhere(
 | 
					    final int itemIndex = mediaState.mediaItems.indexWhere(
 | 
				
			||||||
      (item) => item.id == widget.initialItemId,
 | 
					      (item) => item.id == widget.initialItemId,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					    print('itemIndex: ${itemIndex}; initial: ${widget.initialItemId}');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (itemIndex == -1) {
 | 
					    if (itemIndex == -1) {
 | 
				
			||||||
      Future.microtask(() {
 | 
					      Future.microtask(() {
 | 
				
			||||||
@@ -115,14 +168,12 @@ class _DetailViewState extends ConsumerState<DetailView> {
 | 
				
			|||||||
          IconButton(
 | 
					          IconButton(
 | 
				
			||||||
            icon: const Icon(Icons.fullscreen),
 | 
					            icon: const Icon(Icons.fullscreen),
 | 
				
			||||||
            onPressed: () {
 | 
					            onPressed: () {
 | 
				
			||||||
              _showError('fullscreen ist wip');
 | 
					              _showError('download ist wip');
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          IconButton(
 | 
					          IconButton(
 | 
				
			||||||
            icon: const Icon(Icons.download),
 | 
					            icon: const Icon(Icons.download),
 | 
				
			||||||
            onPressed: () {
 | 
					            onPressed: _downloadMedia,
 | 
				
			||||||
              _showError('download ist wip');
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
          PopupMenuButton<String>(
 | 
					          PopupMenuButton<String>(
 | 
				
			||||||
            onSelected: (value) async {
 | 
					            onSelected: (value) async {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										58
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								pubspec.lock
									
									
									
									
									
								
							@@ -150,6 +150,14 @@ packages:
 | 
				
			|||||||
      url: "https://pub.dev"
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
    source: hosted
 | 
					    source: hosted
 | 
				
			||||||
    version: "3.4.1"
 | 
					    version: "3.4.1"
 | 
				
			||||||
 | 
					  flutter_downloader:
 | 
				
			||||||
 | 
					    dependency: "direct main"
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      name: flutter_downloader
 | 
				
			||||||
 | 
					      sha256: "93a9ddbd561f8a3f5483b4189453fba145a0a1014a88143c96a966296b78a118"
 | 
				
			||||||
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
 | 
					    source: hosted
 | 
				
			||||||
 | 
					    version: "1.12.0"
 | 
				
			||||||
  flutter_lints:
 | 
					  flutter_lints:
 | 
				
			||||||
    dependency: "direct dev"
 | 
					    dependency: "direct dev"
 | 
				
			||||||
    description:
 | 
					    description:
 | 
				
			||||||
@@ -385,7 +393,7 @@ packages:
 | 
				
			|||||||
    source: hosted
 | 
					    source: hosted
 | 
				
			||||||
    version: "1.9.1"
 | 
					    version: "1.9.1"
 | 
				
			||||||
  path_provider:
 | 
					  path_provider:
 | 
				
			||||||
    dependency: transitive
 | 
					    dependency: "direct main"
 | 
				
			||||||
    description:
 | 
					    description:
 | 
				
			||||||
      name: path_provider
 | 
					      name: path_provider
 | 
				
			||||||
      sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
 | 
					      sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
 | 
				
			||||||
@@ -432,6 +440,54 @@ packages:
 | 
				
			|||||||
      url: "https://pub.dev"
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
    source: hosted
 | 
					    source: hosted
 | 
				
			||||||
    version: "2.3.0"
 | 
					    version: "2.3.0"
 | 
				
			||||||
 | 
					  permission_handler:
 | 
				
			||||||
 | 
					    dependency: "direct main"
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      name: permission_handler
 | 
				
			||||||
 | 
					      sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f"
 | 
				
			||||||
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
 | 
					    source: hosted
 | 
				
			||||||
 | 
					    version: "12.0.0+1"
 | 
				
			||||||
 | 
					  permission_handler_android:
 | 
				
			||||||
 | 
					    dependency: transitive
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      name: permission_handler_android
 | 
				
			||||||
 | 
					      sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
 | 
				
			||||||
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
 | 
					    source: hosted
 | 
				
			||||||
 | 
					    version: "13.0.1"
 | 
				
			||||||
 | 
					  permission_handler_apple:
 | 
				
			||||||
 | 
					    dependency: transitive
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      name: permission_handler_apple
 | 
				
			||||||
 | 
					      sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
 | 
				
			||||||
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
 | 
					    source: hosted
 | 
				
			||||||
 | 
					    version: "9.4.7"
 | 
				
			||||||
 | 
					  permission_handler_html:
 | 
				
			||||||
 | 
					    dependency: transitive
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      name: permission_handler_html
 | 
				
			||||||
 | 
					      sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
 | 
				
			||||||
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
 | 
					    source: hosted
 | 
				
			||||||
 | 
					    version: "0.1.3+5"
 | 
				
			||||||
 | 
					  permission_handler_platform_interface:
 | 
				
			||||||
 | 
					    dependency: transitive
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      name: permission_handler_platform_interface
 | 
				
			||||||
 | 
					      sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
 | 
				
			||||||
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
 | 
					    source: hosted
 | 
				
			||||||
 | 
					    version: "4.3.0"
 | 
				
			||||||
 | 
					  permission_handler_windows:
 | 
				
			||||||
 | 
					    dependency: transitive
 | 
				
			||||||
 | 
					    description:
 | 
				
			||||||
 | 
					      name: permission_handler_windows
 | 
				
			||||||
 | 
					      sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
 | 
				
			||||||
 | 
					      url: "https://pub.dev"
 | 
				
			||||||
 | 
					    source: hosted
 | 
				
			||||||
 | 
					    version: "0.2.1"
 | 
				
			||||||
  platform:
 | 
					  platform:
 | 
				
			||||||
    dependency: transitive
 | 
					    dependency: transitive
 | 
				
			||||||
    description:
 | 
					    description:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.9+39
 | 
					version: 1.1.10+40
 | 
				
			||||||
 | 
					
 | 
				
			||||||
environment:
 | 
					environment:
 | 
				
			||||||
  sdk: ^3.9.0-100.2.beta
 | 
					  sdk: ^3.9.0-100.2.beta
 | 
				
			||||||
@@ -42,6 +42,9 @@ dependencies:
 | 
				
			|||||||
  flutter_secure_storage: ^9.2.4
 | 
					  flutter_secure_storage: ^9.2.4
 | 
				
			||||||
  flutter_riverpod: ^2.6.1
 | 
					  flutter_riverpod: ^2.6.1
 | 
				
			||||||
  go_router: ^15.1.3
 | 
					  go_router: ^15.1.3
 | 
				
			||||||
 | 
					  flutter_downloader: ^1.12.0
 | 
				
			||||||
 | 
					  permission_handler: ^12.0.0+1
 | 
				
			||||||
 | 
					  path_provider: ^2.1.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dev_dependencies:
 | 
					dev_dependencies:
 | 
				
			||||||
  flutter_test:
 | 
					  flutter_test:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user