Update the bridge to own accessible objects 78/316878/2
authorYoungsun Suh <youngsun.suh@samsung.com>
Fri, 30 Aug 2024 02:25:35 +0000 (11:25 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Fri, 30 Aug 2024 05:44:21 +0000 (14:44 +0900)
Change-Id: I01c195f7acac2f3cb9ab060aa58435465a2d102f

automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Controls-BridgeUp.cpp
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-test-application.cpp
dali-toolkit/internal/controls/control/control-data-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.h

index 6822a3d9f8b58c527717217d845063b637a65275..b703dcfe06690df84ed3526d89809ae2f6d880e2 100644 (file)
@@ -1933,5 +1933,85 @@ int UtcDaliEmitAccessibilityStateChanged(void)
   DALI_TEST_CHECK(Dali::Accessibility::TestStateChangedResult("showing", 1));
   DALI_TEST_CHECK(Accessibility::Bridge::GetCurrentBridge()->GetDefaultLabel(rootAccessible) != buttonAccessible);
 
+  Dali::Accessibility::TestEnableSC(false);
+
+  END_TEST;
+}
+
+int UtcDaliGetAcessibleTestWithSceneConnection(void)
+{
+  ToolkitTestApplication application;
+
+  Dali::Accessibility::TestEnableSC(true);
+
+  auto layer = Layer::New();
+
+  auto container = Control::New();
+  container.SetProperty(Actor::Property::SIZE, Vector2(300, 300));
+  container.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::CONTAINER);
+  layer.Add(container);
+
+  auto button = Control::New();
+  button.SetProperty(Actor::Property::SIZE, Vector2(20, 20));
+  button.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::BUTTON);
+  container.Add(button);
+
+  application.GetScene().Add(layer);
+  Wait(application);
+
+  auto layerAccessible_1     = Accessibility::Accessible::Get(layer);     // AdaptorAccessible
+  auto containerAccessible_1 = Accessibility::Accessible::Get(container); // ControlAccessible
+  auto buttonAccessible_1    = Accessibility::Accessible::Get(button);    // ControlAccessible
+  DALI_TEST_CHECK(layerAccessible_1);
+  DALI_TEST_CHECK(containerAccessible_1);
+  DALI_TEST_CHECK(buttonAccessible_1);
+
+  // Test Getting already added accessible from the map
+  auto layerAccessible_1_1     = Accessibility::Accessible::Get(layer);
+  auto containerAccessible_1_1 = Accessibility::Accessible::Get(container);
+  auto buttonAccessible_1_1    = Accessibility::Accessible::Get(button);
+  DALI_TEST_CHECK(layerAccessible_1_1 == layerAccessible_1);
+  DALI_TEST_CHECK(containerAccessible_1_1 == containerAccessible_1);
+  DALI_TEST_CHECK(buttonAccessible_1_1 == buttonAccessible_1);
+
+  // Test ControlAccessible Removal on SceneDisconnection and recreation on next Get
+  {
+    layer.Remove(container);
+    Wait(application);
+
+    // Create dummy to make sure new accessible is create in new memory position
+    auto dummy           = Control::New();
+    auto dummyAccessible = Accessibility::Accessible::Get(dummy);
+    DALI_TEST_CHECK(dummyAccessible);
+
+    auto layerAccessible_2     = Accessibility::Accessible::Get(layer);
+    auto containerAccessible_2 = Accessibility::Accessible::Get(container);
+    auto buttonAccessible_2    = Accessibility::Accessible::Get(button);
+
+    DALI_TEST_CHECK(containerAccessible_2);
+    DALI_TEST_CHECK(buttonAccessible_2);
+
+    DALI_TEST_CHECK(layerAccessible_2 == layerAccessible_1); // layer accessible unchanged
+    DALI_TEST_CHECK(containerAccessible_2 != containerAccessible_1);
+    DALI_TEST_CHECK(buttonAccessible_2 != buttonAccessible_1);
+  }
+
+  // Test AdaptorAccessibleRemoval on SceneDisconnection and reacreation on next Get
+  {
+    application.GetScene().Remove(layer);
+    Wait(application);
+
+    // Create dummy to make sure new accessible is create in new memory position
+    auto dummy           = Control::New();
+    auto dummyAccessible = Accessibility::Accessible::Get(dummy);
+    DALI_TEST_CHECK(dummyAccessible);
+
+    auto layerAccessible_3 = Accessibility::Accessible::Get(layer);
+    DALI_TEST_CHECK(layerAccessible_3);
+    DALI_TEST_CHECK(layerAccessible_3 != layerAccessible_1);
+  }
+
+  Dali::Accessibility::TestEnableSC(false);
+
   END_TEST;
 }
