diff --git a/android/build.gradle b/android/build.gradle index b187a15..b9eff21 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,30 +4,33 @@ version '1.0-SNAPSHOT' buildscript { repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:7.3.0' } } rootProject.allprojects { repositories { google() - jcenter() + mavenCentral() } } apply plugin: 'com.android.library' android { - compileSdkVersion 29 + namespace 'com.example.fluttershare' + compileSdkVersion 33 defaultConfig { minSdkVersion 16 + targetSdkVersion 33 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + lintOptions { disable 'InvalidPackage' } @@ -35,6 +38,6 @@ android { dependencies { api 'commons-io:commons-io:2.6' - implementation 'androidx.core:core:1.3.2' + implementation 'androidx.core:core:1.9.0' } diff --git a/android/src/main/java/com/example/fluttershare/FlutterSharePlugin.java b/android/src/main/java/com/example/fluttershare/FlutterSharePlugin.java index 3184385..3946d8f 100644 --- a/android/src/main/java/com/example/fluttershare/FlutterSharePlugin.java +++ b/android/src/main/java/com/example/fluttershare/FlutterSharePlugin.java @@ -1,5 +1,6 @@ package com.example.fluttershare; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -13,48 +14,63 @@ import java.util.ArrayList; import io.flutter.embedding.engine.plugins.FlutterPlugin; -import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.plugin.common.PluginRegistry.Registrar; - /** FlutterSharePlugin */ -public class FlutterSharePlugin implements FlutterPlugin, MethodCallHandler { +public class FlutterSharePlugin implements FlutterPlugin, ActivityAware, MethodCallHandler { private Context context; + private Activity activity; private MethodChannel methodChannel; - public FlutterSharePlugin() {} + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + this.context = binding.getApplicationContext(); + methodChannel = new MethodChannel(binding.getBinaryMessenger(), "flutter_share"); + methodChannel.setMethodCallHandler(this); + } - /** Plugin registration. */ - @SuppressWarnings("deprecation") - public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) { - final FlutterSharePlugin instance = new FlutterSharePlugin(); - instance.onAttachedToEngine(registrar.context(), registrar.messenger()); + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + if (methodChannel != null) { + methodChannel.setMethodCallHandler(null); + methodChannel = null; + } + context = null; + activity = null; } @Override - public void onAttachedToEngine(FlutterPluginBinding binding) { - onAttachedToEngine(binding.getApplicationContext(), binding.getBinaryMessenger()); + public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { + activity = binding.getActivity(); } - private void onAttachedToEngine(Context applicationContext, BinaryMessenger messenger) { - this.context = applicationContext; - methodChannel = new MethodChannel(messenger, "flutter_share"); - methodChannel.setMethodCallHandler(this); + @Override + public void onDetachedFromActivityForConfigChanges() { + activity = null; } @Override - public void onDetachedFromEngine(FlutterPluginBinding binding) { - context = null; - methodChannel.setMethodCallHandler(null); - methodChannel = null; + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + activity = binding.getActivity(); + } + + @Override + public void onDetachedFromActivity() { + activity = null; } @Override public void onMethodCall(MethodCall call, Result result) { + if (activity == null) { + result.error("NO_ACTIVITY", "Share plugin requires a foreground activity.", null); + return; + } + if (call.method.equals("shareFile")) { shareFile(call, result); } else if (call.method.equals("share")) { @@ -65,15 +81,13 @@ public void onMethodCall(MethodCall call, Result result) { } private void share(MethodCall call, Result result) { - try - { + try { String title = call.argument("title"); String text = call.argument("text"); String linkUrl = call.argument("linkUrl"); String chooserTitle = call.argument("chooserTitle"); - if (title == null || title.isEmpty()) - { + if (title == null || title.isEmpty()) { Log.println(Log.ERROR, "", "FlutterShare Error: Title null or empty"); result.error("FlutterShare: Title cannot be null or empty", null, null); return; @@ -105,28 +119,24 @@ private void share(MethodCall call, Result result) { Intent chooserIntent = Intent.createChooser(intent, chooserTitle); chooserIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); chooserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(chooserIntent); + activity.startActivity(chooserIntent); result.success(true); - } - catch (Exception ex) - { + } catch (Exception ex) { Log.println(Log.ERROR, "", "FlutterShare: Error"); result.error(ex.getMessage(), null, null); } } private void shareFile(MethodCall call, Result result) { - try - { + try { String title = call.argument("title"); String text = call.argument("text"); String filePath = call.argument("filePath"); String fileType = call.argument("fileType"); String chooserTitle = call.argument("chooserTitle"); - if (filePath == null || filePath.isEmpty()) - { + if (filePath == null || filePath.isEmpty()) { Log.println(Log.ERROR, "", "FlutterShare: ShareLocalFile Error: filePath null or empty"); result.error("FlutterShare: FilePath cannot be null or empty", null, null); return; @@ -149,12 +159,10 @@ private void shareFile(MethodCall call, Result result) { Intent chooserIntent = Intent.createChooser(intent, chooserTitle); chooserIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); chooserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(chooserIntent); + activity.startActivity(chooserIntent); result.success(true); - } - catch (Exception ex) - { + } catch (Exception ex) { result.error(ex.getMessage(), null, null); Log.println(Log.ERROR, "", "FlutterShare: Error"); } diff --git a/example/.flutter-plugins-dependencies b/example/.flutter-plugins-dependencies index ad8479f..d27e4c8 100644 --- a/example/.flutter-plugins-dependencies +++ b/example/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"file_picker","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/file_picker-3.0.1/","dependencies":[]},{"name":"flutter_share","path":"/Users/britto/dev/projects/flutter_share/","dependencies":[]},{"name":"path_provider","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.1/","dependencies":[]}],"android":[{"name":"file_picker","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/file_picker-3.0.1/","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-2.0.1/","dependencies":[]},{"name":"flutter_share","path":"/Users/britto/dev/projects/flutter_share/","dependencies":[]},{"name":"path_provider","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.1/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.0/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.0/","dependencies":[]}],"web":[{"name":"file_picker","path":"/Users/britto/flutter/.pub-cache/hosted/pub.dartlang.org/file_picker-3.0.1/","dependencies":[]}]},"dependencyGraph":[{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"flutter_share","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2021-04-08 12:20:00.830702","version":"2.0.4"} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"file_picker","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/file_picker-3.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_share","path":"/Users/abdullahtas/Desktop/flutter_share/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/path_provider-2.0.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"file_picker","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/file_picker-3.0.1/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"],"dev_dependency":false},{"name":"flutter_plugin_android_lifecycle","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_share","path":"/Users/abdullahtas/Desktop/flutter_share/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/path_provider-2.0.1/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"path_provider_macos","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/path_provider_macos-2.0.0/","native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"path_provider_linux","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/path_provider_linux-2.0.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"path_provider_windows","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/path_provider_windows-2.0.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"web":[{"name":"file_picker","path":"/Users/abdullahtas/.pub-cache/hosted/pub.dev/file_picker-3.0.1/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"flutter_share","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2025-04-17 23:58:30.732018","version":"3.29.3","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 2819f02..6b66533 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/example/pubspec.lock b/example/pubspec.lock index 8661895..970b4a1 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,77 +5,80 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" source: hosted - version: "1.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.19.1" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: caac504f942f41dfadcf45229ce8c47065b93919a12739f20d6173a883c5ec73 + url: "https://pub.dev" source: hosted version: "1.0.2" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.2" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: d97fffd9d86f3dccc7a9059128b468a99320c69007cc9d41a3a1bda07d4e86dc + url: "https://pub.dev" source: hosted version: "1.0.0" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "9fd2163d866769f60f4df8ac1dc59f52498d810c356fe78022e383dd3c57c0e1" + url: "https://pub.dev" source: hosted version: "6.1.0" file_picker: dependency: "direct main" description: name: file_picker - url: "https://pub.dartlang.org" + sha256: "1081616a13f9c04b2c11a513619478ec294d65bd72919064c5b99a6b880f79fb" + url: "https://pub.dev" source: hosted version: "3.0.1" flutter: @@ -87,7 +90,8 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "6f25e9e30df26b3971041847c9106c5a037e72517c8e6514ada99ca42e07e2c7" + url: "https://pub.dev" source: hosted version: "2.0.1" flutter_share: @@ -107,172 +111,219 @@ packages: description: flutter source: sdk version: "0.0.0" - js: + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + url: "https://pub.dev" + source: hosted + version: "10.0.8" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: dependency: transitive description: - name: js - url: "https://pub.dartlang.org" + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "3.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" source: hosted - version: "0.12.10" + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.16.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: aa1b3572707c240d72569ce01756728cf0c8dca0cc381253d8ca2858c13edfe4 + url: "https://pub.dev" source: hosted version: "2.0.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: "938d2b6591587bcb009d2109a6ea464fd8fb2a75dc6423171b0d0afb1d27c708" + url: "https://pub.dev" source: hosted version: "2.0.0" path_provider_macos: dependency: transitive description: name: path_provider_macos - url: "https://pub.dartlang.org" + sha256: eb58b896ea3a504f0b0fa7870646bda6935a6f752b2a54df33f97070dacca8d4 + url: "https://pub.dev" source: hosted version: "2.0.0" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: c2af5a8a6369992d915f8933dfc23172071001359d17896e83db8be57db8a397 + url: "https://pub.dev" source: hosted version: "2.0.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: ecd4d04c225596bcf0fbb86408a1f40084a02dfa412e60172ad52a7f12a781ef + url: "https://pub.dev" source: hosted version: "2.0.0" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: ebc79f16b5f6b609aad4a5e63447d4795d16f7adee46e93ed03200848c006735 + url: "https://pub.dev" source: hosted version: "3.0.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: c2c49e16d42fd6983eb55e44b7f197fdf16b4da7aab7f8e1d21da307cad3fb02 + url: "https://pub.dev" source: hosted version: "2.0.0" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: dc3c073b5bc0db4e0f3dbc6b69f8e9cf2f336dafb3db996242ebdacf94c295dd + url: "https://pub.dev" source: hosted version: "4.2.1" screenshot: dependency: "direct main" description: name: screenshot - url: "https://pub.dartlang.org" + sha256: "633ee2ede6d651b333d58505dcb32bdde293e5d0ad2e9ce45b9b4ea69fe9a72a" + url: "https://pub.dev" source: hosted version: "1.0.0-nullsafety.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" source: hosted - version: "0.2.19" - typed_data: + version: "0.7.4" + vector_math: dependency: transitive description: - name: typed_data - url: "https://pub.dartlang.org" + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "1.3.0" - vector_math: + version: "2.1.4" + vm_service: dependency: transitive description: - name: vector_math - url: "https://pub.dartlang.org" + name: vm_service + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "14.3.1" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c0ee29e0f6e4ee5a63983aae753640adc15017b34e50424f8b45063426e19c5b + url: "https://pub.dev" source: hosted version: "2.0.5" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: "0186b3f2d66be9a12b0295bddcf8b6f8c0b0cc2f85c6287344e2a6366bc28457" + url: "https://pub.dev" source: hosted version: "0.2.0" sdks: - dart: ">=2.12.0 <3.0.0" - flutter: ">=1.20.0" + dart: ">=3.7.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/lib/flutter_share.dart b/lib/flutter_share.dart index 754cfa5..d433a77 100644 --- a/lib/flutter_share.dart +++ b/lib/flutter_share.dart @@ -1,12 +1,11 @@ import 'dart:async'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'flutter_share_platform_interface.dart'; +export 'flutter_share_method.dart'; +/// A Flutter plugin for sharing content via the platform share UI. class FlutterShare { - static const MethodChannel _channel = MethodChannel('flutter_share'); - /// Shares a message or/and link url with app chooser. /// /// - Title: Is the [title] of the message. Used as email subject if sharing @@ -15,25 +14,18 @@ class FlutterShare { /// - LinkUrl: Is the [linkUrl] to include with the message. /// - ChooserTitle (Just for Android): Is the [chooserTitle] of the app /// chooser popup. If null the system default title will be used. - static Future share( - {required String title, - String? text, - String? linkUrl, - String? chooserTitle}) async { - assert(title.isNotEmpty); - - if (title.isEmpty) { - throw FlutterError('Title cannot be null'); - } - - final success = await _channel.invokeMethod('share', { - 'title': title, - 'text': text, - 'linkUrl': linkUrl, - 'chooserTitle': chooserTitle, - }); - - return success; + static Future share({ + required String title, + String? text, + String? linkUrl, + String? chooserTitle, + }) { + return FlutterSharePlatform.instance.share( + title: title, + text: text, + linkUrl: linkUrl, + chooserTitle: chooserTitle, + ); } /// Shares a local file with the app chooser. @@ -46,30 +38,19 @@ class FlutterShare { /// chooser popup. If null, the system default title will be used. /// - FileType (Just for Android): It's the [fileType] that will be sent in the /// chooser popup. If null, the system default title will be used. - static Future shareFile( - {required String title, - required String filePath, - String? text, - String? chooserTitle, - String fileType = '*/*'}) async { - assert(title.isNotEmpty); - assert(filePath.isNotEmpty); - - if (title.isEmpty) { - throw FlutterError('Title cannot be null'); - } else if (filePath.isEmpty) { - throw FlutterError('FilePath cannot be null'); - } - - final success = - await _channel.invokeMethod('shareFile', { - 'title': title, - 'text': text, - 'filePath': filePath, - 'fileType': fileType, - 'chooserTitle': chooserTitle, - }); - - return success; + static Future shareFile({ + required String title, + required String filePath, + String? text, + String? chooserTitle, + String fileType = '*/*', + }) { + return FlutterSharePlatform.instance.shareFile( + title: title, + filePath: filePath, + text: text, + chooserTitle: chooserTitle, + fileType: fileType, + ); } } diff --git a/lib/flutter_share_method.dart b/lib/flutter_share_method.dart new file mode 100644 index 0000000..183f09d --- /dev/null +++ b/lib/flutter_share_method.dart @@ -0,0 +1,12 @@ +import 'package:flutter/services.dart'; + +/// The method channel implementation of FlutterShare. +class FlutterShareMethod { + /// The method channel used to communicate with the native platform. + static const MethodChannel channel = MethodChannel('flutter_share'); + + /// Registers this class as the default instance of FlutterShare. + static void registerWith() { + // Method channel setup is handled automatically by the Flutter framework + } +} \ No newline at end of file diff --git a/lib/flutter_share_platform_interface.dart b/lib/flutter_share_platform_interface.dart new file mode 100644 index 0000000..344bf3e --- /dev/null +++ b/lib/flutter_share_platform_interface.dart @@ -0,0 +1,70 @@ +import 'package:flutter/services.dart'; + +/// The interface that implementations of flutter_share must implement. +abstract class FlutterSharePlatform { + /// The method channel used to interact with the native platform. + static const MethodChannel _channel = MethodChannel('flutter_share'); + + static FlutterSharePlatform _instance = MethodChannelFlutterShare(); + + /// The default instance of [FlutterSharePlatform] to use. + static FlutterSharePlatform get instance => _instance; + + /// Share content + Future share({ + required String title, + String? text, + String? linkUrl, + String? chooserTitle, + }) { + throw UnimplementedError('share() has not been implemented.'); + } + + /// Share file + Future shareFile({ + required String title, + required String filePath, + String? text, + String? chooserTitle, + String fileType = '*/*', + }) { + throw UnimplementedError('shareFile() has not been implemented.'); + } +} + +/// An implementation of [FlutterSharePlatform] that uses method channels. +class MethodChannelFlutterShare extends FlutterSharePlatform { + @override + Future share({ + required String title, + String? text, + String? linkUrl, + String? chooserTitle, + }) async { + final bool? success = await FlutterSharePlatform._channel.invokeMethod('share', { + 'title': title, + 'text': text, + 'linkUrl': linkUrl, + 'chooserTitle': chooserTitle, + }); + return success; + } + + @override + Future shareFile({ + required String title, + required String filePath, + String? text, + String? chooserTitle, + String fileType = '*/*', + }) async { + final bool? success = await FlutterSharePlatform._channel.invokeMethod('shareFile', { + 'title': title, + 'text': text, + 'filePath': filePath, + 'fileType': fileType, + 'chooserTitle': chooserTitle, + }); + return success; + } +} \ No newline at end of file diff --git a/lib/src/method_channel_flutter_share.dart b/lib/src/method_channel_flutter_share.dart new file mode 100644 index 0000000..183f09d --- /dev/null +++ b/lib/src/method_channel_flutter_share.dart @@ -0,0 +1,12 @@ +import 'package:flutter/services.dart'; + +/// The method channel implementation of FlutterShare. +class FlutterShareMethod { + /// The method channel used to communicate with the native platform. + static const MethodChannel channel = MethodChannel('flutter_share'); + + /// Registers this class as the default instance of FlutterShare. + static void registerWith() { + // Method channel setup is handled automatically by the Flutter framework + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index fd7fbbb..a91a1d4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,51 +5,50 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" source: hosted - version: "1.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.19.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.2" flutter: dependency: "direct main" description: flutter @@ -60,94 +59,131 @@ packages: description: flutter source: sdk version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + url: "https://pub.dev" + source: hosted + version: "10.0.8" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" source: hosted - version: "0.12.10" + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.16.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: "direct dev" - description: - name: pedantic - url: "https://pub.dartlang.org" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.9.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" source: hosted - version: "0.2.19" - typed_data: + version: "0.7.4" + vector_math: dependency: transitive description: - name: typed_data - url: "https://pub.dartlang.org" + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "1.3.0" - vector_math: + version: "2.1.4" + vm_service: dependency: transitive description: - name: vector_math - url: "https://pub.dartlang.org" + name: vm_service + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "14.3.1" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=3.7.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index bcf0175..ca985e1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,14 +13,15 @@ flutter: android: package: com.example.fluttershare pluginClass: FlutterSharePlugin + dartPluginClass: FlutterShareMethod ios: pluginClass: FlutterSharePlugin + dartPluginClass: FlutterShareMethod dev_dependencies: flutter_test: sdk: flutter - pedantic: ^1.11.0 environment: sdk: '>=2.12.0 <3.0.0' - flutter: '>=1.10.0' \ No newline at end of file + flutter: '>=2.0.0' \ No newline at end of file