Unverified Commit 322eb81a authored by Chris Bracken's avatar Chris Bracken Committed by GitHub

Revert longPress/Tap and Gallery changes (#17269)

Revert longPress/Tap and Gallery changes
parent 40ddf010
......@@ -153,41 +153,17 @@ List<GalleryDemo> _buildGalleryDemos() {
routeName: BottomNavigationDemo.routeName,
buildRoute: (BuildContext context) => new BottomNavigationDemo(),
),
new GalleryDemo(
title: 'Bottom sheet: Modal',
subtitle: 'A dismissable bottom sheet',
icon: GalleryIcons.bottom_sheets,
category: _kMaterialComponents,
routeName: ModalBottomSheetDemo.routeName,
buildRoute: (BuildContext context) => new ModalBottomSheetDemo(),
),
new GalleryDemo(
title: 'Bottom sheet: Persistent',
subtitle: 'A bottom sheet that sticks around',
icon: GalleryIcons.bottom_sheet_persistent,
category: _kMaterialComponents,
routeName: PersistentBottomSheetDemo.routeName,
buildRoute: (BuildContext context) => new PersistentBottomSheetDemo(),
),
new GalleryDemo(
title: 'Buttons',
subtitle: 'Flat, raised, dropdown, and more',
subtitle: 'All kinds: flat, raised, dropdown, icon, etc',
icon: GalleryIcons.generic_buttons,
category: _kMaterialComponents,
routeName: ButtonsDemo.routeName,
buildRoute: (BuildContext context) => new ButtonsDemo(),
),
new GalleryDemo(
title: 'Buttons: Floating Action Button',
subtitle: 'FAB with transitions',
icon: GalleryIcons.buttons,
category: _kMaterialComponents,
routeName: TabsFabDemo.routeName,
buildRoute: (BuildContext context) => new TabsFabDemo(),
),
new GalleryDemo(
title: 'Cards',
subtitle: 'Baseline cards with rounded corners',
subtitle: 'Material with rounded corners and a drop shadow',
icon: GalleryIcons.cards,
category: _kMaterialComponents,
routeName: CardsDemo.routeName,
......@@ -195,7 +171,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Chips',
subtitle: 'Labeled with delete buttons and avatars',
subtitle: 'Label with an optional delete button and avatar',
icon: GalleryIcons.chips,
category: _kMaterialComponents,
routeName: ChipDemo.routeName,
......@@ -210,16 +186,32 @@ List<GalleryDemo> _buildGalleryDemos() {
buildRoute: (BuildContext context) => new DataTableDemo(),
),
new GalleryDemo(
title: 'Dialogs',
subtitle: 'Simple, alert, and fullscreen',
title: 'Date and time pickers',
subtitle: 'Date and time selection widgets',
icon: GalleryIcons.event,
category: _kMaterialComponents,
routeName: DateAndTimePickerDemo.routeName,
buildRoute: (BuildContext context) => new DateAndTimePickerDemo(),
),
new GalleryDemo(
title: 'Dialog',
subtitle: 'All kinds: simple, alert, fullscreen, etc',
icon: GalleryIcons.dialogs,
category: _kMaterialComponents,
routeName: DialogDemo.routeName,
buildRoute: (BuildContext context) => new DialogDemo(),
),
new GalleryDemo(
title: 'Drawer',
subtitle: 'Navigation drawer with a standard header',
icon: GalleryIcons.menu,
category: _kMaterialComponents,
routeName: DrawerDemo.routeName,
buildRoute: (BuildContext context) => new DrawerDemo(),
),
new GalleryDemo(
title: 'Expand/collapse list control',
subtitle: 'A list with one sub-list level',
subtitle: 'List with one level of sublists',
icon: GalleryIcons.expand_all,
category: _kMaterialComponents,
routeName: TwoLevelListDemo.routeName,
......@@ -233,6 +225,14 @@ List<GalleryDemo> _buildGalleryDemos() {
routeName: ExpansionPanelsDemo.routeName,
buildRoute: (BuildContext context) => new ExpansionPanelsDemo(),
),
new GalleryDemo(
title: 'Floating action button',
subtitle: 'Action buttons with transitions',
icon: GalleryIcons.buttons,
category: _kMaterialComponents,
routeName: TabsFabDemo.routeName,
buildRoute: (BuildContext context) => new TabsFabDemo(),
),
new GalleryDemo(
title: 'Grid',
subtitle: 'Row and column layout',
......@@ -243,28 +243,28 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Icons',
subtitle: 'Enabled and disabled icons with opacity',
subtitle: 'Enabled and disabled icons with varying opacity',
icon: GalleryIcons.sentiment_very_satisfied,
category: _kMaterialComponents,
routeName: IconsDemo.routeName,
buildRoute: (BuildContext context) => new IconsDemo(),
),
new GalleryDemo(
title: 'Lists',
subtitle: 'Scrolling list layouts',
icon: GalleryIcons.list_alt,
category: _kMaterialComponents,
routeName: ListDemo.routeName,
buildRoute: (BuildContext context) => const ListDemo(),
),
new GalleryDemo(
title: 'Lists: leave-behind list items',
title: 'Leave-behind list items',
subtitle: 'List items with hidden actions',
icon: GalleryIcons.lists_leave_behind,
category: _kMaterialComponents,
routeName: LeaveBehindDemo.routeName,
buildRoute: (BuildContext context) => const LeaveBehindDemo(),
),
new GalleryDemo(
title: 'List',
subtitle: 'Layout variations for scrollable lists',
icon: GalleryIcons.list_alt,
category: _kMaterialComponents,
routeName: ListDemo.routeName,
buildRoute: (BuildContext context) => const ListDemo(),
),
new GalleryDemo(
title: 'Menus',
subtitle: 'Menu buttons and simple menus',
......@@ -274,15 +274,15 @@ List<GalleryDemo> _buildGalleryDemos() {
buildRoute: (BuildContext context) => const MenuDemo(),
),
new GalleryDemo(
title: 'Navigation drawer',
subtitle: 'Navigation drawer with standard header',
icon: GalleryIcons.menu,
title: 'Modal bottom sheet',
subtitle: 'Modal sheet that slides up from the bottom',
icon: GalleryIcons.bottom_sheets,
category: _kMaterialComponents,
routeName: DrawerDemo.routeName,
buildRoute: (BuildContext context) => new DrawerDemo(),
routeName: ModalBottomSheetDemo.routeName,
buildRoute: (BuildContext context) => new ModalBottomSheetDemo(),
),
new GalleryDemo(
title: 'Pagination',
title: 'Page selector',
subtitle: 'PageView with indicator',
icon: GalleryIcons.page_control,
category: _kMaterialComponents,
......@@ -290,16 +290,16 @@ List<GalleryDemo> _buildGalleryDemos() {
buildRoute: (BuildContext context) => new PageSelectorDemo(),
),
new GalleryDemo(
title: 'Pickers',
subtitle: 'Date and time selection widgets',
icon: GalleryIcons.event,
title: 'Persistent bottom sheet',
subtitle: 'Sheet that slides up from the bottom',
icon: GalleryIcons.bottom_sheet_persistent,
category: _kMaterialComponents,
routeName: DateAndTimePickerDemo.routeName,
buildRoute: (BuildContext context) => new DateAndTimePickerDemo(),
routeName: PersistentBottomSheetDemo.routeName,
buildRoute: (BuildContext context) => new PersistentBottomSheetDemo(),
),
new GalleryDemo(
title: 'Progress indicators',
subtitle: 'Linear, circular, indeterminate',
subtitle: 'All kinds: linear, circular, indeterminate, etc',
icon: GalleryIcons.progress_activity,
category: _kMaterialComponents,
routeName: ProgressIndicatorDemo.routeName,
......@@ -313,6 +313,14 @@ List<GalleryDemo> _buildGalleryDemos() {
routeName: OverscrollDemo.routeName,
buildRoute: (BuildContext context) => const OverscrollDemo(),
),
new GalleryDemo(
title: 'Scrollable tabs',
subtitle: 'Tab bar that scrolls',
category: _kMaterialComponents,
icon: GalleryIcons.tabs,
routeName: ScrollableTabsDemo.routeName,
buildRoute: (BuildContext context) => new ScrollableTabsDemo(),
),
new GalleryDemo(
title: 'Selection controls',
subtitle: 'Checkboxes, radio buttons, and switches',
......@@ -323,7 +331,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Sliders',
subtitle: 'Widgets for selecting a value by swiping',
subtitle: 'Widgets that select a value by dragging the slider thumb',
icon: GalleryIcons.sliders,
category: _kMaterialComponents,
routeName: SliderDemo.routeName,
......@@ -331,7 +339,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Snackbar',
subtitle: 'Temporary messaging',
subtitle: 'Temporary message that appears at the bottom',
icon: GalleryIcons.snackbar,
category: _kMaterialComponents,
routeName: SnackBarDemo.routeName,
......@@ -345,14 +353,6 @@ List<GalleryDemo> _buildGalleryDemos() {
routeName: TabsDemo.routeName,
buildRoute: (BuildContext context) => new TabsDemo(),
),
new GalleryDemo(
title: 'Tabs: Scrolling',
subtitle: 'Tab bar that scrolls',
category: _kMaterialComponents,
icon: GalleryIcons.tabs,
routeName: ScrollableTabsDemo.routeName,
buildRoute: (BuildContext context) => new ScrollableTabsDemo(),
),
new GalleryDemo(
title: 'Text fields',
subtitle: 'Single line of editable text and numbers',
......@@ -363,7 +363,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Tooltips',
subtitle: 'Short message displayed on long-press',
subtitle: 'Short message displayed after a long-press',
icon: GalleryIcons.tooltip,
category: _kMaterialComponents,
routeName: TooltipDemo.routeName,
......@@ -373,6 +373,7 @@ List<GalleryDemo> _buildGalleryDemos() {
// Cupertino Components
new GalleryDemo(
title: 'Activity Indicator',
subtitle: 'Cupertino styled activity indicator',
icon: GalleryIcons.cupertino_progress,
category: _kCupertinoComponents,
routeName: CupertinoProgressIndicatorDemo.routeName,
......@@ -380,6 +381,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Buttons',
subtitle: 'Cupertino styled buttons',
icon: GalleryIcons.generic_buttons,
category: _kCupertinoComponents,
routeName: CupertinoButtonsDemo.routeName,
......@@ -387,6 +389,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Dialogs',
subtitle: 'Cupertino styled dialogs',
icon: GalleryIcons.dialogs,
category: _kCupertinoComponents,
routeName: CupertinoDialogDemo.routeName,
......@@ -394,6 +397,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Navigation',
subtitle: 'Cupertino styled navigation patterns',
icon: GalleryIcons.bottom_navigation,
category: _kCupertinoComponents,
routeName: CupertinoNavigationDemo.routeName,
......@@ -401,6 +405,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Pickers',
subtitle: 'Cupertino styled pickers',
icon: GalleryIcons.event,
category: _kCupertinoComponents,
routeName: CupertinoPickerDemo.routeName,
......@@ -408,6 +413,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Pull to refresh',
subtitle: 'Cupertino styled refresh controls',
icon: GalleryIcons.cupertino_pull_to_refresh,
category: _kCupertinoComponents,
routeName: CupertinoRefreshControlDemo.routeName,
......@@ -415,6 +421,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Sliders',
subtitle: 'Cupertino styled sliders',
icon: GalleryIcons.sliders,
category: _kCupertinoComponents,
routeName: CupertinoSliderDemo.routeName,
......@@ -422,6 +429,7 @@ List<GalleryDemo> _buildGalleryDemos() {
),
new GalleryDemo(
title: 'Switches',
subtitle: 'Cupertino styled switches',
icon: GalleryIcons.cupertino_switch,
category: _kCupertinoComponents,
routeName: CupertinoSwitchDemo.routeName,
......
......@@ -177,25 +177,6 @@ class _DemoItem extends StatelessWidget {
final bool isDark = theme.brightness == Brightness.dark;
final double textScaleFactor = MediaQuery.of(context)?.textScaleFactor ?? 1.0;
final List<Widget> titleChildren = <Widget>[
new Text(
demo.title,
style: theme.textTheme.subhead.copyWith(
color: isDark ? Colors.white : const Color(0xFF202124),
),
),
];
if (demo.subtitle != null) {
titleChildren.add(
new Text(
demo.subtitle,
style: theme.textTheme.body1.copyWith(
color: isDark ? Colors.white : const Color(0xFF60646B)
),
),
);
}
return new RawMaterialButton(
padding: EdgeInsets.zero,
splashColor: theme.primaryColor.withOpacity(0.12),
......@@ -221,7 +202,19 @@ class _DemoItem extends StatelessWidget {
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: titleChildren,
children: <Widget>[
new Text(
demo.title,
style: theme.textTheme.subhead.copyWith(
color: isDark ? Colors.white : const Color(0xFF202124),
),
),
new Text(
demo.subtitle,
style: theme.textTheme.body1.copyWith(
color: isDark ? Colors.white : const Color(0xFF60646B)),
),
],
),
),
const SizedBox(width: 44.0),
......
......@@ -21,8 +21,8 @@ const FileSystem _fs = const LocalFileSystem();
// --trace-startup, as we do in this test, the VM stores trace events in an
// endless buffer instead of a ring buffer.
//
// These names must match GalleryItem titles from kAllGalleryDemos
// in examples/flutter_gallery/lib/gallery/demos.dart
// These names must match GalleryItem titles from kAllGalleryItems
// in examples/flutter_gallery/lib/gallery.item.dart
const List<String> kProfiledDemos = const <String>[
'Shrine',
'Contact profile',
......@@ -31,14 +31,14 @@ const List<String> kProfiledDemos = const <String>[
'Buttons',
'Cards',
'Chips',
'Pickers',
'Dialogs',
'Date and time pickers',
'Dialog',
];
// Demos that will be backed out of within FlutterDriver.runUnsynchronized();
//
// These names must match GalleryItem titles from kAllGalleryDemos
// in examples/flutter_gallery/lib/gallery/demos.dart
// These names must match GalleryItem titles from kAllGalleryItems
// in examples/flutter_gallery/lib/gallery.item.dart
const List<String> kUnsynchronizedDemos = const <String>[
'Progress indicators',
'Activity Indicator',
......
......@@ -4,8 +4,6 @@
import 'dart:async';
import 'package:flutter/rendering.dart';
import 'package:flutter/semantics.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
......@@ -88,7 +86,6 @@ class Feedback {
/// * [wrapForTap] to trigger platform-specific feedback before executing a
/// [GestureTapCallback].
static Future<Null> forTap(BuildContext context) async {
context.findRenderObject().sendSemanticsEvent(const TapSemanticEvent());
switch (_platform(context)) {
case TargetPlatform.android:
case TargetPlatform.fuchsia:
......@@ -127,7 +124,6 @@ class Feedback {
/// * [wrapForLongPress] to trigger platform-specific feedback before
/// executing a [GestureLongPressCallback].
static Future<Null> forLongPress(BuildContext context) {
context.findRenderObject().sendSemanticsEvent(const LongPressSemanticsEvent());
switch (_platform(context)) {
case TargetPlatform.android:
case TargetPlatform.fuchsia:
......
......@@ -285,7 +285,6 @@ abstract class RenderToggleable extends RenderConstrainedBox {
onChanged(false);
break;
}
sendSemanticsEvent(const TapSemanticEvent());
}
void _handleTapUp(TapUpDetails details) {
......
......@@ -2165,25 +2165,6 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im
// Nothing to do by default.
}
/// Sends a [SemanticsEvent] associated with this render object's [SemanticsNode].
///
/// If this render object has no semantics information, the first parent
/// render object with a non-null semantic node is used.
///
/// If semantics are disabled, no events are dispatched.
///
/// See [SemanticsNode.sendEvent] for a full description of the behavior.
void sendSemanticsEvent(SemanticsEvent semanticsEvent) {
if (owner.semanticsOwner == null)
return;
if (_semantics != null) {
_semantics.sendEvent(semanticsEvent);
} else if (parent != null) {
final RenderObject renderParent = parent;
renderParent.sendSemanticsEvent(semanticsEvent);
}
}
// Use [_semanticsConfiguration] to access.
SemanticsConfiguration _cachedSemanticsConfiguration;
......
......@@ -107,29 +107,3 @@ class TooltipSemanticsEvent extends SemanticsEvent {
};
}
}
/// An event which triggers long press semantic feedback.
///
/// Currently only honored on Android. Triggers a long-press specific sound
/// when TalkBack is enabled.
class LongPressSemanticsEvent extends SemanticsEvent {
/// Constructs an event that triggers a long-press semantic feedback by the platform.
const LongPressSemanticsEvent() : super('longPress');
@override
Map<String, dynamic> getDataMap() => const <String, dynamic>{};
}
/// An event which triggers tap semantic feedback.
///
/// Currently only honored on Android. Triggers a tap specific sound when
/// TalkBack is enabled.
class TapSemanticEvent extends SemanticsEvent {
/// Constructs an event that triggers a long-press semantic feedback by the platform.
const TapSemanticEvent() : super('tap');
@override
Map<String, dynamic> getDataMap() => const <String, dynamic>{};
}
......@@ -34,8 +34,7 @@ class SemanticsService {
/// Sends a semantic announcement of a tooltip.
///
/// Currently only honored on Android. The contents of [message] will be
/// read by TalkBack.
/// This is only used by Android.
static Future<Null> tooltip(String message) async {
final TooltipSemanticsEvent event = new TooltipSemanticsEvent(message);
await SystemChannels.accessibility.send(event.toMap());
......
......@@ -5,7 +5,6 @@
import 'dart:ui';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
......@@ -186,44 +185,4 @@ void main() {
await tester.pumpAndSettle();
expect(checkBoxValue, null);
});
testWidgets('has semantic events', (WidgetTester tester) async {
dynamic semanticEvent;
bool checkboxValue = false;
SystemChannels.accessibility.setMockMessageHandler((dynamic message) {
semanticEvent = message;
});
final SemanticsTester semanticsTester = new SemanticsTester(tester);
await tester.pumpWidget(
new Material(
child: new StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return new Checkbox(
value: checkboxValue,
onChanged: (bool value) {
setState(() {
checkboxValue = value;
});
},
);
},
),
),
);
await tester.tap(find.byType(Checkbox));
final RenderObject object = tester.firstRenderObject(find.byType(Checkbox));
expect(checkboxValue, true);
expect(semanticEvent, <String, dynamic>{
'type': 'tap',
'nodeId': object.debugSemantics.id,
'data': <String, dynamic>{},
});
expect(object.debugSemantics.getSemanticsData().hasAction(SemanticsAction.tap), true);
SystemChannels.accessibility.setMockMessageHandler(null);
semanticsTester.dispose();
});
}
import 'dart:ui';
// Copyright 2017 The Chromium 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/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import '../widgets/semantics_tester.dart';
import 'feedback_tester.dart';
void main () {
......@@ -26,23 +21,8 @@ void main () {
});
group('Feedback on Android', () {
List<Map<String, Object>> semanticEvents;
setUp(() {
semanticEvents = <Map<String, Object>>[];
SystemChannels.accessibility.setMockMessageHandler((dynamic message) {
final Map<dynamic, dynamic> typedMessage = message;
semanticEvents.add(typedMessage.cast<String, Object>());
});
});
tearDown(() {
SystemChannels.accessibility.setMockMessageHandler(null);
});
testWidgets('forTap', (WidgetTester tester) async {
final SemanticsTester semanticsTester = new SemanticsTester(tester);
await tester.pumpWidget(new TestWidget(
tapHandler: (BuildContext context) {
return () => Feedback.forTap(context);
......@@ -51,27 +31,14 @@ void main () {
await tester.pumpAndSettle(kWaitDuration);
expect(feedback.hapticCount, 0);
expect(feedback.clickSoundCount, 0);
expect(semanticEvents, isEmpty);
await tester.tap(find.text('X'));
await tester.pumpAndSettle(kWaitDuration);
final RenderObject object = tester.firstRenderObject(find.byType(GestureDetector));
expect(feedback.hapticCount, 0);
expect(feedback.clickSoundCount, 1);
expect(semanticEvents.single, <String, dynamic>{
'type': 'tap',
'nodeId': object.debugSemantics.id,
'data': <String, dynamic>{},
});
expect(object.debugSemantics.getSemanticsData().hasAction(SemanticsAction.tap), true);
semanticsTester.dispose();
});
testWidgets('forTap Wrapper', (WidgetTester tester) async {
final SemanticsTester semanticsTester = new SemanticsTester(tester);
int callbackCount = 0;
final VoidCallback callback = () {
callbackCount++;
......@@ -82,7 +49,6 @@ void main () {
return Feedback.wrapForTap(callback, context);
},
));
await tester.pumpAndSettle(kWaitDuration);
expect(feedback.hapticCount, 0);
expect(feedback.clickSoundCount, 0);
......@@ -90,24 +56,12 @@ void main () {
await tester.tap(find.text('X'));
await tester.pumpAndSettle(kWaitDuration);
final RenderObject object = tester.firstRenderObject(find.byType(GestureDetector));
expect(feedback.hapticCount, 0);
expect(feedback.clickSoundCount, 1);
expect(callbackCount, 1);
expect(semanticEvents.single, <String, dynamic>{
'type': 'tap',
'nodeId': object.debugSemantics.id,
'data': <String, dynamic>{},
});
expect(object.debugSemantics.getSemanticsData().hasAction(SemanticsAction.tap), true);
semanticsTester.dispose();
});
testWidgets('forLongPress', (WidgetTester tester) async {
final SemanticsTester semanticsTester = new SemanticsTester(tester);
await tester.pumpWidget(new TestWidget(
longPressHandler: (BuildContext context) {
return () => Feedback.forLongPress(context);
......@@ -119,23 +73,11 @@ void main () {
await tester.longPress(find.text('X'));
await tester.pumpAndSettle(kWaitDuration);
final RenderObject object = tester.firstRenderObject(find.byType(GestureDetector));
expect(feedback.hapticCount, 1);
expect(feedback.clickSoundCount, 0);
expect(semanticEvents.single, <String, dynamic>{
'type': 'longPress',
'nodeId': object.debugSemantics.id,
'data': <String, dynamic>{},
});
expect(object.debugSemantics.getSemanticsData().hasAction(SemanticsAction.longPress), true);
semanticsTester.dispose();
});
testWidgets('forLongPress Wrapper', (WidgetTester tester) async {
final SemanticsTester semanticsTester = new SemanticsTester(tester);
int callbackCount = 0;
final VoidCallback callback = () {
callbackCount++;
......@@ -147,26 +89,15 @@ void main () {
},
));
await tester.pumpAndSettle(kWaitDuration);
final RenderObject object = tester.firstRenderObject(find.byType(GestureDetector));
expect(feedback.hapticCount, 0);
expect(feedback.clickSoundCount, 0);
expect(callbackCount, 0);
await tester.longPress(find.text('X'));
await tester.pumpAndSettle(kWaitDuration);
expect(feedback.hapticCount, 1);
expect(feedback.clickSoundCount, 0);
expect(callbackCount, 1);
expect(semanticEvents.single, <String, dynamic>{
'type': 'longPress',
'nodeId': object.debugSemantics.id,
'data': <String, dynamic>{},
});
expect(object.debugSemantics.getSemanticsData().hasAction(SemanticsAction.longPress), true);
semanticsTester.dispose();
});
});
......
......@@ -5,7 +5,6 @@
import 'dart:ui';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
......@@ -163,39 +162,4 @@ void main() {
semantics.dispose();
});
testWidgets('has semantic events', (WidgetTester tester) async {
final SemanticsTester semantics = new SemanticsTester(tester);
final Key key = new UniqueKey();
dynamic semanticEvent;
int radioValue = 2;
SystemChannels.accessibility.setMockMessageHandler((dynamic message) {
semanticEvent = message;
});
await tester.pumpWidget(new Material(
child: new Radio<int>(
key: key,
value: 1,
groupValue: radioValue,
onChanged: (int i) {
radioValue = i;
},
),
));
await tester.tap(find.byKey(key));
final RenderObject object = tester.firstRenderObject(find.byKey(key));
expect(radioValue, 1);
expect(semanticEvent, <String, dynamic>{
'type': 'tap',
'nodeId': object.debugSemantics.id,
'data': <String, dynamic>{},
});
expect(object.debugSemantics.getSemanticsData().hasAction(SemanticsAction.tap), true);
semantics.dispose();
SystemChannels.accessibility.setMockMessageHandler(null);
});
}
......@@ -4,11 +4,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import '../rendering/mock_canvas.dart';
import '../widgets/semantics_tester.dart';
void main() {
testWidgets('Switch can toggle on tap', (WidgetTester tester) async {
......@@ -189,48 +187,4 @@ void main() {
..circle(color: Colors.red[500])
);
});
testWidgets('switch has semantic events', (WidgetTester tester) async {
dynamic semanticEvent;
bool value = false;
SystemChannels.accessibility.setMockMessageHandler((dynamic message) {
semanticEvent = message;
});
final SemanticsTester semanticsTester = new SemanticsTester(tester);
await tester.pumpWidget(
new Directionality(
textDirection: TextDirection.ltr,
child: new StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return new Material(
child: new Center(
child: new Switch(
value: value,
onChanged: (bool newValue) {
setState(() {
value = newValue;
});
},
),
),
);
},
),
),
);
await tester.tap(find.byType(Switch));
final RenderObject object = tester.firstRenderObject(find.byType(Switch));
expect(value, true);
expect(semanticEvent, <String, dynamic>{
'type': 'tap',
'nodeId': object.debugSemantics.id,
'data': <String, dynamic>{},
});
expect(object.debugSemantics.getSemanticsData().hasAction(SemanticsAction.tap), true);
semanticsTester.dispose();
SystemChannels.accessibility.setMockMessageHandler(null);
});
}
import 'dart:ui';
import 'package:flutter/services.dart';
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
......@@ -606,48 +605,6 @@ void main() {
feedback.dispose();
});
testWidgets('has semantic events', (WidgetTester tester) async {
final List<dynamic> semanticEvents = <dynamic>[];
SystemChannels.accessibility.setMockMessageHandler((dynamic message) {
semanticEvents.add(message);
});
final SemanticsTester semantics = new SemanticsTester(tester);
await tester.pumpWidget(
new MaterialApp(
home: new Center(
child: new Tooltip(
message: 'Foo',
child: new Container(
width: 100.0,
height: 100.0,
color: Colors.green[500],
),
),
),
),
);
await tester.longPress(find.byType(Tooltip));
final RenderObject object = tester.firstRenderObject(find.byType(Tooltip));
expect(semanticEvents, unorderedEquals(<dynamic>[
<String, dynamic>{
'type': 'longPress',
'nodeId': findDebugSemantics(object).id,
'data': <String, dynamic>{},
},
<String, dynamic>{
'type': 'tooltip',
'data': <String, dynamic>{
'message': 'Foo',
},
},
]));
semantics.dispose();
SystemChannels.accessibility.setMockMessageHandler(null);
});
testWidgets('Semantics included', (WidgetTester tester) async {
final SemanticsTester semantics = new SemanticsTester(tester);
......@@ -720,9 +677,3 @@ void main() {
});
}
SemanticsNode findDebugSemantics(RenderObject object) {
if (object.debugSemantics != null)
return object.debugSemantics;
return findDebugSemantics(object.parent);
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment