mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Adds a mechanism for announce events to be forwarded to a11y. (flutter/engine#23499)
This commit is contained in:
parent
74c7cac41a
commit
0cc337ef5b
@ -111,6 +111,7 @@ template("runner_sources") {
|
||||
"//flutter/lib/ui",
|
||||
"//flutter/runtime",
|
||||
"//flutter/shell/common",
|
||||
"//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
|
||||
]
|
||||
flutter_deps = [
|
||||
":fuchsia_gpu_configuration",
|
||||
|
||||
@ -431,6 +431,15 @@ fuchsia::accessibility::semantics::Node AccessibilityBridge::GetRootNodeUpdate(
|
||||
return root_fuchsia_node;
|
||||
}
|
||||
|
||||
void AccessibilityBridge::RequestAnnounce(const std::string message) {
|
||||
fuchsia::accessibility::semantics::SemanticEvent semantic_event;
|
||||
fuchsia::accessibility::semantics::AnnounceEvent announce_event;
|
||||
announce_event.set_message(message);
|
||||
semantic_event.set_announce(std::move(announce_event));
|
||||
|
||||
tree_ptr_->SendSemanticEvent(std::move(semantic_event), []() {});
|
||||
}
|
||||
|
||||
void AccessibilityBridge::UpdateScreenRects() {
|
||||
std::unordered_set<int32_t> visited_nodes;
|
||||
UpdateScreenRects(kRootNodeId, SkM44{}, &visited_nodes);
|
||||
|
||||
@ -85,6 +85,9 @@ class AccessibilityBridge
|
||||
void AddSemanticsNodeUpdate(const flutter::SemanticsNodeUpdates update,
|
||||
float view_pixel_ratio);
|
||||
|
||||
// Requests a message announcement from the accessibility TTS system.
|
||||
void RequestAnnounce(const std::string message);
|
||||
|
||||
// Notifies the bridge of a 'hover move' touch exploration event.
|
||||
zx_status_t OnHoverMove(double x, double y);
|
||||
|
||||
|
||||
@ -103,6 +103,16 @@ TEST_F(AccessibilityBridgeTest, EnableDisable) {
|
||||
EXPECT_TRUE(accessibility_delegate_.enabled());
|
||||
}
|
||||
|
||||
TEST_F(AccessibilityBridgeTest, RequestAnnounce) {
|
||||
accessibility_bridge_->RequestAnnounce("message");
|
||||
RunLoopUntilIdle();
|
||||
|
||||
auto& last_events = semantics_manager_.GetLastEvents();
|
||||
ASSERT_EQ(last_events.size(), 1u);
|
||||
ASSERT_TRUE(last_events[0].is_announce());
|
||||
EXPECT_EQ(last_events[0].announce().message(), "message");
|
||||
}
|
||||
|
||||
TEST_F(AccessibilityBridgeTest, UpdatesNodeRoles) {
|
||||
flutter::SemanticsNodeUpdates updates;
|
||||
|
||||
|
||||
@ -90,6 +90,18 @@ class MockSemanticsManager
|
||||
commit_count_++;
|
||||
}
|
||||
|
||||
void SendSemanticEvent(
|
||||
fuchsia::accessibility::semantics::SemanticEvent semantic_event,
|
||||
SendSemanticEventCallback callback) override {
|
||||
last_events_.emplace_back(std::move(semantic_event));
|
||||
callback();
|
||||
}
|
||||
|
||||
std::vector<fuchsia::accessibility::semantics::SemanticEvent>&
|
||||
GetLastEvents() {
|
||||
return last_events_;
|
||||
}
|
||||
|
||||
private:
|
||||
bool has_view_ref_ = false;
|
||||
fidl::BindingSet<SemanticsManager> bindings_;
|
||||
@ -102,6 +114,7 @@ class MockSemanticsManager
|
||||
bool delete_overflowed_;
|
||||
std::vector<uint32_t> last_deleted_node_ids_;
|
||||
int commit_count_;
|
||||
std::vector<fuchsia::accessibility::semantics::SemanticEvent> last_events_;
|
||||
};
|
||||
|
||||
} // namespace flutter_runner_test
|
||||
|
||||
@ -15,6 +15,8 @@
|
||||
#include "flutter/fml/logging.h"
|
||||
#include "flutter/lib/ui/window/pointer_data.h"
|
||||
#include "flutter/lib/ui/window/window.h"
|
||||
#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/encodable_value.h"
|
||||
#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/standard_message_codec.h"
|
||||
#include "third_party/rapidjson/include/rapidjson/document.h"
|
||||
#include "third_party/rapidjson/include/rapidjson/stringbuffer.h"
|
||||
#include "third_party/rapidjson/include/rapidjson/writer.h"
|
||||
@ -658,6 +660,25 @@ void PlatformView::UpdateSemantics(
|
||||
void PlatformView::HandleAccessibilityChannelPlatformMessage(
|
||||
fml::RefPtr<flutter::PlatformMessage> message) {
|
||||
FML_DCHECK(message->channel() == kAccessibilityChannel);
|
||||
|
||||
const flutter::StandardMessageCodec& standard_message_codec =
|
||||
flutter::StandardMessageCodec::GetInstance(nullptr);
|
||||
std::unique_ptr<flutter::EncodableValue> decoded =
|
||||
standard_message_codec.DecodeMessage(message->data());
|
||||
|
||||
flutter::EncodableMap map = std::get<flutter::EncodableMap>(*decoded);
|
||||
std::string type =
|
||||
std::get<std::string>(map.at(flutter::EncodableValue("type")));
|
||||
if (type == "announce") {
|
||||
flutter::EncodableMap data_map = std::get<flutter::EncodableMap>(
|
||||
map.at(flutter::EncodableValue("data")));
|
||||
std::string text =
|
||||
std::get<std::string>(data_map.at(flutter::EncodableValue("message")));
|
||||
|
||||
accessibility_bridge_->RequestAnnounce(text);
|
||||
}
|
||||
|
||||
message->response()->CompleteEmpty();
|
||||
}
|
||||
|
||||
// Channel handler for kFlutterPlatformChannel
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user