From a1a77e40148f928189c4f64b12e886671e08d00b Mon Sep 17 00:00:00 2001 From: hangyu Date: Mon, 13 Jul 2026 13:37:27 -0700 Subject: [PATCH 1/6] Clean up mockup data and leave only placeholder text in semantics tree and diagnostics panels Replace custom outline border color with standard theme focusColor Replace hardcoded BorderRadius with theme defaultBorderRadius constant Add placeholder Accessibility screen and controller --- packages/devtools_app/lib/devtools_app.dart | 2 + packages/devtools_app/lib/src/app.dart | 7 ++ .../accessibility_controller.dart | 67 ++++++++++ .../accessibility/accessibility_screen.dart | 118 ++++++++++++++++++ .../lib/src/shared/feature_flags.dart | 7 ++ .../lib/src/shared/framework/screen.dart | 6 + .../accessibility_screen_test.dart | 88 +++++++++++++ .../lib/src/helpers/wrappers.dart | 7 ++ 8 files changed, 302 insertions(+) create mode 100644 packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart create mode 100644 packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart create mode 100644 packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart diff --git a/packages/devtools_app/lib/devtools_app.dart b/packages/devtools_app/lib/devtools_app.dart index 5125d710595..fb2637e7665 100644 --- a/packages/devtools_app/lib/devtools_app.dart +++ b/packages/devtools_app/lib/devtools_app.dart @@ -10,6 +10,8 @@ export 'src/framework/notifications_view.dart'; export 'src/framework/release_notes.dart'; export 'src/framework/scaffold/app_bar.dart'; export 'src/framework/scaffold/status_line.dart'; +export 'src/screens/accessibility/accessibility_controller.dart'; +export 'src/screens/accessibility/accessibility_screen.dart'; export 'src/screens/app_size/app_size_controller.dart'; export 'src/screens/app_size/app_size_screen.dart'; export 'src/screens/debugger/breakpoint_manager.dart'; diff --git a/packages/devtools_app/lib/src/app.dart b/packages/devtools_app/lib/src/app.dart index 272f1fc06cd..e51ec18c84a 100644 --- a/packages/devtools_app/lib/src/app.dart +++ b/packages/devtools_app/lib/src/app.dart @@ -23,6 +23,8 @@ import 'framework/notifications_view.dart'; import 'framework/observer/disconnect_observer.dart'; import 'framework/release_notes.dart'; import 'framework/scaffold/scaffold.dart'; +import 'screens/accessibility/accessibility_controller.dart'; +import 'screens/accessibility/accessibility_screen.dart'; import 'screens/app_size/app_size_controller.dart'; import 'screens/app_size/app_size_screen.dart'; import 'screens/debugger/debugger_controller.dart'; @@ -713,6 +715,11 @@ List defaultScreens({ LoggingScreen(), createController: (_) => LoggingController(), ), + if (FeatureFlags.accessibility.isEnabled) + DevToolsScreen( + AccessibilityScreen(), + createController: (_) => AccessibilityController(), + ), DevToolsScreen(ProviderScreen()), DevToolsScreen( AppSizeScreen(), diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart new file mode 100644 index 00000000000..fa30251d360 --- /dev/null +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart @@ -0,0 +1,67 @@ +// Copyright 2026 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. + +import 'package:devtools_app_shared/utils.dart'; +import 'package:flutter/foundation.dart'; + +import '../../shared/framework/screen.dart'; +import '../../shared/framework/screen_controllers.dart'; + +/// Controller for the Accessibility screen. +class AccessibilityController extends DevToolsScreenController + with AutoDisposeControllerMixin { + AccessibilityController() { + _initListeners(); + } + + void _initListeners() { + brightness.addListener(_onBrightnessChanged); + textScale.addListener(_onTextScaleChanged); + boldText.addListener(_onBoldTextChanged); + screenReader.addListener(_onScreenReaderChanged); + highContrast.addListener(_onHighContrastChanged); + } + + void _onBrightnessChanged() { + // TODO(a11y): Implement VM service extension call for brightness override. + // e.g. using 'ext.flutter.brightnessOverride'. + } + + void _onTextScaleChanged() { + // TODO(a11y): Implement VM service extension call for text scale override. + } + + void _onBoldTextChanged() { + // TODO(a11y): Implement VM service extension call for bold text override. + } + + void _onScreenReaderChanged() { + // TODO(a11y): Implement VM service extension call for screen reader / semantics debugger. + // e.g. using 'ext.flutter.showSemanticsDebugger'. + } + + void _onHighContrastChanged() { + // TODO(a11y): Implement VM service extension call for high contrast override. + } + + @override + final screenId = ScreenMetaData.accessibility.id; + + // --- Accessibility Overrides State --- + final brightness = ValueNotifier('System'); + final textScale = ValueNotifier(1.0); + final boldText = ValueNotifier(false); + final screenReader = ValueNotifier(false); + final highContrast = ValueNotifier(false); + + @override + void dispose() { + brightness.dispose(); + textScale.dispose(); + boldText.dispose(); + screenReader.dispose(); + highContrast.dispose(); + super.dispose(); + } +} diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart new file mode 100644 index 00000000000..b7317560144 --- /dev/null +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart @@ -0,0 +1,118 @@ +// Copyright 2026 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. + +import 'package:devtools_app_shared/ui.dart'; +import 'package:devtools_app_shared/utils.dart'; +import 'package:flutter/material.dart'; + +import '../../shared/framework/screen.dart'; +import '../../shared/globals.dart'; +import '../../shared/ui/tab.dart'; +import 'accessibility_controller.dart'; + +/// A screen that displays accessibility information. +class AccessibilityScreen extends Screen { + AccessibilityScreen() : super.fromMetaData(ScreenMetaData.accessibility); + + static final id = ScreenMetaData.accessibility.id; + + @override + Widget buildScreenBody(BuildContext context) => + const AccessibilityScreenBody(); +} + +class AccessibilityScreenBody extends StatefulWidget { + const AccessibilityScreenBody({super.key}); + + @override + State createState() => + _AccessibilityScreenBodyState(); +} + +class _AccessibilityScreenBodyState extends State + with AutoDisposeMixin { + late AccessibilityController controller; + + @override + void initState() { + super.initState(); + controller = screenControllers.lookup(); + } + + @override + Widget build(BuildContext context) { + final splitAxis = _splitAxisFor(context); + return SplitPane( + axis: splitAxis, + initialFractions: const [0.6, 0.4], + children: [_buildMainContent(context), _buildOverridesPane(context)], + ); + } + + Widget _buildMainContent(BuildContext context) { + return AnalyticsTabbedView( + gaScreen: AccessibilityScreen.id, + tabs: [ + ( + tab: DevToolsTab.create( + tabName: 'Diagnostics', + gaPrefix: AccessibilityScreen.id, + ), + tabView: _buildDiagnosticsPane(context), + ), + ( + tab: DevToolsTab.create( + tabName: 'Semantics Tree', + gaPrefix: AccessibilityScreen.id, + ), + tabView: _buildSemanticsTreePane(context), + ), + ], + ); + } + + Axis _splitAxisFor(BuildContext context) { + final screenSize = MediaQuery.of(context).size; + return screenSize.width > 1000 ? Axis.horizontal : Axis.vertical; + } + + Widget _buildDiagnosticsPane(BuildContext context) { + return const DevToolsAreaPane( + header: AreaPaneHeader(title: Text('Accessibility Diagnostics')), + child: Center( + child: Text( + 'Accessibility diagnostics placeholder.\n' + '// TODO(a11y): Implement audit scanning and accessibility violations list.', + textAlign: TextAlign.center, + ), + ), + ); + } + + Widget _buildSemanticsTreePane(BuildContext context) { + return const DevToolsAreaPane( + header: AreaPaneHeader(title: Text('Semantics Tree')), + child: Center( + child: Text( + 'Accessibility semantics tree placeholder.\n' + '// TODO(a11y): Implement semantics tree view and details explorer.', + textAlign: TextAlign.center, + ), + ), + ); + } + + Widget _buildOverridesPane(BuildContext context) { + return const DevToolsAreaPane( + header: AreaPaneHeader(title: Text('Accessibility Overrides')), + child: Center( + child: Text( + 'Accessibility overrides placeholder.\n' + '// TODO(a11y): Implement setting overrides (brightness, text scale, bold text, screen reader, high contrast).', + textAlign: TextAlign.center, + ), + ), + ); + } +} diff --git a/packages/devtools_app/lib/src/shared/feature_flags.dart b/packages/devtools_app/lib/src/shared/feature_flags.dart index 07882781690..937c75108a6 100644 --- a/packages/devtools_app/lib/src/shared/feature_flags.dart +++ b/packages/devtools_app/lib/src/shared/feature_flags.dart @@ -69,6 +69,12 @@ extension FeatureFlags on Never { enabled: enableExperiments, ); + /// Flag to enable the Accessibility page. + static final accessibility = BooleanFeatureFlag( + name: 'accessibility', + enabled: enableExperiments, + ); + /// A set of all the boolean feature flags for debugging purposes. /// /// When adding a new boolean flag, you are responsible for adding it to this @@ -77,6 +83,7 @@ extension FeatureFlags on Never { memorySaveLoad, devToolsExtensions, dapDebugging, + accessibility, }; /// A set of all the Flutter channel feature flags for debugging purposes. diff --git a/packages/devtools_app/lib/src/shared/framework/screen.dart b/packages/devtools_app/lib/src/shared/framework/screen.dart index a2544f23377..aca77805eff 100644 --- a/packages/devtools_app/lib/src/shared/framework/screen.dart +++ b/packages/devtools_app/lib/src/shared/framework/screen.dart @@ -94,6 +94,12 @@ enum ScreenMetaData { supportsWebServerDevice: true, tutorialVideoTimestamp: '?t=558', ), + accessibility( + 'accessibility', + title: 'Accessibility', + icon: Icons.accessibility, + requiresConnection: false, + ), provider( 'provider', title: 'Provider', diff --git a/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart new file mode 100644 index 00000000000..a67178fa9fa --- /dev/null +++ b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart @@ -0,0 +1,88 @@ +// Copyright 2026 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. + +@TestOn('vm') +library; + +import 'package:devtools_app/devtools_app.dart'; +import 'package:devtools_app_shared/ui.dart'; +import 'package:devtools_app_shared/utils.dart'; +import 'package:devtools_test/devtools_test.dart'; +import 'package:devtools_test/helpers.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; + +void main() { + late AccessibilityScreen screen; + late AccessibilityController controller; + const windowSize = Size(1000.0, 1000.0); + + group('Accessibility Screen', () { + Future pumpAccessibilityScreen(WidgetTester tester) async { + await tester.pumpWidget( + wrapWithControllers( + const AccessibilityScreenBody(), + accessibility: controller, + ), + ); + } + + setUp(() { + final fakeServiceConnection = FakeServiceConnectionManager(); + when( + fakeServiceConnection.serviceManager.connectedApp!.isFlutterWebAppNow, + ).thenReturn(false); + when( + fakeServiceConnection.serviceManager.connectedApp!.isProfileBuildNow, + ).thenReturn(false); + when( + fakeServiceConnection.errorBadgeManager.errorCountNotifier( + 'accessibility', + ), + ).thenReturn(ValueNotifier(0)); + + setGlobal(NotificationService, NotificationService()); + setGlobal( + DevToolsEnvironmentParameters, + ExternalDevToolsEnvironmentParameters(), + ); + setGlobal(PreferencesController, PreferencesController()); + setGlobal(ServiceConnectionManager, fakeServiceConnection); + setGlobal(IdeTheme, IdeTheme()); + + controller = AccessibilityController(); + screen = AccessibilityScreen(); + }); + + testWidgets('builds its tab', (WidgetTester tester) async { + await tester.pumpWidget(wrap(Builder(builder: screen.buildTab))); + expect(find.text('Accessibility'), findsOneWidget); + }); + + testWidgetsWithWindowSize('builds split view with panes', windowSize, ( + WidgetTester tester, + ) async { + await pumpAccessibilityScreen(tester); + await tester.pumpAndSettle(); + + expect(find.byType(AccessibilityScreenBody), findsOneWidget); + expect(find.byType(SplitPane), findsAtLeastNWidgets(1)); + + // Overrides pane should be visible and contain placeholder text + expect(find.text('Accessibility Overrides'), findsOneWidget); + expect( + find.textContaining('Accessibility overrides placeholder.'), + findsOneWidget, + ); + + // Diagnostics tab should be active by default and contain placeholder text + expect(find.text('Accessibility Diagnostics'), findsOneWidget); + expect( + find.textContaining('Accessibility diagnostics placeholder.'), + findsOneWidget, + ); + }); + }); +} diff --git a/packages/devtools_test/lib/src/helpers/wrappers.dart b/packages/devtools_test/lib/src/helpers/wrappers.dart index 20f16ad8817..a782b26d6dc 100644 --- a/packages/devtools_test/lib/src/helpers/wrappers.dart +++ b/packages/devtools_test/lib/src/helpers/wrappers.dart @@ -96,6 +96,7 @@ Widget wrapWithControllers( ReleaseNotesController? releaseNotes, VMDeveloperToolsController? vmDeveloperTools, DTDToolsController? dtdTools, + AccessibilityController? accessibility, bool includeRouter = true, DevToolsQueryParams? queryParams, }) { @@ -173,6 +174,12 @@ Widget wrapWithControllers( offline: offline, ); } + if (accessibility != null) { + screenControllers.register( + () => accessibility, + offline: offline, + ); + } var child = wrapWithNotifications(widget); final providers = [ From b3681b23de13f1a62db75ddb60e8046554f0ba12 Mon Sep 17 00:00:00 2001 From: hangyu Date: Mon, 13 Jul 2026 13:57:50 -0700 Subject: [PATCH 2/6] Update screen.dart --- packages/devtools_app/lib/src/shared/framework/screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools_app/lib/src/shared/framework/screen.dart b/packages/devtools_app/lib/src/shared/framework/screen.dart index aca77805eff..2bfe341a5fd 100644 --- a/packages/devtools_app/lib/src/shared/framework/screen.dart +++ b/packages/devtools_app/lib/src/shared/framework/screen.dart @@ -98,7 +98,7 @@ enum ScreenMetaData { 'accessibility', title: 'Accessibility', icon: Icons.accessibility, - requiresConnection: false, + requiresFlutter: true, ), provider( 'provider', From 47565eb3166f261efcdc91c6c293209a84598eba Mon Sep 17 00:00:00 2001 From: hangyu Date: Mon, 13 Jul 2026 14:11:01 -0700 Subject: [PATCH 3/6] lint --- .../accessibility/accessibility_screen.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart index b7317560144..463fb43ef72 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart @@ -46,11 +46,11 @@ class _AccessibilityScreenBodyState extends State return SplitPane( axis: splitAxis, initialFractions: const [0.6, 0.4], - children: [_buildMainContent(context), _buildOverridesPane(context)], + children: [_buildMainContent(), _buildOverridesPane()], ); } - Widget _buildMainContent(BuildContext context) { + Widget _buildMainContent() { return AnalyticsTabbedView( gaScreen: AccessibilityScreen.id, tabs: [ @@ -59,14 +59,14 @@ class _AccessibilityScreenBodyState extends State tabName: 'Diagnostics', gaPrefix: AccessibilityScreen.id, ), - tabView: _buildDiagnosticsPane(context), + tabView: _buildDiagnosticsPane(), ), ( tab: DevToolsTab.create( tabName: 'Semantics Tree', gaPrefix: AccessibilityScreen.id, ), - tabView: _buildSemanticsTreePane(context), + tabView: _buildSemanticsTreePane(), ), ], ); @@ -77,7 +77,7 @@ class _AccessibilityScreenBodyState extends State return screenSize.width > 1000 ? Axis.horizontal : Axis.vertical; } - Widget _buildDiagnosticsPane(BuildContext context) { + Widget _buildDiagnosticsPane() { return const DevToolsAreaPane( header: AreaPaneHeader(title: Text('Accessibility Diagnostics')), child: Center( @@ -90,7 +90,7 @@ class _AccessibilityScreenBodyState extends State ); } - Widget _buildSemanticsTreePane(BuildContext context) { + Widget _buildSemanticsTreePane() { return const DevToolsAreaPane( header: AreaPaneHeader(title: Text('Semantics Tree')), child: Center( @@ -103,7 +103,7 @@ class _AccessibilityScreenBodyState extends State ); } - Widget _buildOverridesPane(BuildContext context) { + Widget _buildOverridesPane() { return const DevToolsAreaPane( header: AreaPaneHeader(title: Text('Accessibility Overrides')), child: Center( From f6895d5ab6385672fc28ed727d98fcb9386f5cf5 Mon Sep 17 00:00:00 2001 From: hangyu Date: Mon, 13 Jul 2026 14:51:06 -0700 Subject: [PATCH 4/6] resolve comments --- .../accessibility_controller.dart | 20 ++--- .../accessibility/accessibility_screen.dart | 76 ++++++++++++------- 2 files changed, 57 insertions(+), 39 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart index fa30251d360..69f6dd12e0d 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart @@ -16,33 +16,33 @@ class AccessibilityController extends DevToolsScreenController } void _initListeners() { - brightness.addListener(_onBrightnessChanged); - textScale.addListener(_onTextScaleChanged); - boldText.addListener(_onBoldTextChanged); - screenReader.addListener(_onScreenReaderChanged); - highContrast.addListener(_onHighContrastChanged); + addAutoDisposeListener(brightness, _onBrightnessChanged); + addAutoDisposeListener(textScale, _onTextScaleChanged); + addAutoDisposeListener(boldText, _onBoldTextChanged); + addAutoDisposeListener(screenReader, _onScreenReaderChanged); + addAutoDisposeListener(highContrast, _onHighContrastChanged); } void _onBrightnessChanged() { - // TODO(a11y): Implement VM service extension call for brightness override. + // TODO(hannah-hyj): Implement VM service extension call for brightness override. // e.g. using 'ext.flutter.brightnessOverride'. } void _onTextScaleChanged() { - // TODO(a11y): Implement VM service extension call for text scale override. + // TODO(hannah-hyj): Implement VM service extension call for text scale override. } void _onBoldTextChanged() { - // TODO(a11y): Implement VM service extension call for bold text override. + // TODO(hannah-hyj): Implement VM service extension call for bold text override. } void _onScreenReaderChanged() { - // TODO(a11y): Implement VM service extension call for screen reader / semantics debugger. + // TODO(hannah-hyj): Implement VM service extension call for screen reader / semantics debugger. // e.g. using 'ext.flutter.showSemanticsDebugger'. } void _onHighContrastChanged() { - // TODO(a11y): Implement VM service extension call for high contrast override. + // TODO(hannah-hyj): Implement VM service extension call for high contrast override. } @override diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart index 463fb43ef72..5402de4033b 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import '../../shared/framework/screen.dart'; import '../../shared/globals.dart'; +import '../../shared/ui/common_widgets.dart'; import '../../shared/ui/tab.dart'; import 'accessibility_controller.dart'; @@ -46,11 +47,24 @@ class _AccessibilityScreenBodyState extends State return SplitPane( axis: splitAxis, initialFractions: const [0.6, 0.4], - children: [_buildMainContent(), _buildOverridesPane()], + children: const [ + _AccessibilityMainContent(), + _AccessibilityOverridesPane(), + ], ); } - Widget _buildMainContent() { + Axis _splitAxisFor(BuildContext context) { + final screenSize = MediaQuery.of(context).size; + return screenSize.width > 1000 ? Axis.horizontal : Axis.vertical; + } +} + +class _AccessibilityMainContent extends StatelessWidget { + const _AccessibilityMainContent(); + + @override + Widget build(BuildContext context) { return AnalyticsTabbedView( gaScreen: AccessibilityScreen.id, tabs: [ @@ -59,59 +73,63 @@ class _AccessibilityScreenBodyState extends State tabName: 'Diagnostics', gaPrefix: AccessibilityScreen.id, ), - tabView: _buildDiagnosticsPane(), + tabView: const _AccessibilityDiagnosticsPane(), ), ( tab: DevToolsTab.create( tabName: 'Semantics Tree', gaPrefix: AccessibilityScreen.id, ), - tabView: _buildSemanticsTreePane(), + tabView: const _AccessibilitySemanticsTreePane(), ), ], ); } +} - Axis _splitAxisFor(BuildContext context) { - final screenSize = MediaQuery.of(context).size; - return screenSize.width > 1000 ? Axis.horizontal : Axis.vertical; - } +class _AccessibilityDiagnosticsPane extends StatelessWidget { + const _AccessibilityDiagnosticsPane(); - Widget _buildDiagnosticsPane() { + @override + Widget build(BuildContext context) { return const DevToolsAreaPane( header: AreaPaneHeader(title: Text('Accessibility Diagnostics')), - child: Center( - child: Text( - 'Accessibility diagnostics placeholder.\n' - '// TODO(a11y): Implement audit scanning and accessibility violations list.', - textAlign: TextAlign.center, - ), + child: CenteredMessage( + message: + 'Accessibility diagnostics placeholder.\n' + '// TODO(hannah-hyj): Implement audit scanning and accessibility violations list.', ), ); } +} + +class _AccessibilitySemanticsTreePane extends StatelessWidget { + const _AccessibilitySemanticsTreePane(); - Widget _buildSemanticsTreePane() { + @override + Widget build(BuildContext context) { return const DevToolsAreaPane( header: AreaPaneHeader(title: Text('Semantics Tree')), - child: Center( - child: Text( - 'Accessibility semantics tree placeholder.\n' - '// TODO(a11y): Implement semantics tree view and details explorer.', - textAlign: TextAlign.center, - ), + child: CenteredMessage( + message: + 'Accessibility semantics tree placeholder.\n' + '// TODO(hannah-hyj): Implement semantics tree view and details explorer.', ), ); } +} + +class _AccessibilityOverridesPane extends StatelessWidget { + const _AccessibilityOverridesPane(); - Widget _buildOverridesPane() { + @override + Widget build(BuildContext context) { return const DevToolsAreaPane( header: AreaPaneHeader(title: Text('Accessibility Overrides')), - child: Center( - child: Text( - 'Accessibility overrides placeholder.\n' - '// TODO(a11y): Implement setting overrides (brightness, text scale, bold text, screen reader, high contrast).', - textAlign: TextAlign.center, - ), + child: CenteredMessage( + message: + 'Accessibility overrides placeholder.\n' + '// TODO(hannah-hyj): Implement setting overrides (brightness, text scale, bold text, screen reader, high contrast).', ), ); } From 9f845659096ed7f995a288b46087fc4365f413fe Mon Sep 17 00:00:00 2001 From: hangyu Date: Mon, 13 Jul 2026 14:54:04 -0700 Subject: [PATCH 5/6] 1 --- .../accessibility/accessibility_screen.dart | 46 +------------------ .../accessibility_screen_test.dart | 6 +-- 2 files changed, 4 insertions(+), 48 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart index 5402de4033b..0053487792a 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart @@ -9,7 +9,6 @@ import 'package:flutter/material.dart'; import '../../shared/framework/screen.dart'; import '../../shared/globals.dart'; import '../../shared/ui/common_widgets.dart'; -import '../../shared/ui/tab.dart'; import 'accessibility_controller.dart'; /// A screen that displays accessibility information. @@ -48,7 +47,7 @@ class _AccessibilityScreenBodyState extends State axis: splitAxis, initialFractions: const [0.6, 0.4], children: const [ - _AccessibilityMainContent(), + _AccessibilitySemanticsTreePane(), _AccessibilityOverridesPane(), ], ); @@ -60,49 +59,6 @@ class _AccessibilityScreenBodyState extends State } } -class _AccessibilityMainContent extends StatelessWidget { - const _AccessibilityMainContent(); - - @override - Widget build(BuildContext context) { - return AnalyticsTabbedView( - gaScreen: AccessibilityScreen.id, - tabs: [ - ( - tab: DevToolsTab.create( - tabName: 'Diagnostics', - gaPrefix: AccessibilityScreen.id, - ), - tabView: const _AccessibilityDiagnosticsPane(), - ), - ( - tab: DevToolsTab.create( - tabName: 'Semantics Tree', - gaPrefix: AccessibilityScreen.id, - ), - tabView: const _AccessibilitySemanticsTreePane(), - ), - ], - ); - } -} - -class _AccessibilityDiagnosticsPane extends StatelessWidget { - const _AccessibilityDiagnosticsPane(); - - @override - Widget build(BuildContext context) { - return const DevToolsAreaPane( - header: AreaPaneHeader(title: Text('Accessibility Diagnostics')), - child: CenteredMessage( - message: - 'Accessibility diagnostics placeholder.\n' - '// TODO(hannah-hyj): Implement audit scanning and accessibility violations list.', - ), - ); - } -} - class _AccessibilitySemanticsTreePane extends StatelessWidget { const _AccessibilitySemanticsTreePane(); diff --git a/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart index a67178fa9fa..f1caff71413 100644 --- a/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart +++ b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart @@ -77,10 +77,10 @@ void main() { findsOneWidget, ); - // Diagnostics tab should be active by default and contain placeholder text - expect(find.text('Accessibility Diagnostics'), findsOneWidget); + // Semantics Tree pane should be visible and contain placeholder text + expect(find.text('Semantics Tree'), findsOneWidget); expect( - find.textContaining('Accessibility diagnostics placeholder.'), + find.textContaining('Accessibility semantics tree placeholder.'), findsOneWidget, ); }); From c0f2ec4beae809989c5a66a0cca75ee716588ddb Mon Sep 17 00:00:00 2001 From: hangyu Date: Mon, 13 Jul 2026 14:58:09 -0700 Subject: [PATCH 6/6] update tests --- .../accessibility/accessibility_screen.dart | 14 ++++++++------ .../accessibility/accessibility_screen_test.dart | 16 ++++------------ 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart index 0053487792a..6c3efd2a224 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart @@ -47,8 +47,8 @@ class _AccessibilityScreenBodyState extends State axis: splitAxis, initialFractions: const [0.6, 0.4], children: const [ - _AccessibilitySemanticsTreePane(), - _AccessibilityOverridesPane(), + AccessibilitySemanticsTreePane(), + AccessibilityOverridesPane(), ], ); } @@ -59,8 +59,9 @@ class _AccessibilityScreenBodyState extends State } } -class _AccessibilitySemanticsTreePane extends StatelessWidget { - const _AccessibilitySemanticsTreePane(); +/// A pane that displays the semantics tree of the connected app. +class AccessibilitySemanticsTreePane extends StatelessWidget { + const AccessibilitySemanticsTreePane({super.key}); @override Widget build(BuildContext context) { @@ -75,8 +76,9 @@ class _AccessibilitySemanticsTreePane extends StatelessWidget { } } -class _AccessibilityOverridesPane extends StatelessWidget { - const _AccessibilityOverridesPane(); +/// A pane that displays the accessibility overrides controls. +class AccessibilityOverridesPane extends StatelessWidget { + const AccessibilityOverridesPane({super.key}); @override Widget build(BuildContext context) { diff --git a/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart index f1caff71413..595cf4a4a7b 100644 --- a/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart +++ b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart @@ -70,19 +70,11 @@ void main() { expect(find.byType(AccessibilityScreenBody), findsOneWidget); expect(find.byType(SplitPane), findsAtLeastNWidgets(1)); - // Overrides pane should be visible and contain placeholder text - expect(find.text('Accessibility Overrides'), findsOneWidget); - expect( - find.textContaining('Accessibility overrides placeholder.'), - findsOneWidget, - ); + // Overrides pane should be visible + expect(find.byType(AccessibilityOverridesPane), findsOneWidget); - // Semantics Tree pane should be visible and contain placeholder text - expect(find.text('Semantics Tree'), findsOneWidget); - expect( - find.textContaining('Accessibility semantics tree placeholder.'), - findsOneWidget, - ); + // Semantics Tree pane should be visible + expect(find.byType(AccessibilitySemanticsTreePane), findsOneWidget); }); }); }