Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit d1b2604

Browse files
committed
FlSettingsPlugin: report accessibility features
1 parent 35b4924 commit d1b2604

File tree

4 files changed

+98
-10
lines changed

4 files changed

+98
-10
lines changed

shell/platform/linux/fl_engine.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ gboolean fl_engine_start(FlEngine* self, GError** error) {
549549
setup_locales(self);
550550

551551
g_autoptr(FlSettings) settings = fl_settings_new();
552-
self->settings_plugin = fl_settings_plugin_new(self->binary_messenger);
552+
self->settings_plugin = fl_settings_plugin_new(self);
553553
fl_settings_plugin_start(self->settings_plugin, settings);
554554

555555
result = self->embedder_api.UpdateSemanticsEnabled(self->engine, TRUE);

shell/platform/linux/fl_settings_plugin.cc

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
#include <gmodule.h>
88

9+
#include "flutter/shell/platform/embedder/embedder.h"
10+
#include "flutter/shell/platform/linux/fl_engine_private.h"
911
#include "flutter/shell/platform/linux/public/flutter_linux/fl_basic_message_channel.h"
12+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
1013
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
1114

1215
static constexpr char kChannelName[] = "flutter/settings";
@@ -20,7 +23,7 @@ struct _FlSettingsPlugin {
2023
GObject parent_instance;
2124

2225
FlBasicMessageChannel* channel;
23-
26+
FlEngine* engine;
2427
FlSettings* settings;
2528
};
2629

@@ -54,6 +57,17 @@ static void update_settings(FlSettingsPlugin* self) {
5457
fl_value_new_string(to_platform_brightness(color_scheme)));
5558
fl_basic_message_channel_send(self->channel, message, nullptr, nullptr,
5659
nullptr);
60+
61+
if (self->engine != nullptr) {
62+
int32_t flags = 0;
63+
if (!fl_settings_get_enable_animations(self->settings)) {
64+
flags |= kFlutterAccessibilityFeatureDisableAnimations;
65+
}
66+
if (fl_settings_get_high_contrast(self->settings)) {
67+
flags |= kFlutterAccessibilityFeatureHighContrast;
68+
}
69+
fl_engine_update_accessibility_features(self->engine, flags);
70+
}
5771
}
5872

