From 4b1734fb458e4e4d566e73984d0e2a9cb0ca6721 Mon Sep 17 00:00:00 2001 From: The one with the braid Date: Sat, 26 Aug 2023 12:54:56 +0200 Subject: [PATCH] fix: desktop drop of HTTP content on linux Signed-off-by: The one with the braid --- lib/main.dart | 5 +++ lib/utils/desktop_drop_downloader.dart | 48 ++++++++++++++++++++++++++ pubspec.lock | 11 +++--- pubspec.yaml | 5 +++ 4 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 lib/utils/desktop_drop_downloader.dart diff --git a/lib/main.dart b/lib/main.dart index 5f451c0a6..432334fc8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; +import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter_app_lock/flutter_app_lock.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/desktop_drop_downloader.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'config/setting_keys.dart'; import 'utils/background_push.dart'; @@ -65,6 +67,9 @@ Future startGui(List clients) async { } } + DesktopDropPlugin.onUnsupportedUriHandler = + DesktopDropDownloader.unsupportedUriCallback; + // Start rendering the Flutter app and wrap it in an Applock. // We do this only for mobile applications as we saw routing // problems on other platforms if we wrap it always. diff --git a/lib/utils/desktop_drop_downloader.dart b/lib/utils/desktop_drop_downloader.dart new file mode 100644 index 000000000..9bf7dcc16 --- /dev/null +++ b/lib/utils/desktop_drop_downloader.dart @@ -0,0 +1,48 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +import 'package:http/http.dart'; +import 'package:path_provider/path_provider.dart'; + +abstract class DesktopDropDownloader { + const DesktopDropDownloader._(); + + static Future unsupportedUriCallback(String url) async { + if (kIsWeb) return null; + final uri = Uri.tryParse(url); + if (uri == null) return null; + + if (!['http', 'https'].contains(uri.scheme)) return null; + + Response response; + + try { + response = await get(uri); + } catch (_) { + return null; + } + + Directory tmp; + + // that's likely failing on many distros but future proof for upcoming + // implementations + try { + tmp = await getTemporaryDirectory(); + } catch (_) { + tmp = + await getDownloadsDirectory() ?? await getApplicationCacheDirectory(); + } + + try { + await tmp.create(recursive: true); + final file = + File('${tmp.path}/desktop_drop_example/${uri.path.split('/').last}'); + await file.create(recursive: true); + await file.writeAsBytes(response.bodyBytes); + return file.path; + } catch (_) { + return null; + } + } +} diff --git a/pubspec.lock b/pubspec.lock index 0b720cb1a..833453035 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -284,11 +284,12 @@ packages: desktop_drop: dependency: "direct main" description: - name: desktop_drop - sha256: "4ca4d960f4b11c032e9adfd2a0a8ac615bc3fddb4cbe73dcf840dd8077582186" - url: "https://pub.dev" - source: hosted - version: "0.4.1" + path: "packages/desktop_drop" + ref: "braid/unsupported-uri-scheme-callback" + resolved-ref: cbcea137c4f8209e2d229335278d06e16390f974 + url: "https://github.com/TheOneWithTheBraid/flutter-plugins.git" + source: git + version: "0.4.3" desktop_lifecycle: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 56f325146..f65acda69 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -148,6 +148,11 @@ msix_config: install_certificate: false dependency_overrides: + desktop_drop: + git: + url: https://github.com/TheOneWithTheBraid/flutter-plugins.git + path: packages/desktop_drop + ref: braid/unsupported-uri-scheme-callback geolocator_android: hosted: name: geolocator_android