From: Youngsun Suh Date: Wed, 16 Oct 2024 07:45:43 +0000 (+0900) Subject: Associate DefaultLabel with actor X-Git-Tag: dali_2.3.50~5^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=358ec15e8c75a626f35848798428575ae9036331;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git Associate DefaultLabel with actor Change-Id: I5684fc44065f8033df5911027c1464c93c37ece6 --- diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Controls-BridgeUp.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Controls-BridgeUp.cpp index 0e2fa6181f..ddebf70ced 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Controls-BridgeUp.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Controls-BridgeUp.cpp @@ -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; diff --git a/dali-toolkit/devel-api/controls/control-devel.cpp b/dali-toolkit/devel-api/controls/control-devel.cpp index 49fd71dec7..a89c4c9fb8 100644 --- a/dali-toolkit/devel-api/controls/control-devel.cpp +++ b/dali-toolkit/devel-api/controls/control-devel.cpp @@ -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); + } } }