| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TOPAZ_RUNTIME_FLUTTER_RUNNER_SEMANTICS_BRIDGE_H_ |
| #define TOPAZ_RUNTIME_FLUTTER_RUNNER_SEMANTICS_BRIDGE_H_ |
| |
| #include <map> |
| #include <unordered_set> |
| |
| #include <fuchsia/accessibility/cpp/fidl.h> |
| #include <fuchsia/sys/cpp/fidl.h> |
| #include <fuchsia/ui/input/cpp/fidl.h> |
| |
| #include "flutter/lib/ui/semantics/semantics_node.h" |
| #include "flutter/lib/ui/window/viewport_metrics.h" |
| #include "lib/fidl/cpp/binding_set.h" |
| |
| #include "flutter/shell/common/platform_view.h" |
| |
| namespace flutter_runner { |
| |
| // Connects the Flutter PlatformView to the Fuchsia accessibility manager and |
| // provides a way to push semantic tree updates to the manager. Also provides |
| // a SemanticsProvider implementation for the manager to call SemanticActions |
| // on nodes on the screen. |
| class SemanticsBridge final : public fuchsia::accessibility::SemanticsProvider { |
| public: |
| SemanticsBridge(flutter::PlatformView* platform_view, |
| flutter::LogicalMetrics* metrics); |
| ~SemanticsBridge() = default; |
| |
| // Store the associated PlatformView's view_id and |
| // environment_service_provider to make necessary connections to |root_| and |
| // |a11y_toggle_|. |
| void SetupEnvironment( |
| uint32_t view_id, |
| fuchsia::sys::ServiceProvider* environment_service_provider); |
| |
| // Converts the updated semantics nodes in |update| to Fidl accessibility |
| // node format to send to the accessibility manager. The update is split into |
| // three manager calls, one to send updated nodes, one to send deleted node |
| // ids, and one to finalize the update. |
| void UpdateSemantics(const flutter::SemanticsNodeUpdates& update); |
| |
| private: |
| // |fuchsia::accessibility::SemanticsProvider| |
| void PerformAccessibilityAction( |
| int32_t node_id, fuchsia::accessibility::Action action) override; |
| |
| // On enabling, sets up a connection to the accessibility manager with |
| // the view id passed in from the PlatformView. In order for Flutter to |
| // start sending semantics updates, we must call SetSemanticsEnabled(true) |
| // in the associated |platform_view_|. |
| // On disabling, we disable Flutter from sending semantic updates and break |
| // the connection to the accessibility manager. |
| void OnAccessibilityToggle(bool enabled); |
| |
| fidl::Binding<fuchsia::accessibility::SemanticsProvider> binding_; |
| |
| // We keep a reference to the PlatformView's environment service provider |
| // to connect to the |fuchsia::accessibility::SemanticsRoot| service |
| // and the |fuchsia::accessibility::ToggleBroadcaster| service. |
| fuchsia::sys::ServiceProvider* environment_service_provider_; |
| fuchsia::accessibility::SemanticsRootPtr root_; |
| fuchsia::accessibility::ToggleBroadcasterPtr a11y_toggle_; |
| // We keep track of the current on/off state; |
| bool enabled_ = false; |
| |
| // The associated Scenic view id for the associated PlatformView. This id |
| // must registered with the accessibility manager, and sent with every |
| // update, delete, and commit. |
| // TODO(SCN-847): Update the view_id system to initialize connections with |
| // event pair kernel objects. |
| uint32_t view_id_; |
| // We must make sure that we have a valid view id and environment service |
| // provider before registering with the a11y manager. |
| bool environment_set_ = false; |
| // We keep a reference to the associated PlatformView to call |
| // SemanticsActions. |
| flutter::PlatformView* platform_view_; |
| // Metrics is needed to scale Scenic view space into local |
| // Flutter space when performing hit-tests. This is converted into |
| // a transform matrix that is applied to this semantic tree's root node |
| // transform matrix when sent to the manager. |
| flutter::LogicalMetrics* metrics_; |
| |
| // Disallow copy and assignment. |
| SemanticsBridge(const SemanticsBridge&) = delete; |
| SemanticsBridge& operator=(const SemanticsBridge&) = delete; |
| }; |
| |
| } // namespace flutter_runner |
| |
| #endif // TOPAZ_RUNTIME_FLUTTER_RUNNER_SEMANTICS_BRIDGE_H_ |