From aaa02adfbad7c2959403a0ec7728bcc5ff4face8 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 11 May 2020 15:46:16 +1200 Subject: [PATCH] Add FlAccessibilityChannel --- ci/licenses_golden/licenses_flutter | 2 + shell/platform/linux/BUILD.gn | 1 + .../linux/fl_accessibility_channel.cc | 81 +++++++++++++++++++ .../platform/linux/fl_accessibility_channel.h | 38 +++++++++ shell/platform/linux/fl_view.cc | 4 + 5 files changed, 126 insertions(+) create mode 100644 shell/platform/linux/fl_accessibility_channel.cc create mode 100644 shell/platform/linux/fl_accessibility_channel.h diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index be2534491f587..48b4acf91bdee 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1189,6 +1189,8 @@ FILE: ../../../flutter/shell/platform/glfw/platform_handler.h FILE: ../../../flutter/shell/platform/glfw/public/flutter_glfw.h FILE: ../../../flutter/shell/platform/glfw/text_input_plugin.cc FILE: ../../../flutter/shell/platform/glfw/text_input_plugin.h +FILE: ../../../flutter/shell/platform/linux/fl_accessibility_channel.cc +FILE: ../../../flutter/shell/platform/linux/fl_accessibility_channel.h FILE: ../../../flutter/shell/platform/linux/fl_basic_message_channel.cc FILE: ../../../flutter/shell/platform/linux/fl_binary_codec.cc FILE: ../../../flutter/shell/platform/linux/fl_binary_codec_test.cc diff --git a/shell/platform/linux/BUILD.gn b/shell/platform/linux/BUILD.gn index d425088023dee..3707d35e1cc5e 100644 --- a/shell/platform/linux/BUILD.gn +++ b/shell/platform/linux/BUILD.gn @@ -74,6 +74,7 @@ source_set("flutter_linux") { public = _public_headers sources = [ + "fl_accessibility_channel.cc", "fl_basic_message_channel.cc", "fl_binary_codec.cc", "fl_binary_messenger.cc", diff --git a/shell/platform/linux/fl_accessibility_channel.cc b/shell/platform/linux/fl_accessibility_channel.cc new file mode 100644 index 0000000000000..a492bfe70edfb --- /dev/null +++ b/shell/platform/linux/fl_accessibility_channel.cc @@ -0,0 +1,81 @@ +// 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. + +#include "flutter/shell/platform/linux/fl_accessibility_channel.h" +#include "flutter/shell/platform/linux/public/flutter_linux/fl_basic_message_channel.h" +#include "flutter/shell/platform/linux/public/flutter_linux/fl_standard_message_codec.h" + +struct _FlAccessibilityChannel { + GObject parent_instance; + + FlBasicMessageChannel* channel; +}; + +G_DEFINE_TYPE(FlAccessibilityChannel, fl_accessibility_channel, G_TYPE_OBJECT) + +// Called when a message is received on this channel +static void message_cb(FlBasicMessageChannel* channel, + FlValue* message, + FlBasicMessageChannelResponseHandle* response_handle, + gpointer user_data) { + if (fl_value_get_type(message) != FL_VALUE_TYPE_MAP) { + g_warning("Ignoring unknown flutter/accessibility message type"); + fl_basic_message_channel_respond(channel, response_handle, nullptr, + nullptr); + return; + } + + FlValue* type_value = fl_value_lookup_string(message, "type"); + if (type_value == nullptr || + fl_value_get_type(type_value) != FL_VALUE_TYPE_STRING) { + g_warning( + "Ignoring unknown flutter/accessibility message with unknown type"); + fl_basic_message_channel_respond(channel, response_handle, nullptr, + nullptr); + return; + } + const gchar* type = fl_value_get_string(type_value); + + if (strcmp(type, "tooltip") == 0) { + g_debug("Got tooltip"); + // FIXME: Make a callback + fl_basic_message_channel_respond(channel, response_handle, nullptr, + nullptr); + } else { + g_debug("Got unknown accessibility message: %s", type); + fl_basic_message_channel_respond(channel, response_handle, nullptr, + nullptr); + } +} + +static void fl_accessibility_channel_dispose(GObject* object) { + FlAccessibilityChannel* self = FL_ACCESSIBILITY_CHANNEL(object); + + g_clear_object(&self->channel); + + G_OBJECT_CLASS(fl_accessibility_channel_parent_class)->dispose(object); +} + +static void fl_accessibility_channel_class_init( + FlAccessibilityChannelClass* klass) { + G_OBJECT_CLASS(klass)->dispose = fl_accessibility_channel_dispose; +} + +static void fl_accessibility_channel_init(FlAccessibilityChannel* self) {} + +FlAccessibilityChannel* fl_accessibility_channel_new( + FlBinaryMessenger* messenger) { + g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger), nullptr); + + FlAccessibilityChannel* self = FL_ACCESSIBILITY_CHANNEL( + g_object_new(fl_accessibility_channel_get_type(), nullptr)); + + g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new(); + self->channel = fl_basic_message_channel_new( + messenger, "flutter/accessibility", FL_MESSAGE_CODEC(codec)); + fl_basic_message_channel_set_message_handler(self->channel, message_cb, self, + nullptr); + + return self; +} diff --git a/shell/platform/linux/fl_accessibility_channel.h b/shell/platform/linux/fl_accessibility_channel.h new file mode 100644 index 0000000000000..e33a5bc4f2c71 --- /dev/null +++ b/shell/platform/linux/fl_accessibility_channel.h @@ -0,0 +1,38 @@ +// 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. + +#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_ACCESSIBILITY_CHANNEL_H_ +#define FLUTTER_SHELL_PLATFORM_LINUX_FL_ACCESSIBILITY_CHANNEL_H_ + +#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h" + +G_BEGIN_DECLS + +G_DECLARE_FINAL_TYPE(FlAccessibilityChannel, + fl_accessibility_channel, + FL, + ACCESSIBILITY_CHANNEL, + GObject); + +/** + * FlAccessibilityChannel: + * + * #FlAccessibilityChannel is a platform channel that implements the shell side + * of SystemChannels.accessibility from the Flutter services library. + */ + +/** + * fl_accessibility_channel_new: + * @messenger: an #FlBinaryMessenger + * + * Creates a new accessibility channel. + * + * Returns: a new #FlAccessibilityChannel + */ +FlAccessibilityChannel* fl_accessibility_channel_new( + FlBinaryMessenger* messenger); + +G_END_DECLS + +#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_ACCESSIBILITY_CHANNEL_H_ diff --git a/shell/platform/linux/fl_view.cc b/shell/platform/linux/fl_view.cc index b3d3bb61290e1..56bf8fd9790d3 100644 --- a/shell/platform/linux/fl_view.cc +++ b/shell/platform/linux/fl_view.cc @@ -4,6 +4,7 @@ #include "flutter/shell/platform/linux/public/flutter_linux/fl_view.h" +#include "flutter/shell/platform/linux/fl_accessibility_channel.h" #include "flutter/shell/platform/linux/fl_engine_private.h" #include "flutter/shell/platform/linux/fl_key_event_plugin.h" #include "flutter/shell/platform/linux/fl_plugin_registrar_private.h" @@ -31,6 +32,7 @@ struct _FlView { int64_t button_state; // Flutter system channel handlers. + FlAccessibilityChannel* accessibility_channel; FlKeyEventPlugin* key_event_plugin; }; @@ -113,6 +115,7 @@ static void fl_view_constructed(GObject* object) { // Create system channel handlers FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(self->engine); + self->accessibility_channel = fl_accessibility_channel_new(messenger); self->key_event_plugin = fl_key_event_plugin_new(messenger); } @@ -155,6 +158,7 @@ static void fl_view_dispose(GObject* object) { g_clear_object(&self->project); g_clear_object(&self->renderer); g_clear_object(&self->engine); + g_clear_object(&self->accessibility_channel); g_clear_object(&self->key_event_plugin); G_OBJECT_CLASS(fl_view_parent_class)->dispose(object);