From b68d31b99f634060d4688ef38ea338b009d64511 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 1 Oct 2019 10:39:54 -0700 Subject: [PATCH 1/3] fix share plugin crashes --- packages/share/CHANGELOG.md | 4 ++ packages/share/ios/Classes/SharePlugin.m | 52 +++++++++++++++++-- packages/share/pubspec.yaml | 2 +- .../example/test_driver/video_player.dart | 19 +++++++ .../test_driver/video_player_test.dart | 10 ++++ 5 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 packages/video_player/example/test_driver/video_player.dart create mode 100644 packages/video_player/example/test_driver/video_player_test.dart diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index b2567e4e096c..444d853d26df 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.2+2 + +* Fix iOS crash when setting subject to null. + ## 0.6.2+1 * Specify explicit type for `invokeMethod`. diff --git a/packages/share/ios/Classes/SharePlugin.m b/packages/share/ios/Classes/SharePlugin.m index cfd8eac6876d..79903f8a1e5b 100644 --- a/packages/share/ios/Classes/SharePlugin.m +++ b/packages/share/ios/Classes/SharePlugin.m @@ -6,6 +6,49 @@ static NSString *const PLATFORM_CHANNEL = @"plugins.flutter.io/share"; +@interface ShareData : NSObject + +@property(readonly, nonatomic, copy) NSString *subject; +@property(readonly, nonatomic, copy) NSString *text; + +- (instancetype)initWithSubject:(NSString *)subject text:(NSString *)text NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __attribute__((unavailable("Use initWithSubject:text: instead"))); + +@end + +@implementation ShareData + +- (instancetype)init { + [super doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (instancetype)initWithSubject:(NSString *)subject text:(NSString *)text { + self = [super init]; + if (self) { + _subject = subject; + _text = text; + } + return self; +} + +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { + return @""; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController + itemForActivityType:(UIActivityType)activityType { + return _text; +} + +- (NSString *)activityViewController:(UIActivityViewController *)activityViewController + subjectForActivityType:(UIActivityType)activityType { + return [_subject isKindOfClass:NSNull.class] ? nil : _subject; +} + +@end + @implementation FLTSharePlugin + (void)registerWithRegistrar:(NSObject *)registrar { @@ -31,7 +74,7 @@ + (void)registerWithRegistrar:(NSObject *)registrar { NSNumber *originWidth = arguments[@"originWidth"]; NSNumber *originHeight = arguments[@"originHeight"]; - CGRect originRect; + CGRect originRect = CGRectZero; if (originX != nil && originY != nil && originWidth != nil && originHeight != nil) { originRect = CGRectMake([originX doubleValue], [originY doubleValue], [originWidth doubleValue], [originHeight doubleValue]); @@ -48,14 +91,13 @@ + (void)registerWithRegistrar:(NSObject *)registrar { }]; } -+ (void)share:(id)sharedItems ++ (void)share:(NSString *)shareText subject:(NSString *)subject withController:(UIViewController *)controller atSource:(CGRect)origin { + ShareData *data = [[ShareData alloc] initWithSubject:subject text:shareText]; UIActivityViewController *activityViewController = - [[UIActivityViewController alloc] initWithActivityItems:@[ sharedItems ] - applicationActivities:nil]; - [activityViewController setValue:subject forKey:@"subject"]; + [[UIActivityViewController alloc] initWithActivityItems:@[ data ] applicationActivities:nil]; activityViewController.popoverPresentationController.sourceView = controller.view; if (!CGRectIsEmpty(origin)) { activityViewController.popoverPresentationController.sourceRect = origin; diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index a051b4480eaa..d140fab114c5 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.2+1 +version: 0.6.2+2 flutter: plugin: diff --git a/packages/video_player/example/test_driver/video_player.dart b/packages/video_player/example/test_driver/video_player.dart new file mode 100644 index 000000000000..7b7908e8f67f --- /dev/null +++ b/packages/video_player/example/test_driver/video_player.dart @@ -0,0 +1,19 @@ +import 'dart:async'; +import 'package:flutter_driver/driver_extension.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:video_player/video_player.dart'; + +void main() { + final Completer completer = Completer(); + enableFlutterDriverExtension(handler: (_) => completer.future); + tearDownAll(() => completer.complete(null)); + + group('VideoPlayer test driver', () { + test('VideoPlayer dispose without crash', () { + final VideoPlayerController controller = + VideoPlayerController.asset('assets/Butterfly-209.mp4'); + controller.play(); + controller.initialize(); + }); + }); +} diff --git a/packages/video_player/example/test_driver/video_player_test.dart b/packages/video_player/example/test_driver/video_player_test.dart new file mode 100644 index 000000000000..d683f81d690e --- /dev/null +++ b/packages/video_player/example/test_driver/video_player_test.dart @@ -0,0 +1,10 @@ +import 'package:flutter_driver/flutter_driver.dart'; +import 'package:test/test.dart'; + +void main() { + test('video_player', () async { + final FlutterDriver driver = await FlutterDriver.connect(); + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); + }); +} From 97f36d312ea1b1fb5cc4e096274b15ed402a479e Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 3 Oct 2019 09:17:08 -0700 Subject: [PATCH 2/3] remove unrelated changes --- .../example/test_driver/video_player.dart | 19 ------------------- .../test_driver/video_player_test.dart | 10 ---------- 2 files changed, 29 deletions(-) delete mode 100644 packages/video_player/example/test_driver/video_player.dart delete mode 100644 packages/video_player/example/test_driver/video_player_test.dart diff --git a/packages/video_player/example/test_driver/video_player.dart b/packages/video_player/example/test_driver/video_player.dart deleted file mode 100644 index 7b7908e8f67f..000000000000 --- a/packages/video_player/example/test_driver/video_player.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'dart:async'; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:video_player/video_player.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('VideoPlayer test driver', () { - test('VideoPlayer dispose without crash', () { - final VideoPlayerController controller = - VideoPlayerController.asset('assets/Butterfly-209.mp4'); - controller.play(); - controller.initialize(); - }); - }); -} diff --git a/packages/video_player/example/test_driver/video_player_test.dart b/packages/video_player/example/test_driver/video_player_test.dart deleted file mode 100644 index d683f81d690e..000000000000 --- a/packages/video_player/example/test_driver/video_player_test.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:test/test.dart'; - -void main() { - test('video_player', () async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); - }); -} From 8a1762cbe12b1af355a7835a3eac09ee6bae4791 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 4 Oct 2019 09:25:12 -0700 Subject: [PATCH 3/3] Update pubspec.yaml --- packages/share/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index d140fab114c5..78d094ee487b 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.2+2 +version: 0.6.2+3 flutter: plugin: