Text Selection Overflow (Android) (#49391)

Adds an overflow menu to the text selection menu on Android when the items overflow.
diff --git a/packages/flutter/lib/src/material/material_localizations.dart b/packages/flutter/lib/src/material/material_localizations.dart
index bad3d05..f15014e 100644
--- a/packages/flutter/lib/src/material/material_localizations.dart
+++ b/packages/flutter/lib/src/material/material_localizations.dart
@@ -71,6 +71,9 @@
   /// The tooltip for the delete button on a [Chip].
   String get deleteButtonTooltip;
 
+  /// The tooltip for the more button on an overflowing text selection menu.
+  String get moreButtonTooltip;
+
   /// The tooltip for the [MonthPicker]'s "next month" button.
   String get nextMonthTooltip;
 
@@ -562,6 +565,9 @@
   String get deleteButtonTooltip => 'Delete';
 
   @override
+  String get moreButtonTooltip => 'More';
+
+  @override
   String get nextMonthTooltip => 'Next month';
 
   @override
diff --git a/packages/flutter/lib/src/material/text_selection.dart b/packages/flutter/lib/src/material/text_selection.dart
index f1893e1..8ad2fd1 100644
--- a/packages/flutter/lib/src/material/text_selection.dart
+++ b/packages/flutter/lib/src/material/text_selection.dart
@@ -4,11 +4,14 @@
 
 import 'dart:math' as math;
 
-import 'package:flutter/widgets.dart';
 import 'package:flutter/rendering.dart';
+import 'package:flutter/scheduler.dart';
+import 'package:flutter/widgets.dart';
 
 import 'debug.dart';
 import 'flat_button.dart';
+import 'icon_button.dart';
+import 'icons.dart';
 import 'material.dart';
 import 'material_localizations.dart';
 import 'theme.dart';
@@ -20,17 +23,18 @@
 const double _kToolbarScreenPadding = 8.0;
 const double _kToolbarHeight = 44.0;
 // Padding when positioning toolbar below selection.
-const double _kToolbarContentDistanceBelow = 16.0;
+const double _kToolbarContentDistanceBelow = _kHandleSize - 2.0;
 const double _kToolbarContentDistance = 8.0;
 
 /// Manages a copy/paste text selection toolbar.
-class _TextSelectionToolbar extends StatelessWidget {
+class _TextSelectionToolbar extends StatefulWidget {
   const _TextSelectionToolbar({
     Key key,
     this.handleCut,
     this.handleCopy,
     this.handlePaste,
     this.handleSelectAll,
+    this.isAbove,
   }) : super(key: key);
 
   final VoidCallback handleCut;
@@ -38,14 +42,60 @@
   final VoidCallback handlePaste;
   final VoidCallback handleSelectAll;
 
+  // When true, the toolbar fits above its anchor and will be positioned there.
+  final bool isAbove;
+
+  @override
+  _TextSelectionToolbarState createState() => _TextSelectionToolbarState();
+}
+
+class _TextSelectionToolbarState extends State<_TextSelectionToolbar> with TickerProviderStateMixin {
+  // Whether or not the overflow menu is open. When it is closed, the menu
+  // items that don't overflow are shown. When it is open, only the overflowing
+  // menu items are shown.
+  bool _overflowOpen = false;
+
+  // The key for _TextSelectionToolbarContainer.
+  UniqueKey _containerKey = UniqueKey();
+
+  FlatButton _getItem(VoidCallback onPressed, String label) {
+    assert(onPressed != null);
+    return FlatButton(
+      child: Text(label),
+      onPressed: onPressed,
+    );
+  }
+
+  @override
+  void didUpdateWidget(_TextSelectionToolbar oldWidget) {
+    if (((widget.handleCut == null) != (oldWidget.handleCut == null))
+      || ((widget.handleCopy == null) != (oldWidget.handleCopy == null))
+      || ((widget.handlePaste == null) != (oldWidget.handlePaste == null))
+      || ((widget.handleSelectAll == null) != (oldWidget.handleSelectAll == null))) {
+      // Change _TextSelectionToolbarContainer's key when the menu changes in
+      // order to cause it to rebuild. This lets it recalculate its
+      // saved width for the new set of children, and it prevents AnimatedSize
+      // from animating the size change.
+      _containerKey = UniqueKey();
+      // If the menu items change, make sure the overflow menu is closed. This
+      // prevents an empty overflow menu.
+      _overflowOpen = false;
+    }
+    super.didUpdateWidget(oldWidget);
+  }
+
   @override
   Widget build(BuildContext context) {
     final MaterialLocalizations localizations = MaterialLocalizations.of(context);
     final List<Widget> items = <Widget>[
-      if (handleCut != null) FlatButton(child: Text(localizations.cutButtonLabel), onPressed: handleCut),
-      if (handleCopy != null) FlatButton(child: Text(localizations.copyButtonLabel), onPressed: handleCopy),
-      if (handlePaste != null) FlatButton(child: Text(localizations.pasteButtonLabel), onPressed: handlePaste),
-      if (handleSelectAll != null) FlatButton(child: Text(localizations.selectAllButtonLabel), onPressed: handleSelectAll),
+      if (widget.handleCut != null)
+        _getItem(widget.handleCut, localizations.cutButtonLabel),
+      if (widget.handleCopy != null)
+        _getItem(widget.handleCopy, localizations.copyButtonLabel),
+      if (widget.handlePaste != null)
+        _getItem(widget.handlePaste, localizations.pasteButtonLabel),
+      if (widget.handleSelectAll != null)
+        _getItem(widget.handleSelectAll, localizations.selectAllButtonLabel),
     ];
 
     // If there is no option available, build an empty widget.
@@ -53,31 +103,481 @@
       return Container(width: 0.0, height: 0.0);
     }
 
-    return Material(
-      elevation: 1.0,
-      child: Container(
-        height: _kToolbarHeight,
-        child: Row(mainAxisSize: MainAxisSize.min, children: items),
+
+    return _TextSelectionToolbarContainer(
+      key: _containerKey,
+      overflowOpen: _overflowOpen,
+      child: AnimatedSize(
+        vsync: this,
+        // This duration was eyeballed on a Pixel 2 emulator running Android
+        // API 28.
+        duration: const Duration(milliseconds: 140),
+        child: Material(
+          elevation: 1.0,
+          child: _TextSelectionToolbarItems(
+            isAbove: widget.isAbove,
+            overflowOpen: _overflowOpen,
+            children: <Widget>[
+              // The navButton that shows and hides the overflow menu is the
+              // first child.
+              Material(
+                child: IconButton(
+                  // TODO(justinmc): This should be an AnimatedIcon, but
+                  // AnimatedIcons doesn't yet support arrow_back to more_vert.
+                  // https://github.com/flutter/flutter/issues/51209
+                  icon: Icon(_overflowOpen ? Icons.arrow_back : Icons.more_vert),
+                  onPressed: () {
+                    setState(() {
+                      _overflowOpen = !_overflowOpen;
+                    });
+                  },
+                  tooltip: _overflowOpen
+                      ? localizations.backButtonTooltip
+                      : localizations.moreButtonTooltip,
+                ),
+              ),
+              ...items,
+            ],
+          ),
+        ),
       ),
     );
   }
 }
 
-/// Centers the toolbar around the given position, ensuring that it remains on
+// When the overflow menu is open, it tries to align its right edge to the right
+// edge of the closed menu. This widget handles this effect by measuring and
+// maintaining the width of the closed menu and aligning the child to the right.
+class _TextSelectionToolbarContainer extends SingleChildRenderObjectWidget {
+  const _TextSelectionToolbarContainer({
+    Key key,
+    @required Widget child,
+    @required this.overflowOpen,
+  }) : assert(child != null),
+       assert(overflowOpen != null),
+       super(key: key, child: child);
+
+  final bool overflowOpen;
+
+  @override
+  _TextSelectionToolbarContainerRenderBox createRenderObject(BuildContext context) {
+    return _TextSelectionToolbarContainerRenderBox(overflowOpen: overflowOpen);
+  }
+
+  @override
+  void updateRenderObject(BuildContext context, _TextSelectionToolbarContainerRenderBox renderObject) {
+    renderObject.overflowOpen = overflowOpen;
+  }
+}
+
+class _TextSelectionToolbarContainerRenderBox extends RenderProxyBox {
+  _TextSelectionToolbarContainerRenderBox({
+    @required bool overflowOpen,
+  }) : assert(overflowOpen != null),
+       _overflowOpen = overflowOpen,
+       super();
+
+  // The width of the menu when it was closed. This is used to achieve the
+  // behavior where the open menu aligns its right edge to the closed menu's
+  // right edge.
+  double _closedWidth;
+
+  bool _overflowOpen;
+  bool get overflowOpen => _overflowOpen;
+  set overflowOpen(bool value) {
+    if (value == overflowOpen) {
+      return;
+    }
+    _overflowOpen = value;
+    markNeedsLayout();
+  }
+
+  @override
+  void performLayout() {
+    child.layout(constraints.loosen(), parentUsesSize: true);
+
+    // Save the width when the menu is closed. If the menu changes, this width
+    // is invalid, so it's important that this RenderBox be recreated in that
+    // case. Currently, this is achieved by providing a new key to
+    // _TextSelectionToolbarContainer.
+    if (!overflowOpen && _closedWidth == null) {
+      _closedWidth = child.size.width;
+    }
+
+    size = constraints.constrain(Size(
+      // If the open menu is wider than the closed menu, just use its own width
+      // and don't worry about aligning the right edges.
+      // _closedWidth is used even when the menu is closed to allow it to
+      // animate its size while keeping the same right alignment.
+      _closedWidth == null || child.size.width > _closedWidth ? child.size.width : _closedWidth,
+      child.size.height,
+    ));
+
+    final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
+    childParentData.offset = Offset(
+      size.width - child.size.width,
+      0.0,
+    );
+  }
+
+  // Paint at the offset set in the parent data.
+  @override
+  void paint(PaintingContext context, Offset offset) {
+    final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
+    context.paintChild(child, childParentData.offset + offset);
+  }
+
+  // Include the parent data offset in the hit test.
+  @override
+  bool hitTestChildren(BoxHitTestResult result, { Offset position }) {
+    // The x, y parameters have the top left of the node's box as the origin.
+    final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
+    return result.addWithPaintOffset(
+      offset: childParentData.offset,
+      position: position,
+      hitTest: (BoxHitTestResult result, Offset transformed) {
+        assert(transformed == position - childParentData.offset);
+        return child.hitTest(result, position: transformed);
+      },
+    );
+  }
+
+  @override
+  void setupParentData(RenderBox child) {
+    if (child.parentData is! _ToolbarParentData) {
+      child.parentData = _ToolbarParentData();
+    }
+  }
+
+  @override
+  void applyPaintTransform(RenderObject child, Matrix4 transform) {
+    final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
+    transform.translate(childParentData.offset.dx, childParentData.offset.dy);
+    super.applyPaintTransform(child, transform);
+  }
+}
+
+// Renders the menu items in the correct positions in the menu and its overflow
+// submenu based on calculating which item would first overflow.
+class _TextSelectionToolbarItems extends MultiChildRenderObjectWidget {
+  _TextSelectionToolbarItems({
+    Key key,
+    @required this.isAbove,
+    @required this.overflowOpen,
+    @required List<Widget> children,
+  }) : assert(children != null),
+       assert(isAbove != null),
+       assert(overflowOpen != null),
+       super(key: key, children: children);
+
+  final bool isAbove;
+  final bool overflowOpen;
+
+  @override
+  _TextSelectionToolbarItemsRenderBox createRenderObject(BuildContext context) {
+    return _TextSelectionToolbarItemsRenderBox(
+      isAbove: isAbove,
+      overflowOpen: overflowOpen,
+    );
+  }
+
+  @override
+  void updateRenderObject(BuildContext context, _TextSelectionToolbarItemsRenderBox renderObject) {
+    renderObject
+      ..isAbove = isAbove
+      ..overflowOpen = overflowOpen;
+  }
+
+  @override
+  _TextSelectionToolbarItemsElement createElement() => _TextSelectionToolbarItemsElement(this);
+}
+
+class _ToolbarParentData extends ContainerBoxParentData<RenderBox> {
+  /// Whether or not this child is painted.
+  ///
+  /// Children in the selection toolbar may be laid out for measurement purposes
+  /// but not painted. This allows these children to be identified.
+  bool shouldPaint;
+
+  @override
+  String toString() => '${super.toString()}; shouldPaint=$shouldPaint';
+}
+
+class _TextSelectionToolbarItemsElement extends MultiChildRenderObjectElement {
+  _TextSelectionToolbarItemsElement(
+    MultiChildRenderObjectWidget widget,
+  ) : super(widget);
+
+  static bool _shouldPaint(Element child) {
+    return (child.renderObject.parentData as _ToolbarParentData).shouldPaint;
+  }
+
+  @override
+  void debugVisitOnstageChildren(ElementVisitor visitor) {
+    children.where(_shouldPaint).forEach(visitor);
+  }
+}
+
+class _TextSelectionToolbarItemsRenderBox extends RenderBox with ContainerRenderObjectMixin<RenderBox, _ToolbarParentData> {
+  _TextSelectionToolbarItemsRenderBox({
+    @required bool isAbove,
+    @required bool overflowOpen,
+  }) : assert(overflowOpen != null),
+       assert(isAbove != null),
+       _isAbove = isAbove,
+       _overflowOpen = overflowOpen,
+       super();
+
+  // The index of the last item that doesn't overflow.
+  int _lastIndexThatFits = -1;
+
+  bool _isAbove;
+  bool get isAbove => _isAbove;
+  set isAbove(bool value) {
+    if (value == isAbove) {
+      return;
+    }
+    _isAbove = value;
+    markNeedsLayout();
+  }
+
+  bool _overflowOpen;
+  bool get overflowOpen => _overflowOpen;
+  set overflowOpen(bool value) {
+    if (value == overflowOpen) {
+      return;
+    }
+    _overflowOpen = value;
+    markNeedsLayout();
+  }
+
+  // Layout the necessary children, and figure out where the children first
+  // overflow, if at all.
+  void _layoutChildren() {
+    // When overflow is not open, the toolbar is always a specific height.
+    final BoxConstraints sizedConstraints = _overflowOpen
+      ? constraints
+      : BoxConstraints.loose(Size(
+          constraints.maxWidth,
+          _kToolbarHeight,
+        ));
+
+    int i = -1;
+    double width = 0.0;
+    visitChildren((RenderObject renderObjectChild) {
+      i++;
+
+      // No need to layout children inside the overflow menu when it's closed.
+      // The opposite is not true. It is necessary to layout the children that
+      // don't overflow when the overflow menu is open in order to calculate
+      // _lastIndexThatFits.
+      if (_lastIndexThatFits != -1 && !overflowOpen) {
+        return;
+      }
+
+      final RenderBox child = renderObjectChild as RenderBox;
+      child.layout(sizedConstraints.loosen(), parentUsesSize: true);
+      width += child.size.width;
+
+      if (width > sizedConstraints.maxWidth && _lastIndexThatFits == -1) {
+        _lastIndexThatFits = i - 1;
+      }
+    });
+
+    // If the last child overflows, but only because of the width of the
+    // overflow button, then just show it and hide the overflow button.
+    final RenderBox navButton = firstChild;
+    if (_lastIndexThatFits != -1
+        && _lastIndexThatFits == childCount - 2
+        && width - navButton.size.width <= sizedConstraints.maxWidth) {
+      _lastIndexThatFits = -1;
+    }
+  }
+
+  // Returns true when the child should be painted, false otherwise.
+  bool _shouldPaintChild(RenderObject renderObjectChild, int index) {
+    // Paint the navButton when there is overflow.
+    if (renderObjectChild == firstChild) {
+      return _lastIndexThatFits != -1;
+    }
+
+    // If there is no overflow, all children besides the navButton are painted.
+    if (_lastIndexThatFits == -1) {
+      return true;
+    }
+
+    // When there is overflow, paint if the child is in the part of the menu
+    // that is currently open. Overflowing children are painted when the
+    // overflow menu is open, and the children that fit are painted when the
+    // overflow menu is closed.
+    return (index > _lastIndexThatFits) == overflowOpen;
+  }
+
+  // Decide which children will be pained and set their shouldPaint, and set the
+  // offset that painted children will be placed at.
+  void _placeChildren() {
+    int i = -1;
+    Size nextSize = const Size(0.0, 0.0);
+    double fitWidth = 0.0;
+    final RenderBox navButton = firstChild;
+    double overflowHeight = overflowOpen && !isAbove ? navButton.size.height : 0.0;
+    visitChildren((RenderObject renderObjectChild) {
+      i++;
+
+      final RenderBox child = renderObjectChild as RenderBox;
+      final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
+
+      // Handle placing the navigation button after iterating all children.
+      if (renderObjectChild == navButton) {
+        return;
+      }
+
+      // There is no need to place children that won't be painted.
+      if (!_shouldPaintChild(renderObjectChild, i)) {
+        childParentData.shouldPaint = false;
+        return;
+      }
+      childParentData.shouldPaint = true;
+
+      if (!overflowOpen) {
+        childParentData.offset = Offset(fitWidth, 0.0);
+        fitWidth += child.size.width;
+        nextSize = Size(
+          fitWidth,
+          math.max(child.size.height, nextSize.height),
+        );
+      } else {
+        childParentData.offset = Offset(0.0, overflowHeight);
+        overflowHeight += child.size.height;
+        nextSize = Size(
+          math.max(child.size.width, nextSize.width),
+          overflowHeight,
+        );
+      }
+    });
+
+    // Place the navigation button if needed.
+    final _ToolbarParentData navButtonParentData = navButton.parentData as _ToolbarParentData;
+    if (_shouldPaintChild(firstChild, 0)) {
+      navButtonParentData.shouldPaint = true;
+      if (overflowOpen) {
+        navButtonParentData.offset = isAbove
+          ? Offset(0.0, overflowHeight)
+          : Offset.zero;
+        nextSize = Size(
+          nextSize.width,
+          isAbove ? nextSize.height + navButton.size.height : nextSize.height,
+        );
+      } else {
+        navButtonParentData.offset = Offset(fitWidth, 0.0);
+        nextSize = Size(nextSize.width + navButton.size.width, nextSize.height);
+      }
+    } else {
+      navButtonParentData.shouldPaint = false;
+    }
+
+    size = nextSize;
+  }
+
+  @override
+  void performLayout() {
+    _lastIndexThatFits = -1;
+    if (firstChild == null) {
+      performResize();
+      return;
+    }
+
+    _layoutChildren();
+    _placeChildren();
+  }
+
+  @override
+  void paint(PaintingContext context, Offset offset) {
+    visitChildren((RenderObject renderObjectChild) {
+      final RenderBox child = renderObjectChild as RenderBox;
+      final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
+      if (!childParentData.shouldPaint) {
+        return;
+      }
+
+      context.paintChild(child, childParentData.offset + offset);
+    });
+  }
+
+  @override
+  void setupParentData(RenderBox child) {
+    if (child.parentData is! _ToolbarParentData) {
+      child.parentData = _ToolbarParentData();
+    }
+  }
+
+  @override
+  bool hitTestChildren(BoxHitTestResult result, { Offset position }) {
+    // The x, y parameters have the top left of the node's box as the origin.
+    RenderBox child = lastChild;
+    while (child != null) {
+      final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
+
+      // Don't hit test children aren't shown.
+      if (!childParentData.shouldPaint) {
+        child = childParentData.previousSibling;
+        continue;
+      }
+
+      final bool isHit = result.addWithPaintOffset(
+        offset: childParentData.offset,
+        position: position,
+        hitTest: (BoxHitTestResult result, Offset transformed) {
+          assert(transformed == position - childParentData.offset);
+          return child.hitTest(result, position: transformed);
+        },
+      );
+      if (isHit)
+        return true;
+      child = childParentData.previousSibling;
+    }
+    return false;
+  }
+}
+
+/// Centers the toolbar around the given anchor, ensuring that it remains on
 /// screen.
 class _TextSelectionToolbarLayout extends SingleChildLayoutDelegate {
-  _TextSelectionToolbarLayout(this.screenSize, this.globalEditableRegion, this.position);
+  _TextSelectionToolbarLayout(this.anchor, this.upperBounds, this.fitsAbove);
 
-  /// The size of the screen at the time that the toolbar was last laid out.
-  final Size screenSize;
+  /// Anchor position of the toolbar in global coordinates.
+  final Offset anchor;
 
-  /// Size and position of the editing region at the time the toolbar was last
-  /// laid out, in global coordinates.
-  final Rect globalEditableRegion;
+  /// The upper-most valid y value for the anchor.
+  final double upperBounds;
 
-  /// Anchor position of the toolbar, relative to the top left of the
-  /// [globalEditableRegion].
-  final Offset position;
+  /// Whether the closed toolbar fits above the anchor position.
+  ///
+  /// If the closed toolbar doesn't fit, then the menu is rendered below the
+  /// anchor position. It should never happen that the toolbar extends below the
+  /// padded bottom of the screen.
+  ///
+  /// If the closed toolbar does fit but it doesn't fit when the overflow menu
+  /// is open, then the toolbar is still rendered above the anchor position. It
+  /// then grows downward, overlapping the selection.
+  final bool fitsAbove;
+
+  // Return the value that centers width as closely as possible to position
+  // while fitting inside of min and max.
+  static double _centerOn(double position, double width, double min, double max) {
+    // If it overflows on the left, put it as far left as possible.
+    if (position - width / 2.0 < min) {
+      return min;
+    }
+
+    // If it overflows on the right, put it as far right as possible.
+    if (position + width / 2.0 > max) {
+      return max - width;
+    }
+
+    // Otherwise it fits while perfectly centered.
+    return position - width / 2.0;
+  }
 
   @override
   BoxConstraints getConstraintsForChild(BoxConstraints constraints) {
@@ -86,27 +586,22 @@
 
   @override
   Offset getPositionForChild(Size size, Size childSize) {
-    final Offset globalPosition = globalEditableRegion.topLeft + position;
-
-    double x = globalPosition.dx - childSize.width / 2.0;
-    double y = globalPosition.dy - childSize.height;
-
-    if (x < _kToolbarScreenPadding)
-      x = _kToolbarScreenPadding;
-    else if (x + childSize.width > screenSize.width - _kToolbarScreenPadding)
-      x = screenSize.width - childSize.width - _kToolbarScreenPadding;
-
-    if (y < _kToolbarScreenPadding)
-      y = _kToolbarScreenPadding;
-    else if (y + childSize.height > screenSize.height - _kToolbarScreenPadding)
-      y = screenSize.height - childSize.height - _kToolbarScreenPadding;
-
-    return Offset(x, y);
+    return Offset(
+      _centerOn(
+        anchor.dx,
+        childSize.width,
+        _kToolbarScreenPadding,
+        size.width - _kToolbarScreenPadding,
+      ),
+      fitsAbove
+        ? math.max(upperBounds, anchor.dy - childSize.height)
+        : anchor.dy,
+    );
   }
 
   @override
   bool shouldRelayout(_TextSelectionToolbarLayout oldDelegate) {
-    return position != oldDelegate.position;
+    return anchor != oldDelegate.anchor;
   }
 }
 
@@ -143,42 +638,52 @@
     BuildContext context,
     Rect globalEditableRegion,
     double textLineHeight,
-    Offset position,
+    Offset selectionMidpoint,
     List<TextSelectionPoint> endpoints,
     TextSelectionDelegate delegate,
   ) {
     assert(debugCheckHasMediaQuery(context));
     assert(debugCheckHasMaterialLocalizations(context));
 
-    // The toolbar should appear below the TextField
-    // when there is not enough space above the TextField to show it.
+    // The toolbar should appear below the TextField when there is not enough
+    // space above the TextField to show it.
     final TextSelectionPoint startTextSelectionPoint = endpoints[0];
-    final double toolbarHeightNeeded = MediaQuery.of(context).padding.top
-      + _kToolbarScreenPadding
+    final TextSelectionPoint endTextSelectionPoint = endpoints.length > 1
+      ? endpoints[1]
+      : endpoints[0];
+    const double closedToolbarHeightNeeded = _kToolbarScreenPadding
       + _kToolbarHeight
       + _kToolbarContentDistance;
-    final double availableHeight = globalEditableRegion.top + endpoints.first.point.dy - textLineHeight;
-    final bool fitsAbove = toolbarHeightNeeded <= availableHeight;
-    final double y = fitsAbove
-        ? startTextSelectionPoint.point.dy - _kToolbarContentDistance - textLineHeight
-        : startTextSelectionPoint.point.dy + _kToolbarHeight + _kToolbarContentDistanceBelow;
-    final Offset preciseMidpoint = Offset(position.dx, y);
+    final double paddingTop = MediaQuery.of(context).padding.top;
+    final double availableHeight = globalEditableRegion.top
+      + startTextSelectionPoint.point.dy
+      - textLineHeight
+      - paddingTop;
+    final bool fitsAbove = closedToolbarHeightNeeded <= availableHeight;
+    final Offset anchor = Offset(
+      globalEditableRegion.left + selectionMidpoint.dx,
+      fitsAbove
+        ? globalEditableRegion.top + startTextSelectionPoint.point.dy - textLineHeight - _kToolbarContentDistance
+        : globalEditableRegion.top + endTextSelectionPoint.point.dy + _kToolbarContentDistanceBelow,
+    );
 
-    return ConstrainedBox(
-      constraints: BoxConstraints.tight(globalEditableRegion.size),
-      child: CustomSingleChildLayout(
-        delegate: _TextSelectionToolbarLayout(
-          MediaQuery.of(context).size,
-          globalEditableRegion,
-          preciseMidpoint,
+    return Stack(
+      children: <Widget>[
+        CustomSingleChildLayout(
+          delegate: _TextSelectionToolbarLayout(
+            anchor,
+            _kToolbarScreenPadding + paddingTop,
+            fitsAbove,
+          ),
+          child: _TextSelectionToolbar(
+            handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
+            handleCopy: canCopy(delegate) ? () => handleCopy(delegate) : null,
+            handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
+            handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
+            isAbove: fitsAbove,
+          ),
         ),
-        child: _TextSelectionToolbar(
-          handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
-          handleCopy: canCopy(delegate) ? () => handleCopy(delegate) : null,
-          handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
-          handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
-        ),
-      ),
+      ],
     );
   }
 
@@ -190,7 +695,7 @@
       height: _kHandleSize,
       child: CustomPaint(
         painter: _TextSelectionHandlePainter(
-          color: Theme.of(context).textSelectionHandleColor
+          color: Theme.of(context).textSelectionHandleColor,
         ),
       ),
     );
diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart
index 84d68bb..0416e4c 100644
--- a/packages/flutter/lib/src/rendering/box.dart
+++ b/packages/flutter/lib/src/rendering/box.dart
@@ -2483,7 +2483,7 @@
   ///  * [defaultPaint], which paints the children appropriate for this
   ///    hit-testing strategy.
   bool defaultHitTestChildren(BoxHitTestResult result, { Offset position }) {
-    // the x, y parameters have the top left of the node's box as the origin
+    // The x, y parameters have the top left of the node's box as the origin.
     ChildType child = lastChild;
     while (child != null) {
       final ParentDataType childParentData = child.parentData as ParentDataType;
diff --git a/packages/flutter/test/material/localizations_test.dart b/packages/flutter/test/material/localizations_test.dart
index 6a2ab17..c27da0c 100644
--- a/packages/flutter/test/material/localizations_test.dart
+++ b/packages/flutter/test/material/localizations_test.dart
@@ -13,6 +13,7 @@
     expect(localizations.backButtonTooltip, isNotNull);
     expect(localizations.closeButtonTooltip, isNotNull);
     expect(localizations.deleteButtonTooltip, isNotNull);
+    expect(localizations.moreButtonTooltip, isNotNull);
     expect(localizations.nextMonthTooltip, isNotNull);
     expect(localizations.previousMonthTooltip, isNotNull);
     expect(localizations.nextPageTooltip, isNotNull);
diff --git a/packages/flutter/test/material/text.dart b/packages/flutter/test/material/text.dart
new file mode 100644
index 0000000..04cf7be
--- /dev/null
+++ b/packages/flutter/test/material/text.dart
@@ -0,0 +1,47 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter_test/flutter_test.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter/widgets.dart';
+
+// Returns the first RenderEditable.
+RenderEditable findRenderEditable(WidgetTester tester) {
+  final RenderObject root = tester.renderObject(find.byType(EditableText));
+  expect(root, isNotNull);
+
+  RenderEditable renderEditable;
+  void recursiveFinder(RenderObject child) {
+    if (child is RenderEditable) {
+      renderEditable = child;
+      return;
+    }
+    child.visitChildren(recursiveFinder);
+  }
+  root.visitChildren(recursiveFinder);
+  expect(renderEditable, isNotNull);
+  return renderEditable;
+}
+
+List<TextSelectionPoint> globalize(Iterable<TextSelectionPoint> points, RenderBox box) {
+  return points.map<TextSelectionPoint>((TextSelectionPoint point) {
+    return TextSelectionPoint(
+      box.localToGlobal(point.point),
+      point.direction,
+    );
+  }).toList();
+}
+
+Offset textOffsetToPosition(WidgetTester tester, int offset) {
+  final RenderEditable renderEditable = findRenderEditable(tester);
+  final List<TextSelectionPoint> endpoints = globalize(
+    renderEditable.getEndpointsForSelection(
+      TextSelection.collapsed(offset: offset),
+    ),
+    renderEditable,
+  );
+  expect(endpoints.length, 1);
+  return endpoints[0].point + const Offset(0.0, -2.0);
+}
diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart
index dfdd77a..157dd55 100644
--- a/packages/flutter/test/material/text_field_test.dart
+++ b/packages/flutter/test/material/text_field_test.dart
@@ -18,6 +18,7 @@
 import '../rendering/mock_canvas.dart';
 import '../widgets/semantics_tester.dart';
 import 'feedback_tester.dart';
+import 'text.dart' show findRenderEditable, globalize, textOffsetToPosition;
 
 class MockClipboard {
   Object _clipboardData = <String, dynamic>{
@@ -141,45 +142,6 @@
     kThreeLines +
     "\nFourth line won't display and ends at";
 
-  // Returns the first RenderEditable.
-  RenderEditable findRenderEditable(WidgetTester tester) {
-    final RenderObject root = tester.renderObject(find.byType(EditableText));
-    expect(root, isNotNull);
-
-    RenderEditable renderEditable;
-    void recursiveFinder(RenderObject child) {
-      if (child is RenderEditable) {
-        renderEditable = child;
-        return;
-      }
-      child.visitChildren(recursiveFinder);
-    }
-    root.visitChildren(recursiveFinder);
-    expect(renderEditable, isNotNull);
-    return renderEditable;
-  }
-
-  List<TextSelectionPoint> globalize(Iterable<TextSelectionPoint> points, RenderBox box) {
-    return points.map<TextSelectionPoint>((TextSelectionPoint point) {
-      return TextSelectionPoint(
-        box.localToGlobal(point.point),
-        point.direction,
-      );
-    }).toList();
-  }
-
-  Offset textOffsetToPosition(WidgetTester tester, int offset) {
-    final RenderEditable renderEditable = findRenderEditable(tester);
-    final List<TextSelectionPoint> endpoints = globalize(
-      renderEditable.getEndpointsForSelection(
-        TextSelection.collapsed(offset: offset),
-      ),
-      renderEditable,
-    );
-    expect(endpoints.length, 1);
-    return endpoints[0].point + const Offset(0.0, -2.0);
-  }
-
   setUp(() {
     debugResetSemanticsIdCounter();
   });
diff --git a/packages/flutter/test/material/text_selection_test.dart b/packages/flutter/test/material/text_selection_test.dart
index 4799bad..964f522 100644
--- a/packages/flutter/test/material/text_selection_test.dart
+++ b/packages/flutter/test/material/text_selection_test.dart
@@ -3,8 +3,10 @@
 // found in the LICENSE file.
 
 import 'package:flutter_test/flutter_test.dart';
-import 'package:flutter/widgets.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter/widgets.dart';
+import 'text.dart' show findRenderEditable, globalize, textOffsetToPosition;
 
 void main() {
   group('canSelectAll', () {
@@ -63,6 +65,445 @@
     });
   });
 
+  group('Text selection menu overflow (Android)', () {
+    testWidgets('All menu items show when they fit.', (WidgetTester tester) async {
+      final TextEditingController controller = TextEditingController(text: 'abc def ghi');
+      await tester.pumpWidget(MaterialApp(
+        theme: ThemeData(platform: TargetPlatform.android),
+        home: Directionality(
+            textDirection: TextDirection.ltr,
+            child: MediaQuery(
+              data: const MediaQueryData(size: Size(800.0, 600.0)),
+              child: Center(
+                child: Material(
+                  child: TextField(
+                    controller: controller,
+                  ),
+                ),
+              ),
+            ),
+          ),
+      ));
+
+      // Initially, the menu isn't shown at all.
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Tap to place the cursor in the field, then tap the handle to show the
+      // selection menu.
+      await tester.tap(find.byType(TextField));
+      await tester.pumpAndSettle();
+      final RenderEditable renderEditable = findRenderEditable(tester);
+      final List<TextSelectionPoint> endpoints = globalize(
+        renderEditable.getEndpointsForSelection(controller.selection),
+        renderEditable,
+      );
+      expect(endpoints.length, 1);
+      final Offset handlePos = endpoints[0].point + const Offset(0.0, 1.0);
+      await tester.tapAt(handlePos, pointer: 7);
+      await tester.pump();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Long press to select a word and show the full selection menu.
+      final Offset textOffset = textOffsetToPosition(tester, 1);
+      await tester.longPressAt(textOffset);
+      await tester.pump();
+      await tester.pump();
+
+      // The full menu is shown without the more button.
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsNothing);
+    }, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
+
+    testWidgets('When menu items don\'t fit, an overflow menu is used.', (WidgetTester tester) async {
+      // Set the screen size to more narrow, so that SELECT ALL can't fit.
+      tester.binding.window.physicalSizeTestValue = const Size(1000, 800);
+      addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
+
+      final TextEditingController controller = TextEditingController(text: 'abc def ghi');
+      await tester.pumpWidget(MaterialApp(
+        theme: ThemeData(platform: TargetPlatform.android),
+        home: Directionality(
+          textDirection: TextDirection.ltr,
+          child: MediaQuery(
+            data: const MediaQueryData(size: Size(800.0, 600.0)),
+            child: Center(
+              child: Material(
+                child: TextField(
+                  controller: controller,
+                ),
+              ),
+            ),
+          ),
+        ),
+      ));
+
+      // Initially, the menu isn't shown at all.
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Long press to show the menu.
+      final Offset textOffset = textOffsetToPosition(tester, 1);
+      await tester.longPressAt(textOffset);
+      await tester.pumpAndSettle();
+
+      // The last button is missing, and a more button is shown.
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsOneWidget);
+      final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
+
+      // Tapping the button shows the overflow menu.
+      await tester.tap(find.byType(IconButton));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsOneWidget);
+
+      // The back button is at the bottom of the overflow menu.
+      final Offset selectAllOffset = tester.getTopLeft(find.text('SELECT ALL'));
+      final Offset moreOffset = tester.getTopLeft(find.byType(IconButton));
+      expect(moreOffset.dy, greaterThan(selectAllOffset.dy));
+
+      // The overflow menu grows upward.
+      expect(selectAllOffset.dy, lessThan(cutOffset.dy));
+
+      // Tapping the back button shows the selection menu again.
+      expect(find.byType(IconButton), findsOneWidget);
+      await tester.tap(find.byType(IconButton));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsOneWidget);
+    }, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
+
+    testWidgets('A smaller menu bumps more items to the overflow menu.', (WidgetTester tester) async {
+      // Set the screen size so narrow that only CUT and COPY can fit.
+      tester.binding.window.physicalSizeTestValue = const Size(800, 800);
+      addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
+
+      final TextEditingController controller = TextEditingController(text: 'abc def ghi');
+      await tester.pumpWidget(MaterialApp(
+        theme: ThemeData(platform: TargetPlatform.android),
+        home: Directionality(
+          textDirection: TextDirection.ltr,
+          child: MediaQuery(
+            data: const MediaQueryData(size: Size(800.0, 600.0)),
+            child: Center(
+              child: Material(
+                child: TextField(
+                  controller: controller,
+                ),
+              ),
+            ),
+          ),
+        ),
+      ));
+
+      // Initially, the menu isn't shown at all.
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Long press to show the menu.
+      final Offset textOffset = textOffsetToPosition(tester, 1);
+      await tester.longPressAt(textOffset);
+      await tester.pump();
+
+      // The last two buttons are missing, and a more button is shown.
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsOneWidget);
+
+      // Tapping the button shows the overflow menu, which contains both buttons
+      // missing from the main menu, and a back button.
+      await tester.tap(find.byType(IconButton));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsOneWidget);
+
+      // Tapping the back button shows the selection menu again.
+      await tester.tap(find.byType(IconButton));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsOneWidget);
+    }, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
+
+    testWidgets('When the menu renders below the text, the overflow menu back button is at the top.', (WidgetTester tester) async {
+      // Set the screen size to more narrow, so that SELECT ALL can't fit.
+      tester.binding.window.physicalSizeTestValue = const Size(1000, 800);
+      addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
+
+      final TextEditingController controller = TextEditingController(text: 'abc def ghi');
+      await tester.pumpWidget(MaterialApp(
+        theme: ThemeData(platform: TargetPlatform.android),
+        home: Directionality(
+          textDirection: TextDirection.ltr,
+          child: MediaQuery(
+            data: const MediaQueryData(size: Size(800.0, 600.0)),
+            child: Align(
+              alignment: Alignment.topLeft,
+              child: Material(
+                child: TextField(
+                  controller: controller,
+                ),
+              ),
+            ),
+          ),
+        ),
+      ));
+
+      // Initially, the menu isn't shown at all.
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Long press to show the menu.
+      final Offset textOffset = textOffsetToPosition(tester, 1);
+      await tester.longPressAt(textOffset);
+      await tester.pump();
+
+      // The last button is missing, and a more button is shown.
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsOneWidget);
+      final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
+
+      // Tapping the button shows the overflow menu.
+      await tester.tap(find.byType(IconButton));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsOneWidget);
+
+      // The back button is at the top of the overflow menu.
+      final Offset selectAllOffset = tester.getTopLeft(find.text('SELECT ALL'));
+      final Offset moreOffset = tester.getTopLeft(find.byType(IconButton));
+      expect(moreOffset.dy, lessThan(selectAllOffset.dy));
+
+      // The overflow menu grows downward.
+      expect(selectAllOffset.dy, greaterThan(cutOffset.dy));
+
+      // Tapping the back button shows the selection menu again.
+      await tester.tap(find.byType(IconButton));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsOneWidget);
+    }, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
+
+    testWidgets('When the menu items change, the menu is closed and _closedWidth reset.', (WidgetTester tester) async {
+      // Set the screen size to more narrow, so that SELECT ALL can't fit.
+      tester.binding.window.physicalSizeTestValue = const Size(1000, 800);
+      addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
+
+      final TextEditingController controller = TextEditingController(text: 'abc def ghi');
+      await tester.pumpWidget(MaterialApp(
+        theme: ThemeData(platform: TargetPlatform.android),
+        home: Directionality(
+          textDirection: TextDirection.ltr,
+          child: MediaQuery(
+            data: const MediaQueryData(size: Size(800.0, 600.0)),
+            child: Align(
+              alignment: Alignment.topLeft,
+              child: Material(
+                child: TextField(
+                  controller: controller,
+                ),
+              ),
+            ),
+          ),
+        ),
+      ));
+
+      // Initially, the menu isn't shown at all.
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Tap to place the cursor and tap again to show the menu without a
+      // selection.
+      await tester.tapAt(textOffsetToPosition(tester, 0));
+      await tester.pumpAndSettle();
+      final RenderEditable renderEditable = findRenderEditable(tester);
+      final List<TextSelectionPoint> endpoints = globalize(
+        renderEditable.getEndpointsForSelection(controller.selection),
+        renderEditable,
+      );
+      expect(endpoints.length, 1);
+      final Offset handlePos = endpoints[0].point + const Offset(0.0, 1.0);
+      await tester.tapAt(handlePos, pointer: 7);
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Tap SELECT ALL and measure the usual position of CUT, without
+      // _closedWidth having been used yet.
+      await tester.tap(find.text('SELECT ALL'));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+      final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
+
+      // Tap to clear the selection.
+      await tester.tapAt(textOffsetToPosition(tester, 0));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Long press to show the menu.
+      await tester.longPressAt(textOffsetToPosition(tester, 1));
+      await tester.pump();
+
+      // The last button is missing, and a more button is shown.
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsOneWidget);
+
+      // Tapping the button shows the overflow menu.
+      await tester.tap(find.byType(IconButton));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsOneWidget);
+
+      // Tapping SELECT ALL changes the menu items so that there is no no longer
+      // any overflow.
+      await tester.tap(find.text('SELECT ALL'));
+      await tester.pumpAndSettle();
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+      final Offset newCutOffset = tester.getTopLeft(find.text('CUT'));
+      expect(newCutOffset, equals(cutOffset));
+    }, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
+  });
+
+  group('menu position', () {
+    testWidgets('When renders below a block of text, menu appears below bottom endpoint', (WidgetTester tester) async {
+      final TextEditingController controller = TextEditingController(text: 'abc\ndef\nghi\njkl\nmno\npqr');
+      await tester.pumpWidget(MaterialApp(
+        theme: ThemeData(platform: TargetPlatform.android),
+        home: Directionality(
+          textDirection: TextDirection.ltr,
+          child: MediaQuery(
+            data: const MediaQueryData(size: Size(800.0, 600.0)),
+            child: Align(
+              alignment: Alignment.topLeft,
+              child: Material(
+                child: TextField(
+                  controller: controller,
+                ),
+              ),
+            ),
+          ),
+        ),
+      ));
+
+      // Initially, the menu isn't shown at all.
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsNothing);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Tap to place the cursor in the field, then tap the handle to show the
+      // selection menu.
+      await tester.tap(find.byType(TextField));
+      await tester.pumpAndSettle();
+      RenderEditable renderEditable = findRenderEditable(tester);
+      List<TextSelectionPoint> endpoints = globalize(
+        renderEditable.getEndpointsForSelection(controller.selection),
+        renderEditable,
+      );
+      expect(endpoints.length, 1);
+      final Offset handlePos = endpoints[0].point + const Offset(0.0, 1.0);
+      await tester.tapAt(handlePos, pointer: 7);
+      await tester.pump();
+      expect(find.text('CUT'), findsNothing);
+      expect(find.text('COPY'), findsNothing);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsOneWidget);
+      expect(find.byType(IconButton), findsNothing);
+
+      // Tap to select all.
+      await tester.tap(find.text('SELECT ALL'));
+      await tester.pumpAndSettle();
+
+      // Only CUT, COPY, and PASTE are shown.
+      expect(find.text('CUT'), findsOneWidget);
+      expect(find.text('COPY'), findsOneWidget);
+      expect(find.text('PASTE'), findsOneWidget);
+      expect(find.text('SELECT ALL'), findsNothing);
+      expect(find.byType(IconButton), findsNothing);
+
+      // The menu appears below the bottom handle.
+      renderEditable = findRenderEditable(tester);
+      endpoints = globalize(
+        renderEditable.getEndpointsForSelection(controller.selection),
+        renderEditable,
+      );
+      expect(endpoints.length, 2);
+      final Offset bottomHandlePos = endpoints[1].point;
+      final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
+      expect(cutOffset.dy, greaterThan(bottomHandlePos.dy));
+    }, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
+  });
+
   group('material handles', () {
     testWidgets('draws transparent handle correctly', (WidgetTester tester) async {
       await tester.pumpWidget(RepaintBoundary(
diff --git a/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart b/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart
index 1c486ac..6344031 100644
--- a/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart
+++ b/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart
@@ -99,6 +99,9 @@
   String get modalBarrierDismissLabel => 'Maak toe';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Volgende maand';
 
   @override
@@ -303,6 +306,9 @@
   String get modalBarrierDismissLabel => 'አሰናብት';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'ቀጣይ ወር';
 
   @override
@@ -507,6 +513,9 @@
   String get modalBarrierDismissLabel => 'رفض';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'الشهر التالي';
 
   @override
@@ -711,6 +720,9 @@
   String get modalBarrierDismissLabel => 'অগ্ৰাহ্য কৰক';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'পৰৱৰ্তী মাহ';
 
   @override
@@ -915,6 +927,9 @@
   String get modalBarrierDismissLabel => 'İmtina edin';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Növbəti ay';
 
   @override
@@ -1119,6 +1134,9 @@
   String get modalBarrierDismissLabel => 'Адхіліць';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Наступны месяц';
 
   @override
@@ -1323,6 +1341,9 @@
   String get modalBarrierDismissLabel => 'Отхвърляне';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Следващият месец';
 
   @override
@@ -1527,6 +1548,9 @@
   String get modalBarrierDismissLabel => 'খারিজ করুন';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'পরের মাস';
 
   @override
@@ -1731,6 +1755,9 @@
   String get modalBarrierDismissLabel => 'Odbaci';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Sljedeći mjesec';
 
   @override
@@ -1935,6 +1962,9 @@
   String get modalBarrierDismissLabel => 'Ignora';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Mes següent';
 
   @override
@@ -2139,6 +2169,9 @@
   String get modalBarrierDismissLabel => 'Zavřít';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Další měsíc';
 
   @override
@@ -2343,6 +2376,9 @@
   String get modalBarrierDismissLabel => 'Afvis';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Næste måned';
 
   @override
@@ -2547,6 +2583,9 @@
   String get modalBarrierDismissLabel => 'Schließen';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Nächster Monat';
 
   @override
@@ -2781,6 +2820,9 @@
   String get modalBarrierDismissLabel => 'Παράβλεψη';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Επόμενος μήνας';
 
   @override
@@ -2985,6 +3027,9 @@
   String get modalBarrierDismissLabel => 'Dismiss';
 
   @override
+  String get moreButtonTooltip => 'More';
+
+  @override
   String get nextMonthTooltip => 'Next month';
 
   @override
@@ -3534,6 +3579,9 @@
   String get modalBarrierDismissLabel => 'Cerrar';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Mes siguiente';
 
   @override
@@ -5361,6 +5409,9 @@
   String get modalBarrierDismissLabel => 'Loobu';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Järgmine kuu';
 
   @override
@@ -5565,6 +5616,9 @@
   String get modalBarrierDismissLabel => 'Baztertu';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Hurrengo hilabetea';
 
   @override
@@ -5769,6 +5823,9 @@
   String get modalBarrierDismissLabel => 'نپذیرفتن';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'ماه بعد';
 
   @override
@@ -5973,6 +6030,9 @@
   String get modalBarrierDismissLabel => 'Ohita';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Seuraava kuukausi';
 
   @override
@@ -6177,6 +6237,9 @@
   String get modalBarrierDismissLabel => 'I-dismiss';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Susunod na buwan';
 
   @override
@@ -6381,6 +6444,9 @@
   String get modalBarrierDismissLabel => 'Ignorer';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Mois suivant';
 
   @override
@@ -6639,6 +6705,9 @@
   String get modalBarrierDismissLabel => 'Ignorar';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Mes seguinte';
 
   @override
@@ -6843,6 +6912,9 @@
   String get modalBarrierDismissLabel => 'Schließen';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Nächster Monat';
 
   @override
@@ -7047,6 +7119,9 @@
   String get modalBarrierDismissLabel => 'છોડી દો';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'આગલો મહિનો';
 
   @override
@@ -7251,6 +7326,9 @@
   String get modalBarrierDismissLabel => 'סגירה';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'החודש הבא';
 
   @override
@@ -7455,6 +7533,9 @@
   String get modalBarrierDismissLabel => 'खारिज करें';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'अगला महीना';
 
   @override
@@ -7659,6 +7740,9 @@
   String get modalBarrierDismissLabel => 'Odbaci';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Sljedeći mjesec';
 
   @override
@@ -7863,6 +7947,9 @@
   String get modalBarrierDismissLabel => 'Elvetés';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Következő hónap';
 
   @override
@@ -8067,6 +8154,9 @@
   String get modalBarrierDismissLabel => 'Փակել';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Հաջորդ ամիս';
 
   @override
@@ -8271,6 +8361,9 @@
   String get modalBarrierDismissLabel => 'Tutup';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Bulan berikutnya';
 
   @override
@@ -8475,6 +8568,9 @@
   String get modalBarrierDismissLabel => 'Hunsa';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Næsti mánuður';
 
   @override
@@ -8679,6 +8775,9 @@
   String get modalBarrierDismissLabel => 'Ignora';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Mese successivo';
 
   @override
@@ -8883,6 +8982,9 @@
   String get modalBarrierDismissLabel => '閉じる';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => '来月';
 
   @override
@@ -9087,6 +9189,9 @@
   String get modalBarrierDismissLabel => 'დახურვა';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'შემდეგი თვე';
 
   @override
@@ -9291,6 +9396,9 @@
   String get modalBarrierDismissLabel => 'Жабу';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Келесі ай';
 
   @override
@@ -9495,6 +9603,9 @@
   String get modalBarrierDismissLabel => 'ច្រាន​ចោល';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'ខែ​​ក្រោយ';
 
   @override
@@ -9699,6 +9810,9 @@
   String get modalBarrierDismissLabel => '\u{cb5}\u{c9c}\u{cbe}\u{c97}\u{cca}\u{cb3}\u{cbf}\u{cb8}\u{cbf}';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => '\u{cae}\u{cc1}\u{c82}\u{ca6}\u{cbf}\u{ca8}\u{20}\u{ca4}\u{cbf}\u{c82}\u{c97}\u{cb3}\u{cc1}';
 
   @override
@@ -9903,6 +10017,9 @@
   String get modalBarrierDismissLabel => '닫기';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => '다음 달';
 
   @override
@@ -10107,6 +10224,9 @@
   String get modalBarrierDismissLabel => 'Жабуу';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Кийинки ай';
 
   @override
@@ -10311,6 +10431,9 @@
   String get modalBarrierDismissLabel => 'ປິດໄວ້';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'ເດືອນໜ້າ';
 
   @override
@@ -10515,6 +10638,9 @@
   String get modalBarrierDismissLabel => 'Atsisakyti';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Kitas mėnuo';
 
   @override
@@ -10719,6 +10845,9 @@
   String get modalBarrierDismissLabel => 'Nerādīt';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Nākamais mēnesis';
 
   @override
@@ -10923,6 +11052,9 @@
   String get modalBarrierDismissLabel => 'Отфрли';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Следниот месец';
 
   @override
@@ -11127,6 +11259,9 @@
   String get modalBarrierDismissLabel => 'നിരസിക്കുക';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'അടുത്ത മാസം';
 
   @override
@@ -11331,6 +11466,9 @@
   String get modalBarrierDismissLabel => 'Үл хэрэгсэх';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Дараах сар';
 
   @override
@@ -11535,6 +11673,9 @@
   String get modalBarrierDismissLabel => 'डिसमिस करा';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'पुढील महिना';
 
   @override
@@ -11739,6 +11880,9 @@
   String get modalBarrierDismissLabel => 'Tolak';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Bulan depan';
 
   @override
@@ -11943,6 +12087,9 @@
   String get modalBarrierDismissLabel => 'ပယ်ရန်';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'နောက်လ';
 
   @override
@@ -12147,6 +12294,9 @@
   String get modalBarrierDismissLabel => 'Avvis';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Neste måned';
 
   @override
@@ -12351,6 +12501,9 @@
   String get modalBarrierDismissLabel => 'खारेज गर्नुहोस्';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'अर्को महिना';
 
   @override
@@ -12555,6 +12708,9 @@
   String get modalBarrierDismissLabel => 'Sluiten';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Volgende maand';
 
   @override
@@ -12759,6 +12915,9 @@
   String get modalBarrierDismissLabel => 'ଖାରଜ କରନ୍ତୁ';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'ପରବର୍ତ୍ତୀ ମାସ';
 
   @override
@@ -12963,6 +13122,9 @@
   String get modalBarrierDismissLabel => 'ਖਾਰਜ ਕਰੋ';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'ਅਗਲਾ ਮਹੀਨਾ';
 
   @override
@@ -13167,6 +13329,9 @@
   String get modalBarrierDismissLabel => 'Zamknij';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Następny miesiąc';
 
   @override
@@ -13371,6 +13536,9 @@
   String get modalBarrierDismissLabel => 'رد کړه';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'بله میاشت';
 
   @override
@@ -13575,6 +13743,9 @@
   String get modalBarrierDismissLabel => 'Dispensar';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Próximo mês';
 
   @override
@@ -13857,6 +14028,9 @@
   String get modalBarrierDismissLabel => 'Închideți';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Luna viitoare';
 
   @override
@@ -14061,6 +14235,9 @@
   String get modalBarrierDismissLabel => 'Закрыть';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Следующий месяц';
 
   @override
@@ -14265,6 +14442,9 @@
   String get modalBarrierDismissLabel => 'ඉවත ලන්න';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'ඊළඟ මාසය';
 
   @override
@@ -14469,6 +14649,9 @@
   String get modalBarrierDismissLabel => 'Odmietnuť';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Budúci mesiac';
 
   @override
@@ -14673,6 +14856,9 @@
   String get modalBarrierDismissLabel => 'Opusti';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Naslednji mesec';
 
   @override
@@ -14877,6 +15063,9 @@
   String get modalBarrierDismissLabel => 'Hiq';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Muaji i ardhshëm';
 
   @override
@@ -15081,6 +15270,9 @@
   String get modalBarrierDismissLabel => 'Одбаци';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Следећи месец';
 
   @override
@@ -15489,6 +15681,9 @@
   String get modalBarrierDismissLabel => 'Stäng';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Nästa månad';
 
   @override
@@ -15693,6 +15888,9 @@
   String get modalBarrierDismissLabel => 'Ondoa';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Mwezi ujao';
 
   @override
@@ -15897,6 +16095,9 @@
   String get modalBarrierDismissLabel => 'நிராகரிக்கும்';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'அடுத்த மாதம்';
 
   @override
@@ -16101,6 +16302,9 @@
   String get modalBarrierDismissLabel => 'విస్మరించు';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'తర్వాత నెల';
 
   @override
@@ -16305,6 +16509,9 @@
   String get modalBarrierDismissLabel => 'ปิด';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'เดือนหน้า';
 
   @override
@@ -16509,6 +16716,9 @@
   String get modalBarrierDismissLabel => 'I-dismiss';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Susunod na buwan';
 
   @override
@@ -16713,6 +16923,9 @@
   String get modalBarrierDismissLabel => 'Kapat';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Gelecek ay';
 
   @override
@@ -16917,6 +17130,9 @@
   String get modalBarrierDismissLabel => 'Закрити';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Наступний місяць';
 
   @override
@@ -17121,6 +17337,9 @@
   String get modalBarrierDismissLabel => 'برخاست کریں';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'اگلا مہینہ';
 
   @override
@@ -17325,6 +17544,9 @@
   String get modalBarrierDismissLabel => 'Yopish';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Keyingi oy';
 
   @override
@@ -17529,6 +17751,9 @@
   String get modalBarrierDismissLabel => 'Bỏ qua';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Tháng sau';
 
   @override
@@ -17733,6 +17958,9 @@
   String get modalBarrierDismissLabel => '关闭';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => '下个月';
 
   @override
@@ -18210,6 +18438,9 @@
   String get modalBarrierDismissLabel => 'Cashisa';
 
   @override
+  String get moreButtonTooltip => 'TBD';
+
+  @override
   String get nextMonthTooltip => 'Inyanga ezayo';
 
   @override
diff --git a/packages/flutter_localizations/lib/src/l10n/material_af.arb b/packages/flutter_localizations/lib/src/l10n/material_af.arb
index 85367da..8390dcc 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_af.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_af.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Vou uit",
   "remainingTextFieldCharacterCountOne": "1 karakter oor",
   "remainingTextFieldCharacterCountOther": "$remainingCount karakters oor",
-  "refreshIndicatorSemanticLabel": "Herlaai"
+  "refreshIndicatorSemanticLabel": "Herlaai",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_am.arb b/packages/flutter_localizations/lib/src/l10n/material_am.arb
index ace6f2a..a99e6fe 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_am.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_am.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "ዘርጋ",
   "remainingTextFieldCharacterCountOne": "1 ቁምፊ ይቀራል",
   "remainingTextFieldCharacterCountOther": "$remainingCount ቁምፊዎች ይቀራሉ",
-  "refreshIndicatorSemanticLabel": "አድስ"
+  "refreshIndicatorSemanticLabel": "አድስ",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ar.arb b/packages/flutter_localizations/lib/src/l10n/material_ar.arb
index 0062c25..9d679aa 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ar.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ar.arb
@@ -58,5 +58,6 @@
   "remainingTextFieldCharacterCountZero": "لا أحرف متبقية",
   "remainingTextFieldCharacterCountOne": "حرف واحد متبقٍ",
   "remainingTextFieldCharacterCountOther": "$remainingCount حرف متبقٍ",
-  "refreshIndicatorSemanticLabel": "إعادة تحميل"
+  "refreshIndicatorSemanticLabel": "إعادة تحميل",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_as.arb b/packages/flutter_localizations/lib/src/l10n/material_as.arb
index bfaeb9b..9ed0226 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_as.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_as.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "বিস্তাৰ কৰক",
   "remainingTextFieldCharacterCountOne": "১টা বর্ণ বাকী আছে",
   "remainingTextFieldCharacterCountOther": "$remainingCountটা বর্ণ বাকী আছে",
-  "refreshIndicatorSemanticLabel": "ৰিফ্ৰেশ্ব কৰক"
+  "refreshIndicatorSemanticLabel": "ৰিফ্ৰেশ্ব কৰক",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_az.arb b/packages/flutter_localizations/lib/src/l10n/material_az.arb
index bae6af2..6449b4b 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_az.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_az.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Genişləndirin",
   "remainingTextFieldCharacterCountOne": "1 simvol qalır",
   "remainingTextFieldCharacterCountOther": "$remainingCount simvol qalır",
-  "refreshIndicatorSemanticLabel": "Yeniləyin"
+  "refreshIndicatorSemanticLabel": "Yeniləyin",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_be.arb b/packages/flutter_localizations/lib/src/l10n/material_be.arb
index a34a6c3..c38f6f3 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_be.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_be.arb
@@ -54,5 +54,6 @@
   "collapsedIconTapHint": "Разгарнуць",
   "remainingTextFieldCharacterCountOne": "Застаўся 1 сімвал",
   "remainingTextFieldCharacterCountOther": "Засталося $remainingCount сімвала",
-  "refreshIndicatorSemanticLabel": "Абнавіць"
+  "refreshIndicatorSemanticLabel": "Абнавіць",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_bg.arb b/packages/flutter_localizations/lib/src/l10n/material_bg.arb
index cd6e683..f4774f8 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_bg.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_bg.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Остава 1 знак",
   "remainingTextFieldCharacterCountOther": "Остават $remainingCount знака",
-  "refreshIndicatorSemanticLabel": "Опресняване"
+  "refreshIndicatorSemanticLabel": "Опресняване",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_bn.arb b/packages/flutter_localizations/lib/src/l10n/material_bn.arb
index c8349fe..8055be3 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_bn.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_bn.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "বড় করুন",
   "remainingTextFieldCharacterCountOne": "আর ১টি অক্ষর লেখা যাবে",
   "remainingTextFieldCharacterCountOther": "আর $remainingCountটি অক্ষর লেখা যাবে",
-  "refreshIndicatorSemanticLabel": "রিফ্রেশ করুন"
+  "refreshIndicatorSemanticLabel": "রিফ্রেশ করুন",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_bs.arb b/packages/flutter_localizations/lib/src/l10n/material_bs.arb
index 89979a7..b2ff5d0 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_bs.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_bs.arb
@@ -53,5 +53,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Još jedan znak",
   "remainingTextFieldCharacterCountOther": "Još $remainingCount znakova",
-  "refreshIndicatorSemanticLabel": "Osvježi"
+  "refreshIndicatorSemanticLabel": "Osvježi",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ca.arb b/packages/flutter_localizations/lib/src/l10n/material_ca.arb
index ad17f41..5b51541 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ca.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ca.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Queda 1 caràcter",
   "remainingTextFieldCharacterCountOther": "Queden $remainingCount caràcters",
-  "refreshIndicatorSemanticLabel": "Actualitza"
+  "refreshIndicatorSemanticLabel": "Actualitza",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_cs.arb b/packages/flutter_localizations/lib/src/l10n/material_cs.arb
index 5922920..ac28cb4 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_cs.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_cs.arb
@@ -55,5 +55,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Zbývá 1 znak",
   "remainingTextFieldCharacterCountOther": "Zbývá $remainingCount znaků",
-  "refreshIndicatorSemanticLabel": "Obnovit"
+  "refreshIndicatorSemanticLabel": "Obnovit",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_da.arb b/packages/flutter_localizations/lib/src/l10n/material_da.arb
index c3caf77..9efeec3 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_da.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_da.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Ét tegn tilbage",
   "remainingTextFieldCharacterCountOther": "$remainingCount tegn tilbage",
-  "refreshIndicatorSemanticLabel": "Opdater"
+  "refreshIndicatorSemanticLabel": "Opdater",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_de.arb b/packages/flutter_localizations/lib/src/l10n/material_de.arb
index b8eedd0..691cf6c 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_de.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_de.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Noch 1 Zeichen",
   "remainingTextFieldCharacterCountOther": "Noch $remainingCount Zeichen",
-  "refreshIndicatorSemanticLabel": "Aktualisieren"
+  "refreshIndicatorSemanticLabel": "Aktualisieren",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_el.arb b/packages/flutter_localizations/lib/src/l10n/material_el.arb
index 2a3b607..68eec0d 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_el.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_el.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "απομένει 1 χαρακτήρας",
   "remainingTextFieldCharacterCountOther": "απομένουν $remainingCount χαρακτήρες",
-  "refreshIndicatorSemanticLabel": "Ανανέωση"
+  "refreshIndicatorSemanticLabel": "Ανανέωση",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_en.arb b/packages/flutter_localizations/lib/src/l10n/material_en.arb
index fc3402f..f51d17b 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_en.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_en.arb
@@ -31,6 +31,11 @@
     "description": "The tooltip for the delete button of chips."
   },
 
+  "moreButtonTooltip": "More",
+  "@moreButtonTooltip": {
+    "description": "The tooltip for the more button in the text selection menu, which shows the overflowing menu items."
+  },
+
   "nextMonthTooltip": "Next month",
   "@nextMonthTooltip": {
     "description": "The tooltip for the month picker's 'next month' button."
diff --git a/packages/flutter_localizations/lib/src/l10n/material_es.arb b/packages/flutter_localizations/lib/src/l10n/material_es.arb
index 26ff120..3387c99 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_es.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_es.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Queda 1 carácter.",
   "remainingTextFieldCharacterCountOther": "Quedan $remainingCount caracteres",
-  "refreshIndicatorSemanticLabel": "Actualizar"
+  "refreshIndicatorSemanticLabel": "Actualizar",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_et.arb b/packages/flutter_localizations/lib/src/l10n/material_et.arb
index f0ee775..f100bd1 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_et.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_et.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Jäänud on 1 tähemärk",
   "remainingTextFieldCharacterCountOther": "Jäänud on $remainingCount tähemärki",
-  "refreshIndicatorSemanticLabel": "Värskendamine"
+  "refreshIndicatorSemanticLabel": "Värskendamine",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_eu.arb b/packages/flutter_localizations/lib/src/l10n/material_eu.arb
index faa0c45..8d92a70 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_eu.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_eu.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Zabaldu",
   "remainingTextFieldCharacterCountOne": "1 karaktere geratzen da",
   "remainingTextFieldCharacterCountOther": "$remainingCount karaktere geratzen dira",
-  "refreshIndicatorSemanticLabel": "Freskatu"
+  "refreshIndicatorSemanticLabel": "Freskatu",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_fa.arb b/packages/flutter_localizations/lib/src/l10n/material_fa.arb
index f5f7415..76ff956 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_fa.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_fa.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "۱ نویسه باقی مانده است",
   "remainingTextFieldCharacterCountOther": "$remainingCount نویسه باقی مانده است",
-  "refreshIndicatorSemanticLabel": "بازخوانی"
+  "refreshIndicatorSemanticLabel": "بازخوانی",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_fi.arb b/packages/flutter_localizations/lib/src/l10n/material_fi.arb
index ae435d7..24040fa 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_fi.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_fi.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 merkki jäljellä",
   "remainingTextFieldCharacterCountOther": "$remainingCount merkkiä jäljellä",
-  "refreshIndicatorSemanticLabel": "Päivitys"
+  "refreshIndicatorSemanticLabel": "Päivitys",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_fil.arb b/packages/flutter_localizations/lib/src/l10n/material_fil.arb
index d317f31..a1060d7 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_fil.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_fil.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 character ang natitira",
   "remainingTextFieldCharacterCountOther": "$remainingCount na character ang natitira",
-  "refreshIndicatorSemanticLabel": "Nagre-refresh"
+  "refreshIndicatorSemanticLabel": "Nagre-refresh",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_fr.arb b/packages/flutter_localizations/lib/src/l10n/material_fr.arb
index 239cf42..e6d48be 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_fr.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_fr.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 caractère restant",
   "remainingTextFieldCharacterCountOther": "$remainingCount caractères restants",
-  "refreshIndicatorSemanticLabel": "Actualiser"
+  "refreshIndicatorSemanticLabel": "Actualiser",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_gl.arb b/packages/flutter_localizations/lib/src/l10n/material_gl.arb
index 2a52209..82438c3 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_gl.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_gl.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 carácter restante",
   "remainingTextFieldCharacterCountOther": "$remainingCount caracteres restantes",
-  "refreshIndicatorSemanticLabel": "Actualizar"
+  "refreshIndicatorSemanticLabel": "Actualizar",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_gsw.arb b/packages/flutter_localizations/lib/src/l10n/material_gsw.arb
index 306f3b6..58d2166 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_gsw.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_gsw.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Noch 1 Zeichen",
   "remainingTextFieldCharacterCountOther": "Noch $remainingCount Zeichen",
-  "refreshIndicatorSemanticLabel": "Aktualisieren"
+  "refreshIndicatorSemanticLabel": "Aktualisieren",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_gu.arb b/packages/flutter_localizations/lib/src/l10n/material_gu.arb
index 666f8bf..3302a3e 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_gu.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_gu.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "વિસ્તૃત કરો",
   "remainingTextFieldCharacterCountOne": "1 અક્ષર બાકી",
   "remainingTextFieldCharacterCountOther": "$remainingCount અક્ષર બાકી",
-  "refreshIndicatorSemanticLabel": "રિફ્રેશ કરો"
+  "refreshIndicatorSemanticLabel": "રિફ્રેશ કરો",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_he.arb b/packages/flutter_localizations/lib/src/l10n/material_he.arb
index 2981ee6..f5af651 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_he.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_he.arb
@@ -55,5 +55,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "נותר תו אחד",
   "remainingTextFieldCharacterCountOther": "נותרו $remainingCount תווים",
-  "refreshIndicatorSemanticLabel": "רענון"
+  "refreshIndicatorSemanticLabel": "רענון",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_hi.arb b/packages/flutter_localizations/lib/src/l10n/material_hi.arb
index 2c7d67a..6872652 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_hi.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_hi.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "एक वर्ण अाैर डाला जा सकता है",
   "remainingTextFieldCharacterCountOther": "$remainingCount वर्ण अाैर डाले जा सकते हैं",
-  "refreshIndicatorSemanticLabel": "रीफ़्रेश करें"
+  "refreshIndicatorSemanticLabel": "रीफ़्रेश करें",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_hr.arb b/packages/flutter_localizations/lib/src/l10n/material_hr.arb
index 5180a92..b4a4ab0 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_hr.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_hr.arb
@@ -53,5 +53,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Preostao je 1 znak",
   "remainingTextFieldCharacterCountOther": "Preostalo je $remainingCount znakova",
-  "refreshIndicatorSemanticLabel": "Osvježi"
+  "refreshIndicatorSemanticLabel": "Osvježi",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_hu.arb b/packages/flutter_localizations/lib/src/l10n/material_hu.arb
index 301dff5..896d41e 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_hu.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_hu.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 karakter maradt",
   "remainingTextFieldCharacterCountOther": "$remainingCount karakter maradt",
-  "refreshIndicatorSemanticLabel": "Frissítés"
+  "refreshIndicatorSemanticLabel": "Frissítés",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_hy.arb b/packages/flutter_localizations/lib/src/l10n/material_hy.arb
index dd3649d..8c47a27 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_hy.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_hy.arb
@@ -56,5 +56,6 @@
   "remainingTextFieldCharacterCountZero": "Նիշի հնարավորություն չկա",
   "remainingTextFieldCharacterCountOne": "Մնացել է 1 նիշ",
   "remainingTextFieldCharacterCountOther": "Մնացել է $remainingCount նիշ",
-  "refreshIndicatorSemanticLabel": "Թարմացնել"
+  "refreshIndicatorSemanticLabel": "Թարմացնել",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_id.arb b/packages/flutter_localizations/lib/src/l10n/material_id.arb
index 9914905..70f98c8 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_id.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_id.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Sisa 1 karakter",
   "remainingTextFieldCharacterCountOther": "Sisa $remainingCount karakter",
-  "refreshIndicatorSemanticLabel": "Memuat ulang"
+  "refreshIndicatorSemanticLabel": "Memuat ulang",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_is.arb b/packages/flutter_localizations/lib/src/l10n/material_is.arb
index b25a6bf..c0ef72f 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_is.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_is.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Stækka",
   "remainingTextFieldCharacterCountOne": "1 stafur eftir",
   "remainingTextFieldCharacterCountOther": "$remainingCount stafir eftir",
-  "refreshIndicatorSemanticLabel": "Endurnýja"
+  "refreshIndicatorSemanticLabel": "Endurnýja",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_it.arb b/packages/flutter_localizations/lib/src/l10n/material_it.arb
index f486542..ebd5352 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_it.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_it.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 carattere rimanente",
   "remainingTextFieldCharacterCountOther": "$remainingCount caratteri rimanenti",
-  "refreshIndicatorSemanticLabel": "Aggiorna"
+  "refreshIndicatorSemanticLabel": "Aggiorna",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ja.arb b/packages/flutter_localizations/lib/src/l10n/material_ja.arb
index 915561f..8852f15 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ja.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ja.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "残り 1 文字(半角相当)",
   "remainingTextFieldCharacterCountOther": "残り $remainingCount 文字(半角相当)",
-  "refreshIndicatorSemanticLabel": "更新"
+  "refreshIndicatorSemanticLabel": "更新",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ka.arb b/packages/flutter_localizations/lib/src/l10n/material_ka.arb
index 70673a0..cb3207c 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ka.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ka.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "გაშლა",
   "remainingTextFieldCharacterCountOne": "დარჩა 1 სიმბოლო",
   "remainingTextFieldCharacterCountOther": "დარჩა $remainingCount სიმბოლო",
-  "refreshIndicatorSemanticLabel": "განახლება"
+  "refreshIndicatorSemanticLabel": "განახლება",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_kk.arb b/packages/flutter_localizations/lib/src/l10n/material_kk.arb
index 82ce189..25f10c8 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_kk.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_kk.arb
@@ -52,5 +52,6 @@
   "collapsedIconTapHint": "Жаю",
   "remainingTextFieldCharacterCountZero": "Таңбалар қалмады",
   "remainingTextFieldCharacterCountOther": "$remainingCount таңба қалды.",
-  "refreshIndicatorSemanticLabel": "Жаңарту"
+  "refreshIndicatorSemanticLabel": "Жаңарту",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_km.arb b/packages/flutter_localizations/lib/src/l10n/material_km.arb
index a6a2cb6..5e080ab 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_km.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_km.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "នៅសល់​ 1 តួ​ទៀត",
   "remainingTextFieldCharacterCountOther": "នៅសល់ $remainingCount តួ​ទៀត",
-  "refreshIndicatorSemanticLabel": "ផ្ទុកឡើងវិញ"
+  "refreshIndicatorSemanticLabel": "ផ្ទុកឡើងវិញ",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_kn.arb b/packages/flutter_localizations/lib/src/l10n/material_kn.arb
index 6241f0d..598202b 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_kn.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_kn.arb
@@ -1,54 +1,55 @@
 {
-  "scriptCategory": "\u0074\u0061\u006c\u006c",
-  "timeOfDayFormat": "\u0048\u003a\u006d\u006d",
-  "openAppDrawerTooltip": "\u0ca8\u0ccd\u0caf\u0cbe\u0cb5\u0cbf\u0c97\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0020\u0cae\u0cc6\u0ca8\u0cc1\u0020\u0ca4\u0cc6\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf",
-  "backButtonTooltip": "\u0cb9\u0cbf\u0c82\u0ca4\u0cbf\u0cb0\u0cc1\u0c97\u0cbf",
-  "closeButtonTooltip": "\u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf\u0cb0\u0cbf",
-  "deleteButtonTooltip": "\u0c85\u0cb3\u0cbf\u0cb8\u0cbf",
-  "nextMonthTooltip": "\u0cae\u0cc1\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",
-  "previousMonthTooltip": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",
-  "nextPageTooltip": "\u0cae\u0cc1\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0caa\u0cc1\u0c9f",
-  "previousPageTooltip": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0caa\u0cc1\u0c9f",
-  "showMenuTooltip": "\u0cae\u0cc6\u0ca8\u0cc1\u0020\u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf",
-  "aboutListTileTitle": "\u0024\u0061\u0070\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e\u004e\u0061\u006d\u0065\u0020\u0cac\u0c97\u0ccd\u0c97\u0cc6",
-  "licensesPageTitle": "\u0caa\u0cb0\u0cb5\u0cbe\u0ca8\u0c97\u0cbf\u0c97\u0cb3\u0cc1",
-  "pageRowsInfoTitle": "\u0024\u0072\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0020\u0024\u0066\u0069\u0072\u0073\u0074\u0052\u006f\u0077\u2013\u0024\u006c\u0061\u0073\u0074\u0052\u006f\u0077",
-  "pageRowsInfoTitleApproximate": "\u0024\u0072\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0020\u0024\u0066\u0069\u0072\u0073\u0074\u0052\u006f\u0077\u2013\u0024\u006c\u0061\u0073\u0074\u0052\u006f\u0077",
-  "rowsPerPageTitle": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0020\u0caa\u0cc1\u0c9f\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cbe\u0cb2\u0cc1\u0c97\u0cb3\u0cc1\u003a",
-  "tabLabel": "\u0024\u0074\u0061\u0062\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0ca8\u0020\u0024\u0074\u0061\u0062\u0049\u006e\u0064\u0065\u0078\u0020\u0c9f\u0ccd\u0caf\u0cbe\u0cac\u0ccd",
-  "selectedRowCountTitleOne": "\u0031\u0020\u0c90\u0c9f\u0c82\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
-  "selectedRowCountTitleOther": "\u0024\u0073\u0065\u006c\u0065\u0063\u0074\u0065\u0064\u0052\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0c90\u0c9f\u0c82\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
-  "cancelButtonLabel": "\u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0cae\u0cbe\u0ca1\u0cbf",
-  "closeButtonLabel": "\u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf\u0cb0\u0cbf",
-  "continueButtonLabel": "\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf",
-  "copyButtonLabel": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf",
-  "cutButtonLabel": "\u0c95\u0ca4\u0ccd\u0ca4\u0cb0\u0cbf\u0cb8\u0cbf",
-  "okButtonLabel": "\u0cb8\u0cb0\u0cbf",
-  "pasteButtonLabel": "\u0c85\u0c82\u0c9f\u0cbf\u0cb8\u0cbf",
-  "selectAllButtonLabel": "\u0c8e\u0cb2\u0ccd\u0cb2\u0cb5\u0ca8\u0ccd\u0ca8\u0cc2\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
-  "viewLicensesButtonLabel": "\u0caa\u0cb0\u0cb5\u0cbe\u0ca8\u0c97\u0cbf\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0cb5\u0cbf\u0cd5\u0c95\u0ccd\u0cb7\u0cbf\u0cb8\u0cbf",
-  "anteMeridiemAbbreviation": "\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6",
-  "postMeridiemAbbreviation": "\u0cb8\u0c82\u0c9c\u0cc6",
-  "timePickerHourModeAnnouncement": "\u0c97\u0c82\u0c9f\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
-  "timePickerMinuteModeAnnouncement": "\u0ca8\u0cbf\u0cae\u0cbf\u0cb7\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
-  "modalBarrierDismissLabel": "\u0cb5\u0c9c\u0cbe\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cbf",
-  "signedInLabel": "\u0cb8\u0cc8\u0ca8\u0ccd\u0020\u0c87\u0ca8\u0ccd\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
-  "hideAccountsLabel": "\u0c96\u0cbe\u0ca4\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0cae\u0cb0\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
-  "showAccountsLabel": "\u0c96\u0cbe\u0ca4\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf",
-  "drawerLabel": "\u0ca8\u0ccd\u0caf\u0cbe\u0cb5\u0cbf\u0c97\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0020\u0cae\u0cc6\u0ca8\u0cc1",
-  "popupMenuLabel": "\u0caa\u0cbe\u0caa\u0ccd\u0c85\u0caa\u0ccd\u0020\u0cae\u0cc6\u0ca8\u0cc1",
-  "dialogLabel": "\u0ca1\u0cc8\u0cb2\u0cbe\u0c97\u0ccd",
-  "alertDialogLabel": "\u0c8e\u0c9a\u0ccd\u0c9a\u0cb0\u0cbf\u0c95\u0cc6",
-  "searchFieldLabel": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf",
-  "reorderItemToStart": "\u0caa\u0ccd\u0cb0\u0cbe\u0cb0\u0c82\u0cad\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
-  "reorderItemToEnd": "\u0c95\u0cca\u0ca8\u0cc6\u0c97\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
-  "reorderItemUp": "\u0cae\u0cc7\u0cb2\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
-  "reorderItemDown": "\u0c95\u0cc6\u0cb3\u0c97\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
-  "reorderItemLeft": "\u0c8e\u0ca1\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
-  "reorderItemRight": "\u0cac\u0cb2\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
-  "expandedIconTapHint": "\u0c95\u0cc1\u0c97\u0ccd\u0c97\u0cbf\u0cb8\u0cbf",
-  "collapsedIconTapHint": "\u0cb5\u0cbf\u0cb8\u0ccd\u0ca4\u0cb0\u0cbf\u0cb8\u0cbf",
-  "remainingTextFieldCharacterCountOne": "\u0031\u0020\u0c85\u0c95\u0ccd\u0cb7\u0cb0\u0020\u0c89\u0cb3\u0cbf\u0ca6\u0cbf\u0ca6\u0cc6",
-  "remainingTextFieldCharacterCountOther": "\u0024\u0072\u0065\u006d\u0061\u0069\u006e\u0069\u006e\u0067\u0043\u006f\u0075\u006e\u0074\u0020\u0c85\u0c95\u0ccd\u0cb7\u0cb0\u0c97\u0cb3\u0cc1\u0020\u0c89\u0cb3\u0cbf\u0ca6\u0cbf\u0cb5\u0cc6",
-  "refreshIndicatorSemanticLabel": "\u0cb0\u0cbf\u0cab\u0ccd\u0cb0\u0cc6\u0cb6\u0ccd\u0020\u0cae\u0cbe\u0ca1\u0cbf"
+  "scriptCategory": "tall",
+  "timeOfDayFormat": "H:mm",
+  "openAppDrawerTooltip": "ನ್ಯಾವಿಗೇಶನ್‌ ಮೆನು ತೆರೆಯಿರಿ",
+  "backButtonTooltip": "ಹಿಂತಿರುಗಿ",
+  "closeButtonTooltip": "ಮುಚ್ಚಿರಿ",
+  "deleteButtonTooltip": "ಅಳಿಸಿ",
+  "nextMonthTooltip": "ಮುಂದಿನ ತಿಂಗಳು",
+  "previousMonthTooltip": "ಹಿಂದಿನ ತಿಂಗಳು",
+  "nextPageTooltip": "ಮುಂದಿನ ಪುಟ",
+  "previousPageTooltip": "ಹಿಂದಿನ ಪುಟ",
+  "showMenuTooltip": "ಮೆನು ತೋರಿಸಿ",
+  "aboutListTileTitle": "$applicationName ಬಗ್ಗೆ",
+  "licensesPageTitle": "ಪರವಾನಗಿಗಳು",
+  "pageRowsInfoTitle": "$rowCount ರಲ್ಲಿ $firstRow–$lastRow",
+  "pageRowsInfoTitleApproximate": "$rowCount ರಲ್ಲಿ $firstRow–$lastRow",
+  "rowsPerPageTitle": "ಪ್ರತಿ ಪುಟಕ್ಕೆ ಸಾಲುಗಳು:",
+  "tabLabel": "$tabCount ರಲ್ಲಿನ $tabIndex ಟ್ಯಾಬ್",
+  "selectedRowCountTitleOne": "1 ಐಟಂ ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ",
+  "selectedRowCountTitleOther": "$selectedRowCount ಐಟಂಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ",
+  "cancelButtonLabel": "ರದ್ದುಮಾಡಿ",
+  "closeButtonLabel": "ಮುಚ್ಚಿರಿ",
+  "continueButtonLabel": "ಮುಂದುವರಿಸಿ",
+  "copyButtonLabel": "ನಕಲಿಸಿ",
+  "cutButtonLabel": "ಕತ್ತರಿಸಿ",
+  "okButtonLabel": "ಸರಿ",
+  "pasteButtonLabel": "ಅಂಟಿಸಿ",
+  "selectAllButtonLabel": "ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆಮಾಡಿ",
+  "viewLicensesButtonLabel": "ಪರವಾನಗಿಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
+  "anteMeridiemAbbreviation": "ಬೆಳಿಗ್ಗೆ",
+  "postMeridiemAbbreviation": "ಸಂಜೆ",
+  "timePickerHourModeAnnouncement": "ಗಂಟೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ",
+  "timePickerMinuteModeAnnouncement": "ನಿಮಿಷಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ",
+  "modalBarrierDismissLabel": "ವಜಾಗೊಳಿಸಿ",
+  "signedInLabel": "ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ",
+  "hideAccountsLabel": "ಖಾತೆಗಳನ್ನು ಮರೆಮಾಡಿ",
+  "showAccountsLabel": "ಖಾತೆಗಳನ್ನು ತೋರಿಸಿ",
+  "drawerLabel": "ನ್ಯಾವಿಗೇಶನ್‌ ಮೆನು",
+  "popupMenuLabel": "ಪಾಪ್ಅಪ್ ಮೆನು",
+  "dialogLabel": "ಡೈಲಾಗ್",
+  "alertDialogLabel": "ಎಚ್ಚರಿಕೆ",
+  "searchFieldLabel": "ಹುಡುಕಿ",
+  "reorderItemToStart": "ಪ್ರಾರಂಭಕ್ಕೆ ಸರಿಸಿ",
+  "reorderItemToEnd": "ಕೊನೆಗೆ ಸರಿಸಿ",
+  "reorderItemUp": "ಮೇಲೆ ಸರಿಸಿ",
+  "reorderItemDown": "ಕೆಳಗೆ ಸರಿಸಿ",
+  "reorderItemLeft": "ಎಡಕ್ಕೆ ಸರಿಸಿ",
+  "reorderItemRight": "ಬಲಕ್ಕೆ ಸರಿಸಿ",
+  "expandedIconTapHint": "ಕುಗ್ಗಿಸಿ",
+  "collapsedIconTapHint": "ವಿಸ್ತರಿಸಿ",
+  "remainingTextFieldCharacterCountOne": "1 ಅಕ್ಷರ ಉಳಿದಿದೆ",
+  "remainingTextFieldCharacterCountOther": "$remainingCount ಅಕ್ಷರಗಳು ಉಳಿದಿವೆ",
+  "refreshIndicatorSemanticLabel": "ರಿಫ್ರೆಶ್ ಮಾಡಿ",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ko.arb b/packages/flutter_localizations/lib/src/l10n/material_ko.arb
index b424457..1cc0c5c 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ko.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ko.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1자 남음",
   "remainingTextFieldCharacterCountOther": "$remainingCount자 남음",
-  "refreshIndicatorSemanticLabel": "새로고침"
+  "refreshIndicatorSemanticLabel": "새로고침",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ky.arb b/packages/flutter_localizations/lib/src/l10n/material_ky.arb
index 97aee02..55fa590 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ky.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ky.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Жайып көрсөтүү",
   "remainingTextFieldCharacterCountOne": "1 белги калды",
   "remainingTextFieldCharacterCountOther": "$remainingCount белги калды",
-  "refreshIndicatorSemanticLabel": "Жаңыртуу"
+  "refreshIndicatorSemanticLabel": "Жаңыртуу",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_lo.arb b/packages/flutter_localizations/lib/src/l10n/material_lo.arb
index 1c06c45..ad27d49 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_lo.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_lo.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "ຂະຫຍາຍ",
   "remainingTextFieldCharacterCountOne": "ຍັງອີກ 1 ຕົວອັກສອນ",
   "remainingTextFieldCharacterCountOther": "ຍັງອີກ $remainingCount ຕົວອັກສອນ",
-  "refreshIndicatorSemanticLabel": "ໂຫຼດຄືນໃໝ່"
+  "refreshIndicatorSemanticLabel": "ໂຫຼດຄືນໃໝ່",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_lt.arb b/packages/flutter_localizations/lib/src/l10n/material_lt.arb
index b1b946c..22ef37e 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_lt.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_lt.arb
@@ -55,5 +55,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Liko 1 simbolis",
   "remainingTextFieldCharacterCountOther": "Liko $remainingCount simbolių",
-  "refreshIndicatorSemanticLabel": "Atnaujinti"
+  "refreshIndicatorSemanticLabel": "Atnaujinti",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_lv.arb b/packages/flutter_localizations/lib/src/l10n/material_lv.arb
index 0973c06..3bfb25e 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_lv.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_lv.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "Nav atlikusi neviena rakstzīme.",
   "remainingTextFieldCharacterCountOne": "Atlikusi 1 rakstzīme.",
   "remainingTextFieldCharacterCountOther": "Atlikušas $remainingCount rakstzīmes.",
-  "refreshIndicatorSemanticLabel": "Atsvaidzināt"
+  "refreshIndicatorSemanticLabel": "Atsvaidzināt",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_mk.arb b/packages/flutter_localizations/lib/src/l10n/material_mk.arb
index c427e1d..add1768 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_mk.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_mk.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Прошири",
   "remainingTextFieldCharacterCountOne": "Преостанува уште 1 знак",
   "remainingTextFieldCharacterCountOther": "Преостануваат уште $remainingCount знаци",
-  "refreshIndicatorSemanticLabel": "Освежи"
+  "refreshIndicatorSemanticLabel": "Освежи",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ml.arb b/packages/flutter_localizations/lib/src/l10n/material_ml.arb
index c70f682..54882cc 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ml.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ml.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "വികസിപ്പിക്കുക",
   "remainingTextFieldCharacterCountOne": "ഒരു പ്രതീകം ശേഷിക്കുന്നു",
   "remainingTextFieldCharacterCountOther": "$remainingCount പ്രതീകങ്ങൾ ശേഷിക്കുന്നു",
-  "refreshIndicatorSemanticLabel": "പുതുക്കിയെടുക്കുക"
+  "refreshIndicatorSemanticLabel": "പുതുക്കിയെടുക്കുക",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_mn.arb b/packages/flutter_localizations/lib/src/l10n/material_mn.arb
index 1c8c4b9..cb62f11 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_mn.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_mn.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "No characters remaining",
   "remainingTextFieldCharacterCountOne": "1 тэмдэгт үлдсэн",
   "remainingTextFieldCharacterCountOther": "$remainingCount тэмдэгт үлдсэн",
-  "refreshIndicatorSemanticLabel": "Сэргээх"
+  "refreshIndicatorSemanticLabel": "Сэргээх",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_mr.arb b/packages/flutter_localizations/lib/src/l10n/material_mr.arb
index c55faa0..5cd4c1f 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_mr.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_mr.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "कोणतेही वर्ण शिल्लक नाहीत",
   "remainingTextFieldCharacterCountOne": "एक वर्ण शिल्लक",
   "remainingTextFieldCharacterCountOther": "$remainingCount वर्ण शिल्लक",
-  "refreshIndicatorSemanticLabel": "रिफ्रेश करा"
+  "refreshIndicatorSemanticLabel": "रिफ्रेश करा",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ms.arb b/packages/flutter_localizations/lib/src/l10n/material_ms.arb
index d8e8bf9..3ed751c 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ms.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ms.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 aksara lagi",
   "remainingTextFieldCharacterCountOther": "$remainingCount aksara lagi",
-  "refreshIndicatorSemanticLabel": "Muat semula"
+  "refreshIndicatorSemanticLabel": "Muat semula",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_my.arb b/packages/flutter_localizations/lib/src/l10n/material_my.arb
index b61db5f..ad8287f 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_my.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_my.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "ချဲ့ရန်",
   "remainingTextFieldCharacterCountOne": "အက္ခရာ ၁ လုံးကျန်သည်",
   "remainingTextFieldCharacterCountOther": "အက္ခရာ $remainingCount လုံးကျန်သည်",
-  "refreshIndicatorSemanticLabel": "ပြန်လည်စတင်ရန်"
+  "refreshIndicatorSemanticLabel": "ပြန်လည်စတင်ရန်",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_nb.arb b/packages/flutter_localizations/lib/src/l10n/material_nb.arb
index 900f860..3a251cf 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_nb.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_nb.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 tegn gjenstår",
   "remainingTextFieldCharacterCountOther": "$remainingCount tegn gjenstår",
-  "refreshIndicatorSemanticLabel": "Laster inn på nytt"
+  "refreshIndicatorSemanticLabel": "Laster inn på nytt",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ne.arb b/packages/flutter_localizations/lib/src/l10n/material_ne.arb
index c9f70b8..fc15da9 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ne.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ne.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "विस्तार गर्नुहोस्",
   "remainingTextFieldCharacterCountOne": "१ वर्ण बाँकी",
   "remainingTextFieldCharacterCountOther": "$remainingCount वर्णहरू बाँकी",
-  "refreshIndicatorSemanticLabel": "पुनः ताजा गर्नुहोस्"
+  "refreshIndicatorSemanticLabel": "पुनः ताजा गर्नुहोस्",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_nl.arb b/packages/flutter_localizations/lib/src/l10n/material_nl.arb
index 5492659..6f94504 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_nl.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_nl.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 teken resterend",
   "remainingTextFieldCharacterCountOther": "$remainingCount tekens resterend",
-  "refreshIndicatorSemanticLabel": "Vernieuwen"
+  "refreshIndicatorSemanticLabel": "Vernieuwen",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_or.arb b/packages/flutter_localizations/lib/src/l10n/material_or.arb
index 91c2b34..6b65d4c 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_or.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_or.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "ପ୍ରସାରିତ କରନ୍ତୁ",
   "remainingTextFieldCharacterCountOne": "1ଟି ଅକ୍ଷର ବାକି ଅଛି",
   "remainingTextFieldCharacterCountOther": "$remainingCountଟି ଅକ୍ଷର ବାକି ଅଛି",
-  "refreshIndicatorSemanticLabel": "ରିଫ୍ରେସ୍ କରନ୍ତୁ"
+  "refreshIndicatorSemanticLabel": "ରିଫ୍ରେସ୍ କରନ୍ତୁ",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_pa.arb b/packages/flutter_localizations/lib/src/l10n/material_pa.arb
index a67082d..e57acc9 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_pa.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_pa.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "ਵਿਸਤਾਰ ਕਰੋ",
   "remainingTextFieldCharacterCountOne": "1 ਅੱਖਰ-ਚਿੰਨ੍ਹ ਬਾਕੀ",
   "remainingTextFieldCharacterCountOther": "$remainingCount ਅੱਖਰ-ਚਿੰਨ੍ਹ ਬਾਕੀ",
-  "refreshIndicatorSemanticLabel": "ਰਿਫ੍ਰੈਸ਼ ਕਰੋ"
+  "refreshIndicatorSemanticLabel": "ਰਿਫ੍ਰੈਸ਼ ਕਰੋ",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_pl.arb b/packages/flutter_localizations/lib/src/l10n/material_pl.arb
index be3613f..1ed89c3 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_pl.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_pl.arb
@@ -55,5 +55,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Jeszcze 1 znak",
   "remainingTextFieldCharacterCountOther": "Pozostało $remainingCount znaków",
-  "refreshIndicatorSemanticLabel": "Odśwież"
+  "refreshIndicatorSemanticLabel": "Odśwież",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ps.arb b/packages/flutter_localizations/lib/src/l10n/material_ps.arb
index 2c318cd..6f456e9 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ps.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ps.arb
@@ -50,5 +50,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "TBD",
   "remainingTextFieldCharacterCountOther": "TBD",
-  "refreshIndicatorSemanticLabel": "TBD"
+  "refreshIndicatorSemanticLabel": "TBD",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_pt.arb b/packages/flutter_localizations/lib/src/l10n/material_pt.arb
index a1d74b6..6c36828 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_pt.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_pt.arb
@@ -53,5 +53,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 caractere restante",
   "remainingTextFieldCharacterCountOther": "$remainingCount caracteres restantes",
-  "refreshIndicatorSemanticLabel": "Atualizar"
+  "refreshIndicatorSemanticLabel": "Atualizar",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ro.arb b/packages/flutter_localizations/lib/src/l10n/material_ro.arb
index 5e29e55..3c92171 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ro.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ro.arb
@@ -54,5 +54,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "un caracter rămas",
   "remainingTextFieldCharacterCountOther": "$remainingCount de caractere rămase",
-  "refreshIndicatorSemanticLabel": "Actualizați"
+  "refreshIndicatorSemanticLabel": "Actualizați",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ru.arb b/packages/flutter_localizations/lib/src/l10n/material_ru.arb
index 15a8cf6..6db7e27 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ru.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ru.arb
@@ -56,5 +56,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Остался 1 символ",
   "remainingTextFieldCharacterCountOther": "Осталось $remainingCount символа",
-  "refreshIndicatorSemanticLabel": "Обновление"
+  "refreshIndicatorSemanticLabel": "Обновление",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_si.arb b/packages/flutter_localizations/lib/src/l10n/material_si.arb
index f294e70..5bd5488 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_si.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_si.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "දිග හරින්න",
   "remainingTextFieldCharacterCountOne": "අනුලකුණු 1ක් ඉතිරිය",
   "remainingTextFieldCharacterCountOther": "අනුලකුණු $remainingCountක් ඉතිරිය",
-  "refreshIndicatorSemanticLabel": "නැවුම් කරන්න"
+  "refreshIndicatorSemanticLabel": "නැවුම් කරන්න",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_sk.arb b/packages/flutter_localizations/lib/src/l10n/material_sk.arb
index d617a86..5f17b77 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_sk.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_sk.arb
@@ -55,5 +55,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Zostáva 1 znak",
   "remainingTextFieldCharacterCountOther": "Zostáva $remainingCount znakov",
-  "refreshIndicatorSemanticLabel": "Obnoviť"
+  "refreshIndicatorSemanticLabel": "Obnoviť",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_sl.arb b/packages/flutter_localizations/lib/src/l10n/material_sl.arb
index b15a668..d7f7687 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_sl.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_sl.arb
@@ -55,5 +55,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Še 1 znak",
   "remainingTextFieldCharacterCountOther": "Še $remainingCount znakov",
-  "refreshIndicatorSemanticLabel": "Osveži"
+  "refreshIndicatorSemanticLabel": "Osveži",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_sq.arb b/packages/flutter_localizations/lib/src/l10n/material_sq.arb
index c8990ea..9236da6 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_sq.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_sq.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Zgjero",
   "remainingTextFieldCharacterCountOne": "1 karakter i mbetur",
   "remainingTextFieldCharacterCountOther": "$remainingCount karaktere të mbetura",
-  "refreshIndicatorSemanticLabel": "Rifresko"
+  "refreshIndicatorSemanticLabel": "Rifresko",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_sr.arb b/packages/flutter_localizations/lib/src/l10n/material_sr.arb
index db45fa6..686cf98 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_sr.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_sr.arb
@@ -53,5 +53,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Преостао је 1 знак",
   "remainingTextFieldCharacterCountOther": "Преостало је $remainingCount знакова",
-  "refreshIndicatorSemanticLabel": "Освежи"
+  "refreshIndicatorSemanticLabel": "Освежи",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_sv.arb b/packages/flutter_localizations/lib/src/l10n/material_sv.arb
index 69a6eb4..5a02f2b 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_sv.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_sv.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 tecken kvar",
   "remainingTextFieldCharacterCountOther": "$remainingCount tecken kvar",
-  "refreshIndicatorSemanticLabel": "Uppdatera"
+  "refreshIndicatorSemanticLabel": "Uppdatera",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_sw.arb b/packages/flutter_localizations/lib/src/l10n/material_sw.arb
index c50ee8f..ea141e2 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_sw.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_sw.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "Hapana herufi zilizo baki",
   "remainingTextFieldCharacterCountOne": "Imesalia herufi 1",
   "remainingTextFieldCharacterCountOther": "Zimesalia herufi $remainingCount",
-  "refreshIndicatorSemanticLabel": "Onyesha upya"
+  "refreshIndicatorSemanticLabel": "Onyesha upya",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ta.arb b/packages/flutter_localizations/lib/src/l10n/material_ta.arb
index bacfa9a..20d0ebe 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ta.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ta.arb
@@ -52,5 +52,6 @@
   "remainingTextFieldCharacterCountZero": "எழுத்துக்கள் எதுவும் இல்லை",
   "remainingTextFieldCharacterCountOne": "1 எழுத்து மீதமுள்ளது",
   "remainingTextFieldCharacterCountOther": "$remainingCount எழுத்துகள் மீதமுள்ளன",
-  "refreshIndicatorSemanticLabel": "ரெஃப்ரெஷ் செய்யும்"
+  "refreshIndicatorSemanticLabel": "ரெஃப்ரெஷ் செய்யும்",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_te.arb b/packages/flutter_localizations/lib/src/l10n/material_te.arb
index 007628f..d76ddf9 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_te.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_te.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "విస్తరించు",
   "remainingTextFieldCharacterCountOne": "1 అక్షరం మిగిలి ఉంది",
   "remainingTextFieldCharacterCountOther": "$remainingCount అక్షరాలు మిగిలి ఉన్నాయి",
-  "refreshIndicatorSemanticLabel": "రిఫ్రెష్ చేయి"
+  "refreshIndicatorSemanticLabel": "రిఫ్రెష్ చేయి",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_th.arb b/packages/flutter_localizations/lib/src/l10n/material_th.arb
index 314cc88..a0d7e0d 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_th.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_th.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "เหลือ 1 อักขระ",
   "remainingTextFieldCharacterCountOther": "เหลือ $remainingCount อักขระ",
-  "refreshIndicatorSemanticLabel": "รีเฟรช"
+  "refreshIndicatorSemanticLabel": "รีเฟรช",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_tl.arb b/packages/flutter_localizations/lib/src/l10n/material_tl.arb
index d317f31..a1060d7 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_tl.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_tl.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 character ang natitira",
   "remainingTextFieldCharacterCountOther": "$remainingCount na character ang natitira",
-  "refreshIndicatorSemanticLabel": "Nagre-refresh"
+  "refreshIndicatorSemanticLabel": "Nagre-refresh",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_tr.arb b/packages/flutter_localizations/lib/src/l10n/material_tr.arb
index 0d4e933..b834d20 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_tr.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_tr.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 karakter kaldı",
   "remainingTextFieldCharacterCountOther": "$remainingCount karakter kaldı",
-  "refreshIndicatorSemanticLabel": "Yenile"
+  "refreshIndicatorSemanticLabel": "Yenile",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_uk.arb b/packages/flutter_localizations/lib/src/l10n/material_uk.arb
index 7ef7294..6ed3a98 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_uk.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_uk.arb
@@ -55,5 +55,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Залишився 1 символ",
   "remainingTextFieldCharacterCountOther": "Залишилося $remainingCount символу",
-  "refreshIndicatorSemanticLabel": "Оновити"
+  "refreshIndicatorSemanticLabel": "Оновити",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ur.arb b/packages/flutter_localizations/lib/src/l10n/material_ur.arb
index a0f4297..14e2919 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ur.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ur.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "1 حرف باقی ہے",
   "remainingTextFieldCharacterCountOther": "$remainingCount حروف باقی ہیں",
-  "refreshIndicatorSemanticLabel": "ریفریش کریں"
+  "refreshIndicatorSemanticLabel": "ریفریش کریں",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_uz.arb b/packages/flutter_localizations/lib/src/l10n/material_uz.arb
index 91e3972..b85aa60 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_uz.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_uz.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Yoyish",
   "remainingTextFieldCharacterCountOne": "1 ta belgi qoldi",
   "remainingTextFieldCharacterCountOther": "$remainingCount ta belgi qoldi",
-  "refreshIndicatorSemanticLabel": "Yangilash"
+  "refreshIndicatorSemanticLabel": "Yangilash",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_vi.arb b/packages/flutter_localizations/lib/src/l10n/material_vi.arb
index 8fef977..1122284 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_vi.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_vi.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "Còn lại 1 ký tự",
   "remainingTextFieldCharacterCountOther": "Còn lại $remainingCount ký tự",
-  "refreshIndicatorSemanticLabel": "Làm mới"
+  "refreshIndicatorSemanticLabel": "Làm mới",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_zh.arb b/packages/flutter_localizations/lib/src/l10n/material_zh.arb
index f3ddf89..98ffdca 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_zh.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_zh.arb
@@ -51,5 +51,6 @@
   "remainingTextFieldCharacterCountZero": "TBD",
   "remainingTextFieldCharacterCountOne": "还可输入 1 个字符",
   "remainingTextFieldCharacterCountOther": "还可输入 $remainingCount 个字符",
-  "refreshIndicatorSemanticLabel": "刷新"
+  "refreshIndicatorSemanticLabel": "刷新",
+  "moreButtonTooltip": "TBD"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_zu.arb b/packages/flutter_localizations/lib/src/l10n/material_zu.arb
index 36ab9ae..d3a78a6 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_zu.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_zu.arb
@@ -50,5 +50,6 @@
   "collapsedIconTapHint": "Nweba",
   "remainingTextFieldCharacterCountOne": "1 uhlamvu olusele",
   "remainingTextFieldCharacterCountOther": "$remainingCount izinhlamvu ezisele",
-  "refreshIndicatorSemanticLabel": "Vuselela"
+  "refreshIndicatorSemanticLabel": "Vuselela",
+  "moreButtonTooltip": "TBD"
 }