index ce66dae3358b27517b4f0b5483bc57b6b1b7cf52..48091cd4d1a6e5d1c9078effa9c45b5504596625 100644 (file)
@@ -54,7 +54,6 @@ ToolkitTestApplication::ToolkitTestApplication(size_t surfaceWidth, size_t surfa
 
   // Core needs to be initialized next before we start the adaptor
   InitializeCore();
-  Accessibility::Accessible::SetObjectRegistry(mCore->GetObjectRegistry());
 
   // This will also emit the window created signals
   AdaptorImpl::GetImpl(*mAdaptor).Start(mMainWindow);
index 985ed9d55777334196d6aaecde443923c3449dc1..e2faac4b27654ccc8d40e209b8923e3df554ef49 100644 (file)
@@ -643,16 +643,20 @@ Control::Impl::Impl(Control& controlImpl)
   mDispatchKeyEvents(true),
   mProcessorRegistered(false)
 {
-  Accessibility::Accessible::RegisterExternalAccessibleGetter([](Dali::Actor actor) -> std::shared_ptr<Accessibility::Accessible> {
+  Accessibility::Accessible::RegisterExternalAccessibleGetter([](Dali::Actor actor) -> std::pair<std::shared_ptr<Accessibility::Accessible>, bool> {
     auto control = Toolkit::Control::DownCast(actor);
     if(!control)
     {
-      return nullptr;
+      return {nullptr, true};
     }
 
     auto& controlImpl = Toolkit::Internal::GetImplementation(control);
+    if(controlImpl.mImpl->IsCreateAccessibleEnabled())
+    {
+      return {std::shared_ptr<DevelControl::ControlAccessible>(controlImpl.CreateAccessibleObject()), true};
+    }
 
-    return controlImpl.GetAccessibleObject();
+    return {nullptr, false};
   });
   mAccessibilityProps.states[DevelControl::AccessibilityState::ENABLED] = true;
 }
@@ -2251,6 +2255,9 @@ void Control::Impl::OnSceneDisconnection()
   {
     (*replacedIter)->pending = false;
   }
+
+  uint32_t actorId = self.GetProperty<int>(Actor::Property::ID);
+  Accessibility::Bridge::GetCurrentBridge()->RemoveAccessible(actorId);
 }
 
 void Control::Impl::SetMargin(Extents margin)
@@ -2442,17 +2449,13 @@ bool Control::Impl::OnIdleCallback()
 
 std::shared_ptr<Toolkit::DevelControl::ControlAccessible> Control::Impl::GetAccessibleObject()
 {
-  if(mAccessibleCreatable && !mAccessibleObject)
-  {
-    mAccessibleObject.reset(mControlImpl.CreateAccessibleObject());
-  }
-
-  return mAccessibleObject;
+  return std::dynamic_pointer_cast<DevelControl::ControlAccessible>(Accessibility::Accessible::GetOwningPtr(mControlImpl.Self()));
 }
 
 bool Control::Impl::IsAccessibleCreated() const
 {
-  return !!mAccessibleObject;
+  uint32_t actorId = mControlImpl.Self().GetProperty<int>(Actor::Property::ID);
+  return !!Accessibility::Bridge::GetCurrentBridge()->GetAccessible(actorId);
 }
 
 void Control::Impl::EnableCreateAccessible(bool enable)
index 93e25447ed9b642e9739b9c93aba62bd8fb77fb5..71c6d3c69c357c9b762ee308beb821cbdb22a30d 100644 (file)
@@ -703,8 +703,6 @@ private:
   bool                                        mIsAccessibilityPropertySetSignalRegistered{false};
   Dali::PropertyNotification                  mAccessibilityPositionNotification;
   Dali::Accessibility::ScreenRelativeMoveType mAccessibilityLastScreenRelativeMoveType{Accessibility::ScreenRelativeMoveType::OUTSIDE};
-
-  std::shared_ptr<Toolkit::DevelControl::ControlAccessible> mAccessibleObject;
 };
 
 } // namespace Internal