Make time picker accessible (#13152)

* make time picker accessible

* use new CustomPaint a11y API

* flutter_localizations tests; use bigger distance delta

* fix am/pm control; selected values

* fix translations; remove @mustCallSuper in describeSemanticsConfiguration

* exclude AM/PM announcement from iOS as on iOS the label is read back automatically
diff --git a/packages/flutter_localizations/lib/src/l10n/localizations.dart b/packages/flutter_localizations/lib/src/l10n/localizations.dart
index 9e30417..9f82310 100644
--- a/packages/flutter_localizations/lib/src/l10n/localizations.dart
+++ b/packages/flutter_localizations/lib/src/l10n/localizations.dart
@@ -45,6 +45,8 @@
     'viewLicensesButtonLabel': r'الاطّلاع على التراخيص',
     'anteMeridiemAbbreviation': r'ص',
     'postMeridiemAbbreviation': r'م',
+    'timePickerHourModeAnnouncement': r'حدد ساعات',
+    'timePickerMinuteModeAnnouncement': r'حدد دقائق',
   },
   'de': const <String, String>{
     'scriptCategory': r'English-like',
@@ -77,6 +79,8 @@
     'viewLicensesButtonLabel': r'LIZENZEN ANZEIGEN',
     'anteMeridiemAbbreviation': r'VORM.',
     'postMeridiemAbbreviation': r'NACHM.',
+    'timePickerHourModeAnnouncement': r'Stunde auswählen',
+    'timePickerMinuteModeAnnouncement': r'Minute auswählen',
   },
   'de_CH': const <String, String>{
     'scriptCategory': r'English-like',
@@ -140,6 +144,8 @@
     'viewLicensesButtonLabel': r'VIEW LICENSES',
     'anteMeridiemAbbreviation': r'AM',
     'postMeridiemAbbreviation': r'PM',
+    'timePickerHourModeAnnouncement': r'Select hours',
+    'timePickerMinuteModeAnnouncement': r'Select minutes',
   },
   'en_AU': const <String, String>{
     'scriptCategory': r'English-like',
@@ -389,6 +395,8 @@
     'viewLicensesButtonLabel': r'VER LICENCIAS',
     'anteMeridiemAbbreviation': r'A.M.',
     'postMeridiemAbbreviation': r'P.M.',
+    'timePickerHourModeAnnouncement': r'Seleccione Horas',
+    'timePickerMinuteModeAnnouncement': r'Seleccione Minutos',
   },
   'es_US': const <String, String>{
     'scriptCategory': r'English-like',
@@ -426,6 +434,8 @@
     'viewLicensesButtonLabel': r'مشاهده مجوزها',
     'anteMeridiemAbbreviation': r'ق.ظ.',
     'postMeridiemAbbreviation': r'ب.ظ.',
+    'timePickerHourModeAnnouncement': r'ساعت ها را انتخاب کنید',
+    'timePickerMinuteModeAnnouncement': r'دقیقه را انتخاب کنید',
   },
   'fr': const <String, String>{
     'scriptCategory': r'English-like',
@@ -458,6 +468,8 @@
     'viewLicensesButtonLabel': r'AFFICHER LES LICENCES',
     'anteMeridiemAbbreviation': r'AM',
     'postMeridiemAbbreviation': r'PM',
+    'timePickerHourModeAnnouncement': r'Sélectionnez les heures',
+    'timePickerMinuteModeAnnouncement': r'Sélectionnez les minutes',
   },
   'fr_CA': const <String, String>{
     'scriptCategory': r'English-like',
@@ -526,6 +538,8 @@
     'viewLicensesButtonLabel': r'הצגת הרישיונות',
     'anteMeridiemAbbreviation': r'AM',
     'postMeridiemAbbreviation': r'PM',
+    'timePickerHourModeAnnouncement': r'בחר שעות',
+    'timePickerMinuteModeAnnouncement': r'בחר דקות',
   },
   'it': const <String, String>{
     'scriptCategory': r'English-like',
@@ -557,6 +571,8 @@
     'viewLicensesButtonLabel': r'VISUALIZZA LICENZE',
     'anteMeridiemAbbreviation': r'AM',
     'postMeridiemAbbreviation': r'PM',
+    'timePickerHourModeAnnouncement': r'Seleziona ore',
+    'timePickerMinuteModeAnnouncement': r'Seleziona minuti',
   },
   'ja': const <String, String>{
     'scriptCategory': r'dense',
@@ -588,6 +604,8 @@
     'viewLicensesButtonLabel': r'ライセンスを表示',
     'anteMeridiemAbbreviation': r'AM',
     'postMeridiemAbbreviation': r'PM',
+    'timePickerHourModeAnnouncement': r'時を選択',
+    'timePickerMinuteModeAnnouncement': r'分を選択',
   },
   'ps': const <String, String>{
     'scriptCategory': r'tall',
@@ -616,6 +634,8 @@
     'pasteButtonLabel': r'پیټ کړئ',
     'selectAllButtonLabel': r'غوره کړئ',
     'viewLicensesButtonLabel': r'لیدلس وګورئ',
+    'timePickerHourModeAnnouncement': r'وختونه وټاکئ',
+    'timePickerMinuteModeAnnouncement': r'منې غوره کړئ',
   },
   'pt': const <String, String>{
     'scriptCategory': r'English-like',
@@ -644,6 +664,8 @@
     'pasteButtonLabel': r'COLAR',
     'selectAllButtonLabel': r'SELECIONAR TUDO',
     'viewLicensesButtonLabel': r'VER LICENÇAS',
+    'timePickerHourModeAnnouncement': r'Selecione horários',
+    'timePickerMinuteModeAnnouncement': r'Selecione Minutos',
   },
   'pt_PT': const <String, String>{
     'scriptCategory': r'English-like',
@@ -709,6 +731,8 @@
     'viewLicensesButtonLabel': r'ЛИЦЕНЗИИ',
     'anteMeridiemAbbreviation': r'АМ',
     'postMeridiemAbbreviation': r'PM',
+    'timePickerHourModeAnnouncement': r'ВЫБРАТЬ ЧАСЫ',
+    'timePickerMinuteModeAnnouncement': r'ВЫБРАТЬ МИНУТЫ',
   },
   'ur': const <String, String>{
     'scriptCategory': r'tall',
@@ -740,6 +764,8 @@
     'viewLicensesButtonLabel': r'لائسنسز دیکھیں',
     'anteMeridiemAbbreviation': r'AM',
     'postMeridiemAbbreviation': r'PM',
+    'timePickerHourModeAnnouncement': r'گھنٹے منتخب کریں',
+    'timePickerMinuteModeAnnouncement': r'منٹ منتخب کریں',
   },
   'zh': const <String, String>{
     'scriptCategory': r'dense',
@@ -771,6 +797,8 @@
     'previousMonthTooltip': r'上个月',
     'anteMeridiemAbbreviation': r'上午',
     'postMeridiemAbbreviation': r'下午',
+    'timePickerHourModeAnnouncement': r'选择小时',
+    'timePickerMinuteModeAnnouncement': r'选择分钟',
   },
 };
 
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ar.arb b/packages/flutter_localizations/lib/src/l10n/material_ar.arb
index 4e284c1..069a418 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ar.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ar.arb
@@ -31,5 +31,7 @@
   "selectAllButtonLabel": "اختيار الكل",
   "viewLicensesButtonLabel": "الاطّلاع على التراخيص",
   "anteMeridiemAbbreviation": "ص",