5973
static void fl_settings_plugin_dispose(GObject* object) {
@@ -62,6 +76,12 @@ static void fl_settings_plugin_dispose(GObject* object) {
6276
g_clear_object(&self->channel);
6377
g_clear_object(&self->settings);
6478

79+
if (self->engine != nullptr) {
80+
g_object_remove_weak_pointer(G_OBJECT(self),
81+
reinterpret_cast<gpointer*>(&(self->engine)));
82+
self->engine = nullptr;
83+
}
84+
6585
G_OBJECT_CLASS(fl_settings_plugin_parent_class)->dispose(object);
6686
}
6787

@@ -71,12 +91,17 @@ static void fl_settings_plugin_class_init(FlSettingsPluginClass* klass) {
7191

7292
static void fl_settings_plugin_init(FlSettingsPlugin* self) {}
7393

74-
FlSettingsPlugin* fl_settings_plugin_new(FlBinaryMessenger* messenger) {
75-
g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger), nullptr);
94+
FlSettingsPlugin* fl_settings_plugin_new(FlEngine* engine) {
95+
g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr);
7696

7797
FlSettingsPlugin* self =
7898
FL_SETTINGS_PLUGIN(g_object_new(fl_settings_plugin_get_type(), nullptr));
7999

100+
self->engine = engine;
101+
g_object_add_weak_pointer(G_OBJECT(self),
102+
reinterpret_cast<gpointer*>(&(self->engine)));
103+
104+
FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
80105
g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
81106
self->channel = fl_basic_message_channel_new(messenger, kChannelName,
82107
FL_MESSAGE_CODEC(codec));

shell/platform/linux/fl_settings_plugin.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_SETTINGS_PLUGIN_H_
77

88
#include "flutter/shell/platform/linux/fl_settings.h"
9-
#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
9+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
1010

1111
G_BEGIN_DECLS
1212

@@ -25,13 +25,13 @@ G_DECLARE_FINAL_TYPE(FlSettingsPlugin,
2525

2626
/**
2727
* fl_settings_plugin_new:
28-
* @messenger: an #FlBinaryMessenger
28+
* @messenger: an #FlEngine
2929
*
3030
* Creates a new plugin that sends user settings to the Flutter engine.
3131
*
3232
* Returns: a new #FlSettingsPlugin
3333
*/
34-
FlSettingsPlugin* fl_settings_plugin_new(FlBinaryMessenger* messenger);
34+
FlSettingsPlugin* fl_settings_plugin_new(FlEngine* engine);
3535

3636
/**
3737
* fl_settings_plugin_start:

shell/platform/linux/fl_settings_plugin_test.cc

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// found in the LICENSE file.
44

55
#include "flutter/shell/platform/linux/fl_settings_plugin.h"
6+
#include "flutter/shell/platform/embedder/embedder.h"
7+
#include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
8+
#include "flutter/shell/platform/linux/fl_engine_private.h"
69
#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
710
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
811
#include "flutter/shell/platform/linux/public/flutter_linux/fl_value.h"
@@ -39,7 +42,9 @@ TEST(FlSettingsPluginTest, AlwaysUse24HourFormat) {
3942
g_autoptr(FlBinaryMessenger) messenger =
4043
fl_binary_messenger_new_mock(&mock_messenger);
4144

42-
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(messenger);
45+
g_autoptr(FlEngine) engine = FL_ENGINE(g_object_new(
46+
fl_engine_get_type(), "binary-messenger", messenger, nullptr));
47+
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(engine);
4348

4449
g_autoptr(FlValue) use_12h = fl_value_new_bool(false);
4550
g_autoptr(FlValue) use_24h = fl_value_new_bool(true);
@@ -65,7 +70,9 @@ TEST(FlSettingsPluginTest, PlatformBrightness) {
6570
g_autoptr(FlBinaryMessenger) messenger =
6671
fl_binary_messenger_new_mock(&mock_messenger);
6772

68-
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(messenger);
73+
g_autoptr(FlEngine) engine = FL_ENGINE(g_object_new(
74+
fl_engine_get_type(), "binary-messenger", messenger, nullptr));
75+
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(engine);
6976

7077
g_autoptr(FlValue) light = fl_value_new_string("light");
7178
g_autoptr(FlValue) dark = fl_value_new_string("dark");
@@ -91,7 +98,9 @@ TEST(FlSettingsPluginTest, TextScaleFactor) {
9198
g_autoptr(FlBinaryMessenger) messenger =
9299
fl_binary_messenger_new_mock(&mock_messenger);
93100

94-
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(messenger);
101+
g_autoptr(FlEngine) engine = FL_ENGINE(g_object_new(
102+
fl_engine_get_type(), "binary-messenger", messenger, nullptr));
103+
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(engine);
95104

96105
g_autoptr(FlValue) one = fl_value_new_float(1.0);
97106
g_autoptr(FlValue) two = fl_value_new_float(2.0);
@@ -109,3 +118,57 @@ TEST(FlSettingsPluginTest, TextScaleFactor) {
109118

110119
fl_settings_emit_changed(settings);
111120
}
121+
122+
// MOCK_ENGINE_PROC is leaky by design
123+
// NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
124+
TEST(FlSettingsPluginTest, AccessibilityFeatures) {
125+
g_autoptr(FlEngine) engine = make_mock_engine();
126+
FlutterEngineProcTable* embedder_api = fl_engine_get_embedder_api(engine);
127+
128+
std::vector<FlutterAccessibilityFeature> calls;
129+
embedder_api->UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
130+
UpdateAccessibilityFeatures,
131+
([&calls](auto engine, FlutterAccessibilityFeature features) {
132+
calls.push_back(features);
133+
return kSuccess;
134+
}));
135+
136+
g_autoptr(FlSettingsPlugin) plugin = fl_settings_plugin_new(engine);
137+
138+
::testing::NiceMock<flutter::testing::MockSettings> settings;
139+
140+
EXPECT_CALL(settings, fl_settings_get_enable_animations(
141+
::testing::Eq<FlSettings*>(settings)))
142+
.WillOnce(::testing::Return(false))
143+
.WillOnce(::testing::Return(true))
144+
.WillOnce(::testing::Return(false))
145+
.WillOnce(::testing::Return(true));
146+
147+
EXPECT_CALL(settings, fl_settings_get_high_contrast(
148+
::testing::Eq<FlSettings*>(settings)))
149+
.WillOnce(::testing::Return(true))
150+
.WillOnce(::testing::Return(false))
151+
.WillOnce(::testing::Return(false))
152+
.WillOnce(::testing::Return(true));
153+
154+
fl_settings_plugin_start(plugin, settings);
155+
EXPECT_THAT(calls, ::testing::SizeIs(1));
156+
EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(
157+
kFlutterAccessibilityFeatureDisableAnimations |
158+
kFlutterAccessibilityFeatureHighContrast));
159+
160+
fl_settings_emit_changed(settings);
161+
EXPECT_THAT(calls, ::testing::SizeIs(2));
162+
EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(0));
163+
164+
fl_settings_emit_changed(settings);
165+
EXPECT_THAT(calls, ::testing::SizeIs(3));
166+
EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(
167+
kFlutterAccessibilityFeatureDisableAnimations));
168+
169+
fl_settings_emit_changed(settings);
170+
EXPECT_THAT(calls, ::testing::SizeIs(4));
171+
EXPECT_EQ(calls.back(), static_cast<FlutterAccessibilityFeature>(
172+
kFlutterAccessibilityFeatureHighContrast));
173+
}
174+
// NOLINTEND(clang-analyzer-core.StackAddressEscape)

0 commit comments

Comments
 (0)