From edfa5ffb9554bb8a7618c68b60a56b8d9c483746 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Mon, 30 Mar 2026 21:07:17 +0900 Subject: [PATCH 1/3] Add gdbus callback for Aurum --- .../platform/tizen/accessibility_settings.cc | 119 ++++++++++++++++-- .../platform/tizen/accessibility_settings.h | 15 +++ 2 files changed, 121 insertions(+), 13 deletions(-) diff --git a/flutter/shell/platform/tizen/accessibility_settings.cc b/flutter/shell/platform/tizen/accessibility_settings.cc index 442c508b..6d62461a 100644 --- a/flutter/shell/platform/tizen/accessibility_settings.cc +++ b/flutter/shell/platform/tizen/accessibility_settings.cc @@ -15,23 +15,68 @@ namespace flutter { AccessibilitySettings::AccessibilitySettings(FlutterTizenEngine* engine) - : engine_(engine) { - bool tts_enabled = false; + : engine_(engine), + tts_enabled_(false), + a11y_enabled_(false), + a11y_proxy_(nullptr), + cancellable_(g_cancellable_new()) { + InitializeScreenReaderMonitoring(); + InitializeA11yMonitoring(); + UpdateSemanticsState(); + InitializeHighContrastMonitoring(); +} + +void AccessibilitySettings::InitializeScreenReaderMonitoring() { int ret = system_settings_get_value_bool( - SYSTEM_SETTINGS_KEY_ACCESSIBILITY_TTS, &tts_enabled); + SYSTEM_SETTINGS_KEY_ACCESSIBILITY_TTS, &tts_enabled_); if (ret != SYSTEM_SETTINGS_ERROR_NONE) { FT_LOG(Error) << "Failed to get value of accessibility tts."; } - if (tts_enabled) { - screen_reader_enabled_ = tts_enabled; - engine_->SetSemanticsEnabled(tts_enabled); - } system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_ACCESSIBILITY_TTS, OnScreenReaderStateChanged, this); +} + +void AccessibilitySettings::InitializeA11yMonitoring() { + GError* error = nullptr; + + a11y_proxy_ = + g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, + nullptr, // GDBusInterfaceInfo + "org.a11y.Bus", // name + "/org/a11y/bus", // object path + "org.a11y.Status", // interface + cancellable_, // GCancellable + &error); // GError + + if (error) { + FT_LOG(Error) << "Failed to create a11y proxy: " << error->message; + g_error_free(error); + return; + } + + GVariant* result = g_dbus_proxy_get_cached_property(a11y_proxy_, "IsEnabled"); + + if (error) { + FT_LOG(Error) << "Failed to get initial a11y state: " << error->message; + g_error_free(error); + } else { + a11y_enabled_ = g_variant_get_boolean(result); + g_variant_unref(result); + FT_LOG(Info) << "Initial a11y state: " + << (a11y_enabled_ ? "enabled" : "disabled"); + } + + g_signal_connect_data(a11y_proxy_, "g-properties-changed", + G_CALLBACK(OnA11yPropertiesChanged), this, nullptr, + G_CONNECT_AFTER); + + FT_LOG(Info) << "Connected to a11y status changes via GDBusProxy"; +} +void AccessibilitySettings::InitializeHighContrastMonitoring() { #ifdef TV_PROFILE int high_contrast = 0; - ret = system_settings_get_value_int( + int ret = system_settings_get_value_int( SYSTEM_SETTINGS_KEY_ACCESSIBILITY_HIGHCONTRAST, &high_contrast); if (ret != SYSTEM_SETTINGS_ERROR_NONE) { FT_LOG(Error) << "Failed to get value of accessibility high contrast."; @@ -43,8 +88,33 @@ AccessibilitySettings::AccessibilitySettings(FlutterTizenEngine* engine) #endif } +void AccessibilitySettings::UpdateSemanticsState() { + bool should_enable = tts_enabled_ || a11y_enabled_; + if (should_enable != screen_reader_enabled_) { + screen_reader_enabled_ = should_enable; + engine_->SetSemanticsEnabled(should_enable); + FT_LOG(Info) << "Semantics state updated to: " + << (should_enable ? "enabled" : "disabled") + << " (TTS: " << (tts_enabled_ ? "enabled" : "disabled") + << ", a11y: " << (a11y_enabled_ ? "enabled" : "disabled") + << ")"; + } +} + AccessibilitySettings::~AccessibilitySettings() { system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_ACCESSIBILITY_TTS); + + if (a11y_proxy_) { + g_object_unref(a11y_proxy_); + a11y_proxy_ = nullptr; + } + + if (cancellable_) { + g_cancellable_cancel(cancellable_); + g_object_unref(cancellable_); + cancellable_ = nullptr; + } + #ifdef TV_PROFILE system_settings_unset_changed_cb( SYSTEM_SETTINGS_KEY_ACCESSIBILITY_HIGHCONTRAST); @@ -74,16 +144,39 @@ void AccessibilitySettings::OnScreenReaderStateChanged( void* user_data) { auto* self = static_cast(user_data); - bool enabled = false; - int ret = system_settings_get_value_bool(key, &enabled); + bool old_tts_enabled = self->tts_enabled_; + int ret = system_settings_get_value_bool(key, &self->tts_enabled_); if (ret != SYSTEM_SETTINGS_ERROR_NONE) { FT_LOG(Error) << "Failed to get value of accessibility tts."; return; } - if (enabled != self->screen_reader_enabled_) { - self->screen_reader_enabled_ = enabled; - self->engine_->SetSemanticsEnabled(enabled); + if (old_tts_enabled != self->tts_enabled_) { + FT_LOG(Info) << "TTS state changed to: " + << (self->tts_enabled_ ? "enabled" : "disabled"); + self->UpdateSemanticsState(); + } +} + +void AccessibilitySettings::OnA11yPropertiesChanged( + GDBusProxy* proxy, + GVariant* changed_properties, + const gchar* const* invalidated_properties, + gpointer user_data) { + auto* self = static_cast(user_data); + + GVariant* is_enabled = g_variant_lookup_value(changed_properties, "IsEnabled", + G_VARIANT_TYPE_BOOLEAN); + if (is_enabled) { + bool old_a11y_enabled = self->a11y_enabled_; + self->a11y_enabled_ = g_variant_get_boolean(is_enabled); + + if (old_a11y_enabled != self->a11y_enabled_) { + FT_LOG(Info) << "a11y IsEnabled property changed to: " + << (self->a11y_enabled_ ? "true" : "false"); + self->UpdateSemanticsState(); + } + g_variant_unref(is_enabled); } } diff --git a/flutter/shell/platform/tizen/accessibility_settings.h b/flutter/shell/platform/tizen/accessibility_settings.h index f986f91f..975cd966 100644 --- a/flutter/shell/platform/tizen/accessibility_settings.h +++ b/flutter/shell/platform/tizen/accessibility_settings.h @@ -5,6 +5,7 @@ #ifndef EMBEDDER_ACCESSIBILITY_SETTINGS_H_ #define EMBEDDER_ACCESSIBILITY_SETTINGS_H_ +#include #include namespace flutter { @@ -17,13 +18,27 @@ class AccessibilitySettings { virtual ~AccessibilitySettings(); private: + void UpdateSemanticsState(); + void InitializeA11yMonitoring(); + void InitializeScreenReaderMonitoring(); + void InitializeHighContrastMonitoring(); + static void OnHighContrastStateChanged(system_settings_key_e key, void* user_data); static void OnScreenReaderStateChanged(system_settings_key_e key, void* user_data); + static void OnA11yPropertiesChanged( + GDBusProxy* proxy, + GVariant* changed_properties, + const gchar* const* invalidated_properties, + gpointer user_data); [[maybe_unused]] FlutterTizenEngine* engine_; [[maybe_unused]] bool screen_reader_enabled_ = false; + bool tts_enabled_ = false; + bool a11y_enabled_ = false; + GDBusProxy* a11y_proxy_ = nullptr; + GCancellable* cancellable_ = nullptr; }; } // namespace flutter From 704f553401e47d82687740c04afbc340eb2fcbbd Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Thu, 2 Apr 2026 11:49:03 +0900 Subject: [PATCH 2/3] Apply gemini's comments --- flutter/shell/platform/tizen/accessibility_settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/shell/platform/tizen/accessibility_settings.cc b/flutter/shell/platform/tizen/accessibility_settings.cc index 6d62461a..caed9579 100644 --- a/flutter/shell/platform/tizen/accessibility_settings.cc +++ b/flutter/shell/platform/tizen/accessibility_settings.cc @@ -173,7 +173,7 @@ void AccessibilitySettings::OnA11yPropertiesChanged( if (old_a11y_enabled != self->a11y_enabled_) { FT_LOG(Info) << "a11y IsEnabled property changed to: " - << (self->a11y_enabled_ ? "true" : "false"); + << (self->a11y_enabled_ ? "enabled" : "disabled"); self->UpdateSemanticsState(); } g_variant_unref(is_enabled); From 33a8b4d79cb95a91a05837650d6da5ce65932044 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Mon, 6 Apr 2026 19:23:22 +0900 Subject: [PATCH 3/3] Apply reviewer's comments --- .../platform/tizen/accessibility_settings.cc | 159 +++++++++--------- .../platform/tizen/accessibility_settings.h | 24 +-- 2 files changed, 91 insertions(+), 92 deletions(-) diff --git a/flutter/shell/platform/tizen/accessibility_settings.cc b/flutter/shell/platform/tizen/accessibility_settings.cc index caed9579..4258dee8 100644 --- a/flutter/shell/platform/tizen/accessibility_settings.cc +++ b/flutter/shell/platform/tizen/accessibility_settings.cc @@ -16,64 +16,67 @@ namespace flutter { AccessibilitySettings::AccessibilitySettings(FlutterTizenEngine* engine) : engine_(engine), - tts_enabled_(false), - a11y_enabled_(false), - a11y_proxy_(nullptr), + dbus_is_enabled_(false), + dbus_screen_reader_enabled_(false), + dbus_proxy_(nullptr), cancellable_(g_cancellable_new()) { - InitializeScreenReaderMonitoring(); - InitializeA11yMonitoring(); - UpdateSemanticsState(); - InitializeHighContrastMonitoring(); + ConnectToA11yBus(); + InitializeHighContrast(); } -void AccessibilitySettings::InitializeScreenReaderMonitoring() { - int ret = system_settings_get_value_bool( - SYSTEM_SETTINGS_KEY_ACCESSIBILITY_TTS, &tts_enabled_); - if (ret != SYSTEM_SETTINGS_ERROR_NONE) { - FT_LOG(Error) << "Failed to get value of accessibility tts."; - } - system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_ACCESSIBILITY_TTS, - OnScreenReaderStateChanged, this); +void AccessibilitySettings::ConnectToA11yBus() { + g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, + nullptr, // GDBusInterfaceInfo + "org.a11y.Bus", // name + "/org/a11y/bus", // object path + "org.a11y.Status", // interface + cancellable_, // GCancellable + OnDBusProxyReady, // Callback + this); // GError } -void AccessibilitySettings::InitializeA11yMonitoring() { +void AccessibilitySettings::OnDBusProxyReady(GObject* source_object, + GAsyncResult* res, + gpointer user_data) { GError* error = nullptr; + auto* self = static_cast(user_data); - a11y_proxy_ = - g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, - nullptr, // GDBusInterfaceInfo - "org.a11y.Bus", // name - "/org/a11y/bus", // object path - "org.a11y.Status", // interface - cancellable_, // GCancellable - &error); // GError - - if (error) { - FT_LOG(Error) << "Failed to create a11y proxy: " << error->message; - g_error_free(error); + self->dbus_proxy_ = g_dbus_proxy_new_for_bus_finish(res, &error); + if (!self->dbus_proxy_) { + FT_LOG(Error) << "Failed to create GDBusProxy"; + if (error) { + FT_LOG(Error) << error->message; + g_error_free(error); + } return; } + self->SetupDBusPropertyMonitoring(); +} - GVariant* result = g_dbus_proxy_get_cached_property(a11y_proxy_, "IsEnabled"); - - if (error) { - FT_LOG(Error) << "Failed to get initial a11y state: " << error->message; - g_error_free(error); - } else { - a11y_enabled_ = g_variant_get_boolean(result); - g_variant_unref(result); - FT_LOG(Info) << "Initial a11y state: " - << (a11y_enabled_ ? "enabled" : "disabled"); - } +void AccessibilitySettings::SetupDBusPropertyMonitoring() { + UpdateStateFromProxy("IsEnabled", dbus_is_enabled_); + UpdateStateFromProxy("ScreenReaderEnabled", dbus_screen_reader_enabled_); + UpdateSemanticsState(); - g_signal_connect_data(a11y_proxy_, "g-properties-changed", - G_CALLBACK(OnA11yPropertiesChanged), this, nullptr, + g_signal_connect_data(dbus_proxy_, "g-properties-changed", + G_CALLBACK(OnDBusPropertiesChanged), this, nullptr, G_CONNECT_AFTER); +} - FT_LOG(Info) << "Connected to a11y status changes via GDBusProxy"; +void AccessibilitySettings::UpdateStateFromProxy(const char* property_name, + bool& property_state) { + GVariant* result = + g_dbus_proxy_get_cached_property(dbus_proxy_, property_name); + + if (result) { + property_state = g_variant_get_boolean(result); + g_variant_unref(result); + } else { + FT_LOG(Error) << "Failed to get " << property_name << " state."; + } } -void AccessibilitySettings::InitializeHighContrastMonitoring() { +void AccessibilitySettings::InitializeHighContrast() { #ifdef TV_PROFILE int high_contrast = 0; int ret = system_settings_get_value_int( @@ -89,24 +92,24 @@ void AccessibilitySettings::InitializeHighContrastMonitoring() { } void AccessibilitySettings::UpdateSemanticsState() { - bool should_enable = tts_enabled_ || a11y_enabled_; - if (should_enable != screen_reader_enabled_) { - screen_reader_enabled_ = should_enable; + bool should_enable = dbus_screen_reader_enabled_ || dbus_is_enabled_; + if (should_enable != semantics_enabled_) { + semantics_enabled_ = should_enable; engine_->SetSemanticsEnabled(should_enable); - FT_LOG(Info) << "Semantics state updated to: " - << (should_enable ? "enabled" : "disabled") - << " (TTS: " << (tts_enabled_ ? "enabled" : "disabled") - << ", a11y: " << (a11y_enabled_ ? "enabled" : "disabled") - << ")"; + FT_LOG(Debug) << "Semantics state updated to: " + << (should_enable ? "enabled" : "disabled") << " (TTS: " + << (dbus_screen_reader_enabled_ ? "enabled" : "disabled") + << ", a11y: " << (dbus_is_enabled_ ? "enabled" : "disabled") + << ")"; } } AccessibilitySettings::~AccessibilitySettings() { system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_ACCESSIBILITY_TTS); - if (a11y_proxy_) { - g_object_unref(a11y_proxy_); - a11y_proxy_ = nullptr; + if (dbus_proxy_) { + g_object_unref(dbus_proxy_); + dbus_proxy_ = nullptr; } if (cancellable_) { @@ -139,45 +142,39 @@ void AccessibilitySettings::OnHighContrastStateChanged( #endif } -void AccessibilitySettings::OnScreenReaderStateChanged( - system_settings_key_e key, - void* user_data) { - auto* self = static_cast(user_data); - - bool old_tts_enabled = self->tts_enabled_; - int ret = system_settings_get_value_bool(key, &self->tts_enabled_); - if (ret != SYSTEM_SETTINGS_ERROR_NONE) { - FT_LOG(Error) << "Failed to get value of accessibility tts."; - return; - } - - if (old_tts_enabled != self->tts_enabled_) { - FT_LOG(Info) << "TTS state changed to: " - << (self->tts_enabled_ ? "enabled" : "disabled"); - self->UpdateSemanticsState(); - } -} - -void AccessibilitySettings::OnA11yPropertiesChanged( +void AccessibilitySettings::OnDBusPropertiesChanged( GDBusProxy* proxy, GVariant* changed_properties, const gchar* const* invalidated_properties, gpointer user_data) { auto* self = static_cast(user_data); + bool is_changed = false; GVariant* is_enabled = g_variant_lookup_value(changed_properties, "IsEnabled", G_VARIANT_TYPE_BOOLEAN); if (is_enabled) { - bool old_a11y_enabled = self->a11y_enabled_; - self->a11y_enabled_ = g_variant_get_boolean(is_enabled); - - if (old_a11y_enabled != self->a11y_enabled_) { - FT_LOG(Info) << "a11y IsEnabled property changed to: " - << (self->a11y_enabled_ ? "enabled" : "disabled"); - self->UpdateSemanticsState(); + bool old_dbus_is_enabled = self->dbus_is_enabled_; + self->dbus_is_enabled_ = g_variant_get_boolean(is_enabled); + if (old_dbus_is_enabled != self->dbus_is_enabled_) { + is_changed = true; } g_variant_unref(is_enabled); } + + GVariant* tts_enabled = g_variant_lookup_value( + changed_properties, "ScreenReaderEnabled", G_VARIANT_TYPE_BOOLEAN); + if (tts_enabled) { + bool old_dbus_screen_reader_enabled = self->dbus_screen_reader_enabled_; + self->dbus_screen_reader_enabled_ = g_variant_get_boolean(tts_enabled); + if (old_dbus_screen_reader_enabled != self->dbus_screen_reader_enabled_) { + is_changed = true; + } + g_variant_unref(tts_enabled); + } + + if (is_changed) { + self->UpdateSemanticsState(); + } } } // namespace flutter diff --git a/flutter/shell/platform/tizen/accessibility_settings.h b/flutter/shell/platform/tizen/accessibility_settings.h index 975cd966..7a208fdd 100644 --- a/flutter/shell/platform/tizen/accessibility_settings.h +++ b/flutter/shell/platform/tizen/accessibility_settings.h @@ -19,25 +19,27 @@ class AccessibilitySettings { private: void UpdateSemanticsState(); - void InitializeA11yMonitoring(); - void InitializeScreenReaderMonitoring(); - void InitializeHighContrastMonitoring(); - + void ConnectToA11yBus(); + void InitializeHighContrast(); + void SetupDBusPropertyMonitoring(); + void UpdateStateFromProxy(const char* property_name, bool& property_state); + + static void OnDBusProxyReady(GObject* source_object, + GAsyncResult* res, + gpointer user_data); static void OnHighContrastStateChanged(system_settings_key_e key, void* user_data); - static void OnScreenReaderStateChanged(system_settings_key_e key, - void* user_data); - static void OnA11yPropertiesChanged( + static void OnDBusPropertiesChanged( GDBusProxy* proxy, GVariant* changed_properties, const gchar* const* invalidated_properties, gpointer user_data); [[maybe_unused]] FlutterTizenEngine* engine_; - [[maybe_unused]] bool screen_reader_enabled_ = false; - bool tts_enabled_ = false; - bool a11y_enabled_ = false; - GDBusProxy* a11y_proxy_ = nullptr; + bool semantics_enabled_ = false; + bool dbus_is_enabled_ = false; + bool dbus_screen_reader_enabled_ = false; + GDBusProxy* dbus_proxy_ = nullptr; GCancellable* cancellable_ = nullptr; };