diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm index 8a3688cb11ba6..3ac744381db25 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm @@ -123,11 +123,23 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { } else if ([method isEqualToString:@"LookUp.invoke"]) { [self showLookUpViewController:args]; result(nil); + } else if ([method isEqualToString:@"Share.invoke"]) { + [self showShareViewController:args]; + result(nil); } else { result(FlutterMethodNotImplemented); } } +- (void)showShareViewController:(NSString*)content { + UIViewController* engineViewController = [_engine.get() viewController]; + NSArray* itemsToShare = @[ content ]; + UIActivityViewController* activityViewController = + [[[UIActivityViewController alloc] initWithActivityItems:itemsToShare + applicationActivities:nil] autorelease]; + [engineViewController presentViewController:activityViewController animated:YES completion:nil]; +} + - (void)searchWeb:(NSString*)searchTerm { NSString* escapedText = [searchTerm stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet @@ -338,7 +350,6 @@ - (BOOL)isLiveTextInputAvailable { - (void)showLookUpViewController:(NSString*)term { UIViewController* engineViewController = [_engine.get() viewController]; - FML_DCHECK(![engineViewController presentingViewController]); UIReferenceLibraryViewController* referenceLibraryViewController = [[[UIReferenceLibraryViewController alloc] initWithTerm:term] autorelease]; [engineViewController presentViewController:referenceLibraryViewController diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPluginTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPluginTest.mm index cdbd6c01d3904..3e19665973e96 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPluginTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPluginTest.mm @@ -19,6 +19,7 @@ @interface FlutterPlatformPlugin () - (BOOL)isLiveTextInputAvailable; - (void)searchWeb:(NSString*)searchTerm; - (void)showLookUpViewController:(NSString*)term; +- (void)showShareViewController:(NSString*)content; @end @interface UIViewController () @@ -122,6 +123,36 @@ - (void)testLookUpCallInitiated { [self waitForExpectationsWithTimeout:2 handler:nil]; } +- (void)testShareScreenInvoked { + FlutterEngine* engine = [[[FlutterEngine alloc] initWithName:@"test" project:nil] autorelease]; + [engine runWithEntrypoint:nil]; + std::unique_ptr> _weakFactory = + std::make_unique>(engine); + + XCTestExpectation* presentExpectation = + [self expectationWithDescription:@"Share view controller presented"]; + + FlutterViewController* engineViewController = + [[[FlutterViewController alloc] initWithEngine:engine nibName:nil bundle:nil] autorelease]; + FlutterViewController* mockEngineViewController = OCMPartialMock(engineViewController); + + FlutterPlatformPlugin* plugin = + [[[FlutterPlatformPlugin alloc] initWithEngine:_weakFactory->GetWeakPtr()] autorelease]; + FlutterPlatformPlugin* mockPlugin = OCMPartialMock(plugin); + + FlutterMethodCall* methodCall = [FlutterMethodCall methodCallWithMethodName:@"Share.invoke" + arguments:@"Test"]; + FlutterResult result = ^(id result) { + OCMVerify([mockEngineViewController + presentViewController:[OCMArg isKindOfClass:[UIActivityViewController class]] + animated:YES + completion:nil]); + [presentExpectation fulfill]; + }; + [mockPlugin handleMethodCall:methodCall result:result]; + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + - (void)testClipboardHasCorrectStrings { [UIPasteboard generalPasteboard].string = nil; FlutterEngine* engine = [[[FlutterEngine alloc] initWithName:@"test" project:nil] autorelease];