From: Youngsun Suh Date: Thu, 26 Sep 2024 01:55:18 +0000 (+0900) Subject: [Tizen] Update to accessibility role V2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen_7.0;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git [Tizen] Update to accessibility role V2 Update default and text-related role to use V2 roles Change-Id: I7729c2cb15ef6aab717e4f78b696ba18c605f91f Fix ignoring highlightable prop set for v2 role Change-Id: Ia582be7941f7a9024911007b6403ce082280f620 --- 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 82f63fd..44b66c9 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 @@ -215,11 +215,13 @@ int UtcDaliControlAccessibilityRole(void) { ToolkitTestApplication application; - auto control = Control::New(); + auto control = Control::New(); + + auto role_none = DevelControl::AccessibilityRole::NONE; auto role_unknown = Dali::Accessibility::Role::UNKNOWN; auto role_pushbutton = Dali::Accessibility::Role::PUSH_BUTTON; - DALI_TEST_EQUALS(role_unknown, control.GetProperty(DevelControl::Property::ACCESSIBILITY_ROLE).Get(), TEST_LOCATION); + DALI_TEST_EQUALS(role_none, control.GetProperty(DevelControl::Property::ACCESSIBILITY_ROLE).Get(), TEST_LOCATION); auto accessible = Dali::Accessibility::Accessible::Get(control); DALI_TEST_EQUALS(role_unknown, accessible->GetRole(), TEST_LOCATION); @@ -312,7 +314,7 @@ int UtcDaliControlAccessibilityRole(void) DALI_TEST_EQUALS(static_cast(Dali::Accessibility::Role::PAGE_TAB_LIST), TestGetRole(accessible->GetAddress()), TEST_LOCATION); control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::TEXT); - DALI_TEST_EQUALS(static_cast(Dali::Accessibility::Role::TEXT), TestGetRole(accessible->GetAddress()), TEST_LOCATION); + DALI_TEST_EQUALS(static_cast(Dali::Accessibility::Role::LABEL), TestGetRole(accessible->GetAddress()), TEST_LOCATION); control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::TOGGLE_BUTTON); DALI_TEST_EQUALS(static_cast(Dali::Accessibility::Role::TOGGLE_BUTTON), TestGetRole(accessible->GetAddress()), TEST_LOCATION); @@ -601,30 +603,57 @@ int UtcDaliControlAccessibilityHighlightable(void) highlightable = control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE); DALI_TEST_EQUALS(highlightable, false, TEST_LOCATION); - auto q = Dali::Accessibility::Accessible::Get(control); + auto accessible = Dali::Accessibility::Accessible::Get(control); Dali::Accessibility::TestEnableSC(true); - auto states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())}; + auto states_by_bridge = Dali::Accessibility::States{TestGetStates(accessible->GetAddress())}; DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]); control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); DALI_TEST_EQUALS(Property::BOOLEAN, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType(), TEST_LOCATION); DALI_TEST_EQUALS(true, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get(), TEST_LOCATION); - states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())}; + states_by_bridge = Dali::Accessibility::States{TestGetStates(accessible->GetAddress())}; DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]); control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false); DALI_TEST_EQUALS(Property::BOOLEAN, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).GetType(), TEST_LOCATION); DALI_TEST_EQUALS(false, control.GetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE).Get(), TEST_LOCATION); - states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())}; + states_by_bridge = Dali::Accessibility::States{TestGetStates(accessible->GetAddress())}; + DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]); + + Dali::Accessibility::TestEnableSC(false); + + END_TEST; +} + +int UtcDaliControlAccessibilityHighlightableV2(void) +{ + ToolkitTestApplication application; + auto control = Control::New(); + auto accessible = Dali::Accessibility::Accessible::Get(control); + + Dali::Accessibility::TestEnableSC(true); + + auto states_by_bridge = Dali::Accessibility::States{TestGetStates(accessible->GetAddress())}; + // Is not highlightable if no role is set DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]); - // Highlightable state is set if V2 role is set and is not Role::None + // Is highlightable by default if V2 role is set and is not Role::None control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::CONTAINER); - states_by_bridge = Dali::Accessibility::States{TestGetStates(q->GetAddress())}; + states_by_bridge = Dali::Accessibility::States{TestGetStates(accessible->GetAddress())}; + DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]); + + // Returns explicitly set highlightable property: false + control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false); + states_by_bridge = Dali::Accessibility::States{TestGetStates(accessible->GetAddress())}; + DALI_TEST_CHECK(!states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]); + + // Returns explicitly set highlightable property: true + control.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); + states_by_bridge = Dali::Accessibility::States{TestGetStates(accessible->GetAddress())}; DALI_TEST_CHECK(states_by_bridge[Dali::Accessibility::State::HIGHLIGHTABLE]); Dali::Accessibility::TestEnableSC(false); diff --git a/dali-toolkit/devel-api/controls/control-accessible.cpp b/dali-toolkit/devel-api/controls/control-accessible.cpp index 5f03f12..d2b07d5 100644 --- a/dali-toolkit/devel-api/controls/control-accessible.cpp +++ b/dali-toolkit/devel-api/controls/control-accessible.cpp @@ -120,7 +120,7 @@ Dali::Accessibility::Role ConvertV2RoleToAtspiRole(AccessibilityRole role) TO_SAME_ROLE_TYPE(SPIN_BUTTON) TO_V1_ROLE_TYPE(TAB, PAGE_TAB) TO_V1_ROLE_TYPE(TAB_LIST, PAGE_TAB_LIST) - TO_SAME_ROLE_TYPE(TEXT) + TO_V1_ROLE_TYPE(TEXT, LABEL) TO_SAME_ROLE_TYPE(TOGGLE_BUTTON) TO_SAME_ROLE_TYPE(TOOL_BAR) default: @@ -158,6 +158,26 @@ bool IsHighlightableRole(int32_t rawRole) return IsRoleV2(rawRole) && static_cast(rawRole) != AccessibilityRole::NONE; } +using Dali::Toolkit::Internal::TriStateProperty; +bool IsHighlightable(TriStateProperty highlightable, int32_t rawRole) +{ + switch(highlightable) + { + case TriStateProperty::AUTO: + { + return IsHighlightableRole(rawRole); + } + case TriStateProperty::TRUE: + { + return true; + } + default: + { + return false; + } + } +} + } // unnamed namespace ControlAccessible::ControlAccessible(Dali::Actor self) @@ -289,7 +309,7 @@ void ControlAccessible::ApplyAccessibilityProps(Dali::Accessibility::States& sta // Apply traits states[State::MODAL] = props.isModal || IsModalRole(props.role); - states[State::HIGHLIGHTABLE] = props.isHighlightable || IsHighlightableRole(props.role); + states[State::HIGHLIGHTABLE] = IsHighlightable(props.isHighlightable, props.role); } Dali::Accessibility::States ControlAccessible::CalculateStates() diff --git a/dali-toolkit/internal/controls/control/control-data-impl.cpp b/dali-toolkit/internal/controls/control/control-data-impl.cpp index 1b6028b..32e5814 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -1455,7 +1455,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const bool highlightable; if(value.Get(highlightable)) { - controlImpl.mImpl->mAccessibilityProps.isHighlightable = highlightable; + controlImpl.mImpl->mAccessibilityProps.isHighlightable = highlightable ? TriStateProperty::TRUE : TriStateProperty::FALSE; } break; } @@ -1690,7 +1690,7 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: { - value = controlImpl.mImpl->mAccessibilityProps.isHighlightable; + value = controlImpl.mImpl->mAccessibilityProps.isHighlightable == TriStateProperty::TRUE ? true : false; break; } diff --git a/dali-toolkit/internal/controls/control/control-data-impl.h b/dali-toolkit/internal/controls/control/control-data-impl.h index 47594c9..c80d7e0 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.h +++ b/dali-toolkit/internal/controls/control/control-data-impl.h @@ -66,6 +66,13 @@ struct RegisteredVisual typedef Dali::OwnerContainer RegisteredVisualContainer; +enum class TriStateProperty +{ + AUTO = 0, + TRUE, + FALSE +}; + /** * @brief Holds the Implementation for the internal control class */ @@ -549,11 +556,11 @@ public: std::string description{}; std::string value{}; std::string automationId{}; - int32_t role{static_cast(Dali::Accessibility::Role::UNKNOWN)}; + int32_t role{static_cast(DevelControl::AccessibilityRole::NONE)}; DevelControl::AccessibilityStates states{}; std::map> relations; Property::Map extraAttributes{}; - bool isHighlightable{false}; + TriStateProperty isHighlightable{TriStateProperty::AUTO}; bool isHidden{false}; bool isScrollable{false}; bool isModal{false}; diff --git a/dali-toolkit/internal/controls/text-controls/text-anchor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-anchor-impl.cpp index 8abb0ae..2bc12b0 100644 --- a/dali-toolkit/internal/controls/text-controls/text-anchor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-anchor-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -146,8 +146,7 @@ void TextAnchor::OnInitialize() Actor self = Self(); // Accessibility - self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, Dali::Accessibility::Role::LINK); - self.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); + self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::LINK); } DevelControl::ControlAccessible* TextAnchor::CreateAccessibleObject() diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index b856c0f..db80aad 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -604,8 +604,7 @@ void TextEditor::OnInitialize() self.Add(mStencil); // Accessibility - self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, Dali::Accessibility::Role::ENTRY); - self.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); + self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::ENTRY); Accessibility::Bridge::EnabledSignal().Connect(this, &TextEditor::OnAccessibilityStatusChanged); Accessibility::Bridge::DisabledSignal().Connect(this, &TextEditor::OnAccessibilityStatusChanged); diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index ae395e8..7ecdd7a 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -538,8 +538,7 @@ void TextField::OnInitialize() } // Accessibility - self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, Dali::Accessibility::Role::ENTRY); - self.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); + self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::ENTRY); Accessibility::Bridge::EnabledSignal().Connect(this, &TextField::OnAccessibilityStatusChanged); Accessibility::Bridge::DisabledSignal().Connect(this, &TextField::OnAccessibilityStatusChanged); @@ -880,7 +879,7 @@ bool TextField::OnKeyEvent(const KeyEvent& event) return true; } else if((Dali::DevelKey::DALI_KEY_RETURN == event.GetKeyCode() && KEY_RETURN_NAME == event.GetKeyName()) || - Dali::DevelKey::DALI_KEY_KP_ENTER == event.GetKeyCode()) + Dali::DevelKey::DALI_KEY_KP_ENTER == event.GetKeyCode()) { // Do nothing when enter is comming. return false; diff --git a/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp b/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp index 45af9b7..d5af9e5 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,8 @@ #include #include -#include #include +#include #include #include #include @@ -512,11 +512,11 @@ void TextField::PropertyHandler::SetProperty(Toolkit::TextField textField, Prope auto mode = map->Find(Toolkit::HiddenInput::Property::MODE); if(mode && (mode->Get() != Toolkit::HiddenInput::Mode::HIDE_NONE)) { - textField.SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE, Accessibility::Role::PASSWORD_TEXT); + textField.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::PASSWORD_TEXT); } else { - textField.SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE, Accessibility::Role::ENTRY); + textField.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::ENTRY); } } break; diff --git a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp index b787366..81706c6 100644 --- a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp @@ -934,8 +934,7 @@ void TextLabel::OnInitialize() engine.SetCursorWidth(0u); // Do not layout space for the cursor. // Accessibility - self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, Dali::Accessibility::Role::LABEL); - self.SetProperty(DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); + self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::TEXT); Accessibility::Bridge::EnabledSignal().Connect(this, &TextLabel::OnAccessibilityStatusChanged); Accessibility::Bridge::DisabledSignal().Connect(this, &TextLabel::OnAccessibilityStatusChanged);