From 57636c5de6f5be366ce02e04c2ee59fc4e1420c6 Mon Sep 17 00:00:00 2001 From: Flummi Date: Wed, 11 Jun 2025 10:52:15 +0200 Subject: [PATCH] v1.1.14+44 --- .../kotlin/com/f0ck/f0ckapp/MainActivity.kt | 66 ++++++++++++++++++- lib/screens/detailview_screen.dart | 25 +++---- pubspec.lock | 32 --------- pubspec.yaml | 3 +- 4 files changed, 79 insertions(+), 47 deletions(-) diff --git a/android/app/src/main/kotlin/com/f0ck/f0ckapp/MainActivity.kt b/android/app/src/main/kotlin/com/f0ck/f0ckapp/MainActivity.kt index b7323fa..2199035 100644 --- a/android/app/src/main/kotlin/com/f0ck/f0ckapp/MainActivity.kt +++ b/android/app/src/main/kotlin/com/f0ck/f0ckapp/MainActivity.kt @@ -1,5 +1,69 @@ package com.f0ck.f0ckapp +import android.content.ContentValues +import android.content.Context +import android.os.Environment +import android.provider.MediaStore +import androidx.annotation.NonNull import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import java.io.File +import java.io.FileInputStream -class MainActivity : FlutterActivity() +class MainActivity : FlutterActivity() { + private val CHANNEL = "MediaShit" + + override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine): Unit { + super.configureFlutterEngine(flutterEngine) + + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { + call, + result -> + if (call.method == "saveFile") { + val filePath = call.argument("filePath") + val fileName = call.argument("fileName") + val subDir = call.argument("subDir") + + if (filePath == null || fileName == null) + result.error("SAVE_FAILED", "file not found", null) + + if (!saveFileUsingMediaStore(applicationContext, filePath!!, fileName!!, subDir)) + result.error("COPY_FAILED", "Datei konnte nicht gespeichert werden", null) + result.success(true) + } else result.notImplemented() + } + } + + private fun saveFileUsingMediaStore( + context: Context, + filePath: String, + fileName: String, + subDir: String? + + ): Boolean { + val srcFile = File(filePath) + if (!srcFile.exists()) return false + + val values = + ContentValues().apply { + put(MediaStore.MediaColumns.DISPLAY_NAME, fileName) + put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + "/" + (subDir ?: "fApp")) + put(MediaStore.MediaColumns.IS_PENDING, 1) + } + + val resolver = context.contentResolver + val collection = MediaStore.Downloads.EXTERNAL_CONTENT_URI + val uri = resolver.insert(collection, values) ?: return false + + resolver.openOutputStream(uri).use { out -> + FileInputStream(srcFile).use { input -> input.copyTo(out!!, 4096) } + } + + values.clear() + values.put(MediaStore.MediaColumns.IS_PENDING, 0) + resolver.update(uri, values, null, null) + + return true + } +} diff --git a/lib/screens/detailview_screen.dart b/lib/screens/detailview_screen.dart index ae0ffcc..41723fe 100644 --- a/lib/screens/detailview_screen.dart +++ b/lib/screens/detailview_screen.dart @@ -2,12 +2,13 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; + +import 'package:cached_network_image/cached_network_image.dart'; import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:downloadsfolder/downloadsfolder.dart' as blah; import 'package:f0ckapp/models/mediaitem_model.dart'; import 'package:f0ckapp/widgets/video_widget.dart'; @@ -70,17 +71,17 @@ class _DetailViewState extends ConsumerState { Future _downloadMedia() async { final MediaState mediaState = ref.read(mediaProvider); final MediaItem currentItem = mediaState.mediaItems[_currentIndex]; - final file = await DefaultCacheManager().getSingleFile(currentItem.mediaUrl); + final File file = await DefaultCacheManager().getSingleFile(currentItem.mediaUrl); + final MethodChannel methodChannel = const MethodChannel('MediaShit'); - bool? success = await blah.copyFileIntoDownloadFolder( - '${file.dirname}/${file.basename}', - currentItem.mediaUrl.split('/').last - ); - if (success == true) { - _showMsg('${file.basename} wurde irgendwie heruntergeladen. Viel Spaß bei der Suche'); - } else { - _showMsg('${file.basename} konnte nicht heruntergeladen werden.'); - } + bool? success = await methodChannel.invokeMethod('saveFile', { + 'filePath': file.path, + 'fileName': currentItem.dest, + }); + + success == true + ? _showMsg('${currentItem.dest} wurde in Downloads/fApp neigespeichert.') + : _showMsg('${currentItem.dest} konnte nicht heruntergeladen werden.'); } @override diff --git a/pubspec.lock b/pubspec.lock index dcb642a..d86de63 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -105,30 +105,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" - dartx: - dependency: transitive - description: - name: dartx - sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - diacritic: - dependency: transitive - description: - name: diacritic - sha256: "12981945ec38931748836cd76f2b38773118d0baef3c68404bdfde9566147876" - url: "https://pub.dev" - source: hosted - version: "0.1.6" - downloadsfolder: - dependency: "direct main" - description: - name: downloadsfolder - sha256: "0e1bb7dd634d6231c0ac116c467da94507a07ed62239712ea0dead981d58b114" - url: "https://pub.dev" - source: hosted - version: "1.2.0" fake_async: dependency: transitive description: @@ -621,14 +597,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.6" - time: - dependency: transitive - description: - name: time - sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" - url: "https://pub.dev" - source: hosted - version: "2.1.5" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4e7c96e..51578fa 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.13+43 +version: 1.1.14+44 environment: sdk: ^3.9.0-100.2.beta @@ -42,7 +42,6 @@ dependencies: flutter_secure_storage: ^9.2.4 flutter_riverpod: ^2.6.1 go_router: ^15.1.3 - downloadsfolder: ^1.2.0 dev_dependencies: flutter_test: