Associate DefaultLabel with actor 54/319154/3
authorYoungsun Suh <youngsun.suh@samsung.com>
Wed, 16 Oct 2024 07:45:43 +0000 (16:45 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Mon, 11 Nov 2024 01:32:10 +0000 (10:32 +0900)
Change-Id: I5684fc44065f8033df5911027c1464c93c37ece6

automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Controls-BridgeUp.cpp
dali-toolkit/devel-api/controls/control-devel.cpp

index 0e2fa6181fffa29eb0398cca5a2f8565ff7939c8..ddebf70ced860e639944b0571ca1c11059b53574 100644 (file)
@@ -2015,6 +2015,67 @@ int UtcDaliEmitAccessibilityStateChanged(void)
   END_TEST;
 }
 
+int UtcDaliAccessibleDefaultLabel(void)
+{
+  ToolkitTestApplication application;
+
+  Dali::Accessibility::TestEnableSC(true);
+
+  auto root           = Control::New();
+  auto rootAccessible = Accessibility::Accessible::Get(root);
+
+  auto control1 = Control::New();
+  auto control2 = Control::New();
+
+  application.GetScene().Add(root);
+  application.SendNotification();
+  application.Render();
+
+  auto bridge = Accessibility::Bridge::GetCurrentBridge();
+
+  // control1 is off scene: not registered as default label
+  bridge->RegisterDefaultLabel(control1);
+  DALI_TEST_CHECK(bridge->GetDefaultLabel(rootAccessible) == rootAccessible);
+
+  // Add control1 and control2 to the scene
+  root.Add(control1);
+  root.Add(control2);
+  application.SendNotification();
+  application.Render();
+
+  // control1 is on scene; registered as default label
+  bridge->RegisterDefaultLabel(control1);
+  DALI_TEST_CHECK(bridge->GetDefaultLabel(rootAccessible) == Accessibility::Accessible::Get(control1));
+
+  // control2 is on scene; registered as default label; GetDefaultLabel returns the last added default label.
+  bridge->RegisterDefaultLabel(control2);
+  DALI_TEST_CHECK(bridge->GetDefaultLabel(rootAccessible) == Accessibility::Accessible::Get(control2));
+
+  // Remove and Reset control2
+  root.Remove(control2);
+  control2.Reset();
+  application.SendNotification();
+  application.Render();
+
+  // GetDefaultLabel returns control1 as control2 becomes unavailable.
+  DALI_TEST_CHECK(bridge->GetDefaultLabel(rootAccessible) == Accessibility::Accessible::Get(control1));
+
+  // UnregisterDefaultLabel immediately remove the control1 from the list.
+  bridge->UnregisterDefaultLabel(control1);
+  DALI_TEST_CHECK(bridge->GetDefaultLabel(rootAccessible) == rootAccessible);
+
+  // Does not crash when unregistering already unregistered actors.
+  bridge->UnregisterDefaultLabel(control1);
+  bridge->UnregisterDefaultLabel(control2);
+
+  // GetDefaultLabel returns nullptr if nullptr is passed.
+  DALI_TEST_CHECK(bridge->GetDefaultLabel(nullptr) == nullptr);
+
+  Dali::Accessibility::TestEnableSC(false);
+
+  END_TEST;
+}
+
 int UtcDaliAccessibleRemovalOnActorDestoyed(void)
 {
   ToolkitTestApplication application;
index 49fd71dec77a3b488194f35ed5bad3eb752296fa..a89c4c9fb87c84ef31101f42fea087d315e2184c 100644 (file)
@@ -315,30 +315,34 @@ bool IsCreateAccessibleEnabled(Toolkit::Control control)
 
 void EmitAccessibilityStateChanged(Dali::Actor actor, Accessibility::State state, int newValue)
 {
-  auto accessible = Accessibility::Accessible::GetOwningPtr(actor);
-  if(DALI_LIKELY(accessible))
+  auto bridge  = Accessibility::Bridge::GetCurrentBridge();
+  auto control = Toolkit::Control::DownCast(actor);
+  if(DALI_LIKELY(control))
   {
-    auto control = Toolkit::Control::DownCast(actor);
-    if(DALI_LIKELY(control))
+    if(state == Accessibility::State::SHOWING)
     {
-      if(state == Accessibility::State::SHOWING)
+      bool isModal = ControlAccessible::IsModal(control);
+      if(isModal)
       {
-        bool isModal = ControlAccessible::IsModal(control);
-        if(isModal)
+        if(newValue == 1)
         {
-          if(newValue == 1)
-          {
-            Accessibility::Bridge::GetCurrentBridge()->RegisterDefaultLabel(accessible);
-          }
-          else
-          {
-            Accessibility::Bridge::GetCurrentBridge()->UnregisterDefaultLabel(accessible);
-          }
+          bridge->RegisterDefaultLabel(actor);
+        }
+        else
+        {
+          bridge->UnregisterDefaultLabel(actor);
         }
       }
     }
+  }
 
-    accessible->EmitStateChanged(state, newValue, 0);
+  if(bridge->IsUp())
+  {
+    auto accessible = Accessibility::Accessible::Get(actor);
+    if(DALI_LIKELY(accessible))
+    {
+      accessible->EmitStateChanged(state, newValue, 0);
+    }
   }
 }