-  "postMeridiemAbbreviation": "م"
+  "postMeridiemAbbreviation": "م",
+  "timePickerHourModeAnnouncement": "حدد ساعات",
+  "timePickerMinuteModeAnnouncement": "حدد دقائق"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_de.arb b/packages/flutter_localizations/lib/src/l10n/material_de.arb
index 5d248d2..4fc5d5f 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_de.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_de.arb
@@ -28,5 +28,7 @@
   "selectAllButtonLabel": "ALLE AUSWÄHLEN",
   "viewLicensesButtonLabel": "LIZENZEN ANZEIGEN",
   "anteMeridiemAbbreviation": "VORM.",
-  "postMeridiemAbbreviation": "NACHM."
+  "postMeridiemAbbreviation": "NACHM.",
+  "timePickerHourModeAnnouncement": "Stunde auswählen",
+  "timePickerMinuteModeAnnouncement": "Minute auswählen"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_en.arb b/packages/flutter_localizations/lib/src/l10n/material_en.arb
index 215f2bd..27cc940 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_en.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_en.arb
@@ -143,5 +143,15 @@
   "postMeridiemAbbreviation": "PM",
   "@postMeridiemAbbreviation": {
     "description": "The abbreviation for post meridiem (after noon) shown in the time picker. Translations for this abbreviation will only be provided for locales that support it."
+  },
+
+  "timePickerHourModeAnnouncement": "Select hours",
+  "@timePickerHourModeAnnouncement": {
+    "description": "The audio announcement made when the time picker dialog is set to hour mode."
+  },
+
+  "timePickerMinuteModeAnnouncement": "Select minutes",
+  "@timePickerMinuteModeAnnouncement": {
+    "description": "The audio announcement made when the time picker dialog is set to minute mode."
   }
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_es.arb b/packages/flutter_localizations/lib/src/l10n/material_es.arb
index aa5e6d6..cf9dc85 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_es.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_es.arb
@@ -28,5 +28,7 @@
   "selectAllButtonLabel": "SELECCIONAR TODO",
   "viewLicensesButtonLabel": "VER LICENCIAS",
   "anteMeridiemAbbreviation": "A.M.",
