diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7dcd720..584b0ba 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + - - - - - + + + diff --git a/lib/API/Classes/ShortURL/short_url.dart b/lib/API/Classes/ShortURL/short_url.dart index 7c1697b..f789739 100644 --- a/lib/API/Classes/ShortURL/short_url.dart +++ b/lib/API/Classes/ShortURL/short_url.dart @@ -57,6 +57,8 @@ class ShortURL { domain = json["domain"], title = json["title"], crawlable = json["crawlable"]; + + /// Returns an empty class of [ShortURL] ShortURL.empty() : shortCode = "", shortUrl = "", diff --git a/lib/views/home_view.dart b/lib/views/home_view.dart index 69a9bd5..fccd5cc 100644 --- a/lib/views/home_view.dart +++ b/lib/views/home_view.dart @@ -1,9 +1,14 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:flutter_sharing_intent/flutter_sharing_intent.dart'; +import 'package:flutter_sharing_intent/model/sharing_file.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:shlink_app/API/Classes/ShlinkStats/shlink_stats.dart'; import 'package:shlink_app/API/server_manager.dart'; import 'package:shlink_app/views/short_url_edit_view.dart'; import 'package:shlink_app/views/url_list_view.dart'; +import 'package:url_launcher/url_launcher_string.dart'; import '../API/Classes/ShortURL/short_url.dart'; import '../globals.dart' as globals; @@ -22,15 +27,33 @@ class _HomeViewState extends State { bool _qrCodeShown = false; String _qrUrl = ""; + late StreamSubscription _intentDataStreamSubscription; + @override void initState() { - // TODO: implement initState super.initState(); + initializeActionProcessText(); WidgetsBinding.instance.addPostFrameCallback((_) { loadAllData(); }); } + Future initializeActionProcessText() async { + _intentDataStreamSubscription = FlutterSharingIntent.instance + .getMediaStream().listen(_handleIntentUrl); + + FlutterSharingIntent.instance.getInitialSharing().then(_handleIntentUrl); + } + + Future _handleIntentUrl(List value) async { + String inputUrlText = value.firstOrNull?.value ?? ""; + if (await canLaunchUrlString(inputUrlText)) { + await Navigator.of(context).push(MaterialPageRoute( + builder: (context) => ShortURLEditView(longUrl: inputUrlText))); + await loadAllData(); + } + } + Future loadAllData() async { await loadShlinkStats(); await loadRecentShortUrls(); diff --git a/lib/views/short_url_edit_view.dart b/lib/views/short_url_edit_view.dart index 3d15de7..20bf8ea 100644 --- a/lib/views/short_url_edit_view.dart +++ b/lib/views/short_url_edit_view.dart @@ -7,9 +7,10 @@ import 'package:shlink_app/API/server_manager.dart'; import '../globals.dart' as globals; class ShortURLEditView extends StatefulWidget { - const ShortURLEditView({super.key, this.shortUrl}); + const ShortURLEditView({super.key, this.shortUrl, this.longUrl}); final ShortURL? shortUrl; + final String? longUrl; @override State createState() => _ShortURLEditViewState(); @@ -43,6 +44,9 @@ class _ShortURLEditViewState extends State duration: const Duration(milliseconds: 500), ); loadExistingUrl(); + if (widget.longUrl != null) { + longUrlController.text = widget.longUrl!; + } super.initState(); } diff --git a/pubspec.lock b/pubspec.lock index d0be5e8..9cd2447 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -109,10 +109,10 @@ packages: dependency: "direct main" description: name: dynamic_color - sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d url: "https://pub.dev" source: hosted - version: "1.6.9" + version: "1.7.0" fake_async: dependency: transitive description: @@ -145,20 +145,19 @@ packages: flutter_launcher_icons: dependency: "direct dev" description: - path: "." - ref: "feat/monochrome-icons-support" - resolved-ref: "1902eba83da89b0350a70672ac7c963cd995e017" - url: "https://github.com/OutdatedGuy/flutter_launcher_icons.git" - source: git + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + url: "https://pub.dev" + source: hosted version: "0.13.1" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" flutter_process_text: dependency: "direct main" description: @@ -171,10 +170,10 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: "22dbf16f23a4bcf9d35e51be1c84ad5bb6f627750565edd70dab70f3ff5fff8f" + sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "9.0.0" flutter_secure_storage_linux: dependency: transitive description: @@ -211,10 +210,18 @@ packages: dependency: transitive description: name: flutter_secure_storage_windows - sha256: "38f9501c7cb6f38961ef0e1eacacee2b2d4715c63cc83fe56449c4d3d0b47255" + sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" + flutter_sharing_intent: + dependency: "direct main" + description: + name: flutter_sharing_intent + sha256: "785ffc391822641457f930eb477c91c2f598a888f50b8fbb40d481ee01c7e719" + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter_test: dependency: "direct dev" description: flutter @@ -229,10 +236,10 @@ packages: dependency: "direct main" description: name: http - sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" url: "https://pub.dev" source: hosted - version: "0.13.6" + version: "1.1.0" http_parser: dependency: transitive description: @@ -245,18 +252,18 @@ packages: dependency: transitive description: name: image - sha256: "004a2e90ce080f8627b5a04aecb4cdfac87d2c3f3b520aa291260be5a32c033d" + sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" url: "https://pub.dev" source: hosted - version: "4.1.4" + version: "4.1.7" intl: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" js: dependency: transitive description: @@ -277,10 +284,10 @@ packages: dependency: "direct dev" description: name: license_generator - sha256: "147605cac9b1ca9ab7f52ed235498927fe7a9edaef56d1b4687f22b9b03f6bad" + sha256: "0b111c03cbccfa36a68a8738e3b2a54392a269673b5258d5fc6a83302d675a9e" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "2.0.0" lints: dependency: transitive description: @@ -337,6 +344,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.3" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" path_provider_linux: dependency: transitive description: @@ -538,18 +569,18 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e8f2efc804810c0f2f5b485f49e7942179f56eabcfe81dce3387fec4bb55876b + sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c url: "https://pub.dev" source: hosted - version: "6.1.9" + version: "6.2.4" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" + sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.3.0" url_launcher_ios: dependency: transitive description: @@ -578,10 +609,10 @@ packages: dependency: transitive description: name: url_launcher_platform_interface - sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" url_launcher_web: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5354004..a2d7a01 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.1.1+7 environment: - sdk: ^2.19.0 + sdk: ^3.0.0 dependencies: flutter: sdk: flutter @@ -31,22 +31,23 @@ dependencies: # cupertino_icons: ^1.0.5 - http: ^0.13.6 + http: ^1.1.0 flutter_process_text: ^1.1.2 - flutter_secure_storage: ^8.0.0 + flutter_secure_storage: ^9.0.0 dartz: ^0.10.1 qr_flutter: ^4.1.0 tuple: ^2.0.2 - intl: ^0.18.1 + intl: ^0.19.0 dynamic_color: ^1.6.6 - url_launcher: 6.1.9 + url_launcher: ^6.2.4 package_info_plus: ^4.0.2 shared_preferences: ^2.2.2 + flutter_sharing_intent: ^1.1.1 dev_dependencies: flutter_test: sdk: flutter - license_generator: ^1.0.5 + license_generator: ^2.0.0 flutter_launcher_icons: ^0.13.1 flutter_lints: ^3.0.1