[Tizen] Update to accessibility role V2 79/318279/1
authorYoungsun Suh <youngsun.suh@samsung.com>
Thu, 26 Sep 2024 01:55:18 +0000 (10:55 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Thu, 26 Sep 2024 08:37:47 +0000 (17:37 +0900)
Update default and text-related role to use V2 roles

Change-Id: I7729c2cb15ef6aab717e4f78b696ba18c605f91f

Fix ignoring highlightable prop set for v2 role

Change-Id: Ia582be7941f7a9024911007b6403ce082280f620

automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Controls-BridgeUp.cpp
dali-toolkit/devel-api/controls/control-accessible.cpp
dali-toolkit/internal/controls/control/control-data-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.h
dali-toolkit/internal/controls/text-controls/text-anchor-impl.cpp
dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp
dali-toolkit/internal/controls/text-controls/text-field-impl.cpp
dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp
dali-toolkit/internal/controls/text-controls/text-label-impl.cpp

index 82f63fd48d44b95eac8f493af0f674f9a3ed49df..44b66c950bbe9ee8b129a9606a3ee672bd98b9ac 100644 (file)
@@ -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<Dali::Accessibility::Role>(), TEST_LOCATION);
+  DALI_TEST_EQUALS(role_none, control.GetProperty(DevelControl::Property::ACCESSIBILITY_ROLE).Get<DevelControl::AccessibilityRole>(), 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<uint32_t>(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<uint32_t>(Dali::Accessibility::Role::TEXT), TestGetRole(accessible->GetAddress()), TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<uint32_t>(Dali::Accessibility::Role::LABEL), TestGetRole(accessible->GetAddress()), TEST_LOCATION);
 
   control.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, DevelControl::AccessibilityRole::TOGGLE_BUTTON);
   DALI_TEST_EQUALS(static_cast<uint32_t>(Dali::Accessibility::Role::TOGGLE_BUTTON), TestGetRole(accessible->GetAddress()), TEST_LOCATION);
@@ -601,30 +603,57 @@ int UtcDaliControlAccessibilityHighlightable(void)
   highlightable = control.GetProperty<bool>(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<bool>(), 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<bool>(), 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);
index 5f03f12823dc2543dc1fe668aa729c249231ca2d..d2b07d530f968e38d8fed6bfe577e769beb8e965 100644 (file)
@@ -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<AccessibilityRole>(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()
index 1b6028b87ce513df4965aa797a35edbffe855429..32e58149285e0b0266f7d3e1a8a93501ffc82841 100644 (file)
@@ -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;
       }
 
index 47594c9a7820e98aac06adc4428516d85f85ef7c..c80d7e0d61b656197c6d2cee818bfccdff700e9c 100644 (file)
@@ -66,6 +66,13 @@ struct RegisteredVisual
 
 typedef Dali::OwnerContainer<RegisteredVisual*> 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<int32_t>(Dali::Accessibility::Role::UNKNOWN)};
+    int32_t                                                                           role{static_cast<int32_t>(DevelControl::AccessibilityRole::NONE)};
     DevelControl::AccessibilityStates                                                 states{};
     std::map<Dali::Accessibility::RelationType, std::set<Accessibility::Accessible*>> relations;
     Property::Map                                                                     extraAttributes{};
-    bool                                                                              isHighlightable{false};
+    TriStateProperty                                                                  isHighlightable{TriStateProperty::AUTO};
     bool                                                                              isHidden{false};
     bool                                                                              isScrollable{false};
     bool                                                                              isModal{false};
index 8abb0aeaacc671ee28182723ec89dc2a0b7f3c63..2bc12b01a30509d4da515b6fbc55ccef977a03cb 100644 (file)
@@ -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()
index b856c0ff6bcf38c9d0fc88e88771a21d333c94e9..db80aad719d0fcb8c69880ce3f761e0a53f8695a 100644 (file)
@@ -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);
index ae395e83b44ca0683fa524ee81badb2d4235c827..7ecdd7af32ac5260db4610fcf2a4eeba7ca72938 100644 (file)
@@ -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;
index 45af9b7ad68466d00028e68ec3135449379c5cc6..d5af9e5d60f67e5806f8a443686f14591d569f16 100644 (file)
@@ -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 <dali-toolkit/devel-api/focus-manager/keyinput-focus-manager.h>
 #include <dali-toolkit/devel-api/text/rendering-backend.h>
 
-#include <dali-toolkit/internal/text/decorator/text-decorator.h>
 #include <dali-toolkit/internal/text/controller/text-controller.h>
+#include <dali-toolkit/internal/text/decorator/text-decorator.h>
 #include <dali-toolkit/internal/text/text-effects-style.h>
 #include <dali-toolkit/internal/text/text-enumerations-impl.h>
 #include <dali-toolkit/internal/text/text-font-style.h>
@@ -512,11 +512,11 @@ void TextField::PropertyHandler::SetProperty(Toolkit::TextField textField, Prope
         auto mode = map->Find(Toolkit::HiddenInput::Property::MODE);
         if(mode && (mode->Get<int>() != 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;
index b787366a8da9b412c405d95d5c2433837230111c..81706c6058547b66428fbe8f065a47121318e81a 100644 (file)
@@ -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);