copyFileIntoDownloadFolder method

  1. @override
Future<SavedDownload?> copyFileIntoDownloadFolder(
  1. String filePath,
  2. String fileName, {
  3. File? file,
  4. String? desiredExtension,
  5. String? subDirectoryPath,
  6. bool openAfterSave = false,
})
override

Implementation

@override
Future<SavedDownload?> copyFileIntoDownloadFolder(
  String filePath,
  String fileName, {
  File? file,
  String? desiredExtension,
  String? subDirectoryPath,
  bool openAfterSave = false,
}) async {
  final androidSdkVersion = Platform.isAndroid
      ? await getCurrentAndroidSdkVersion()
      : 0;

  final fileToCopy = file ?? File(filePath);

  // Android 10+ goes through MediaStore so we don't need MANAGE_EXTERNAL_STORAGE.
  if (Platform.isAndroid && androidSdkVersion >= 29) {
    final result = await methodChannel
        .invokeMapMethod<String, dynamic>('saveFileUsingMediaStore', {
          'filePath': fileToCopy.path,
          'fileName': p.basenameWithoutExtension(fileName),
          'extension': desiredExtension ?? p.extension(fileToCopy.path),
          'subDirectoryPath': subDirectoryPath,
          'openAfterSave': openAfterSave,
        });
    if (result == null) return null;
    final path = result['path'] as String?;
    if (path == null) return null;
    final uri = result['uri'] as String?;
    return SavedDownload(
      file: File(path),
      contentUri: uri == null ? null : Uri.parse(uri),
    );
  }

  // Legacy Android / all other platforms: plain file copy.
  final folderPath = p.absolute(
    (await getDownloadFolder()).path,
    subDirectoryPath,
  );

  final copied = await fileToCopy.copyTo(
    folderPath,
    fileName,
    desiredExtension: desiredExtension ?? p.extension(fileToCopy.path),
  );

  if (openAfterSave) {
    await _openLocalFile(copied);
  }
  return SavedDownload(file: copied);
}