-  "postMeridiemAbbreviation": "P.M."
+  "postMeridiemAbbreviation": "P.M.",
+  "timePickerHourModeAnnouncement": "Seleccione Horas",
+  "timePickerMinuteModeAnnouncement": "Seleccione Minutos"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_fa.arb b/packages/flutter_localizations/lib/src/l10n/material_fa.arb
index 12d07b2..e7cbf93 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_fa.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_fa.arb
@@ -27,5 +27,7 @@
   "selectAllButtonLabel": "انتخاب همه",
   "viewLicensesButtonLabel": "مشاهده مجوزها",
   "anteMeridiemAbbreviation": "ق.ظ.",
-  "postMeridiemAbbreviation": "ب.ظ."
+  "postMeridiemAbbreviation": "ب.ظ.",
+  "timePickerHourModeAnnouncement": "ساعت ها را انتخاب کنید",
+  "timePickerMinuteModeAnnouncement": "دقیقه را انتخاب کنید"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_fr.arb b/packages/flutter_localizations/lib/src/l10n/material_fr.arb
index 69d7b29..9eb4fd2 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_fr.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_fr.arb
@@ -28,5 +28,7 @@
   "selectAllButtonLabel": "TOUT SÉLECTIONNER",
   "viewLicensesButtonLabel": "AFFICHER LES LICENCES",
   "anteMeridiemAbbreviation": "AM",
-  "postMeridiemAbbreviation": "PM"
+  "postMeridiemAbbreviation": "PM",
+  "timePickerHourModeAnnouncement": "Sélectionnez les heures",
+  "timePickerMinuteModeAnnouncement": "Sélectionnez les minutes"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_he.arb b/packages/flutter_localizations/lib/src/l10n/material_he.arb
index 39083de..b6fe9e9 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_he.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_he.arb
@@ -29,5 +29,7 @@
   "selectAllButtonLabel": "בחירת הכול",
   "viewLicensesButtonLabel": "הצגת הרישיונות",
   "anteMeridiemAbbreviation": "AM",
-  "postMeridiemAbbreviation": "PM"
+  "postMeridiemAbbreviation": "PM",
+  "timePickerHourModeAnnouncement": "בחר שעות",
+  "timePickerMinuteModeAnnouncement": "בחר דקות"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_it.arb b/packages/flutter_localizations/lib/src/l10n/material_it.arb
index a0faf2a..785e32a 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_it.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_it.arb
@@ -27,5 +27,7 @@
   "selectAllButtonLabel": "SELEZIONA TUTTO",
   "viewLicensesButtonLabel": "VISUALIZZA LICENZE",
   "anteMeridiemAbbreviation": "AM",
-  "postMeridiemAbbreviation": "PM"
+  "postMeridiemAbbreviation": "PM",
+  "timePickerHourModeAnnouncement": "Seleziona ore",
+  "timePickerMinuteModeAnnouncement": "Seleziona minuti"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ja.arb b/packages/flutter_localizations/lib/src/l10n/material_ja.arb
index c34a6ab..3bedf74 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ja.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ja.arb
@@ -27,5 +27,7 @@
   "selectAllButtonLabel": "すべて選択",
   "viewLicensesButtonLabel": "ライセンスを表示",
   "anteMeridiemAbbreviation": "AM",
