From f3e3fe4ef108677e995b978c102047089ab7e593 Mon Sep 17 00:00:00 2001 From: Youngsun Suh Date: Fri, 30 Aug 2024 11:24:45 +0900 Subject: [PATCH] Update the bridge to own accessible objects Change-Id: I6a4311ed6d94f73af885e7963fa08d9f21aa4044 --- .../adaptor-framework/accessibility-bridge.h | 15 +++++ .../adaptor-framework/accessibility.cpp | 66 ++++++++++--------- dali/devel-api/atspi-interfaces/accessible.h | 9 +-- .../accessibility/bridge/bridge-impl.cpp | 17 +++++ .../accessibility/bridge/dummy/dummy-atspi.h | 9 +++ .../adaptor/common/application-impl.cpp | 1 - 6 files changed, 76 insertions(+), 41 deletions(-) diff --git a/dali/devel-api/adaptor-framework/accessibility-bridge.h b/dali/devel-api/adaptor-framework/accessibility-bridge.h index a47f6b234..156108aee 100644 --- a/dali/devel-api/adaptor-framework/accessibility-bridge.h +++ b/dali/devel-api/adaptor-framework/accessibility-bridge.h @@ -62,6 +62,21 @@ struct DALI_ADAPTOR_API Bridge */ virtual ~Bridge() = default; + /** + * @brief Adds the accessible object associated with given actorId to the brige. + */ + virtual void AddAccessible(uint32_t actorId, std::shared_ptr accessible) = 0; + + /** + * @brief Removed the accessible object associated with given actorId from the brige. + */ + virtual void RemoveAccessible(uint32_t actorId) = 0; + + /** + * @brief Gets the accessible object associated with given actorId from the brige. + */ + virtual std::shared_ptr GetAccessible(uint32_t actorId) const = 0; + /** * @brief Gets bus name which bridge is initialized on. * diff --git a/dali/devel-api/adaptor-framework/accessibility.cpp b/dali/devel-api/adaptor-framework/accessibility.cpp index 6caf3d86b..19a0c72ea 100644 --- a/dali/devel-api/adaptor-framework/accessibility.cpp +++ b/dali/devel-api/adaptor-framework/accessibility.cpp @@ -352,6 +352,12 @@ class AdaptorAccessible : public ActorAccessible private: std::unique_ptr mRenderNotification = nullptr; + void OffSceneCallback(Actor actor) + { + uint32_t actorId = actor.GetProperty(Actor::Property::ID); + Bridge::GetCurrentBridge()->RemoveAccessible(actorId); + } + protected: bool mRoot = false; @@ -360,6 +366,7 @@ public: : ActorAccessible(actor), mRoot(isRoot) { + actor.OffSceneSignal().Connect(this, &AdaptorAccessible::OffSceneCallback); } bool GrabFocus() override @@ -526,31 +533,15 @@ public: } }; // AdaptorAccessible -using AdaptorAccessiblesType = std::unordered_map>; +using ConvertingResult = std::pair, bool>; -// Save RefObject from an Actor in Accessible::Get() -AdaptorAccessiblesType& GetAdaptorAccessibles() -{ - static AdaptorAccessiblesType gAdaptorAccessibles; - return gAdaptorAccessibles; -} - -std::function(Dali::Actor)> convertingFunctor = [](Dali::Actor) -> std::shared_ptr { - return nullptr; +std::function convertingFunctor = [](Dali::Actor) -> ConvertingResult { + return {nullptr, true}; }; -ObjectRegistry objectRegistry; } // namespace -void Accessible::SetObjectRegistry(ObjectRegistry registry) -{ - objectRegistry = registry; - objectRegistry.ObjectDestroyedSignal().Connect([](const Dali::RefObject* obj) { - GetAdaptorAccessibles().erase(obj); - }); -} - -void Accessible::RegisterExternalAccessibleGetter(std::function(Dali::Actor)> functor) +void Accessible::RegisterExternalAccessibleGetter(std::function functor) { convertingFunctor = functor; } @@ -562,21 +553,32 @@ std::shared_ptr Accessible::GetOwningPtr(Dali::Actor actor) return nullptr; } - auto accessible = convertingFunctor(actor); - if(!accessible) + auto bridge = Bridge::GetCurrentBridge(); + + uint32_t actorId = actor.GetProperty(Actor::Property::ID); + auto accessible = bridge->GetAccessible(actorId); + if(accessible) { - auto pair = GetAdaptorAccessibles().emplace(&actor.GetBaseObject(), nullptr); - if(pair.second) + return accessible; + } + + auto result = convertingFunctor(actor); + accessible = result.first; + const bool creationEnabled = result.second; + if(!accessible && creationEnabled) + { + bool isRoot = false; + Dali::Integration::Scene scene = Dali::Integration::Scene::Get(actor); + if(scene) { - bool isRoot = false; - Dali::Integration::Scene scene = Dali::Integration::Scene::Get(actor); - if(scene) - { - isRoot = (actor == scene.GetRootLayer()); - } - pair.first->second.reset(new AdaptorAccessible(actor, isRoot)); + isRoot = (actor == scene.GetRootLayer()); } - accessible = pair.first->second; + accessible = std::make_shared(actor, isRoot); + } + + if(accessible) + { + bridge->AddAccessible(actorId, accessible); } return accessible; diff --git a/dali/devel-api/atspi-interfaces/accessible.h b/dali/devel-api/atspi-interfaces/accessible.h index b163ea25b..3ff4dcdb4 100644 --- a/dali/devel-api/atspi-interfaces/accessible.h +++ b/dali/devel-api/atspi-interfaces/accessible.h @@ -456,18 +456,11 @@ public: */ static void SetCurrentlyHighlightedActor(Dali::Actor actor); - /** - * @brief Sets ObjectRegistry. - * - * @param[in] registry ObjectRegistry instance - */ - static void SetObjectRegistry(ObjectRegistry registry); - /** * @brief The method registers functor resposible for converting Actor into Accessible. * @param functor The returning Accessible handle from Actor object */ - static void RegisterExternalAccessibleGetter(std::function(Dali::Actor)> functor); + static void RegisterExternalAccessibleGetter(std::function, bool>(Dali::Actor)> functor); /** * @brief Acquires Accessible object from Actor object. diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index 6e18a472e..698afac16 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -90,10 +90,27 @@ class BridgeImpl : public virtual BridgeBase, Dali::Timer mReadScreenReaderEnabledTimer; Dali::Timer mForceUpTimer; std::string mPreferredBusName; + std::map> mAccessibles; // Actor.ID to Accessible map public: BridgeImpl() = default; + void AddAccessible(uint32_t actorId, std::shared_ptr accessible) override + { + mAccessibles[actorId] = std::move(accessible); + } + + void RemoveAccessible(uint32_t actorId) override + { + mAccessibles.erase(actorId); + } + + std::shared_ptr GetAccessible(uint32_t actorId) const override + { + auto iter = mAccessibles.find(actorId); + return iter != mAccessibles.end() ? iter->second : nullptr; + } + /** * @copydoc Dali::Accessibility::Bridge::EmitKeyEvent() */ diff --git a/dali/internal/accessibility/bridge/dummy/dummy-atspi.h b/dali/internal/accessibility/bridge/dummy/dummy-atspi.h index 8353a4d4b..063d4dc11 100644 --- a/dali/internal/accessibility/bridge/dummy/dummy-atspi.h +++ b/dali/internal/accessibility/bridge/dummy/dummy-atspi.h @@ -237,6 +237,15 @@ struct DummyBridge : Dali::Accessibility::Bridge void SetPreferredBusName(std::string_view preferredBusName) override { } + + void AddAccessible(uint32_t actorId, std::shared_ptr accessible) override{}; + + void RemoveAccessible(uint32_t actorId) override{}; + + std::shared_ptr GetAccessible(uint32_t actorId) const override + { + return nullptr; + }; }; } // namespace Dali::Accessibility diff --git a/dali/internal/adaptor/common/application-impl.cpp b/dali/internal/adaptor/common/application-impl.cpp index 519e6a457..41c8f646e 100644 --- a/dali/internal/adaptor/common/application-impl.cpp +++ b/dali/internal/adaptor/common/application-impl.cpp @@ -387,7 +387,6 @@ void Application::OnInit() DALI_TRACE_BEGIN(gTraceFilter, "DALI_APP_ADAPTOR_START"); mAdaptor->Start(); DALI_TRACE_END(gTraceFilter, "DALI_APP_ADAPTOR_START"); - Accessibility::Accessible::SetObjectRegistry(mAdaptor->GetObjectRegistry()); if(!mStylesheet.empty()) { -- 2.34.1