From 4cd46b177bf36c873d3b0ffb05c90c91b64be26e Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 5 Mar 2026 12:10:08 -0800 Subject: [PATCH 1/8] Add accessibility tab placeholder --- packages/devtools_app/lib/src/app.dart | 7 ++ .../accessibility_controller.dart | 65 ++++++++++ .../accessibility/accessibility_controls.dart | 117 ++++++++++++++++++ .../accessibility/accessibility_results.dart | 23 ++++ .../accessibility/accessibility_screen.dart | 46 +++++++ .../lib/src/shared/feature_flags.dart | 9 ++ .../lib/src/shared/framework/screen.dart | 5 + .../accessibility_screen_test.dart | 66 ++++++++++ .../lib/src/helpers/wrappers.dart | 8 ++ 9 files changed, 346 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_controls.dart create mode 100644 packages/devtools_app/lib/src/screens/accessibility/accessibility_results.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/src/app.dart b/packages/devtools_app/lib/src/app.dart index 43c72cd6b7c..620a42c4bc9 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'; @@ -731,6 +733,11 @@ List defaultScreens({ DTDToolsScreen(), createController: (_) => DTDToolsController(), ), + if (FeatureFlags.accessibility.isEnabled) + DevToolsScreen( + AccessibilityScreen(), + createController: (_) => AccessibilityController(), + ), ]; } 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..ba92a6d4d8f --- /dev/null +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart @@ -0,0 +1,65 @@ +// Copyright 2025 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 'dart:async'; + +import 'package:devtools_app_shared/utils.dart'; +import 'package:flutter/foundation.dart'; + +import '../../shared/diagnostics/diagnostics_node.dart'; +import '../../shared/framework/screen.dart'; +import '../../shared/framework/screen_controllers.dart'; + +class AccessibilityController extends DevToolsScreenController + with AutoDisposeControllerMixin { + @override + String get screenId => ScreenMetaData.accessibility.id; + + /// The root node of the semantics tree. + ValueListenable get rootNode => _rootNode; + final _rootNode = ValueNotifier(null); + + /// Whether the accessibility feature is enabled. + ValueListenable get accessibilityEnabled => _accessibilityEnabled; + final _accessibilityEnabled = ValueNotifier(false); + + ValueListenable get textScaleFactor => _textScaleFactor; + final _textScaleFactor = ValueNotifier(1.0); + + ValueListenable get highContrastEnabled => _highContrastEnabled; + final _highContrastEnabled = ValueNotifier(false); + + ValueListenable get autoAuditEnabled => _autoAuditEnabled; + final _autoAuditEnabled = ValueNotifier(false); + + Future toggleAccessibility(bool enable) async { + _accessibilityEnabled.value = enable; + if (enable) { + // TODO(kenz): enable semantics and other accessibility features. + } else { + // TODO(kenz): disable semantics and other accessibility features. + } + } + + Future setTextScaleFactor(double factor) async { + _textScaleFactor.value = factor; + // TODO(kenz): set text scale factor on device. + } + + Future toggleHighContrast(bool enable) async { + _highContrastEnabled.value = enable; + // TODO(kenz): set high contrast on device. + } + + Future toggleAutoAudit(bool enable) async { + _autoAuditEnabled.value = enable; + if (enable) { + await runAudit(); + } + } + + Future runAudit() async { + // TODO(kenz): run accessibility audit. + } +} diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart new file mode 100644 index 00000000000..9a277eb1e2d --- /dev/null +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart @@ -0,0 +1,117 @@ +import 'dart:async'; + +import 'package:devtools_app_shared/ui.dart'; +import 'package:flutter/material.dart'; + +import '../../shared/globals.dart'; +import 'accessibility_controller.dart'; + +class AccessibilityControls extends StatelessWidget { + const AccessibilityControls({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const AreaPaneHeader(title: Text('Settings & Controls')), + Expanded( + child: ListView( + padding: const EdgeInsets.all(defaultSpacing), + children: const [ + _SystemSimulationControls(), + SizedBox(height: defaultSpacing), + _AuditControls(), + ], + ), + ), + ], + ); + } +} + +class _SystemSimulationControls extends StatelessWidget { + const _SystemSimulationControls(); + + @override + Widget build(BuildContext context) { + final controller = screenControllers.lookup(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'SYSTEM SIMULATION', + style: Theme.of(context).textTheme.titleSmall, + ), + const SizedBox(height: denseSpacing), + ValueListenableBuilder( + valueListenable: controller.highContrastEnabled, + builder: (context, enabled, _) { + return SwitchListTile( + title: const Text('High Contrast Mode'), + value: enabled, + onChanged: (value) => + unawaited(controller.toggleHighContrast(value)), + ); + }, + ), + const SizedBox(height: denseSpacing), + ValueListenableBuilder( + valueListenable: controller.textScaleFactor, + builder: (context, factor, _) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Text Scale Factor: ${factor.toStringAsFixed(1)}x'), + Slider( + value: factor, + min: 0.5, + max: 3.0, + divisions: 25, + label: factor.toStringAsFixed(1), + onChanged: (value) => + unawaited(controller.setTextScaleFactor(value)), + ), + ], + ); + }, + ), + ], + ); + } +} + +class _AuditControls extends StatelessWidget { + const _AuditControls(); + + @override + Widget build(BuildContext context) { + final controller = screenControllers.lookup(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('AUDIT CONTROLS', style: Theme.of(context).textTheme.titleSmall), + const SizedBox(height: denseSpacing), + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + icon: const Icon(Icons.play_arrow), + label: const Text('Run Audit'), + onPressed: () => unawaited(controller.runAudit()), + ), + ), + const SizedBox(height: denseSpacing), + ValueListenableBuilder( + valueListenable: controller.autoAuditEnabled, + builder: (context, enabled, _) { + return SwitchListTile( + title: const Text('Auto-run Audit'), + value: enabled, + onChanged: (value) => + unawaited(controller.toggleAutoAudit(value)), + ); + }, + ), + ], + ); + } +} diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_results.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_results.dart new file mode 100644 index 00000000000..3e527bb388d --- /dev/null +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_results.dart @@ -0,0 +1,23 @@ +import 'package:devtools_app_shared/ui.dart'; +import 'package:flutter/material.dart'; + +class AccessibilityResults extends StatelessWidget { + const AccessibilityResults({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const AreaPaneHeader(title: Text('Audit Results')), + Expanded( + child: ListView.builder( + itemCount: 0, + itemBuilder: (context, index) { + return const ListTile(title: Text('Violation Placeholder')); + }, + ), + ), + ], + ); + } +} 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..ceb1066b0f1 --- /dev/null +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart @@ -0,0 +1,46 @@ +import 'package:devtools_app_shared/ui.dart'; +import 'package:flutter/material.dart'; + +import '../../shared/framework/screen.dart'; +import '../../shared/globals.dart'; +import 'accessibility_controller.dart'; +import 'accessibility_controls.dart'; +import 'accessibility_results.dart'; + +class AccessibilityScreen extends Screen { + AccessibilityScreen() : super.fromMetaData(ScreenMetaData.accessibility); + + static final id = ScreenMetaData.accessibility.id; + + @override + Widget buildScreenBody(BuildContext context) { + return const AccessibilityScreenBody(); + } +} + +class AccessibilityScreenBody extends StatefulWidget { + const AccessibilityScreenBody({super.key}); + + @override + State createState() => + _AccessibilityScreenBodyState(); +} + +class _AccessibilityScreenBodyState extends State { + late final AccessibilityController controller; + + @override + void initState() { + super.initState(); + controller = screenControllers.lookup(); + } + + @override + Widget build(BuildContext context) { + return SplitPane( + axis: Axis.horizontal, + initialFractions: const [0.3, 0.7], + children: const [AccessibilityControls(), AccessibilityResults()], + ); + } +} diff --git a/packages/devtools_app/lib/src/shared/feature_flags.dart b/packages/devtools_app/lib/src/shared/feature_flags.dart index 88a8b248878..9cb2e46d3ab 100644 --- a/packages/devtools_app/lib/src/shared/feature_flags.dart +++ b/packages/devtools_app/lib/src/shared/feature_flags.dart @@ -93,6 +93,14 @@ extension FeatureFlags on Never { enabled: enableExperiments, ); + /// Flag to enable the Accessibility screen. + /// + /// https://github.com/flutter/devtools/issues/9044 + static final accessibility = BooleanFeatureFlag( + name: 'accessibility', + enabled: true, + ); + /// 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 @@ -104,6 +112,7 @@ extension FeatureFlags on Never { dapDebugging, inspectorV2, aiAssistant, + 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 0cdc840653a..d28a02730d7 100644 --- a/packages/devtools_app/lib/src/shared/framework/screen.dart +++ b/packages/devtools_app/lib/src/shared/framework/screen.dart @@ -129,6 +129,11 @@ enum ScreenMetaData { requiresAdvancedDeveloperMode: true, requiresConnection: false, ), + accessibility( + 'accessibility', + title: 'Accessibility', + icon: Icons.accessibility_new_rounded, + ), simple('simple'); const ScreenMetaData( 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..8950d2ed50b --- /dev/null +++ b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart @@ -0,0 +1,66 @@ +import 'package:devtools_app/src/app.dart'; +import 'package:devtools_app/src/screens/accessibility/accessibility_screen.dart'; +import 'package:devtools_app/src/service/service_manager.dart'; +import 'package:devtools_app/src/shared/feature_flags.dart'; +import 'package:devtools_app/src/shared/framework/screen.dart'; +import 'package:devtools_app/src/shared/globals.dart'; +import 'package:devtools_app/src/shared/managers/banner_messages.dart'; +import 'package:devtools_app/src/shared/managers/notifications.dart'; +import 'package:devtools_app/src/shared/offline/offline_data.dart'; +import 'package:devtools_app/src/shared/preferences/preferences.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'; + +void main() { + const screen = ScreenMetaData.accessibility; + + group('AccessibilityScreen', () { + late FakeServiceConnectionManager fakeServiceConnection; + + setUp(() { + fakeServiceConnection = FakeServiceConnectionManager(); + setGlobal(ServiceConnectionManager, fakeServiceConnection); + setGlobal(IdeTheme, IdeTheme()); + setGlobal(OfflineDataController, OfflineDataController()); + setGlobal(NotificationService, NotificationService()); + setGlobal(BannerMessagesController, BannerMessagesController()); + setGlobal(PreferencesController, PreferencesController()); + FeatureFlags.accessibility.setEnabledForTests(true); + }); + + tearDown(() { + FeatureFlags.accessibility.setEnabledForTests(false); + }); + + testWidgets('builds its body', (WidgetTester tester) async { + await tester.pumpWidget( + wrap( + Builder(builder: (context) => AccessibilityScreen().build(context)), + ), + ); + expect(find.byType(AccessibilityScreenBody), findsOneWidget); + expect(find.text('Accessibility Screen Placeholder'), findsOneWidget); + }); + + test('is included in defaultScreens when enabled', () { + devtoolsScreens = null; + expect( + defaultScreens().any((s) => s.screen is AccessibilityScreen), + isTrue, + ); + }); + + test('is invalid in defaultScreens when disabled', () { + FeatureFlags.accessibility.setEnabledForTests(false); + devtoolsScreens = null; + expect( + defaultScreens().any((s) => s.screen is AccessibilityScreen), + isFalse, + ); + }); + }); +} diff --git a/packages/devtools_test/lib/src/helpers/wrappers.dart b/packages/devtools_test/lib/src/helpers/wrappers.dart index 20f16ad8817..0f7b5a45069 100644 --- a/packages/devtools_test/lib/src/helpers/wrappers.dart +++ b/packages/devtools_test/lib/src/helpers/wrappers.dart @@ -8,6 +8,7 @@ library; import 'package:devtools_app/devtools_app.dart'; +import 'package:devtools_app/src/screens/accessibility/accessibility_controller.dart'; import 'package:devtools_app/src/shared/primitives/query_parameters.dart'; import 'package:devtools_app_shared/ui.dart'; import 'package:devtools_app_shared/utils.dart'; @@ -96,6 +97,7 @@ Widget wrapWithControllers( ReleaseNotesController? releaseNotes, VMDeveloperToolsController? vmDeveloperTools, DTDToolsController? dtdTools, + AccessibilityController? accessibility, bool includeRouter = true, DevToolsQueryParams? queryParams, }) { @@ -173,6 +175,12 @@ Widget wrapWithControllers( offline: offline, ); } + if (accessibility != null) { + screenControllers.register( + () => accessibility, + offline: offline, + ); + } var child = wrapWithNotifications(widget); final providers = [ From 086e0cae4845e1061e833658d78f332cc9063928 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 5 Mar 2026 13:10:04 -0800 Subject: [PATCH 2/8] update --- .../accessibility_controller.dart | 24 ++++--------------- .../accessibility_screen_test.dart | 19 ++++++++++----- 2 files changed, 17 insertions(+), 26 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 ba92a6d4d8f..76833664555 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:devtools_app_shared/utils.dart'; import 'package:flutter/foundation.dart'; -import '../../shared/diagnostics/diagnostics_node.dart'; import '../../shared/framework/screen.dart'; import '../../shared/framework/screen_controllers.dart'; @@ -16,10 +15,6 @@ class AccessibilityController extends DevToolsScreenController @override String get screenId => ScreenMetaData.accessibility.id; - /// The root node of the semantics tree. - ValueListenable get rootNode => _rootNode; - final _rootNode = ValueNotifier(null); - /// Whether the accessibility feature is enabled. ValueListenable get accessibilityEnabled => _accessibilityEnabled; final _accessibilityEnabled = ValueNotifier(false); @@ -33,33 +28,22 @@ class AccessibilityController extends DevToolsScreenController ValueListenable get autoAuditEnabled => _autoAuditEnabled; final _autoAuditEnabled = ValueNotifier(false); - Future toggleAccessibility(bool enable) async { - _accessibilityEnabled.value = enable; - if (enable) { - // TODO(kenz): enable semantics and other accessibility features. - } else { - // TODO(kenz): disable semantics and other accessibility features. - } - } - Future setTextScaleFactor(double factor) async { _textScaleFactor.value = factor; - // TODO(kenz): set text scale factor on device. + // TODO(chunhtai): set text scale factor on device. } Future toggleHighContrast(bool enable) async { _highContrastEnabled.value = enable; - // TODO(kenz): set high contrast on device. + // TODO(chunhtai): set high contrast on device. } Future toggleAutoAudit(bool enable) async { _autoAuditEnabled.value = enable; - if (enable) { - await runAudit(); - } + // TODO(chunhtai): auto run audit when enabled. } Future runAudit() async { - // TODO(kenz): run accessibility audit. + // TODO(chunhtai): run accessibility audit. } } 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 8950d2ed50b..f388bdfd76a 100644 --- a/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart +++ b/packages/devtools_app/test/screens/accessibility/accessibility_screen_test.dart @@ -1,9 +1,14 @@ +// Copyright 2024 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/src/app.dart'; +import 'package:devtools_app/src/screens/accessibility/accessibility_controller.dart'; +import 'package:devtools_app/src/screens/accessibility/accessibility_controls.dart'; +import 'package:devtools_app/src/screens/accessibility/accessibility_results.dart'; import 'package:devtools_app/src/screens/accessibility/accessibility_screen.dart'; import 'package:devtools_app/src/service/service_manager.dart'; import 'package:devtools_app/src/shared/feature_flags.dart'; -import 'package:devtools_app/src/shared/framework/screen.dart'; -import 'package:devtools_app/src/shared/globals.dart'; import 'package:devtools_app/src/shared/managers/banner_messages.dart'; import 'package:devtools_app/src/shared/managers/notifications.dart'; import 'package:devtools_app/src/shared/offline/offline_data.dart'; @@ -16,10 +21,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - const screen = ScreenMetaData.accessibility; - group('AccessibilityScreen', () { late FakeServiceConnectionManager fakeServiceConnection; + late AccessibilityController controller; setUp(() { fakeServiceConnection = FakeServiceConnectionManager(); @@ -30,6 +34,7 @@ void main() { setGlobal(BannerMessagesController, BannerMessagesController()); setGlobal(PreferencesController, PreferencesController()); FeatureFlags.accessibility.setEnabledForTests(true); + controller = AccessibilityController(); }); tearDown(() { @@ -38,12 +43,14 @@ void main() { testWidgets('builds its body', (WidgetTester tester) async { await tester.pumpWidget( - wrap( + wrapWithControllers( Builder(builder: (context) => AccessibilityScreen().build(context)), + accessibility: controller, ), ); expect(find.byType(AccessibilityScreenBody), findsOneWidget); - expect(find.text('Accessibility Screen Placeholder'), findsOneWidget); + expect(find.byType(AccessibilityControls), findsOneWidget); + expect(find.byType(AccessibilityResults), findsOneWidget); }); test('is included in defaultScreens when enabled', () { From 2d6a0681dfeb823364f67e20b76bc936db14bc42 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 5 Mar 2026 15:37:37 -0800 Subject: [PATCH 3/8] update --- .../src/screens/accessibility/accessibility_controller.dart | 1 - .../lib/src/screens/accessibility/accessibility_controls.dart | 4 ++++ .../lib/src/screens/accessibility/accessibility_results.dart | 4 ++++ .../lib/src/screens/accessibility/accessibility_screen.dart | 4 ++++ packages/devtools_app/lib/src/shared/feature_flags.dart | 2 +- 5 files changed, 13 insertions(+), 2 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 76833664555..b3a217b2365 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart @@ -15,7 +15,6 @@ class AccessibilityController extends DevToolsScreenController @override String get screenId => ScreenMetaData.accessibility.id; - /// Whether the accessibility feature is enabled. ValueListenable get accessibilityEnabled => _accessibilityEnabled; final _accessibilityEnabled = ValueNotifier(false); diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart index 9a277eb1e2d..ec92512f6c7 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart @@ -1,3 +1,7 @@ +// Copyright 2025 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 'dart:async'; import 'package:devtools_app_shared/ui.dart'; diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_results.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_results.dart index 3e527bb388d..5a2a7b649cb 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_results.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_results.dart @@ -1,3 +1,7 @@ +// Copyright 2025 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:flutter/material.dart'; 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 ceb1066b0f1..8b09d44eac2 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_screen.dart @@ -1,3 +1,7 @@ +// Copyright 2025 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:flutter/material.dart'; diff --git a/packages/devtools_app/lib/src/shared/feature_flags.dart b/packages/devtools_app/lib/src/shared/feature_flags.dart index 9cb2e46d3ab..858accf38f2 100644 --- a/packages/devtools_app/lib/src/shared/feature_flags.dart +++ b/packages/devtools_app/lib/src/shared/feature_flags.dart @@ -98,7 +98,7 @@ extension FeatureFlags on Never { /// https://github.com/flutter/devtools/issues/9044 static final accessibility = BooleanFeatureFlag( name: 'accessibility', - enabled: true, + enabled: enableExperiments, ); /// A set of all the boolean feature flags for debugging purposes. From 032eb86c5402482d22e2d9373c6050be25f71db7 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 5 Mar 2026 15:44:37 -0800 Subject: [PATCH 4/8] update --- packages/devtools_app/lib/src/shared/feature_flags.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools_app/lib/src/shared/feature_flags.dart b/packages/devtools_app/lib/src/shared/feature_flags.dart index 858accf38f2..1050e0d206e 100644 --- a/packages/devtools_app/lib/src/shared/feature_flags.dart +++ b/packages/devtools_app/lib/src/shared/feature_flags.dart @@ -95,7 +95,7 @@ extension FeatureFlags on Never { /// Flag to enable the Accessibility screen. /// - /// https://github.com/flutter/devtools/issues/9044 + /// https://github.com/flutter/devtools/issues/9687 static final accessibility = BooleanFeatureFlag( name: 'accessibility', enabled: enableExperiments, From c58d36a507f82637c1734fd98532675ae0327f68 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Fri, 6 Mar 2026 09:36:47 -0800 Subject: [PATCH 5/8] update --- .../accessibility/accessibility_controller.dart | 8 ++++---- .../screens/accessibility/accessibility_controls.dart | 11 ++++------- 2 files changed, 8 insertions(+), 11 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 b3a217b2365..74fbd3d8772 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart @@ -27,22 +27,22 @@ class AccessibilityController extends DevToolsScreenController ValueListenable get autoAuditEnabled => _autoAuditEnabled; final _autoAuditEnabled = ValueNotifier(false); - Future setTextScaleFactor(double factor) async { + void setTextScaleFactor(double factor) { _textScaleFactor.value = factor; // TODO(chunhtai): set text scale factor on device. } - Future toggleHighContrast(bool enable) async { + void toggleHighContrast(bool enable) { _highContrastEnabled.value = enable; // TODO(chunhtai): set high contrast on device. } - Future toggleAutoAudit(bool enable) async { + void toggleAutoAudit(bool enable) { _autoAuditEnabled.value = enable; // TODO(chunhtai): auto run audit when enabled. } - Future runAudit() async { + void runAudit() { // TODO(chunhtai): run accessibility audit. } } diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart index ec92512f6c7..a95d2ecf37a 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart @@ -53,8 +53,7 @@ class _SystemSimulationControls extends StatelessWidget { return SwitchListTile( title: const Text('High Contrast Mode'), value: enabled, - onChanged: (value) => - unawaited(controller.toggleHighContrast(value)), + onChanged: (value) => controller.toggleHighContrast(value), ); }, ), @@ -72,8 +71,7 @@ class _SystemSimulationControls extends StatelessWidget { max: 3.0, divisions: 25, label: factor.toStringAsFixed(1), - onChanged: (value) => - unawaited(controller.setTextScaleFactor(value)), + onChanged: (value) => controller.setTextScaleFactor(value), ), ], ); @@ -100,7 +98,7 @@ class _AuditControls extends StatelessWidget { child: ElevatedButton.icon( icon: const Icon(Icons.play_arrow), label: const Text('Run Audit'), - onPressed: () => unawaited(controller.runAudit()), + onPressed: () => controller.runAudit(), ), ), const SizedBox(height: denseSpacing), @@ -110,8 +108,7 @@ class _AuditControls extends StatelessWidget { return SwitchListTile( title: const Text('Auto-run Audit'), value: enabled, - onChanged: (value) => - unawaited(controller.toggleAutoAudit(value)), + onChanged: (value) => controller.toggleAutoAudit(value), ); }, ), From c48ef060e90c38fdaf8c9cabe4d2bcc1d260015d Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Fri, 6 Mar 2026 09:38:40 -0800 Subject: [PATCH 6/8] update --- packages/devtools_app/benchmark/web_bundle_size_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools_app/benchmark/web_bundle_size_test.dart b/packages/devtools_app/benchmark/web_bundle_size_test.dart index 1e17beb7506..d1635d89911 100644 --- a/packages/devtools_app/benchmark/web_bundle_size_test.dart +++ b/packages/devtools_app/benchmark/web_bundle_size_test.dart @@ -11,7 +11,7 @@ import 'package:path/path.dart' as path; import 'package:test/test.dart'; // Benchmark size in kB. -const bundleSizeBenchmark = 5550; +const bundleSizeBenchmark = 5560; const gzipBundleSizeBenchmark = 1650; void main() { From fe12fa4233b3f2c42395971fef5af5769bac49d8 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Fri, 6 Mar 2026 10:05:24 -0800 Subject: [PATCH 7/8] update --- .../lib/src/screens/accessibility/accessibility_controller.dart | 2 -- 1 file changed, 2 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 74fbd3d8772..c067e4e6ef8 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controller.dart @@ -2,8 +2,6 @@ // 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 'dart:async'; - import 'package:devtools_app_shared/utils.dart'; import 'package:flutter/foundation.dart'; From 8500ba710c1eb8baa9c9eafb18af14216da27065 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Fri, 6 Mar 2026 12:01:23 -0800 Subject: [PATCH 8/8] lint --- .../lib/src/screens/accessibility/accessibility_controls.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart index a95d2ecf37a..3d23cdc9b39 100644 --- a/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart +++ b/packages/devtools_app/lib/src/screens/accessibility/accessibility_controls.dart @@ -2,8 +2,6 @@ // 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 'dart:async'; - import 'package:devtools_app_shared/ui.dart'; import 'package:flutter/material.dart';