-  "postMeridiemAbbreviation": "PM"
+  "postMeridiemAbbreviation": "PM",
+  "timePickerHourModeAnnouncement": "時を選択",
+  "timePickerMinuteModeAnnouncement": "分を選択"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ps.arb b/packages/flutter_localizations/lib/src/l10n/material_ps.arb
index 89a41f6..c8d3769 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ps.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ps.arb
@@ -26,5 +26,7 @@
   "okButtonLabel": "سمه ده",
   "pasteButtonLabel": "پیټ کړئ",
   "selectAllButtonLabel": "غوره کړئ",
-  "viewLicensesButtonLabel": "لیدلس وګورئ"
+  "viewLicensesButtonLabel": "لیدلس وګورئ",
+  "timePickerHourModeAnnouncement": "وختونه وټاکئ",
+  "timePickerMinuteModeAnnouncement": "منې غوره کړئ"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_pt.arb b/packages/flutter_localizations/lib/src/l10n/material_pt.arb
index e2b95c4..c4dd6d2 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_pt.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_pt.arb
@@ -26,5 +26,7 @@
   "okButtonLabel": "OK",
   "pasteButtonLabel": "COLAR",
   "selectAllButtonLabel": "SELECIONAR TUDO",
-  "viewLicensesButtonLabel": "VER LICENÇAS"
+  "viewLicensesButtonLabel": "VER LICENÇAS",
+  "timePickerHourModeAnnouncement": "Selecione horários",
+  "timePickerMinuteModeAnnouncement": "Selecione Minutos"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ru.arb b/packages/flutter_localizations/lib/src/l10n/material_ru.arb
index 3b36b5f..d4c0e0b 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ru.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ru.arb
@@ -30,5 +30,7 @@
   "selectAllButtonLabel": "ВЫБРАТЬ ВСЕ",
   "viewLicensesButtonLabel": "ЛИЦЕНЗИИ",
   "anteMeridiemAbbreviation": "АМ",
-  "postMeridiemAbbreviation": "PM"
+  "postMeridiemAbbreviation": "PM",
+  "timePickerHourModeAnnouncement": "ВЫБРАТЬ ЧАСЫ",
+  "timePickerMinuteModeAnnouncement": "ВЫБРАТЬ МИНУТЫ"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ur.arb b/packages/flutter_localizations/lib/src/l10n/material_ur.arb
index 1276c28..8d41993 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_ur.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_ur.arb
@@ -27,5 +27,7 @@
   "selectAllButtonLabel": "سبھی منتخب کریں",
   "viewLicensesButtonLabel": "لائسنسز دیکھیں",
   "anteMeridiemAbbreviation": "AM",
-  "postMeridiemAbbreviation": "PM"
+  "postMeridiemAbbreviation": "PM",
+  "timePickerHourModeAnnouncement": "گھنٹے منتخب کریں",
+  "timePickerMinuteModeAnnouncement": "منٹ منتخب کریں"
 }
diff --git a/packages/flutter_localizations/lib/src/l10n/material_zh.arb b/packages/flutter_localizations/lib/src/l10n/material_zh.arb
index 8afe969..791a974 100644
--- a/packages/flutter_localizations/lib/src/l10n/material_zh.arb
+++ b/packages/flutter_localizations/lib/src/l10n/material_zh.arb
@@ -27,5 +27,7 @@
   "nextMonthTooltip": "下个月",
   "previousMonthTooltip": "上个月",
   "anteMeridiemAbbreviation": "上午",
-  "postMeridiemAbbreviation": "下午"
+  "postMeridiemAbbreviation": "下午",
+  "timePickerHourModeAnnouncement": "选择小时",
+  "timePickerMinuteModeAnnouncement": "选择分钟"
 }
diff --git a/packages/flutter_localizations/lib/src/material_localizations.dart b/packages/flutter_localizations/lib/src/material_localizations.dart
index a1538f6..800ddfa 100644
--- a/packages/flutter_localizations/lib/src/material_localizations.dart
+++ b/packages/flutter_localizations/lib/src/material_localizations.dart
@@ -316,6 +316,12 @@
   @override
   String get postMeridiemAbbreviation => _nameToValue['postMeridiemAbbreviation'];
 
+  @override
+  String get timePickerHourModeAnnouncement => _nameToValue['timePickerHourModeAnnouncement'];
+
+  @override
+  String get timePickerMinuteModeAnnouncement => _nameToValue['timePickerMinuteModeAnnouncement'];
+
   /// The [TimeOfDayFormat] corresponding to one of the following supported
   /// patterns:
   ///