This commit is contained in:
		@@ -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<String>("filePath")
 | 
			
		||||
        val fileName = call.argument<String>("fileName")
 | 
			
		||||
        val subDir = call.argument<String?>("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
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DetailView> {
 | 
			
		||||
  Future<void> _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<bool>('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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user