diff --git a/simplistic_editor/lib/basic_text_field.dart b/simplistic_editor/lib/basic_text_field.dart index b88a13618..a6f655c0b 100644 --- a/simplistic_editor/lib/basic_text_field.dart +++ b/simplistic_editor/lib/basic_text_field.dart @@ -28,6 +28,8 @@ class BasicTextField extends StatefulWidget { VoidCallback? onSelectAll, VoidCallback? onLookUp, VoidCallback? onLiveTextInput, + VoidCallback? onSearchWeb, + VoidCallback? onShare, TextSelectionToolbarAnchors anchors, ) { return AdaptiveTextSelectionToolbar.editable( @@ -38,10 +40,9 @@ class BasicTextField extends StatefulWidget { onSelectAll: onSelectAll, onLookUp: onLookUp, onLiveTextInput: onLiveTextInput, + onSearchWeb: onSearchWeb, + onShare: onShare, anchors: anchors, - // TODO(Renzo-Olivares): https://github.com/flutter/samples/issues/2088 - onSearchWeb: null, - onShare: null, ); } diff --git a/simplistic_editor/lib/basic_text_input_client.dart b/simplistic_editor/lib/basic_text_input_client.dart index ec691fe9c..4aae8722d 100644 --- a/simplistic_editor/lib/basic_text_input_client.dart +++ b/simplistic_editor/lib/basic_text_input_client.dart @@ -26,6 +26,8 @@ typedef BasicTextFieldContextMenuBuilder = Widget Function( VoidCallback? onSelectAll, VoidCallback? onLookUp, VoidCallback? onLiveTextInput, + VoidCallback? onSearchWeb, + VoidCallback? onShare, TextSelectionToolbarAnchors anchors, ); @@ -867,6 +869,13 @@ class BasicTextInputClientState extends State liveTextInputEnabled ? () => _startLiveTextInput(SelectionChangedCause.toolbar) : null, + searchWebEnabled + ? () => + _searchWebForSelection(SelectionChangedCause.toolbar) + : null, + shareEnabled + ? () => _shareSelection(SelectionChangedCause.toolbar) + : null, _contextMenuAnchors, ); }, @@ -1016,6 +1025,65 @@ class BasicTextInputClientState extends State ); } + @override + bool get searchWebEnabled { + if (defaultTargetPlatform != TargetPlatform.iOS) { + return false; + } + + return !textEditingValue.selection.isCollapsed && + textEditingValue.selection.textInside(textEditingValue.text).trim() != + ''; + } + + /// Launch a web search on the current selection, + /// as in the "Search Web" edit menu button on iOS. + /// + /// Currently this is only implemented for iOS. + Future _searchWebForSelection(SelectionChangedCause cause) async { + final String text = + textEditingValue.selection.textInside(textEditingValue.text); + if (text.isNotEmpty) { + await SystemChannels.platform.invokeMethod( + 'SearchWeb.invoke', + text, + ); + } + } + + @override + bool get shareEnabled { + switch (defaultTargetPlatform) { + case TargetPlatform.android: + case TargetPlatform.iOS: + return !textEditingValue.selection.isCollapsed && + textEditingValue.selection + .textInside(textEditingValue.text) + .trim() != + ''; + case TargetPlatform.macOS: + case TargetPlatform.fuchsia: + case TargetPlatform.linux: + case TargetPlatform.windows: + return false; + } + } + + /// Launch the share interface for the current selection, + /// as in the "Share..." edit menu button on iOS. + /// + /// Currently this is only implemented for iOS and Android. + Future _shareSelection(SelectionChangedCause cause) async { + final String text = + textEditingValue.selection.textInside(textEditingValue.text); + if (text.isNotEmpty) { + await SystemChannels.platform.invokeMethod( + 'Share.invoke', + text, + ); + } + } + @override Widget build(BuildContext context) { return Actions( diff --git a/tool/flutter_ci_script_master.sh b/tool/flutter_ci_script_master.sh index 9d5fcd2b4..f729d46f4 100755 --- a/tool/flutter_ci_script_master.sh +++ b/tool/flutter_ci_script_master.sh @@ -55,7 +55,8 @@ declare -ar PROJECT_NAMES=( "provider_shopper" "simple_shader" "simplistic_calculator" - "simplistic_editor" + # TODO(DomesticMouse): The method 'isSelectionWithinTextBounds' isn't defined for the type 'TextEditingController' + # "simplistic_editor" "testing_app" "veggieseasons" "web_embedding/element_embedding_demo"