From effeff6385b642203aa0ceaa4a8b70b42c9bebe4 Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Thu, 2 Jun 2022 12:29:01 -0700 Subject: [PATCH] Revert "Hide text selection toolbar when dragging handles on mobile (#104274)" This reverts commit 4ec4c249ea5d62d6ef06e6d2e6af48c4500decb2. --- .../lib/src/widgets/text_selection.dart | 70 ++----------------- .../test/material/text_field_test.dart | 5 -- .../test/widgets/editable_text_test.dart | 63 ----------------- .../test/widgets/selectable_text_test.dart | 7 +- .../test/widgets/text_selection_test.dart | 2 - 5 files changed, 6 insertions(+), 141 deletions(-) diff --git a/packages/flutter/lib/src/widgets/text_selection.dart b/packages/flutter/lib/src/widgets/text_selection.dart index f27b1cf831e19..3075c511ca581 100644 --- a/packages/flutter/lib/src/widgets/text_selection.dart +++ b/packages/flutter/lib/src/widgets/text_selection.dart @@ -29,11 +29,6 @@ export 'package:flutter/services.dart' show TextSelectionDelegate; /// called. const Duration _kDragSelectionUpdateThrottle = Duration(milliseconds: 50); -/// A duration that determines the delay before showing the text selection -/// toolbar again after dragging either selection handle on Android. Eyeballed -/// on a Pixel 5 Android API 31 emulator. -const Duration _kAndroidPostDragShowDelay = Duration(milliseconds: 300); - /// Signature for when a pointer that's dragging to select text has moved again. /// /// The first argument [startDetails] contains the details of the event that @@ -787,8 +782,6 @@ class SelectionOverlay { /// Controls the fade-in and fade-out animations for the toolbar and handles. static const Duration fadeDuration = Duration(milliseconds: 150); - Timer? _androidPostDragShowTimer; - /// A pair of handles. If this is non-null, there are always 2, though the /// second is hidden when the selection is collapsed. List? _handles; @@ -828,7 +821,7 @@ class SelectionOverlay { /// Shows the toolbar by inserting it into the [context]'s overlay. /// {@endtemplate} void showToolbar() { - if (_toolbar != null || (_hideToolbarWhenDraggingHandles && _isDraggingHandles)) { + if (_toolbar != null) { return; } _toolbar = OverlayEntry(builder: _buildToolbar); @@ -895,62 +888,9 @@ class SelectionOverlay { /// Disposes this object and release resources. /// {@endtemplate} void dispose() { - _androidPostDragShowTimer?.cancel(); - _androidPostDragShowTimer = null; hide(); } - final bool _hideToolbarWhenDraggingHandles = - { TargetPlatform.iOS, TargetPlatform.android }.contains(defaultTargetPlatform); - - bool _isDraggingStartHandle = false; - bool _isDraggingEndHandle = false; - bool get _isDraggingHandles => _isDraggingStartHandle || _isDraggingEndHandle; - - Future _handleDragging() async { - // Hide toolbar while dragging either handle on Android and iOS. - if (!_hideToolbarWhenDraggingHandles) - return; - - if (_isDraggingHandles) { - if (defaultTargetPlatform == TargetPlatform.android) { - _androidPostDragShowTimer?.cancel(); - _androidPostDragShowTimer = null; - } - hideToolbar(); - } else { - if (defaultTargetPlatform == TargetPlatform.android) { - _androidPostDragShowTimer = Timer(_kAndroidPostDragShowDelay, showToolbar); - } else { - showToolbar(); - } - } - } - - void _onStartHandleDragStart(DragStartDetails details) { - _isDraggingStartHandle = true; - _handleDragging(); - onStartHandleDragStart?.call(details); - } - - void _onStartHandleDragEnd(DragEndDetails details) { - _isDraggingStartHandle = false; - _handleDragging(); - onStartHandleDragEnd?.call(details); - } - - void _onEndHandleDragStart(DragStartDetails details) { - _isDraggingEndHandle = true; - _handleDragging(); - onEndHandleDragStart?.call(details); - } - - void _onEndHandleDragEnd(DragEndDetails details) { - _isDraggingEndHandle = false; - _handleDragging(); - onEndHandleDragEnd?.call(details); - } - Widget _buildStartHandle(BuildContext context) { final Widget handle; final TextSelectionControls? selectionControls = this.selectionControls; @@ -961,9 +901,9 @@ class SelectionOverlay { type: _startHandleType, handleLayerLink: startHandleLayerLink, onSelectionHandleTapped: onSelectionHandleTapped, - onSelectionHandleDragStart: _onStartHandleDragStart, + onSelectionHandleDragStart: onStartHandleDragStart, onSelectionHandleDragUpdate: onStartHandleDragUpdate, - onSelectionHandleDragEnd: _onStartHandleDragEnd, + onSelectionHandleDragEnd: onStartHandleDragEnd, selectionControls: selectionControls, visibility: startHandlesVisible, preferredLineHeight: _lineHeightAtStart, @@ -986,9 +926,9 @@ class SelectionOverlay { type: _endHandleType, handleLayerLink: endHandleLayerLink, onSelectionHandleTapped: onSelectionHandleTapped, - onSelectionHandleDragStart: _onEndHandleDragStart, + onSelectionHandleDragStart: onEndHandleDragStart, onSelectionHandleDragUpdate: onEndHandleDragUpdate, - onSelectionHandleDragEnd: _onEndHandleDragEnd, + onSelectionHandleDragEnd: onEndHandleDragEnd, selectionControls: selectionControls, visibility: endHandlesVisible, preferredLineHeight: _lineHeightAtEnd, diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index c818af4869251..5aee23098ab52 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -3179,11 +3179,6 @@ void main() { expect(controller.selection.extentOffset, 50); if (!isContextMenuProvidedByPlatform) { - if (defaultTargetPlatform == TargetPlatform.android) { - // There should be a delay before the toolbar is shown again on Android. - expect(find.text('Cut'), findsNothing); - await tester.pump(const Duration(milliseconds: 300)); - } await tester.tap(find.text('Cut')); await tester.pump(); expect(controller.selection.isCollapsed, true); diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart index 38b1247dc281f..3e46034def0b0 100644 --- a/packages/flutter/test/widgets/editable_text_test.dart +++ b/packages/flutter/test/widgets/editable_text_test.dart @@ -1553,69 +1553,6 @@ void main() { // toolbar. Until we change that, this test should remain skipped. }, skip: kIsWeb, variant: const TargetPlatformVariant({ TargetPlatform.iOS, TargetPlatform.android })); // [intended] - testWidgets('dragging handles hides toolbar on mobile', (WidgetTester tester) async { - controller.text = 'blah blah blah'; - - await tester.pumpWidget( - MaterialApp( - home: EditableText( - backgroundCursorColor: Colors.grey, - controller: controller, - focusNode: focusNode, - style: textStyle, - cursorColor: cursorColor, - selectionControls: materialTextSelectionControls, - ), - ), - ); - - final EditableTextState state = - tester.state(find.byType(EditableText)); - - // Show the toolbar - state.renderEditable.selectWordsInRange( - from: Offset.zero, - cause: SelectionChangedCause.tap, - ); - await tester.pump(); - - expect(state.showToolbar(), true); - await tester.pumpAndSettle(); - expect(find.text('Paste'), findsOneWidget); - - final List endpoints = globalize( - state.renderEditable.getEndpointsForSelection(state.textEditingValue.selection), - state.renderEditable, - ); - expect(endpoints.length, 2); - - // We use a small offset because the endpoint is on the very corner of the - // handle. - final Offset endHandlePosition = endpoints[1].point + const Offset(1.0, 1.0); - - // Select 2 more characters by dragging end handle. - final TestGesture gesture = await tester.startGesture(endHandlePosition); - await gesture.moveTo(textOffsetToPosition(tester, 6)); - await tester.pumpAndSettle(); - expect(find.text('Paste'), findsNothing); - - // End drag gesture and expect toolbar to show again. - await gesture.up(); - if (defaultTargetPlatform == TargetPlatform.android) { - // There should be a delay before the toolbar is shown again on Android. - expect(find.text('Paste'), findsNothing); - await tester.pump(const Duration(milliseconds: 300)); - } - await tester.pumpAndSettle(); - expect(find.text('Paste'), findsOneWidget); - - // On web, we don't show the Flutter toolbar and instead rely on the browser - // toolbar. Until we change that, this test should remain skipped. - }, - skip: kIsWeb, // [intended] - variant: const TargetPlatformVariant({ TargetPlatform.iOS, TargetPlatform.android }), - ); - testWidgets('Paste is shown only when there is something to paste', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( diff --git a/packages/flutter/test/widgets/selectable_text_test.dart b/packages/flutter/test/widgets/selectable_text_test.dart index 206bde93e9db1..66bee58dc5b38 100644 --- a/packages/flutter/test/widgets/selectable_text_test.dart +++ b/packages/flutter/test/widgets/selectable_text_test.dart @@ -1132,12 +1132,7 @@ void main() { await gesture.moveTo(newHandlePos); await tester.pump(); await gesture.up(); - if (defaultTargetPlatform == TargetPlatform.android) { - // There should be a delay before the toolbar is shown again on Android. - expect(find.text('Cut'), findsNothing); - await tester.pump(const Duration(milliseconds: 300)); - } - await tester.pumpAndSettle(); + await tester.pump(); expect(controller.selection.baseOffset, 5); expect(controller.selection.extentOffset, 50); diff --git a/packages/flutter/test/widgets/text_selection_test.dart b/packages/flutter/test/widgets/text_selection_test.dart index a5c9cf1c92f1e..bf04f41bd3c2b 100644 --- a/packages/flutter/test/widgets/text_selection_test.dart +++ b/packages/flutter/test/widgets/text_selection_test.dart @@ -1246,8 +1246,6 @@ void main() { await gesture2.up(); await tester.pump(const Duration(milliseconds: 20)); expect(endDragEndDetails, isNotNull); - - selectionOverlay.dispose(); }); }); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy