| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:typed_data'; |
| import 'dart:ui'; |
| |
| import 'package:vector_math/vector_math_64.dart'; |
| |
| import 'scenario.dart'; |
| |
| /// Sends the received locale data back as semantics information. |
| class LocaleInitialization extends Scenario { |
| /// Constructor |
| LocaleInitialization(super.view); |
| |
| int _tapCount = 0; |
| |
| /// Start off by sending the supported locales list via semantics. |
| @override |
| void onBeginFrame(Duration duration) { |
| // Doesn't matter what we draw. Just paint white. |
| final SceneBuilder builder = SceneBuilder(); |
| final PictureRecorder recorder = PictureRecorder(); |
| final Canvas canvas = Canvas(recorder); |
| |
| canvas.drawRect( |
| Rect.fromLTWH(0, 0, view.physicalSize.width, view.physicalSize.height), |
| Paint()..color = const Color.fromARGB(255, 255, 255, 255), |
| ); |
| final Picture picture = recorder.endRecording(); |
| |
| builder.addPicture( |
| Offset.zero, |
| picture, |
| ); |
| final Scene scene = builder.build(); |
| view.render(scene); |
| scene.dispose(); |
| |
| // On the first frame, pretend that it drew a text field. Send the |
| // corresponding semantics tree comprised of 1 node with the locale data |
| // as the label. |
| final SemanticsUpdateBuilder semanticsUpdateBuilder = |
| SemanticsUpdateBuilder()..updateNode( |
| id: 0, |
| // SemanticsFlag.isTextField. |
| flags: 16, |
| // SemanticsAction.tap. |
| actions: 1, |
| rect: const Rect.fromLTRB(0.0, 0.0, 414.0, 48.0), |
| label: view.platformDispatcher.locales.toString(), |
| labelAttributes: <StringAttribute>[], |
| textDirection: TextDirection.ltr, |
| textSelectionBase: -1, |
| textSelectionExtent: -1, |
| platformViewId: -1, |
| maxValueLength: -1, |
| currentValueLength: 0, |
| scrollChildren: 0, |
| scrollIndex: 0, |
| scrollPosition: 0.0, |
| scrollExtentMax: 0.0, |
| scrollExtentMin: 0.0, |
| transform: Matrix4.identity().storage, |
| elevation: 0.0, |
| thickness: 0.0, |
| hint: '', |
| hintAttributes: <StringAttribute>[], |
| value: '', |
| valueAttributes: <StringAttribute>[], |
| increasedValue: '', |
| increasedValueAttributes: <StringAttribute>[], |
| decreasedValue: '', |
| decreasedValueAttributes: <StringAttribute>[], |
| tooltip: '', |
| childrenInTraversalOrder: Int32List(0), |
| childrenInHitTestOrder: Int32List(0), |
| additionalActions: Int32List(0), |
| ); |
| |
| final SemanticsUpdate semanticsUpdate = semanticsUpdateBuilder.build(); |
| |
| view.updateSemantics(semanticsUpdate); |
| } |
| |
| /// Handle taps. |
| /// |
| /// Send changing information via semantics on each successive tap. |
| @override |
| void onPointerDataPacket(PointerDataPacket packet) { |
| String label = ''; |
| switch(_tapCount) { |
| case 1: { |
| // Set label to string data we wish to pass on first frame. |
| label = '1'; |
| break; |
| } |
| // Expand for other test cases. |
| } |
| |
| final SemanticsUpdateBuilder semanticsUpdateBuilder = |
| SemanticsUpdateBuilder()..updateNode( |
| id: 0, |
| // SemanticsFlag.isTextField. |
| flags: 16, |
| // SemanticsAction.tap. |
| actions: 1, |
| rect: const Rect.fromLTRB(0.0, 0.0, 414.0, 48.0), |
| label: label, |
| labelAttributes: <StringAttribute>[], |
| textDirection: TextDirection.ltr, |
| textSelectionBase: 0, |
| textSelectionExtent: 0, |
| platformViewId: -1, |
| maxValueLength: -1, |
| currentValueLength: 0, |
| scrollChildren: 0, |
| scrollIndex: 0, |
| scrollPosition: 0.0, |
| scrollExtentMax: 0.0, |
| scrollExtentMin: 0.0, |
| transform: Matrix4.identity().storage, |
| elevation: 0.0, |
| thickness: 0.0, |
| hint: '', |
| hintAttributes: <StringAttribute>[], |
| value: '', |
| valueAttributes: <StringAttribute>[], |
| increasedValue: '', |
| increasedValueAttributes: <StringAttribute>[], |
| decreasedValue: '', |
| decreasedValueAttributes: <StringAttribute>[], |
| tooltip: '', |
| childrenInTraversalOrder: Int32List(0), |
| childrenInHitTestOrder: Int32List(0), |
| additionalActions: Int32List(0), |
| ); |
| |
| final SemanticsUpdate semanticsUpdate = semanticsUpdateBuilder.build(); |
| |
| view.updateSemantics(semanticsUpdate); |
| |
| _tapCount++; |
| } |
| } |