Use shared_ptr for Accessible object 86/312786/5
authorYoungsun Suh <youngsun.suh@samsung.com>
Fri, 14 Jun 2024 07:01:44 +0000 (16:01 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Thu, 20 Jun 2024 00:56:30 +0000 (09:56 +0900)
Change-Id: I83e50c800587fa413d235d15952cbf2dec8bdfe7

dali-toolkit/devel-api/controls/control-devel.cpp
dali-toolkit/internal/controls/buttons/check-box-button-impl.cpp
dali-toolkit/internal/controls/buttons/push-button-impl.cpp
dali-toolkit/internal/controls/buttons/radio-button-impl.cpp
dali-toolkit/internal/controls/buttons/toggle-button-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.h
dali-toolkit/internal/controls/popup/popup-impl.cpp
dali-toolkit/public-api/controls/control-impl.cpp
dali-toolkit/public-api/controls/control-impl.h

index 1de25f4..93c3d71 100644 (file)
@@ -256,7 +256,7 @@ Dali::Accessibility::ReadingInfoTypes GetAccessibilityReadingInfoType(Toolkit::C
 
 bool ClearAccessibilityHighlight(Toolkit::Control control)
 {
-  auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
+  auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
   if(DALI_LIKELY(controlAccessible))
   {
     return controlAccessible->ClearHighlight();
@@ -266,7 +266,7 @@ bool ClearAccessibilityHighlight(Toolkit::Control control)
 
 bool GrabAccessibilityHighlight(Toolkit::Control control)
 {
-  auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
+  auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
   if(DALI_LIKELY(controlAccessible))
   {
     return controlAccessible->GrabHighlight();
@@ -276,7 +276,7 @@ bool GrabAccessibilityHighlight(Toolkit::Control control)
 
 Dali::Accessibility::States GetAccessibilityStates(Toolkit::Control control)
 {
-  auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
+  auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
   if(DALI_LIKELY(controlAccessible))
   {
     return controlAccessible->GetStates();
@@ -286,7 +286,7 @@ Dali::Accessibility::States GetAccessibilityStates(Toolkit::Control control)
 
 void NotifyAccessibilityStateChange(Toolkit::Control control, Dali::Accessibility::States states, bool recurse)
 {
-  auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
+  auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
   if(DALI_LIKELY(controlAccessible))
   {
     controlAccessible->NotifyAccessibilityStateChange(std::move(states), recurse);
index b000325..a778371 100644 (file)
@@ -101,7 +101,7 @@ void CheckBoxButton::OnStateChange(State newState)
   // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
   if(newState == SELECTED_STATE || newState == UNSELECTED_STATE)
   {
-    auto* accessible = GetAccessibleObject();
+    auto accessible = GetAccessibleObject();
     if(DALI_LIKELY(accessible) && accessible->IsHighlighted())
     {
       accessible->EmitStateChanged(Dali::Accessibility::State::CHECKED, newState == SELECTED_STATE ? 1 : 0, 0);
index 70e7261..4e26fad 100644 (file)
@@ -209,7 +209,7 @@ void PushButton::OnStateChange(State newState)
   // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
   if(newState == SELECTED_STATE || newState == UNSELECTED_STATE)
   {
-    auto* accessible = GetAccessibleObject();
+    auto accessible = GetAccessibleObject();
     if(DALI_LIKELY(accessible) && accessible->IsHighlighted())
     {
       accessible->EmitStateChanged(Dali::Accessibility::State::PRESSED, newState == SELECTED_STATE ? 1 : 0, 0);
index d352f2b..3241ea0 100644 (file)
@@ -109,7 +109,7 @@ void RadioButton::OnStateChange(State newState)
   // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
   if(newState == SELECTED_STATE || newState == UNSELECTED_STATE)
   {
-    auto* accessible = GetAccessibleObject();
+    auto accessible = GetAccessibleObject();
     if(DALI_LIKELY(accessible) && accessible->IsHighlighted())
     {
       accessible->EmitStateChanged(Dali::Accessibility::State::CHECKED, newState == SELECTED_STATE ? 1 : 0, 0);
index 5dd9b87..d292b0e 100644 (file)
@@ -414,7 +414,7 @@ void ToggleButton::OnStateChange(State newState)
   // TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
   if(newState == SELECTED_STATE || newState == UNSELECTED_STATE)
   {
-    auto* accessible = GetAccessibleObject();
+    auto accessible = GetAccessibleObject();
     if(DALI_LIKELY(accessible) && accessible->IsHighlighted())
     {
       accessible->EmitStateChanged(Dali::Accessibility::State::CHECKED, mCurrentToggleIndex ? 1 : 0, 0);
index a67cd34..efb0dee 100644 (file)
@@ -497,19 +497,6 @@ static bool IsShowingGeometryOnScreen(Dali::Rect<> rect)
   return rect.width > 0 && rect.height > 0;
 }
 
-Dali::Accessibility::Accessible* ExternalAccessibleGetter(Dali::Actor actor)
-{
-  auto control = Toolkit::Control::DownCast(actor);
-  if(!control)
-  {
-    return nullptr;
-  }
-
-  auto& controlImpl = Toolkit::Internal::GetImplementation(control);
-
-  return controlImpl.GetAccessibleObject();
-}
-
 } // unnamed namespace
 
 // clang-format off
@@ -580,7 +567,17 @@ Control::Impl::Impl(Control& controlImpl)
   mDispatchKeyEvents(true),
   mProcessorRegistered(false)
 {
-  Dali::Accessibility::Accessible::RegisterExternalAccessibleGetter(&ExternalAccessibleGetter);
+  Accessibility::Accessible::RegisterExternalAccessibleGetter([](Dali::Actor actor) -> std::shared_ptr<Accessibility::Accessible> {
+    auto control = Toolkit::Control::DownCast(actor);
+    if(!control)
+    {
+      return nullptr;
+    }
+
+    auto& controlImpl = Toolkit::Internal::GetImplementation(control);
+
+    return controlImpl.GetAccessibleObject();
+  });
 }
 
 Control::Impl::~Impl()
@@ -632,7 +629,7 @@ void Control::Impl::CheckHighlightedObjectGeometry()
   {
     auto lastPosition   = accessible->GetLastPosition();
     auto accessibleRect = accessible->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
-    auto rect           = GetShowingGeometry(accessibleRect, accessible);
+    auto rect           = GetShowingGeometry(accessibleRect, accessible.get());
 
     switch(mAccessibilityLastScreenRelativeMoveType)
     {
@@ -728,7 +725,7 @@ void Control::Impl::UnregisterAccessibilityPropertySetSignal()
 
 void Control::Impl::OnAccessibilityPropertySet(Dali::Handle& handle, Dali::Property::Index index, const Dali::Property::Value& value)
 {
-  auto* accessible = GetAccessibleObject();
+  auto accessible = GetAccessibleObject();
   if(DALI_LIKELY(accessible))
   {
     if(mAccessibilityGetNameSignal.Empty())
@@ -1530,7 +1527,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         {
           controlImpl.mImpl->mAccessibilityHidden = hidden;
 
-          auto* accessible = controlImpl.GetAccessibleObject();
+          auto accessible = controlImpl.GetAccessibleObject();
           if(DALI_LIKELY(accessible))
           {
             auto* parent = dynamic_cast<Dali::Accessibility::ActorAccessible*>(accessible->GetParent());
@@ -2293,14 +2290,14 @@ bool Control::Impl::OnIdleCallback()
   return mIdleCallbackRegistered;
 }
 
-Toolkit::DevelControl::ControlAccessible* Control::Impl::GetAccessibleObject()
+std::shared_ptr<Toolkit::DevelControl::ControlAccessible> Control::Impl::GetAccessibleObject()
 {
   if(mAccessibleCreatable && !mAccessibleObject)
   {
     mAccessibleObject.reset(mControlImpl.CreateAccessibleObject());
   }
 
-  return mAccessibleObject.get();
+  return mAccessibleObject;
 }
 
 bool Control::Impl::IsAccessibleCreated() const
index fff6769..6320864 100644 (file)
@@ -456,7 +456,7 @@ public:
   /**
    * @copydoc Dali::Toolkit::Internal::Control::GetAccessibleObject()
    */
-  Toolkit::DevelControl::ControlAccessible* GetAccessibleObject();
+  std::shared_ptr<Toolkit::DevelControl::ControlAccessible> GetAccessibleObject();
 
   /**
    * @copydoc Dali::Toolkit::DevelControl::IsAccessibleCreated()
@@ -636,7 +636,7 @@ public:
   Dali::Accessibility::Role mAccessibilityRole = Dali::Accessibility::Role::UNKNOWN;
 
   std::map<Dali::Accessibility::RelationType, std::set<Accessibility::Accessible*>> mAccessibilityRelations;
-  std::unique_ptr<Toolkit::DevelControl::ControlAccessible>                         mAccessibleObject;
+  std::shared_ptr<Toolkit::DevelControl::ControlAccessible>                         mAccessibleObject;
 
   // Gesture Detection
   PinchGestureDetector     mPinchGestureDetector;
index 9c9a1f2..3195965 100644 (file)
@@ -729,7 +729,7 @@ void Popup::SetDisplayState(Toolkit::Popup::DisplayState displayState)
 
   // Convert the bool state to the actual display state to use.
   mDisplayState    = display ? Toolkit::Popup::SHOWING : Toolkit::Popup::HIDING;
-  auto* accessible = Dali::Accessibility::Accessible::Get(Self());
+  auto accessible = Dali::Accessibility::Accessible::GetOwningPtr(Self());
 
   if(display)
   {
index a1f1828..e435710 100644 (file)
@@ -199,7 +199,7 @@ void Control::SetResourceReady()
   controlDataImpl.ResourceReady();
 }
 
-Toolkit::DevelControl::ControlAccessible* Control::GetAccessibleObject()
+std::shared_ptr<Toolkit::DevelControl::ControlAccessible> Control::GetAccessibleObject()
 {
   return mImpl->GetAccessibleObject();
 }
@@ -525,7 +525,7 @@ void Control::EmitKeyInputFocusSignal(bool focusGained)
       auto parent = accessible->GetParent();
       if(parent && !accessible->GetStates()[Dali::Accessibility::State::MANAGES_DESCENDANTS])
       {
-        parent->EmitActiveDescendantChanged(accessible);
+        parent->EmitActiveDescendantChanged(accessible.get());
       }
     }
   }
@@ -608,7 +608,7 @@ void Control::OnPropertySet(Property::Index index, const Property::Value& proper
     }
     case Actor::Property::VISIBLE:
     {
-      auto* accessible = GetAccessibleObject();
+      auto accessible = GetAccessibleObject();
       if(DALI_LIKELY(accessible) && accessible->IsHighlighted())
       {
         accessible->EmitVisible(Self().GetProperty<bool>(Actor::Property::VISIBLE));
index 4fe0781..76991aa 100644 (file)
@@ -140,7 +140,7 @@ public:
    *
    * @see CreateAccessibleObject()
    */
-  Toolkit::DevelControl::ControlAccessible* GetAccessibleObject();
+  std::shared_ptr<Toolkit::DevelControl::ControlAccessible> GetAccessibleObject();
 
   // Gesture Detection