From 07398ae730a3f27e4eb4481ef48ae0bee945247b Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 3 Dec 2024 14:26:05 +0800 Subject: [PATCH 01/19] feat(share_plus): Added excludedActivityTypes support for the iOS platform. --- .../Sources/share_plus/FPPSharePlusPlugin.m | 73 ++++++++++++++++++- .../share_plus/share_plus/lib/share_plus.dart | 20 ++++- .../share_plus/lib/src/share_plus_linux.dart | 3 + .../share_plus/lib/src/share_plus_web.dart | 3 + .../lib/src/share_plus_windows.dart | 3 + .../method_channel/method_channel_share.dart | 19 +++++ .../share_plus_platform.dart | 37 ++++++++++ 7 files changed, 156 insertions(+), 2 deletions(-) diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index bb3d501e50..e1dcb37637 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -39,6 +39,59 @@ return viewController; } +static NSDictionary *activityTypes; + +static void initializeActivityTypeMapping(void) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableDictionary *originalTypes = + [[NSMutableDictionary alloc] initWithDictionary:@{ + @"postToFacebook" : UIActivityTypePostToFacebook, + @"postToTwitter" : UIActivityTypePostToTwitter, + @"postToWeibo" : UIActivityTypePostToWeibo, + @"message" : UIActivityTypeMessage, + @"mail" : UIActivityTypeMail, + @"print" : UIActivityTypePrint, + @"copyToPasteboard" : UIActivityTypeCopyToPasteboard, + @"assignToContact" : UIActivityTypeAssignToContact, + @"saveToCameraRoll" : UIActivityTypeSaveToCameraRoll, + @"addToReadingList" : UIActivityTypeAddToReadingList, + @"postToFlickr" : UIActivityTypePostToFlickr, + @"postToVimeo" : UIActivityTypePostToVimeo, + @"postToTencentWeibo" : UIActivityTypePostToTencentWeibo, + @"airDrop" : UIActivityTypeAirDrop, + @"openInIBooks" : UIActivityTypeOpenInIBooks, + @"markupAsPDF" : UIActivityTypeMarkupAsPDF, + }]; + + if (@available(iOS 15.4, *)) { + originalTypes[@"sharePlay"] = UIActivityTypeSharePlay; + } + + if (@available(iOS 16.0, *)) { + originalTypes[@"collaborationInviteWithLink"] = + UIActivityTypeCollaborationInviteWithLink; + } + + if (@available(iOS 16.0, *)) { + originalTypes[@"collaborationCopyLink"] = + UIActivityTypeCollaborationCopyLink; + } + if (@available(iOS 16.4, *)) { + originalTypes[@"addToHomeScreen"] = UIActivityTypeAddToHomeScreen; + } + activityTypes = originalTypes; + }); +} + +UIActivityType activityTypeForString(NSString *activityTypeString) { + initializeActivityTypeMapping(); + if ([activityTypes.allKeys containsObject:activityTypeString]) { + return activityTypes[activityTypeString]; + } + return nil; +} + // We need the companion to avoid ARC deadlock @interface UIActivityViewSuccessCompanion : NSObject @@ -254,6 +307,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originY = arguments[@"originY"]; NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; + NSArray *activityType = arguments[@"activityTypes"]; CGRect originRect = CGRectZero; if (originX && originY && originWidth && originHeight) { @@ -285,6 +339,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { [self shareText:shareText subject:shareSubject + activityType:activityType withController:topViewController atSource:originRect toResult:result]; @@ -323,6 +378,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { withMimeType:mimeTypes withSubject:subject withText:text + activityType:activityType withController:topViewController atSource:originRect toResult:result]; @@ -347,6 +403,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { TopViewControllerForViewController(rootViewController); [self shareUri:uri + activityType:activityType withController:topViewController atSource:originRect toResult:result]; @@ -358,6 +415,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { + (void)share:(NSArray *)shareItems withSubject:(NSString *)subject + activityType:(NSArray *)activityType withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { @@ -369,7 +427,14 @@ + (void)share:(NSArray *)shareItems if (![subject isKindOfClass:[NSNull class]]) { [activityViewController setValue:subject forKey:@"subject"]; } - + NSMutableArray *excludedActivityTypes = [[NSMutableArray alloc] init]; + for (NSString *type in activityType) { + UIActivityType activityType = activityTypeForString(type); + if (activityType != nil) { + [excludedActivityTypes addObject:activityType]; + } + } + activityViewController.excludedActivityTypes = excludedActivityTypes; activityViewController.popoverPresentationController.sourceView = controller.view; BOOL isCoordinateSpaceOfSourceView = @@ -413,12 +478,14 @@ + (void)share:(NSArray *)shareItems } + (void)shareUri:(NSString *)uri + activityType:(NSArray *)activityType withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { NSURL *data = [NSURL URLWithString:uri]; [self share:@[ data ] withSubject:nil + activityType:activityType withController:controller atSource:origin toResult:result]; @@ -426,6 +493,7 @@ + (void)shareUri:(NSString *)uri + (void)shareText:(NSString *)shareText subject:(NSString *)subject + activityType:(NSArray *)activityType withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { @@ -433,6 +501,7 @@ + (void)shareText:(NSString *)shareText text:shareText]; [self share:@[ data ] withSubject:subject + activityType:activityType withController:controller atSource:origin toResult:result]; @@ -442,6 +511,7 @@ + (void)shareFiles:(NSArray *)paths withMimeType:(NSArray *)mimeTypes withSubject:(NSString *)subject withText:(NSString *)text + activityType:(NSArray *)activityType withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { @@ -461,6 +531,7 @@ + (void)shareFiles:(NSArray *)paths [self share:items withSubject:subject + activityType:activityType withController:controller atSource:origin toResult:result]; diff --git a/packages/share_plus/share_plus/lib/share_plus.dart b/packages/share_plus/share_plus/lib/share_plus.dart index 52e50d624d..09423f82c5 100644 --- a/packages/share_plus/share_plus/lib/share_plus.dart +++ b/packages/share_plus/share_plus/lib/share_plus.dart @@ -8,7 +8,7 @@ import 'dart:ui'; import 'package:share_plus_platform_interface/share_plus_platform_interface.dart'; export 'package:share_plus_platform_interface/share_plus_platform_interface.dart' - show ShareResult, ShareResultStatus, XFile; + show ShareResult, ShareResultStatus, XFile, CupertinoActivityType; export 'src/share_plus_linux.dart'; export 'src/share_plus_windows.dart' @@ -30,6 +30,10 @@ class Share { /// origin rect for the share sheet to popover from on iPads and Macs. It has no effect /// on other devices. /// + /// The optional [activityType] parameter is used to exclude services on iOS and macOS that + /// you feel are not suitable for your content. + /// It has no effect on other platforms. + /// /// May throw [PlatformException] /// from [MethodChannel]. /// @@ -37,10 +41,12 @@ class Share { static Future shareUri( Uri uri, { Rect? sharePositionOrigin, + List? activityType, }) async { return _platform.shareUri( uri, sharePositionOrigin: sharePositionOrigin, + activityType: activityType, ); } @@ -57,6 +63,10 @@ class Share { /// origin rect for the share sheet to popover from on iPads and Macs. It has no effect /// on other devices. /// + /// The optional [activityType] parameter is used to exclude services on iOS and macOS that + /// you feel are not suitable for your content. + /// It has no effect on other platforms. + /// /// May throw [PlatformException] or [FormatException] /// from [MethodChannel]. /// @@ -83,12 +93,14 @@ class Share { String text, { String? subject, Rect? sharePositionOrigin, + List? activityType, }) async { assert(text.isNotEmpty); return _platform.share( text, subject: subject, sharePositionOrigin: sharePositionOrigin, + activityType: activityType, ); } @@ -111,6 +123,10 @@ class Share { /// origin rect for the share sheet to popover from on iPads and Macs. It has no effect /// on other devices. /// + /// The optional [activityType] parameter is used to exclude services on iOS and macOS that + /// you feel are not suitable for your content. + /// It has no effect on other platforms. + /// /// The optional parameter [fileNameOverrides] can be used to override the names of shared files /// When set, the list length must match the number of [files] to share. /// This is useful when sharing files that were created by [`XFile.fromData`](https://github.com/flutter/packages/blob/754de1918a339270b70971b6841cf1e04dd71050/packages/cross_file/lib/src/types/io.dart#L43), @@ -125,6 +141,7 @@ class Share { String? subject, String? text, Rect? sharePositionOrigin, + List? activityType, List? fileNameOverrides, }) async { assert(files.isNotEmpty); @@ -133,6 +150,7 @@ class Share { subject: subject, text: text, sharePositionOrigin: sharePositionOrigin, + activityType: activityType, fileNameOverrides: fileNameOverrides, ); } diff --git a/packages/share_plus/share_plus/lib/src/share_plus_linux.dart b/packages/share_plus/share_plus/lib/src/share_plus_linux.dart index 03132bddc0..95b8d37ade 100644 --- a/packages/share_plus/share_plus/lib/src/share_plus_linux.dart +++ b/packages/share_plus/share_plus/lib/src/share_plus_linux.dart @@ -24,6 +24,7 @@ class SharePlusLinuxPlugin extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, + List? activityType, }) async { throw UnimplementedError( 'shareUri() has not been implemented on Linux. Use share().'); @@ -35,6 +36,7 @@ class SharePlusLinuxPlugin extends SharePlatform { String text, { String? subject, Rect? sharePositionOrigin, + List? activityType, }) async { final queryParameters = { if (subject != null) 'subject': subject, @@ -68,6 +70,7 @@ class SharePlusLinuxPlugin extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, + List? activityType, List? fileNameOverrides, }) { throw UnimplementedError( diff --git a/packages/share_plus/share_plus/lib/src/share_plus_web.dart b/packages/share_plus/share_plus/lib/src/share_plus_web.dart index 45d7968aee..386ed15692 100644 --- a/packages/share_plus/share_plus/lib/src/share_plus_web.dart +++ b/packages/share_plus/share_plus/lib/src/share_plus_web.dart @@ -32,6 +32,7 @@ class SharePlusWebPlugin extends SharePlatform { Future shareUri( Uri uri, { Rect? sharePositionOrigin, + List? activityType, }) async { final data = ShareData( url: uri.toString(), @@ -76,6 +77,7 @@ class SharePlusWebPlugin extends SharePlatform { String text, { String? subject, Rect? sharePositionOrigin, + List? activityType, }) async { final ShareData data; if (subject != null && subject.isNotEmpty) { @@ -160,6 +162,7 @@ class SharePlusWebPlugin extends SharePlatform { String? text, Rect? sharePositionOrigin, List? fileNameOverrides, + List? activityType, }) async { assert( fileNameOverrides == null || files.length == fileNameOverrides.length); diff --git a/packages/share_plus/share_plus/lib/src/share_plus_windows.dart b/packages/share_plus/share_plus/lib/src/share_plus_windows.dart index 5a660e4763..2af62b4c6d 100644 --- a/packages/share_plus/share_plus/lib/src/share_plus_windows.dart +++ b/packages/share_plus/share_plus/lib/src/share_plus_windows.dart @@ -28,6 +28,7 @@ class SharePlusWindowsPlugin extends SharePlatform { Uri uri, { String? subject, String? text, + List? activityType, Rect? sharePositionOrigin, }) async { throw UnimplementedError( @@ -39,6 +40,7 @@ class SharePlusWindowsPlugin extends SharePlatform { Future share( String text, { String? subject, + List? activityType, Rect? sharePositionOrigin, }) async { final queryParameters = { @@ -73,6 +75,7 @@ class SharePlusWindowsPlugin extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, + List? activityType, List? fileNameOverrides, }) { throw UnimplementedError( diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index bb7fa696c6..ec2e1fc5f8 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -9,6 +9,7 @@ import 'dart:io'; // ignore: unnecessary_import import 'dart:ui'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart' show visibleForTesting; import 'package:mime/mime.dart' show extensionFromMime, lookupMimeType; @@ -27,6 +28,7 @@ class MethodChannelShare extends SharePlatform { Future shareUri( Uri uri, { Rect? sharePositionOrigin, + List? activityType, }) async { final params = {'uri': uri.toString()}; @@ -37,6 +39,11 @@ class MethodChannelShare extends SharePlatform { params['originHeight'] = sharePositionOrigin.height; } + if (activityType != null) { + final activityTypes = activityType.map((e) => e.value).toList(); + params['activityTypes'] = activityTypes; + } + final result = await channel.invokeMethod('shareUri', params) ?? 'dev.fluttercommunity.plus/share/unavailable'; @@ -49,6 +56,7 @@ class MethodChannelShare extends SharePlatform { String text, { String? subject, Rect? sharePositionOrigin, + List? activityType, }) async { assert(text.isNotEmpty); final params = { @@ -63,6 +71,11 @@ class MethodChannelShare extends SharePlatform { params['originHeight'] = sharePositionOrigin.height; } + if (activityType != null) { + final activityTypes = activityType.map((e) => e.value).toList(); + params['activityTypes'] = activityTypes; + } + final result = await channel.invokeMethod('share', params) ?? 'dev.fluttercommunity.plus/share/unavailable'; @@ -76,6 +89,7 @@ class MethodChannelShare extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, + List? activityType, List? fileNameOverrides, }) async { assert(files.isNotEmpty); @@ -109,6 +123,11 @@ class MethodChannelShare extends SharePlatform { params['originHeight'] = sharePositionOrigin.height; } + if (activityType != null) { + final activityTypes = activityType.map((e) => e.value).toList(); + params['activityTypes'] = activityTypes; + } + final result = await channel.invokeMethod('shareFiles', params) ?? 'dev.fluttercommunity.plus/share/unavailable'; diff --git a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart index f1840624ef..68271bd797 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart @@ -35,10 +35,12 @@ class SharePlatform extends PlatformInterface { Future shareUri( Uri uri, { Rect? sharePositionOrigin, + List? activityType, }) { return _instance.shareUri( uri, sharePositionOrigin: sharePositionOrigin, + activityType: activityType, ); } @@ -47,11 +49,13 @@ class SharePlatform extends PlatformInterface { String text, { String? subject, Rect? sharePositionOrigin, + List? activityType, }) async { return await _instance.share( text, subject: subject, sharePositionOrigin: sharePositionOrigin, + activityType: activityType, ); } @@ -61,6 +65,7 @@ class SharePlatform extends PlatformInterface { String? subject, String? text, Rect? sharePositionOrigin, + List? activityType, List? fileNameOverrides, }) async { return _instance.shareXFiles( @@ -68,6 +73,7 @@ class SharePlatform extends PlatformInterface { subject: subject, text: text, sharePositionOrigin: sharePositionOrigin, + activityType: activityType, fileNameOverrides: fileNameOverrides, ); } @@ -126,3 +132,34 @@ enum ShareResultStatus { /// but the user action can not be determined unavailable, } + +/// An abstract class that you subclass to implement app-specific services +/// for iOS and macOS. +/// +/// https://developer.apple.com/documentation/uikit/uiactivity/activitytype +enum CupertinoActivityType { + postToFacebook, + postToTwitter, + postToWeibo, + message, + mail, + print, + copyToPasteboard, + assignToContact, + saveToCameraRoll, + addToReadingList, + postToFlickr, + postToVimeo, + postToTencentWeibo, + airDrop, + openInIBooks, + markupAsPDF, + sharePlay, + collaborationInviteWithLink, + collaborationCopyLink, + addToHomeScreen, +} + +extension Value on CupertinoActivityType { + String get value => toString().split('.').last; +} From 64cc1fe8af57530117f36ee6cb35658b3784fa88 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 3 Dec 2024 18:17:53 +0800 Subject: [PATCH 02/19] added test parameter --- .../share_plus_platform_interface_test.dart | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index 03c796bddc..642126b11e 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -65,6 +65,9 @@ void main() { await sharePlatform.shareUri( Uri.parse('https://pub.dev/packages/share_plus'), sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + activityType: [ + CupertinoActivityType.message, + ], ); verify(mockChannel.invokeMethod('shareUri', { 'uri': 'https://pub.dev/packages/share_plus', @@ -72,12 +75,18 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, + 'activityTypes': [ + CupertinoActivityType.message.value, + ], })); await sharePlatform.share( 'some text to share', subject: 'some subject to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + activityType: [ + CupertinoActivityType.message, + ], ); verify(mockChannel.invokeMethod('share', { 'text': 'some text to share', @@ -86,6 +95,9 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, + 'activityTypes': [ + CupertinoActivityType.message.value, + ], })); await withFile('tempfile-83649a.png', (File fd) async { @@ -94,6 +106,9 @@ void main() { subject: 'some subject to share', text: 'some text to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + activityType: [ + CupertinoActivityType.message, + ], ); verify(mockChannel.invokeMethod( 'shareFiles', @@ -106,6 +121,9 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, + 'activityTypes': [ + CupertinoActivityType.message.value, + ], }, )); }); @@ -155,6 +173,9 @@ void main() { 'some text to share', subject: 'some subject to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + activityType: [ + CupertinoActivityType.message, + ], ); verify(mockChannel.invokeMethod('share', { 'text': 'some text to share', @@ -163,6 +184,9 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, + 'activityTypes': [ + CupertinoActivityType.message.value, + ], })); await withFile('tempfile-83649e.png', (File fd) async { From 5a151b2b295813d1c638a02a3384b124cdb45f8e Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Mon, 9 Dec 2024 11:41:36 +0800 Subject: [PATCH 03/19] fix(share_plus): the ambiguity caused by the parameter name. --- .../Sources/share_plus/FPPSharePlusPlugin.m | 110 +++++++++--------- .../share_plus/share_plus/lib/share_plus.dart | 18 +-- .../share_plus/lib/src/share_plus_linux.dart | 6 +- .../share_plus/lib/src/share_plus_web.dart | 6 +- .../lib/src/share_plus_windows.dart | 6 +- .../method_channel/method_channel_share.dart | 24 ++-- .../share_plus_platform.dart | 12 +- .../share_plus_platform_interface_test.dart | 32 ++--- 8 files changed, 99 insertions(+), 115 deletions(-) diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index 4b1d35217e..76c6b658e7 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -84,7 +84,7 @@ static void initializeActivityTypeMapping(void) { }); } -UIActivityType activityTypeForString(NSString *activityTypeString) { +static UIActivityType activityTypeForString(NSString *activityTypeString) { initializeActivityTypeMapping(); if ([activityTypes.allKeys containsObject:activityTypeString]) { return activityTypes[activityTypeString]; @@ -307,7 +307,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originY = arguments[@"originY"]; NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; - NSArray *activityType = arguments[@"activityTypes"]; + NSArray *excludedActivityType = arguments[@"excludedActivityType"]; CGRect originRect = CGRectZero; if (originX && originY && originWidth && originHeight) { @@ -338,11 +338,11 @@ + (void)registerWithRegistrar:(NSObject *)registrar { TopViewControllerForViewController(rootViewController); [self shareText:shareText - subject:shareSubject - activityType:activityType - withController:topViewController - atSource:originRect - toResult:result]; + subject:shareSubject + excludedActivityType:excludedActivityType + withController:topViewController + atSource:originRect + toResult:result]; } else if ([@"shareFiles" isEqualToString:call.method]) { NSArray *paths = arguments[@"paths"]; NSArray *mimeTypes = arguments[@"mimeTypes"]; @@ -375,13 +375,13 @@ + (void)registerWithRegistrar:(NSObject *)registrar { UIViewController *topViewController = TopViewControllerForViewController(rootViewController); [self shareFiles:paths - withMimeType:mimeTypes - withSubject:subject - withText:text - activityType:activityType - withController:topViewController - atSource:originRect - toResult:result]; + withMimeType:mimeTypes + withSubject:subject + withText:text + excludedActivityType:excludedActivityType + withController:topViewController + atSource:originRect + toResult:result]; } else if ([@"shareUri" isEqualToString:call.method]) { NSString *uri = arguments[@"uri"]; @@ -403,10 +403,10 @@ + (void)registerWithRegistrar:(NSObject *)registrar { TopViewControllerForViewController(rootViewController); [self shareUri:uri - activityType:activityType - withController:topViewController - atSource:originRect - toResult:result]; + excludedActivityType:excludedActivityType + withController:topViewController + atSource:originRect + toResult:result]; } else { result(FlutterMethodNotImplemented); } @@ -414,11 +414,11 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } + (void)share:(NSArray *)shareItems - withSubject:(NSString *)subject - activityType:(NSArray *)activityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + withSubject:(NSString *)subject + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { UIActivityViewSuccessController *activityViewController = [[UIActivityViewSuccessController alloc] initWithActivityItems:shareItems applicationActivities:nil]; @@ -428,7 +428,7 @@ + (void)share:(NSArray *)shareItems [activityViewController setValue:subject forKey:@"subject"]; } NSMutableArray *excludedActivityTypes = [[NSMutableArray alloc] init]; - for (NSString *type in activityType) { + for (NSString *type in excludedActivityType) { UIActivityType activityType = activityTypeForString(type); if (activityType != nil) { [excludedActivityTypes addObject:activityType]; @@ -478,43 +478,43 @@ + (void)share:(NSArray *)shareItems } + (void)shareUri:(NSString *)uri - activityType:(NSArray *)activityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSURL *data = [NSURL URLWithString:uri]; [self share:@[ data ] - withSubject:nil - activityType:activityType - withController:controller - atSource:origin - toResult:result]; + withSubject:nil + excludedActivityType:excludedActivityType + withController:controller + atSource:origin + toResult:result]; } + (void)shareText:(NSString *)shareText - subject:(NSString *)subject - activityType:(NSArray *)activityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + subject:(NSString *)subject + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSObject *data = [[SharePlusData alloc] initWithSubject:subject text:shareText]; [self share:@[ data ] - withSubject:subject - activityType:activityType - withController:controller - atSource:origin - toResult:result]; + withSubject:subject + excludedActivityType:excludedActivityType + withController:controller + atSource:origin + toResult:result]; } + (void)shareFiles:(NSArray *)paths - withMimeType:(NSArray *)mimeTypes - withSubject:(NSString *)subject - withText:(NSString *)text - activityType:(NSArray *)activityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + withMimeType:(NSArray *)mimeTypes + withSubject:(NSString *)subject + withText:(NSString *)text + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSMutableArray *items = [[NSMutableArray alloc] init]; for (int i = 0; i < [paths count]; i++) { @@ -530,11 +530,11 @@ + (void)shareFiles:(NSArray *)paths } [self share:items - withSubject:subject - activityType:activityType - withController:controller - atSource:origin - toResult:result]; + withSubject:subject + excludedActivityType:excludedActivityType + withController:controller + atSource:origin + toResult:result]; } @end diff --git a/packages/share_plus/share_plus/lib/share_plus.dart b/packages/share_plus/share_plus/lib/share_plus.dart index 09423f82c5..c8ba1b2440 100644 --- a/packages/share_plus/share_plus/lib/share_plus.dart +++ b/packages/share_plus/share_plus/lib/share_plus.dart @@ -30,7 +30,7 @@ class Share { /// origin rect for the share sheet to popover from on iPads and Macs. It has no effect /// on other devices. /// - /// The optional [activityType] parameter is used to exclude services on iOS and macOS that + /// The optional [excludedActivityType] parameter is used to exclude services on iOS and macOS that /// you feel are not suitable for your content. /// It has no effect on other platforms. /// @@ -41,12 +41,12 @@ class Share { static Future shareUri( Uri uri, { Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { return _platform.shareUri( uri, sharePositionOrigin: sharePositionOrigin, - activityType: activityType, + excludedActivityType: excludedActivityType, ); } @@ -63,7 +63,7 @@ class Share { /// origin rect for the share sheet to popover from on iPads and Macs. It has no effect /// on other devices. /// - /// The optional [activityType] parameter is used to exclude services on iOS and macOS that + /// The optional [excludedActivityType] parameter is used to exclude services on iOS and macOS that /// you feel are not suitable for your content. /// It has no effect on other platforms. /// @@ -93,14 +93,14 @@ class Share { String text, { String? subject, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { assert(text.isNotEmpty); return _platform.share( text, subject: subject, sharePositionOrigin: sharePositionOrigin, - activityType: activityType, + excludedActivityType: excludedActivityType, ); } @@ -123,7 +123,7 @@ class Share { /// origin rect for the share sheet to popover from on iPads and Macs. It has no effect /// on other devices. /// - /// The optional [activityType] parameter is used to exclude services on iOS and macOS that + /// The optional [excludedActivityType] parameter is used to exclude services on iOS and macOS that /// you feel are not suitable for your content. /// It has no effect on other platforms. /// @@ -141,7 +141,7 @@ class Share { String? subject, String? text, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, List? fileNameOverrides, }) async { assert(files.isNotEmpty); @@ -150,7 +150,7 @@ class Share { subject: subject, text: text, sharePositionOrigin: sharePositionOrigin, - activityType: activityType, + excludedActivityType: excludedActivityType, fileNameOverrides: fileNameOverrides, ); } diff --git a/packages/share_plus/share_plus/lib/src/share_plus_linux.dart b/packages/share_plus/share_plus/lib/src/share_plus_linux.dart index 95b8d37ade..7cc2d5965b 100644 --- a/packages/share_plus/share_plus/lib/src/share_plus_linux.dart +++ b/packages/share_plus/share_plus/lib/src/share_plus_linux.dart @@ -24,7 +24,7 @@ class SharePlusLinuxPlugin extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { throw UnimplementedError( 'shareUri() has not been implemented on Linux. Use share().'); @@ -36,7 +36,7 @@ class SharePlusLinuxPlugin extends SharePlatform { String text, { String? subject, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { final queryParameters = { if (subject != null) 'subject': subject, @@ -70,7 +70,7 @@ class SharePlusLinuxPlugin extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, List? fileNameOverrides, }) { throw UnimplementedError( diff --git a/packages/share_plus/share_plus/lib/src/share_plus_web.dart b/packages/share_plus/share_plus/lib/src/share_plus_web.dart index 386ed15692..fec316e0e3 100644 --- a/packages/share_plus/share_plus/lib/src/share_plus_web.dart +++ b/packages/share_plus/share_plus/lib/src/share_plus_web.dart @@ -32,7 +32,7 @@ class SharePlusWebPlugin extends SharePlatform { Future shareUri( Uri uri, { Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { final data = ShareData( url: uri.toString(), @@ -77,7 +77,7 @@ class SharePlusWebPlugin extends SharePlatform { String text, { String? subject, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { final ShareData data; if (subject != null && subject.isNotEmpty) { @@ -162,7 +162,7 @@ class SharePlusWebPlugin extends SharePlatform { String? text, Rect? sharePositionOrigin, List? fileNameOverrides, - List? activityType, + List? excludedActivityType, }) async { assert( fileNameOverrides == null || files.length == fileNameOverrides.length); diff --git a/packages/share_plus/share_plus/lib/src/share_plus_windows.dart b/packages/share_plus/share_plus/lib/src/share_plus_windows.dart index 2af62b4c6d..b1a7946790 100644 --- a/packages/share_plus/share_plus/lib/src/share_plus_windows.dart +++ b/packages/share_plus/share_plus/lib/src/share_plus_windows.dart @@ -28,7 +28,7 @@ class SharePlusWindowsPlugin extends SharePlatform { Uri uri, { String? subject, String? text, - List? activityType, + List? excludedActivityType, Rect? sharePositionOrigin, }) async { throw UnimplementedError( @@ -40,7 +40,7 @@ class SharePlusWindowsPlugin extends SharePlatform { Future share( String text, { String? subject, - List? activityType, + List? excludedActivityType, Rect? sharePositionOrigin, }) async { final queryParameters = { @@ -75,7 +75,7 @@ class SharePlusWindowsPlugin extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, List? fileNameOverrides, }) { throw UnimplementedError( diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index ec2e1fc5f8..20f3a9ce81 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -28,7 +28,7 @@ class MethodChannelShare extends SharePlatform { Future shareUri( Uri uri, { Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { final params = {'uri': uri.toString()}; @@ -39,9 +39,9 @@ class MethodChannelShare extends SharePlatform { params['originHeight'] = sharePositionOrigin.height; } - if (activityType != null) { - final activityTypes = activityType.map((e) => e.value).toList(); - params['activityTypes'] = activityTypes; + if (excludedActivityType != null) { + final activityTypes = excludedActivityType.map((e) => e.value).toList(); + params['excludedActivityType'] = activityTypes; } final result = await channel.invokeMethod('shareUri', params) ?? @@ -56,7 +56,7 @@ class MethodChannelShare extends SharePlatform { String text, { String? subject, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { assert(text.isNotEmpty); final params = { @@ -71,9 +71,9 @@ class MethodChannelShare extends SharePlatform { params['originHeight'] = sharePositionOrigin.height; } - if (activityType != null) { - final activityTypes = activityType.map((e) => e.value).toList(); - params['activityTypes'] = activityTypes; + if (excludedActivityType != null) { + final activityTypes = excludedActivityType.map((e) => e.value).toList(); + params['excludedActivityType'] = activityTypes; } final result = await channel.invokeMethod('share', params) ?? @@ -89,7 +89,7 @@ class MethodChannelShare extends SharePlatform { String? subject, String? text, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, List? fileNameOverrides, }) async { assert(files.isNotEmpty); @@ -123,9 +123,9 @@ class MethodChannelShare extends SharePlatform { params['originHeight'] = sharePositionOrigin.height; } - if (activityType != null) { - final activityTypes = activityType.map((e) => e.value).toList(); - params['activityTypes'] = activityTypes; + if (excludedActivityType != null) { + final activityTypes = excludedActivityType.map((e) => e.value).toList(); + params['excludedActivityType'] = activityTypes; } final result = await channel.invokeMethod('shareFiles', params) ?? diff --git a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart index 68271bd797..18d8821bac 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart @@ -35,12 +35,12 @@ class SharePlatform extends PlatformInterface { Future shareUri( Uri uri, { Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) { return _instance.shareUri( uri, sharePositionOrigin: sharePositionOrigin, - activityType: activityType, + excludedActivityType: excludedActivityType, ); } @@ -49,13 +49,13 @@ class SharePlatform extends PlatformInterface { String text, { String? subject, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, }) async { return await _instance.share( text, subject: subject, sharePositionOrigin: sharePositionOrigin, - activityType: activityType, + excludedActivityType: excludedActivityType, ); } @@ -65,7 +65,7 @@ class SharePlatform extends PlatformInterface { String? subject, String? text, Rect? sharePositionOrigin, - List? activityType, + List? excludedActivityType, List? fileNameOverrides, }) async { return _instance.shareXFiles( @@ -73,7 +73,7 @@ class SharePlatform extends PlatformInterface { subject: subject, text: text, sharePositionOrigin: sharePositionOrigin, - activityType: activityType, + excludedActivityType: excludedActivityType, fileNameOverrides: fileNameOverrides, ); } diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index 642126b11e..cd4dee00ca 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -65,9 +65,7 @@ void main() { await sharePlatform.shareUri( Uri.parse('https://pub.dev/packages/share_plus'), sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - activityType: [ - CupertinoActivityType.message, - ], + excludedActivityType: [CupertinoActivityType.message], ); verify(mockChannel.invokeMethod('shareUri', { 'uri': 'https://pub.dev/packages/share_plus', @@ -75,18 +73,14 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, - 'activityTypes': [ - CupertinoActivityType.message.value, - ], + 'excludedActivityType': [CupertinoActivityType.message.value], })); await sharePlatform.share( 'some text to share', subject: 'some subject to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - activityType: [ - CupertinoActivityType.message, - ], + excludedActivityType: [CupertinoActivityType.message], ); verify(mockChannel.invokeMethod('share', { 'text': 'some text to share', @@ -95,9 +89,7 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, - 'activityTypes': [ - CupertinoActivityType.message.value, - ], + 'excludedActivityType': [CupertinoActivityType.message.value], })); await withFile('tempfile-83649a.png', (File fd) async { @@ -106,9 +98,7 @@ void main() { subject: 'some subject to share', text: 'some text to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - activityType: [ - CupertinoActivityType.message, - ], + excludedActivityType: [CupertinoActivityType.message], ); verify(mockChannel.invokeMethod( 'shareFiles', @@ -121,9 +111,7 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, - 'activityTypes': [ - CupertinoActivityType.message.value, - ], + 'excludedActivityType': [CupertinoActivityType.message.value], }, )); }); @@ -173,9 +161,7 @@ void main() { 'some text to share', subject: 'some subject to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - activityType: [ - CupertinoActivityType.message, - ], + excludedActivityType: [CupertinoActivityType.message], ); verify(mockChannel.invokeMethod('share', { 'text': 'some text to share', @@ -184,9 +170,7 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, - 'activityTypes': [ - CupertinoActivityType.message.value, - ], + 'excludedActivityType': [CupertinoActivityType.message.value], })); await withFile('tempfile-83649e.png', (File fd) async { From 67bc12c7143b46b0a71c345c74c67d99426b9f79 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Mon, 21 Apr 2025 11:49:10 +0800 Subject: [PATCH 04/19] add example --- .../example/lib/excluded_activity_type.dart | 75 ++++ .../share_plus/example/lib/main.dart | 349 ++++++++++-------- .../Sources/share_plus/FPPSharePlusPlugin.m | 2 +- .../share_plus/share_plus/lib/share_plus.dart | 2 +- .../method_channel/method_channel_share.dart | 10 +- .../share_plus_platform.dart | 2 +- .../share_plus_platform_interface_test.dart | 1 + 7 files changed, 275 insertions(+), 166 deletions(-) create mode 100644 packages/share_plus/share_plus/example/lib/excluded_activity_type.dart diff --git a/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart b/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart new file mode 100644 index 0000000000..dba19d68ed --- /dev/null +++ b/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:share_plus/share_plus.dart'; + +class ExcludedActivityTypePage extends StatefulWidget { + final List? excludedActivityType; + + const ExcludedActivityTypePage({ + super.key, + this.excludedActivityType, + }); + + @override + State createState() => _ExcludedActivityTypePageState(); +} + +class _ExcludedActivityTypePageState extends State { + final List options = []; + final List selected = []; + + @override + void initState() { + for (final type in CupertinoActivityType.values) { + options.add(type.value); + } + if (widget.excludedActivityType != null && + widget.excludedActivityType!.isNotEmpty) { + for (final type in widget.excludedActivityType!) { + selected.add(type.value); + } + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Excluded Activity Type'), + actions: [ + IconButton( + icon: const Icon(Icons.check), + onPressed: () { + final List tempSelected = []; + for (final String type in selected) { + tempSelected.add( + CupertinoActivityType.values + .firstWhere((e) => e.value == type), + ); + } + Navigator.pop(context, tempSelected); + }, + ), + ], + ), + body: ListView( + children: options.map((option) { + return CheckboxListTile( + value: selected.contains(option), + title: Text(option), + controlAffinity: ListTileControlAffinity.leading, + onChanged: (bool? checked) { + setState(() { + if (checked == true) { + selected.add(option); + } else { + selected.remove(option); + } + }); + }, + ); + }).toList(), + ), + ); + } +} diff --git a/packages/share_plus/share_plus/example/lib/main.dart b/packages/share_plus/share_plus/example/lib/main.dart index e698caa98c..dbcf089b75 100644 --- a/packages/share_plus/share_plus/example/lib/main.dart +++ b/packages/share_plus/share_plus/example/lib/main.dart @@ -6,7 +6,6 @@ import 'dart:convert'; import 'dart:io'; - import 'package:file_selector/file_selector.dart' hide XFile; // hides to test if share_plus exports XFile import 'package:flutter/foundation.dart'; @@ -16,20 +15,37 @@ import 'package:image_picker/image_picker.dart' hide XFile; // hides to test if share_plus exports XFile import 'package:share_plus/share_plus.dart'; +import 'excluded_activity_type.dart'; import 'image_previews.dart'; void main() { - runApp(const DemoApp()); + runApp(const MyApp()); } -class DemoApp extends StatefulWidget { - const DemoApp({super.key}); +class MyApp extends StatelessWidget { + const MyApp({super.key}); @override - DemoAppState createState() => DemoAppState(); + Widget build(BuildContext context) { + return MaterialApp( + title: 'Share Plus Plugin Demo', + theme: ThemeData( + useMaterial3: true, + colorSchemeSeed: const Color(0x9f4376f8), + ), + home: const MyHomePage(), + ); + } } -class DemoAppState extends State { +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key}); + + @override + State createState() => MyHomePageState(); +} + +class MyHomePageState extends State { String text = ''; String subject = ''; String title = ''; @@ -37,170 +53,170 @@ class DemoAppState extends State { String fileName = ''; List imageNames = []; List imagePaths = []; + List cupertinoExcludedActivityType = []; @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Share Plus Plugin Demo', - theme: ThemeData( - useMaterial3: true, - colorSchemeSeed: const Color(0x9f4376f8), + return Scaffold( + appBar: AppBar( + title: const Text('Share Plus Plugin Demo'), + elevation: 4, ), - home: Scaffold( - appBar: AppBar( - title: const Text('Share Plus Plugin Demo'), - elevation: 4, - ), - body: SingleChildScrollView( - padding: const EdgeInsets.all(24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'Share text', - hintText: 'Enter some text and/or link to share', - ), - maxLines: null, - onChanged: (String value) => setState(() { - text = value; - }), - ), - const SizedBox(height: 16), - TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'Share subject', - hintText: 'Enter subject to share (optional)', - ), - maxLines: null, - onChanged: (String value) => setState(() { - subject = value; - }), + body: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Share text', + hintText: 'Enter some text and/or link to share', ), - const SizedBox(height: 16), - TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'Share title', - hintText: 'Enter title to share (optional)', - ), - maxLines: null, - onChanged: (String value) => setState(() { - title = value; - }), - ), - const SizedBox(height: 16), - TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'Share uri', - hintText: 'Enter the uri you want to share', - ), - maxLines: null, - onChanged: (String value) { - setState(() => uri = value); - }, + maxLines: null, + onChanged: (String value) => setState(() { + text = value; + }), + ), + const SizedBox(height: 16), + TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Share subject', + hintText: 'Enter subject to share (optional)', ), - const SizedBox(height: 16), - TextField( - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'Share Text as File', - hintText: 'Enter the filename you want to share your text as', - ), - maxLines: null, - onChanged: (String value) { - setState(() => fileName = value); - }, + maxLines: null, + onChanged: (String value) => setState(() { + subject = value; + }), + ), + const SizedBox(height: 16), + TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Share title', + hintText: 'Enter title to share (optional)', ), - const SizedBox(height: 16), - ImagePreviews(imagePaths, onDelete: _onDeleteImage), - ElevatedButton.icon( - label: const Text('Add image'), - onPressed: () async { - // Using `package:image_picker` to get image from gallery. - if (!kIsWeb && - (Platform.isMacOS || - Platform.isLinux || - Platform.isWindows)) { - // Using `package:file_selector` on windows, macos & Linux, since `package:image_picker` is not supported. - const XTypeGroup typeGroup = XTypeGroup( - label: 'images', - extensions: ['jpg', 'jpeg', 'png', 'gif'], - ); - final file = await openFile( - acceptedTypeGroups: [typeGroup]); - if (file != null) { - setState(() { - imagePaths.add(file.path); - imageNames.add(file.name); - }); - } - } else { - final imagePicker = ImagePicker(); - final pickedFile = await imagePicker.pickImage( - source: ImageSource.gallery, - ); - if (pickedFile != null) { - setState(() { - imagePaths.add(pickedFile.path); - imageNames.add(pickedFile.name); - }); - } - } - }, - icon: const Icon(Icons.add), + maxLines: null, + onChanged: (String value) => setState(() { + title = value; + }), + ), + const SizedBox(height: 16), + TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Share uri', + hintText: 'Enter the uri you want to share', ), - const SizedBox(height: 32), - Builder( - builder: (BuildContext context) { - return ElevatedButton( - style: ElevatedButton.styleFrom( - foregroundColor: Theme.of(context).colorScheme.onPrimary, - backgroundColor: Theme.of(context).colorScheme.primary, - ), - onPressed: text.isEmpty && imagePaths.isEmpty - ? null - : () => _onShareWithResult(context), - child: const Text('Share'), - ); - }, + maxLines: null, + onChanged: (String value) { + setState(() => uri = value); + }, + ), + const SizedBox(height: 16), + TextField( + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Share Text as File', + hintText: 'Enter the filename you want to share your text as', ), - const SizedBox(height: 16), - Builder( - builder: (BuildContext context) { - return ElevatedButton( - style: ElevatedButton.styleFrom( - foregroundColor: Theme.of(context).colorScheme.onPrimary, - backgroundColor: Theme.of(context).colorScheme.primary, - ), - onPressed: () { - _onShareXFileFromAssets(context); - }, - child: const Text('Share XFile from Assets'), + maxLines: null, + onChanged: (String value) { + setState(() => fileName = value); + }, + ), + const SizedBox(height: 16), + ImagePreviews(imagePaths, onDelete: _onDeleteImage), + ElevatedButton.icon( + label: const Text('Add image'), + onPressed: () async { + // Using `package:image_picker` to get image from gallery. + if (!kIsWeb && + (Platform.isMacOS || + Platform.isLinux || + Platform.isWindows)) { + // Using `package:file_selector` on windows, macos & Linux, since `package:image_picker` is not supported. + const XTypeGroup typeGroup = XTypeGroup( + label: 'images', + extensions: ['jpg', 'jpeg', 'png', 'gif'], ); - }, - ), - const SizedBox(height: 16), - Builder( - builder: (BuildContext context) { - return ElevatedButton( - style: ElevatedButton.styleFrom( - foregroundColor: Theme.of(context).colorScheme.onPrimary, - backgroundColor: Theme.of(context).colorScheme.primary, - ), - onPressed: fileName.isEmpty || text.isEmpty - ? null - : () => _onShareTextAsXFile(context), - child: const Text('Share text as XFile'), + final file = await openFile( + acceptedTypeGroups: [typeGroup]); + if (file != null) { + setState(() { + imagePaths.add(file.path); + imageNames.add(file.name); + }); + } + } else { + final imagePicker = ImagePicker(); + final pickedFile = await imagePicker.pickImage( + source: ImageSource.gallery, ); - }, + if (pickedFile != null) { + setState(() { + imagePaths.add(pickedFile.path); + imageNames.add(pickedFile.name); + }); + } + } + }, + icon: const Icon(Icons.add), + ), + if (Platform.isIOS || Platform.isMacOS) const SizedBox(height: 16), + if (Platform.isIOS || Platform.isMacOS) + ElevatedButton( + onPressed: _onSelectExcludedActivityType, + child: Text('add Excluded Activity Type'), ), - ], - ), + const SizedBox(height: 32), + Builder( + builder: (BuildContext context) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onPrimary, + backgroundColor: Theme.of(context).colorScheme.primary, + ), + onPressed: text.isEmpty && imagePaths.isEmpty + ? null + : () => _onShareWithResult(context), + child: const Text('Share'), + ); + }, + ), + const SizedBox(height: 16), + Builder( + builder: (BuildContext context) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onPrimary, + backgroundColor: Theme.of(context).colorScheme.primary, + ), + onPressed: () { + _onShareXFileFromAssets(context); + }, + child: const Text('Share XFile from Assets'), + ); + }, + ), + const SizedBox(height: 16), + Builder( + builder: (BuildContext context) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onPrimary, + backgroundColor: Theme.of(context).colorScheme.primary, + ), + onPressed: fileName.isEmpty || text.isEmpty + ? null + : () => _onShareTextAsXFile(context), + child: const Text('Share text as XFile'), + ); + }, + ), + ], ), ), ); @@ -213,6 +229,18 @@ class DemoAppState extends State { }); } + void _onSelectExcludedActivityType() async { + final result = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ExcludedActivityTypePage( + excludedActivityType: cupertinoExcludedActivityType), + ), + ); + if (result != null) { + cupertinoExcludedActivityType = result; + } + } + void _onShareWithResult(BuildContext context) async { // A builder is used to retrieve the context immediately // surrounding the ElevatedButton. @@ -237,6 +265,7 @@ class DemoAppState extends State { title: title.isEmpty ? null : title, files: files, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + excludedActivityType: [CupertinoActivityType.airDrop], ), ); } else if (uri.isNotEmpty) { @@ -246,6 +275,7 @@ class DemoAppState extends State { subject: subject.isEmpty ? null : subject, title: title.isEmpty ? null : title, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + excludedActivityType: cupertinoExcludedActivityType, ), ); } else { @@ -255,6 +285,7 @@ class DemoAppState extends State { subject: subject.isEmpty ? null : subject, title: title.isEmpty ? null : title, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + excludedActivityType: cupertinoExcludedActivityType, ), ); } @@ -278,6 +309,7 @@ class DemoAppState extends State { ], sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, downloadFallbackEnabled: true, + excludedActivityType: cupertinoExcludedActivityType, ), ); scaffoldMessenger.showSnackBar(getResultSnackBar(shareResult)); @@ -305,6 +337,7 @@ class DemoAppState extends State { sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, fileNameOverrides: [fileName], downloadFallbackEnabled: true, + excludedActivityType: cupertinoExcludedActivityType, ), ); diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index 7f0962cd93..f5b464c543 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -440,8 +440,8 @@ + (void)share:(NSArray *)shareItems [[UIActivityViewSuccessController alloc] initWithActivityItems:shareItems applicationActivities:nil]; - NSMutableArray *excludedActivityTypes = [[NSMutableArray alloc] init]; if(excludedActivityType.count > 0){ + NSMutableArray *excludedActivityTypes = [[NSMutableArray alloc] init]; for (NSString *type in excludedActivityType) { UIActivityType activityType = activityTypeForString(type); if (activityType != nil) { diff --git a/packages/share_plus/share_plus/lib/share_plus.dart b/packages/share_plus/share_plus/lib/share_plus.dart index bfae848b73..ca06c6261a 100644 --- a/packages/share_plus/share_plus/lib/share_plus.dart +++ b/packages/share_plus/share_plus/lib/share_plus.dart @@ -8,7 +8,7 @@ import 'package:meta/meta.dart'; import 'package:share_plus_platform_interface/share_plus_platform_interface.dart'; export 'package:share_plus_platform_interface/share_plus_platform_interface.dart' - show ShareResult, ShareResultStatus, XFile, ShareParams; + show ShareResult, ShareResultStatus, XFile, ShareParams, CupertinoActivityType, CupertinoActivityTypeValue; export 'src/share_plus_linux.dart'; export 'src/share_plus_windows.dart' diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index c10803f670..e56231dd5f 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -50,11 +50,6 @@ class MethodChannelShare extends SharePlatform { map['originHeight'] = params.sharePositionOrigin!.height; } - if(params.excludedActivityType != null) { - final activityTypes = params.excludedActivityType!.map((e) => e.value).toList(); - map['excludedActivityType'] = activityTypes; - } - if (params.files != null) { final filesWithPath = await _getFiles(params.files!, params.fileNameOverrides); @@ -72,6 +67,11 @@ class MethodChannelShare extends SharePlatform { map['mimeTypes'] = mimeTypes; } + if(params.excludedActivityType != null) { + final activityTypes = params.excludedActivityType!.map((e) => e.value).toList(); + map['excludedActivityType'] = activityTypes; + } + return map; } diff --git a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart index 8dbbcfaafa..5aa9dbc589 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart @@ -238,6 +238,6 @@ enum CupertinoActivityType { addToHomeScreen, } -extension Value on CupertinoActivityType { +extension CupertinoActivityTypeValue on CupertinoActivityType { String get value => toString().split('.').last; } diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index b30db3be0d..dfdd94631e 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -74,6 +74,7 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, + 'excludedActivityType': ['airDrop'], })); await sharePlatform.share( From 7a3b5fb422135d49c291ef94a9c9de9e6eb9a745 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Mon, 21 Apr 2025 11:52:54 +0800 Subject: [PATCH 05/19] fix dart format --- packages/share_plus/share_plus/lib/share_plus.dart | 8 +++++++- .../lib/method_channel/method_channel_share.dart | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/share_plus/share_plus/lib/share_plus.dart b/packages/share_plus/share_plus/lib/share_plus.dart index ca06c6261a..ead35f37d5 100644 --- a/packages/share_plus/share_plus/lib/share_plus.dart +++ b/packages/share_plus/share_plus/lib/share_plus.dart @@ -8,7 +8,13 @@ import 'package:meta/meta.dart'; import 'package:share_plus_platform_interface/share_plus_platform_interface.dart'; export 'package:share_plus_platform_interface/share_plus_platform_interface.dart' - show ShareResult, ShareResultStatus, XFile, ShareParams, CupertinoActivityType, CupertinoActivityTypeValue; + show + ShareResult, + ShareResultStatus, + XFile, + ShareParams, + CupertinoActivityType, + CupertinoActivityTypeValue; export 'src/share_plus_linux.dart'; export 'src/share_plus_windows.dart' diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index e56231dd5f..6843658685 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -67,8 +67,9 @@ class MethodChannelShare extends SharePlatform { map['mimeTypes'] = mimeTypes; } - if(params.excludedActivityType != null) { - final activityTypes = params.excludedActivityType!.map((e) => e.value).toList(); + if (params.excludedActivityType != null) { + final activityTypes = + params.excludedActivityType!.map((e) => e.value).toList(); map['excludedActivityType'] = activityTypes; } From 80ff1658e02879e70a68ca43c35d89b980002ec0 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Mon, 21 Apr 2025 11:55:34 +0800 Subject: [PATCH 06/19] fix oc format --- .../Sources/share_plus/FPPSharePlusPlugin.m | 112 +++++++++--------- 1 file changed, 54 insertions(+), 58 deletions(-) diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index f5b464c543..5046891a86 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -382,9 +382,6 @@ + (void)registerWithRegistrar:(NSObject *)registrar { return; } } - - - // Check if root view controller is valid UIViewController *rootViewController = RootViewController(); @@ -399,26 +396,26 @@ + (void)registerWithRegistrar:(NSObject *)registrar { if (uri) { [self shareUri:uri - excludedActivityType:excludedActivityType - withController:topViewController - atSource:originRect - toResult:result]; + excludedActivityType:excludedActivityType + withController:topViewController + atSource:originRect + toResult:result]; } else if (paths) { [self shareFiles:paths - withMimeType:mimeTypes - withSubject:shareTitle - withText:shareText - excludedActivityType:excludedActivityType - withController:rootViewController - atSource:originRect - toResult:result]; + withMimeType:mimeTypes + withSubject:shareTitle + withText:shareText + excludedActivityType:excludedActivityType + withController:rootViewController + atSource:originRect + toResult:result]; } else if (shareText) { [self shareText:shareText - subject:shareTitle - excludedActivityType:excludedActivityType - withController:rootViewController - atSource:originRect - toResult:result]; + subject:shareTitle + excludedActivityType:excludedActivityType + withController:rootViewController + atSource:originRect + toResult:result]; } else { result([FlutterError errorWithCode:@"error" message:@"No share content provided" @@ -431,16 +428,16 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } + (void)share:(NSArray *)shareItems - withSubject:(NSString *)subject -excludedActivityType:(NSArray *)excludedActivityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + withSubject:(NSString *)subject + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { UIActivityViewSuccessController *activityViewController = [[UIActivityViewSuccessController alloc] initWithActivityItems:shareItems applicationActivities:nil]; - - if(excludedActivityType.count > 0){ + + if (excludedActivityType.count > 0) { NSMutableArray *excludedActivityTypes = [[NSMutableArray alloc] init]; for (NSString *type in excludedActivityType) { UIActivityType activityType = activityTypeForString(type); @@ -450,7 +447,6 @@ + (void)share:(NSArray *)shareItems } activityViewController.excludedActivityTypes = excludedActivityTypes; } - // Force subject when sharing a raw url or files if (![subject isKindOfClass:[NSNull class]]) { @@ -500,43 +496,43 @@ + (void)share:(NSArray *)shareItems } + (void)shareUri:(NSString *)uri -excludedActivityType:(NSArray *)excludedActivityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSURL *data = [NSURL URLWithString:uri]; [self share:@[ data ] - withSubject:nil -excludedActivityType: excludedActivityType - withController:controller - atSource:origin - toResult:result]; + withSubject:nil + excludedActivityType:excludedActivityType + withController:controller + atSource:origin + toResult:result]; } + (void)shareText:(NSString *)shareText - subject:(NSString *)subject -excludedActivityType:(NSArray *)excludedActivityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + subject:(NSString *)subject + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSObject *data = [[SharePlusData alloc] initWithSubject:subject text:shareText]; [self share:@[ data ] - withSubject:subject -excludedActivityType: excludedActivityType - withController:controller - atSource:origin - toResult:result]; + withSubject:subject + excludedActivityType:excludedActivityType + withController:controller + atSource:origin + toResult:result]; } + (void)shareFiles:(NSArray *)paths - withMimeType:(NSArray *)mimeTypes - withSubject:(NSString *)subject - withText:(NSString *)text -excludedActivityType:(NSArray *)excludedActivityType - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + withMimeType:(NSArray *)mimeTypes + withSubject:(NSString *)subject + withText:(NSString *)text + excludedActivityType:(NSArray *)excludedActivityType + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSMutableArray *items = [[NSMutableArray alloc] init]; for (int i = 0; i < [paths count]; i++) { @@ -552,11 +548,11 @@ + (void)shareFiles:(NSArray *)paths } [self share:items - withSubject:subject -excludedActivityType: excludedActivityType - withController:controller - atSource:origin - toResult:result]; + withSubject:subject + excludedActivityType:excludedActivityType + withController:controller + atSource:origin + toResult:result]; } @end From 871c7426a760bd20d5a4f753e6887d8502a9698e Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Mon, 21 Apr 2025 12:00:11 +0800 Subject: [PATCH 07/19] ++ --- packages/share_plus/share_plus/example/lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/share_plus/share_plus/example/lib/main.dart b/packages/share_plus/share_plus/example/lib/main.dart index dbcf089b75..d1bee646e9 100644 --- a/packages/share_plus/share_plus/example/lib/main.dart +++ b/packages/share_plus/share_plus/example/lib/main.dart @@ -169,7 +169,7 @@ class MyHomePageState extends State { if (Platform.isIOS || Platform.isMacOS) ElevatedButton( onPressed: _onSelectExcludedActivityType, - child: Text('add Excluded Activity Type'), + child: const Text('add Excluded Activity Type'), ), const SizedBox(height: 32), Builder( From e9277f98ee7d646bf042fb9aafd2597c14a951a0 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Mon, 21 Apr 2025 13:33:46 +0800 Subject: [PATCH 08/19] fix test --- .../lib/method_channel/method_channel_share.dart | 3 ++- .../test/share_plus_platform_interface_test.dart | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index 6843658685..2c7f6e0259 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -67,7 +67,8 @@ class MethodChannelShare extends SharePlatform { map['mimeTypes'] = mimeTypes; } - if (params.excludedActivityType != null) { + if (params.excludedActivityType != null && + params.excludedActivityType!.isNotEmpty) { final activityTypes = params.excludedActivityType!.map((e) => e.value).toList(); map['excludedActivityType'] = activityTypes; diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index dfdd94631e..6a8815a127 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -66,6 +66,7 @@ void main() { ShareParams( uri: Uri.parse('https://pub.dev/packages/share_plus'), sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + excludedActivityType: [CupertinoActivityType.airDrop] ), ); verify(mockChannel.invokeMethod('share', { @@ -82,6 +83,7 @@ void main() { text: 'some text to share', subject: 'some subject to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + excludedActivityType: [], ), ); verify(mockChannel.invokeMethod('share', { @@ -100,6 +102,7 @@ void main() { subject: 'some subject to share', text: 'some text to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + excludedActivityType: null ), ); verify(mockChannel.invokeMethod( From 3c739bd93c70553d150c95958254b530c9431157 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Mon, 21 Apr 2025 13:39:01 +0800 Subject: [PATCH 09/19] fix: format --- .../share_plus_platform_interface_test.dart | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index 6a8815a127..8a0d71da42 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -64,10 +64,9 @@ void main() { test('sharing origin sets the right params', () async { await sharePlatform.share( ShareParams( - uri: Uri.parse('https://pub.dev/packages/share_plus'), - sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - excludedActivityType: [CupertinoActivityType.airDrop] - ), + uri: Uri.parse('https://pub.dev/packages/share_plus'), + sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + excludedActivityType: [CupertinoActivityType.airDrop]), ); verify(mockChannel.invokeMethod('share', { 'uri': 'https://pub.dev/packages/share_plus', @@ -98,12 +97,11 @@ void main() { await withFile('tempfile-83649a.png', (File fd) async { await sharePlatform.share( ShareParams( - files: [XFile(fd.path)], - subject: 'some subject to share', - text: 'some text to share', - sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - excludedActivityType: null - ), + files: [XFile(fd.path)], + subject: 'some subject to share', + text: 'some text to share', + sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + excludedActivityType: null), ); verify(mockChannel.invokeMethod( 'share', From 54ea30c2f7dd204a4a48b5cc4e47a3d8a63f6e18 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 22 Apr 2025 11:37:25 +0800 Subject: [PATCH 10/19] update readme.md --- packages/share_plus/share_plus/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/share_plus/share_plus/README.md b/packages/share_plus/share_plus/README.md index 17211bd542..beaaa1c76d 100644 --- a/packages/share_plus/share_plus/README.md +++ b/packages/share_plus/share_plus/README.md @@ -110,6 +110,17 @@ if (result.status == ShareResultStatus.dismissed) { } ``` +On iOS or macOS, if you want to exclude certain options from appearing in your share sheet, +you can set the excludedActivityTypes array. +For the list of supported excludedActivityTypes, you can refer to Apple’s [documentation](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/excludedactivitytypes/). + +```dart +ShareParams( + // rest of params + excludedActivityTypes: [CupertinoActivityType.postToFacebook], +) +``` + On web, this uses the [Web Share API](https://web.dev/web-share/) if it's available. Otherwise it falls back to downloading the shared files. See [Can I Use - Web Share API](https://caniuse.com/web-share) to understand From 80dea49d0f9264f6cd41cab96c78fc4b927e1d8e Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 6 May 2025 09:59:46 +0800 Subject: [PATCH 11/19] ++ --- packages/share_plus/share_plus/README.md | 2 +- .../example/lib/excluded_activity_type.dart | 6 +++--- .../share_plus/example/lib/main.dart | 21 ++++++++++--------- .../method_channel/method_channel_share.dart | 6 +++--- .../share_plus_platform.dart | 4 ++-- .../share_plus_platform_interface_test.dart | 20 ++++++++++-------- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/packages/share_plus/share_plus/README.md b/packages/share_plus/share_plus/README.md index beaaa1c76d..ae29590b32 100644 --- a/packages/share_plus/share_plus/README.md +++ b/packages/share_plus/share_plus/README.md @@ -112,7 +112,7 @@ if (result.status == ShareResultStatus.dismissed) { On iOS or macOS, if you want to exclude certain options from appearing in your share sheet, you can set the excludedActivityTypes array. -For the list of supported excludedActivityTypes, you can refer to Apple’s [documentation](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/excludedactivitytypes/). +For the list of supported excludedActivityTypes, you can refer to [CupertinoActivityType](https://pub.dev/documentation/share_plus/latest/share_plus/ShareParams-class.html). ```dart ShareParams( diff --git a/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart b/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart index dba19d68ed..e0ae81aff2 100644 --- a/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart +++ b/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:share_plus/share_plus.dart'; -class ExcludedActivityTypePage extends StatefulWidget { +class ExcludedCupertinoActivityTypePage extends StatefulWidget { final List? excludedActivityType; - const ExcludedActivityTypePage({ + const ExcludedCupertinoActivityTypePage({ super.key, this.excludedActivityType, }); @@ -13,7 +13,7 @@ class ExcludedActivityTypePage extends StatefulWidget { State createState() => _ExcludedActivityTypePageState(); } -class _ExcludedActivityTypePageState extends State { +class _ExcludedActivityTypePageState extends State { final List options = []; final List selected = []; diff --git a/packages/share_plus/share_plus/example/lib/main.dart b/packages/share_plus/share_plus/example/lib/main.dart index d1bee646e9..3e4a137ba9 100644 --- a/packages/share_plus/share_plus/example/lib/main.dart +++ b/packages/share_plus/share_plus/example/lib/main.dart @@ -53,7 +53,7 @@ class MyHomePageState extends State { String fileName = ''; List imageNames = []; List imagePaths = []; - List cupertinoExcludedActivityType = []; + List excludedCupertinoActivityType = []; @override Widget build(BuildContext context) { @@ -169,7 +169,7 @@ class MyHomePageState extends State { if (Platform.isIOS || Platform.isMacOS) ElevatedButton( onPressed: _onSelectExcludedActivityType, - child: const Text('add Excluded Activity Type'), + child: const Text('Add Excluded Activity Type'), ), const SizedBox(height: 32), Builder( @@ -232,12 +232,13 @@ class MyHomePageState extends State { void _onSelectExcludedActivityType() async { final result = await Navigator.of(context).push( MaterialPageRoute( - builder: (context) => ExcludedActivityTypePage( - excludedActivityType: cupertinoExcludedActivityType), + builder: (context) => ExcludedCupertinoActivityTypePage( + excludedActivityType: excludedCupertinoActivityType, + ), ), ); if (result != null) { - cupertinoExcludedActivityType = result; + excludedCupertinoActivityType = result; } } @@ -265,7 +266,7 @@ class MyHomePageState extends State { title: title.isEmpty ? null : title, files: files, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, - excludedActivityType: [CupertinoActivityType.airDrop], + excludedCupertinoActivities: [CupertinoActivityType.airDrop], ), ); } else if (uri.isNotEmpty) { @@ -275,7 +276,7 @@ class MyHomePageState extends State { subject: subject.isEmpty ? null : subject, title: title.isEmpty ? null : title, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, - excludedActivityType: cupertinoExcludedActivityType, + excludedCupertinoActivities: excludedCupertinoActivityType, ), ); } else { @@ -285,7 +286,7 @@ class MyHomePageState extends State { subject: subject.isEmpty ? null : subject, title: title.isEmpty ? null : title, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, - excludedActivityType: cupertinoExcludedActivityType, + excludedCupertinoActivities: excludedCupertinoActivityType, ), ); } @@ -309,7 +310,7 @@ class MyHomePageState extends State { ], sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, downloadFallbackEnabled: true, - excludedActivityType: cupertinoExcludedActivityType, + excludedCupertinoActivities: excludedCupertinoActivityType, ), ); scaffoldMessenger.showSnackBar(getResultSnackBar(shareResult)); @@ -337,7 +338,7 @@ class MyHomePageState extends State { sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, fileNameOverrides: [fileName], downloadFallbackEnabled: true, - excludedActivityType: cupertinoExcludedActivityType, + excludedCupertinoActivities: excludedCupertinoActivityType, ), ); diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index 2c7f6e0259..a94ff1393b 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -67,10 +67,10 @@ class MethodChannelShare extends SharePlatform { map['mimeTypes'] = mimeTypes; } - if (params.excludedActivityType != null && - params.excludedActivityType!.isNotEmpty) { + if (params.excludedCupertinoActivities != null && + params.excludedCupertinoActivities!.isNotEmpty) { final activityTypes = - params.excludedActivityType!.map((e) => e.value).toList(); + params.excludedCupertinoActivities!.map((e) => e.value).toList(); map['excludedActivityType'] = activityTypes; } diff --git a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart index 5aa9dbc589..43cc4c69f0 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart @@ -140,7 +140,7 @@ class ShareParams { /// /// * Supported platforms: iOS, macOS /// Parameter ignored on other platforms. - final List? excludedActivityType; + final List? excludedCupertinoActivities; ShareParams({ this.text, @@ -153,7 +153,7 @@ class ShareParams { this.fileNameOverrides, this.downloadFallbackEnabled = true, this.mailToFallbackEnabled = true, - this.excludedActivityType, + this.excludedCupertinoActivities, }); } diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index 8a0d71da42..26bc62b400 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -64,9 +64,10 @@ void main() { test('sharing origin sets the right params', () async { await sharePlatform.share( ShareParams( - uri: Uri.parse('https://pub.dev/packages/share_plus'), - sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - excludedActivityType: [CupertinoActivityType.airDrop]), + uri: Uri.parse('https://pub.dev/packages/share_plus'), + sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + excludedCupertinoActivities: [CupertinoActivityType.airDrop], + ), ); verify(mockChannel.invokeMethod('share', { 'uri': 'https://pub.dev/packages/share_plus', @@ -82,7 +83,7 @@ void main() { text: 'some text to share', subject: 'some subject to share', sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - excludedActivityType: [], + excludedCupertinoActivities: [], ), ); verify(mockChannel.invokeMethod('share', { @@ -97,11 +98,12 @@ void main() { await withFile('tempfile-83649a.png', (File fd) async { await sharePlatform.share( ShareParams( - files: [XFile(fd.path)], - subject: 'some subject to share', - text: 'some text to share', - sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), - excludedActivityType: null), + files: [XFile(fd.path)], + subject: 'some subject to share', + text: 'some text to share', + sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0), + excludedCupertinoActivities: null, + ), ); verify(mockChannel.invokeMethod( 'share', From f7e4025f8f100ae9a1789b60bb2c1e216f2c7913 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 6 May 2025 10:30:50 +0800 Subject: [PATCH 12/19] ++ --- .../share_plus/example/lib/excluded_activity_type.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart b/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart index e0ae81aff2..f1bb63b7e1 100644 --- a/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart +++ b/packages/share_plus/share_plus/example/lib/excluded_activity_type.dart @@ -13,7 +13,8 @@ class ExcludedCupertinoActivityTypePage extends StatefulWidget { State createState() => _ExcludedActivityTypePageState(); } -class _ExcludedActivityTypePageState extends State { +class _ExcludedActivityTypePageState + extends State { final List options = []; final List selected = []; From 1bd95c7316709e2f6583ea86007c00013a69ab93 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Wed, 18 Jun 2025 09:23:39 +0800 Subject: [PATCH 13/19] feat: Adjust the documentation comments for CupertinoActivityType, remove the extension, and add a new get value method. --- .../share_plus_platform.dart | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart index 43cc4c69f0..05258d0904 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart @@ -211,10 +211,14 @@ enum ShareResultStatus { unavailable, } -/// An abstract class that you subclass to implement app-specific services -/// for iOS and macOS. +/// Represents iOS-supported share activity types, such as AirDrop, Messages, +/// Mail, and others. /// -/// https://developer.apple.com/documentation/uikit/uiactivity/activitytype +/// This enum is used to identify specific activity types in the iOS share sheet, +/// especially when certain types should be excluded from the share options. +/// +/// See also: +/// [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype) enum CupertinoActivityType { postToFacebook, postToTwitter, @@ -235,9 +239,9 @@ enum CupertinoActivityType { sharePlay, collaborationInviteWithLink, collaborationCopyLink, - addToHomeScreen, -} + addToHomeScreen; -extension CupertinoActivityTypeValue on CupertinoActivityType { - String get value => toString().split('.').last; + String get value { + return toString().split('.').last; + } } From 286c3261b83f3a318f8b36479e81f51a37718c30 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Wed, 18 Jun 2025 10:03:50 +0800 Subject: [PATCH 14/19] fix: rename parameters and refactor the conversion method. --- .../Sources/share_plus/FPPSharePlusPlugin.m | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index 5046891a86..ca7db91755 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -84,12 +84,21 @@ static void initializeActivityTypeMapping(void) { }); } -static UIActivityType activityTypeForString(NSString *activityTypeString) { - initializeActivityTypeMapping(); - if ([activityTypes.allKeys containsObject:activityTypeString]) { - return activityTypes[activityTypeString]; +static NSArray *activityTypesForStrings(NSArray *activityTypeStrings) { + if (activityTypeStrings == nil || activityTypeStrings.count == 0) { + return nil; } - return nil; + initializeActivityTypeMapping(); + NSMutableArray *result = [NSMutableArray array]; + + for (NSString *key in activityTypeStrings) { + UIActivityType mapped = activityTypes[key]; + if (mapped) { + [result addObject:mapped]; + } + } + + return [result copy]; } // We need the companion to avoid ARC deadlock @@ -307,7 +316,8 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originY = arguments[@"originY"]; NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; - NSArray *excludedActivityType = arguments[@"excludedActivityType"]; + NSArray *excludedActivityTypeStrings = arguments[@"excludedActivityType"]; + NSArray *excludedActivityTypes = activityTypesForStrings(excludedActivityTypeStrings); CGRect originRect = CGRectZero; if (originX && originY && originWidth && originHeight) { @@ -396,7 +406,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { if (uri) { [self shareUri:uri - excludedActivityType:excludedActivityType + excludedActivityTypes:excludedActivityTypes withController:topViewController atSource:originRect toResult:result]; @@ -405,14 +415,14 @@ + (void)registerWithRegistrar:(NSObject *)registrar { withMimeType:mimeTypes withSubject:shareTitle withText:shareText - excludedActivityType:excludedActivityType + excludedActivityTypes:excludedActivityTypes withController:rootViewController atSource:originRect toResult:result]; } else if (shareText) { [self shareText:shareText subject:shareTitle - excludedActivityType:excludedActivityType + excludedActivityTypes:excludedActivityTypes withController:rootViewController atSource:originRect toResult:result]; @@ -429,7 +439,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { + (void)share:(NSArray *)shareItems withSubject:(NSString *)subject - excludedActivityType:(NSArray *)excludedActivityType +excludedActivityTypes:(NSArray *)excludedActivityTypes withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { @@ -437,16 +447,7 @@ + (void)share:(NSArray *)shareItems [[UIActivityViewSuccessController alloc] initWithActivityItems:shareItems applicationActivities:nil]; - if (excludedActivityType.count > 0) { - NSMutableArray *excludedActivityTypes = [[NSMutableArray alloc] init]; - for (NSString *type in excludedActivityType) { - UIActivityType activityType = activityTypeForString(type); - if (activityType != nil) { - [excludedActivityTypes addObject:activityType]; - } - } - activityViewController.excludedActivityTypes = excludedActivityTypes; - } + activityViewController.excludedActivityTypes = excludedActivityTypes; // Force subject when sharing a raw url or files if (![subject isKindOfClass:[NSNull class]]) { @@ -496,14 +497,14 @@ + (void)share:(NSArray *)shareItems } + (void)shareUri:(NSString *)uri - excludedActivityType:(NSArray *)excludedActivityType +excludedActivityTypes:(NSArray *)excludedActivityTypes withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { NSURL *data = [NSURL URLWithString:uri]; [self share:@[ data ] withSubject:nil - excludedActivityType:excludedActivityType +excludedActivityTypes:excludedActivityTypes withController:controller atSource:origin toResult:result]; @@ -511,7 +512,7 @@ + (void)shareUri:(NSString *)uri + (void)shareText:(NSString *)shareText subject:(NSString *)subject - excludedActivityType:(NSArray *)excludedActivityType +excludedActivityTypes:(NSArray *)excludedActivityTypes withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { @@ -519,7 +520,7 @@ + (void)shareText:(NSString *)shareText text:shareText]; [self share:@[ data ] withSubject:subject - excludedActivityType:excludedActivityType +excludedActivityTypes:excludedActivityTypes withController:controller atSource:origin toResult:result]; @@ -529,7 +530,7 @@ + (void)shareFiles:(NSArray *)paths withMimeType:(NSArray *)mimeTypes withSubject:(NSString *)subject withText:(NSString *)text - excludedActivityType:(NSArray *)excludedActivityType +excludedActivityTypes:(NSArray *)excludedActivityTypes withController:(UIViewController *)controller atSource:(CGRect)origin toResult:(FlutterResult)result { @@ -549,7 +550,7 @@ + (void)shareFiles:(NSArray *)paths [self share:items withSubject:subject - excludedActivityType:excludedActivityType +excludedActivityTypes:excludedActivityTypes withController:controller atSource:origin toResult:result]; From 78d862d86c005a819260725b2eba887dfcca6dc8 Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Wed, 18 Jun 2025 10:10:23 +0800 Subject: [PATCH 15/19] fix: format --- .../Sources/share_plus/FPPSharePlusPlugin.m | 128 +++++++++--------- .../share_plus_platform.dart | 2 +- 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index ca7db91755..4289895e80 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -84,21 +84,22 @@ static void initializeActivityTypeMapping(void) { }); } -static NSArray *activityTypesForStrings(NSArray *activityTypeStrings) { +static NSArray * +activityTypesForStrings(NSArray *activityTypeStrings) { if (activityTypeStrings == nil || activityTypeStrings.count == 0) { - return nil; + return nil; } - initializeActivityTypeMapping(); - NSMutableArray *result = [NSMutableArray array]; + initializeActivityTypeMapping(); + NSMutableArray *result = [NSMutableArray array]; - for (NSString *key in activityTypeStrings) { - UIActivityType mapped = activityTypes[key]; - if (mapped) { - [result addObject:mapped]; - } + for (NSString *key in activityTypeStrings) { + UIActivityType mapped = activityTypes[key]; + if (mapped) { + [result addObject:mapped]; } + } - return [result copy]; + return [result copy]; } // We need the companion to avoid ARC deadlock @@ -317,7 +318,8 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; NSArray *excludedActivityTypeStrings = arguments[@"excludedActivityType"]; - NSArray *excludedActivityTypes = activityTypesForStrings(excludedActivityTypeStrings); + NSArray *excludedActivityTypes = + activityTypesForStrings(excludedActivityTypeStrings); CGRect originRect = CGRectZero; if (originX && originY && originWidth && originHeight) { @@ -406,26 +408,26 @@ + (void)registerWithRegistrar:(NSObject *)registrar { if (uri) { [self shareUri:uri - excludedActivityTypes:excludedActivityTypes - withController:topViewController - atSource:originRect - toResult:result]; + excludedActivityTypes:excludedActivityTypes + withController:topViewController + atSource:originRect + toResult:result]; } else if (paths) { [self shareFiles:paths - withMimeType:mimeTypes - withSubject:shareTitle - withText:shareText - excludedActivityTypes:excludedActivityTypes - withController:rootViewController - atSource:originRect - toResult:result]; + withMimeType:mimeTypes + withSubject:shareTitle + withText:shareText + excludedActivityTypes:excludedActivityTypes + withController:rootViewController + atSource:originRect + toResult:result]; } else if (shareText) { [self shareText:shareText - subject:shareTitle - excludedActivityTypes:excludedActivityTypes - withController:rootViewController - atSource:originRect - toResult:result]; + subject:shareTitle + excludedActivityTypes:excludedActivityTypes + withController:rootViewController + atSource:originRect + toResult:result]; } else { result([FlutterError errorWithCode:@"error" message:@"No share content provided" @@ -438,11 +440,11 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } + (void)share:(NSArray *)shareItems - withSubject:(NSString *)subject -excludedActivityTypes:(NSArray *)excludedActivityTypes - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + withSubject:(NSString *)subject + excludedActivityTypes:(NSArray *)excludedActivityTypes + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { UIActivityViewSuccessController *activityViewController = [[UIActivityViewSuccessController alloc] initWithActivityItems:shareItems applicationActivities:nil]; @@ -497,43 +499,43 @@ + (void)share:(NSArray *)shareItems } + (void)shareUri:(NSString *)uri -excludedActivityTypes:(NSArray *)excludedActivityTypes - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + excludedActivityTypes:(NSArray *)excludedActivityTypes + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSURL *data = [NSURL URLWithString:uri]; [self share:@[ data ] - withSubject:nil -excludedActivityTypes:excludedActivityTypes - withController:controller - atSource:origin - toResult:result]; + withSubject:nil + excludedActivityTypes:excludedActivityTypes + withController:controller + atSource:origin + toResult:result]; } + (void)shareText:(NSString *)shareText - subject:(NSString *)subject -excludedActivityTypes:(NSArray *)excludedActivityTypes - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + subject:(NSString *)subject + excludedActivityTypes:(NSArray *)excludedActivityTypes + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSObject *data = [[SharePlusData alloc] initWithSubject:subject text:shareText]; [self share:@[ data ] - withSubject:subject -excludedActivityTypes:excludedActivityTypes - withController:controller - atSource:origin - toResult:result]; + withSubject:subject + excludedActivityTypes:excludedActivityTypes + withController:controller + atSource:origin + toResult:result]; } + (void)shareFiles:(NSArray *)paths - withMimeType:(NSArray *)mimeTypes - withSubject:(NSString *)subject - withText:(NSString *)text -excludedActivityTypes:(NSArray *)excludedActivityTypes - withController:(UIViewController *)controller - atSource:(CGRect)origin - toResult:(FlutterResult)result { + withMimeType:(NSArray *)mimeTypes + withSubject:(NSString *)subject + withText:(NSString *)text + excludedActivityTypes:(NSArray *)excludedActivityTypes + withController:(UIViewController *)controller + atSource:(CGRect)origin + toResult:(FlutterResult)result { NSMutableArray *items = [[NSMutableArray alloc] init]; for (int i = 0; i < [paths count]; i++) { @@ -549,11 +551,11 @@ + (void)shareFiles:(NSArray *)paths } [self share:items - withSubject:subject -excludedActivityTypes:excludedActivityTypes - withController:controller - atSource:origin - toResult:result]; + withSubject:subject + excludedActivityTypes:excludedActivityTypes + withController:controller + atSource:origin + toResult:result]; } @end diff --git a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart index 05258d0904..40ceee27b6 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart @@ -242,6 +242,6 @@ enum CupertinoActivityType { addToHomeScreen; String get value { - return toString().split('.').last; + return toString().split('.').last; } } From e167f6b36aa045e2478020e376aea5a1a0b936fd Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Wed, 18 Jun 2025 10:30:47 +0800 Subject: [PATCH 16/19] fix: delete CupertinoActivityTypeValue --- packages/share_plus/share_plus/lib/share_plus.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/share_plus/share_plus/lib/share_plus.dart b/packages/share_plus/share_plus/lib/share_plus.dart index ead35f37d5..b6e055e3de 100644 --- a/packages/share_plus/share_plus/lib/share_plus.dart +++ b/packages/share_plus/share_plus/lib/share_plus.dart @@ -13,8 +13,7 @@ export 'package:share_plus_platform_interface/share_plus_platform_interface.dart ShareResultStatus, XFile, ShareParams, - CupertinoActivityType, - CupertinoActivityTypeValue; + CupertinoActivityType; export 'src/share_plus_linux.dart'; export 'src/share_plus_windows.dart' From 1076e5402c6c4ab47ede533dab2a42780ee3d09e Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 24 Jun 2025 09:19:31 +0800 Subject: [PATCH 17/19] feat: rename parameter --- .../ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m | 2 +- .../lib/method_channel/method_channel_share.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index 4289895e80..4bef8d4b8c 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -317,7 +317,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originY = arguments[@"originY"]; NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; - NSArray *excludedActivityTypeStrings = arguments[@"excludedActivityType"]; + NSArray *excludedActivityTypeStrings = arguments[@"excludedActivityTypes"]; NSArray *excludedActivityTypes = activityTypesForStrings(excludedActivityTypeStrings); diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index a94ff1393b..ea7381950e 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -69,9 +69,9 @@ class MethodChannelShare extends SharePlatform { if (params.excludedCupertinoActivities != null && params.excludedCupertinoActivities!.isNotEmpty) { - final activityTypes = + final excludedActivityTypes = params.excludedCupertinoActivities!.map((e) => e.value).toList(); - map['excludedActivityType'] = activityTypes; + map['excludedActivityTypes'] = excludedActivityTypes; } return map; From ea3ff510cd58fba05d4c204d24c3ccfd2e3becdc Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 24 Jun 2025 09:38:58 +0800 Subject: [PATCH 18/19] fix: test --- .../test/share_plus_platform_interface_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index 26bc62b400..82943a1ae1 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -75,7 +75,7 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, - 'excludedActivityType': ['airDrop'], + 'excludedActivityTypes': ['airDrop'], })); await sharePlatform.share( From d8ccc88694d25af98004adb65436d52be26b7e0c Mon Sep 17 00:00:00 2001 From: StanleyCocos Date: Tue, 24 Jun 2025 15:02:32 +0800 Subject: [PATCH 19/19] ++ --- .../ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m | 2 +- .../lib/method_channel/method_channel_share.dart | 2 +- .../test/share_plus_platform_interface_test.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m index 4bef8d4b8c..144b35dbb9 100644 --- a/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m +++ b/packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m @@ -317,7 +317,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originY = arguments[@"originY"]; NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; - NSArray *excludedActivityTypeStrings = arguments[@"excludedActivityTypes"]; + NSArray *excludedActivityTypeStrings = arguments[@"excludedCupertinoActivities"]; NSArray *excludedActivityTypes = activityTypesForStrings(excludedActivityTypeStrings); diff --git a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart index ea7381950e..c4ece10e00 100644 --- a/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart +++ b/packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart @@ -71,7 +71,7 @@ class MethodChannelShare extends SharePlatform { params.excludedCupertinoActivities!.isNotEmpty) { final excludedActivityTypes = params.excludedCupertinoActivities!.map((e) => e.value).toList(); - map['excludedActivityTypes'] = excludedActivityTypes; + map['excludedCupertinoActivities'] = excludedActivityTypes; } return map; diff --git a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart index 82943a1ae1..18f22cf889 100644 --- a/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart +++ b/packages/share_plus/share_plus_platform_interface/test/share_plus_platform_interface_test.dart @@ -75,7 +75,7 @@ void main() { 'originY': 2.0, 'originWidth': 3.0, 'originHeight': 4.0, - 'excludedActivityTypes': ['airDrop'], + 'excludedCupertinoActivities': ['airDrop'], })); await sharePlatform.share(