Add ACCESSIBILITY_VALUE property to control 71/315971/3
authorYoungsun Suh <youngsun.suh@samsung.com>
Mon, 12 Aug 2024 01:37:34 +0000 (10:37 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Mon, 12 Aug 2024 06:47:53 +0000 (15:47 +0900)
Change-Id: Ib8216c26dd5ca0d4b175b0ebc5ce65a2aaec430b

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

index f0a8b1cdb8cdb8bb46157b81b5ad8cff88b3fa65..886098b54a16404a4d8b7a26d0065be857c4d04b 100644 (file)
@@ -158,6 +158,40 @@ int UtcDaliControlAccessibilityDescription(void)
   END_TEST;
 }
 
+int UtcDaliControlAccessibilityValue(void)
+{
+  ToolkitTestApplication application;
+
+  auto control = Control::New();
+
+  auto q = Dali::Accessibility::Accessible::Get(control);
+  DALI_TEST_CHECK(q);
+
+  DALI_TEST_EQUALS("", q->GetValue(), TEST_LOCATION);
+
+  control.SetProperty(DevelControl::Property::ACCESSIBILITY_VALUE, "Accessibility_Value");
+  DALI_TEST_EQUALS("Accessibility_Value", q->GetValue(), TEST_LOCATION);
+
+  auto property = control.GetProperty(DevelControl::Property::ACCESSIBILITY_VALUE).Get<std::string>();
+  DALI_TEST_EQUALS("Accessibility_Value", property, TEST_LOCATION);
+
+  Dali::Accessibility::TestEnableSC(true);
+
+  auto i = dynamic_cast<Dali::Accessibility::Component*>(q);
+
+  DALI_TEST_CHECK(i);
+  i->GrabHighlight();
+
+  control.SetProperty(DevelControl::Property::ACCESSIBILITY_VALUE, "Changed_Accessiblity_Value");
+  DALI_TEST_EQUALS("Changed_Accessiblity_Value", q->GetValue(), TEST_LOCATION);
+  DALI_TEST_EQUALS(control.GetProperty(DevelControl::Property::ACCESSIBILITY_VALUE).Get<std::string>(), "Changed_Accessiblity_Value", TEST_LOCATION);
+
+  //TODO test emission of description change signal
+  Dali::Accessibility::TestEnableSC(false);
+
+  END_TEST;
+}
+
 int UtcDaliControlAccessibilityRole(void)
 {
   ToolkitTestApplication application;
index 8b543400741607c00ba176e1b0ada252c067244f..0249c91423e696d47a644bdc40a4194f6ea05010 100644 (file)
@@ -131,24 +131,6 @@ int UtcDaliControlAccessibileBlockAccessibleCreation(void)
   END_TEST;
 }
 
-int UtcDaliControlPropertyAccessibilityTranslationDomain(void)
-{
-  ToolkitTestApplication application;
-
-  auto control = Control::New();
-
-  auto accessibility_translation_domain = DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN;
-  DALI_TEST_EQUALS("", control.GetProperty<std::string>(accessibility_translation_domain), TEST_LOCATION);
-
-  control.SetProperty(accessibility_translation_domain, "translation_domain_test_1");
-  DALI_TEST_EQUALS("translation_domain_test_1", control.GetProperty(accessibility_translation_domain).Get<std::string>(), TEST_LOCATION);
-
-  control.SetProperty(accessibility_translation_domain, "translation_domain_test_2");
-  DALI_TEST_EQUALS("translation_domain_test_2", control.GetProperty(accessibility_translation_domain).Get<std::string>(), TEST_LOCATION);
-
-  END_TEST;
-}
-
 // This test shows that when the accessibility bridge is
 // not up, there is no possibility to grab or clear highlight
 int UtcDaliControlAccessibilityHighlight(void)
index 7e6981bc314c0a837b6501e23a8cd9afde0dc6b6..7ab6a8b45042ebcea44f68b830d2dc5afde44320 100644 (file)
@@ -127,9 +127,9 @@ std::string ControlAccessible::GetName() const
   {
     controlImpl.mAccessibilityGetNameSignal.Emit(name);
   }
-  else if(!controlImpl.mAccessibilityName.empty())
+  else if(!controlImpl.mAccessibilityProps.name.empty())
   {
-    name = controlImpl.mAccessibilityName;
+    name = controlImpl.mAccessibilityProps.name;
   }
   else if(auto raw = GetNameRaw(); !raw.empty())
   {
@@ -140,11 +140,6 @@ std::string ControlAccessible::GetName() const
     name = Self().GetProperty<std::string>(Actor::Property::NAME);
   }
 
-  if(!controlImpl.mAccessibilityTranslationDomain.empty())
-  {
-    return GetLocaleText(name, controlImpl.mAccessibilityTranslationDomain.c_str());
-  }
-
   return GetLocaleText(name);
 }
 
@@ -165,20 +160,15 @@ std::string ControlAccessible::GetDescription() const
   {
     controlImpl.mAccessibilityGetDescriptionSignal.Emit(description);
   }
-  else if(!controlImpl.mAccessibilityDescription.empty())
+  else if(!controlImpl.mAccessibilityProps.description.empty())
   {
-    description = controlImpl.mAccessibilityDescription;
+    description = controlImpl.mAccessibilityProps.description;
   }
   else
   {
     description = GetDescriptionRaw();
   }
 
-  if(!controlImpl.mAccessibilityTranslationDomain.empty())
-  {
-    return GetLocaleText(description, controlImpl.mAccessibilityTranslationDomain.c_str());
-  }
-
   return GetLocaleText(description);
 }
 
@@ -187,6 +177,11 @@ std::string ControlAccessible::GetDescriptionRaw() const
   return {};
 }
 
+std::string ControlAccessible::GetValue() const
+{
+  return Self().GetProperty<std::string>(Toolkit::DevelControl::Property::ACCESSIBILITY_VALUE);
+}
+
 Dali::Accessibility::Role ControlAccessible::GetRole() const
 {
   return Self().GetProperty<Dali::Accessibility::Role>(Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE);
@@ -313,7 +308,7 @@ bool ControlAccessible::IsHidden() const
   Internal::Control&       internalControl = Toolkit::Internal::GetImplementation(control);
   Internal::Control::Impl& controlImpl     = Internal::Control::Impl::Get(internalControl);
 
-  return controlImpl.mAccessibilityHidden;
+  return controlImpl.mAccessibilityProps.isHidden;
 }
 
 bool ControlAccessible::GrabFocus()
index 4b3d3d6c5a32ecb602c115b42c8ce11458c15ae0..98eda71e8a883e9ced04bcddbcff696fdfacbfb3 100644 (file)
@@ -104,6 +104,11 @@ public:
    */
   virtual std::string GetDescriptionRaw() const;
 
+  /**
+   * @copydoc Dali::Accessibility::Accessible::GetValue()
+   */
+  std::string GetValue() const override;
+
   /**
    * @copydoc Dali::Accessibility::Accessible::GetRole()
    */
index 93c3d713e2ecabf0ce15b2fcddb5b81c256b85ec..4fc23c7595f18800285ddb9f2c548543f62ab23a 100644 (file)
@@ -189,7 +189,7 @@ void AppendAccessibilityRelation(Toolkit::Control control, Dali::Actor destinati
 {
   if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
   {
-    GetControlImplementation(control).mAccessibilityRelations[relation].insert(destinationAccessible);
+    GetControlImplementation(control).mAccessibilityProps.relations[relation].insert(destinationAccessible);
   }
 }
 
@@ -197,7 +197,7 @@ void RemoveAccessibilityRelation(Toolkit::Control control, Dali::Actor destinati
 {
   if(auto destinationAccessible = Accessibility::Accessible::Get(destination))
   {
-    auto& relations = GetControlImplementation(control).mAccessibilityRelations;
+    auto& relations = GetControlImplementation(control).mAccessibilityProps.relations;
 
     relations[relation].erase(destinationAccessible);
 
@@ -210,7 +210,7 @@ void RemoveAccessibilityRelation(Toolkit::Control control, Dali::Actor destinati
 
 std::vector<Accessibility::Relation> GetAccessibilityRelations(Toolkit::Control control)
 {
-  const auto&                          relations = GetControlImplementation(control).mAccessibilityRelations;
+  const auto&                          relations = GetControlImplementation(control).mAccessibilityProps.relations;
   std::vector<Accessibility::Relation> result;
 
   for(auto& relation : relations)
@@ -226,7 +226,7 @@ std::vector<Accessibility::Relation> GetAccessibilityRelations(Toolkit::Control
 
 void ClearAccessibilityRelations(Toolkit::Control control)
 {
-  GetControlImplementation(control).mAccessibilityRelations.clear();
+  GetControlImplementation(control).mAccessibilityProps.relations.clear();
 }
 
 void AppendAccessibilityAttribute(Toolkit::Control control, const std::string& key, const std::string& value)
index 465041a0815f459d91db625a73912ea77bf2b1a2..11948267f6ada3fb0afffa09e752f8cabefefdd8 100644 (file)
@@ -161,7 +161,7 @@ enum
   ACCESSIBILITY_DESCRIPTION,
 
   /**
-   * @brief Current translation domain for accessibility clients.
+   * @brief Deprecated. Current translation domain for accessibility clients.
    * @details Name "accessibilityTranslationDomain", type Property::STRING.
    */
   ACCESSIBILITY_TRANSLATION_DOMAIN,
@@ -223,6 +223,12 @@ enum
    * It will also appear in the AT-SPI tree under the key "automationId".
    */
   AUTOMATION_ID,
+
+  /**
+   * @brief The accessibility value represented by the control. For example, "60%" for a slider object.
+   * @details Name "accessibilityValue", type Property::STRING.
+   */
+  ACCESSIBILITY_VALUE,
 };
 
 } // namespace Property
index a9e34206aa06f56a65efb38a9039845727a6908a..692539d83c55f33be79aebfba8492ae7b1d5c968 100644 (file)
@@ -525,6 +525,7 @@ const PropertyRegistration Control::Impl::PROPERTY_23(typeRegistration, "accessi
 const PropertyRegistration Control::Impl::PROPERTY_24(typeRegistration, "clockwiseFocusableActorId",      Toolkit::DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID,     Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty);
 const PropertyRegistration Control::Impl::PROPERTY_25(typeRegistration, "counterClockwiseFocusableActorId", Toolkit::DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty);
 const PropertyRegistration Control::Impl::PROPERTY_26(typeRegistration, "automationId",                   Toolkit::DevelControl::Property::AUTOMATION_ID,                    Property::STRING,  &Control::Impl::SetProperty, &Control::Impl::GetProperty);
+const PropertyRegistration Control::Impl::PROPERTY_27(typeRegistration, "accessibilityValue",             Toolkit::DevelControl::Property::ACCESSIBILITY_VALUE,                    Property::STRING,  &Control::Impl::SetProperty, &Control::Impl::GetProperty);
 
 // clang-format on
 
@@ -738,7 +739,7 @@ void Control::Impl::OnAccessibilityPropertySet(Dali::Handle& handle, Dali::Prope
   {
     if(mAccessibilityGetNameSignal.Empty())
     {
-      if(index == DevelControl::Property::ACCESSIBILITY_NAME || (mAccessibilityName.empty() && index == accessible->GetNamePropertyIndex()))
+      if(index == DevelControl::Property::ACCESSIBILITY_NAME || (mAccessibilityProps.name.empty() && index == accessible->GetNamePropertyIndex()))
       {
         accessible->Emit(Dali::Accessibility::ObjectPropertyChangeEvent::NAME);
       }
@@ -746,7 +747,7 @@ void Control::Impl::OnAccessibilityPropertySet(Dali::Handle& handle, Dali::Prope
 
     if(mAccessibilityGetDescriptionSignal.Empty())
     {
-      if(index == DevelControl::Property::ACCESSIBILITY_DESCRIPTION || (mAccessibilityDescription.empty() && index == accessible->GetDescriptionPropertyIndex()))
+      if(index == DevelControl::Property::ACCESSIBILITY_DESCRIPTION || (mAccessibilityProps.description.empty() && index == accessible->GetDescriptionPropertyIndex()))
       {
         accessible->Emit(Dali::Accessibility::ObjectPropertyChangeEvent::DESCRIPTION);
       }
@@ -1263,14 +1264,14 @@ void Control::Impl::DoActionExtension(Dali::Property::Index visualIndex, Dali::P
 
 void Control::Impl::AppendAccessibilityAttribute(const std::string& key, const std::string value)
 {
-  Property::Value* checkedValue = mAccessibilityAttributes.Find(key);
+  Property::Value* checkedValue = mAccessibilityProps.extraAttributes.Find(key);
   if(checkedValue)
   {
-    mAccessibilityAttributes[key] = Property::Value(value);
+    mAccessibilityProps.extraAttributes[key] = Property::Value(value);
   }
   else
   {
-    mAccessibilityAttributes.Insert(key, value);
+    mAccessibilityProps.extraAttributes.Insert(key, value);
   }
 }
 
@@ -1463,7 +1464,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         std::string name;
         if(value.Get(name))
         {
-          controlImpl.mImpl->mAccessibilityName = name;
+          controlImpl.mImpl->mAccessibilityProps.name = std::move(name);
         }
         break;
       }
@@ -1473,17 +1474,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         std::string text;
         if(value.Get(text))
         {
-          controlImpl.mImpl->mAccessibilityDescription = text;
-        }
-        break;
-      }
-
-      case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN:
-      {
-        std::string text;
-        if(value.Get(text))
-        {
-          controlImpl.mImpl->mAccessibilityTranslationDomain = text;
+          controlImpl.mImpl->mAccessibilityProps.description = std::move(text);
         }
         break;
       }
@@ -1493,7 +1484,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         Dali::Accessibility::Role role;
         if(value.Get(role))
         {
-          controlImpl.mImpl->mAccessibilityRole = role;
+          controlImpl.mImpl->mAccessibilityProps.role = role;
         }
         break;
       }
@@ -1503,7 +1494,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         bool highlightable;
         if(value.Get(highlightable))
         {
-          controlImpl.mImpl->mAccessibilityHighlightable = highlightable;
+          controlImpl.mImpl->mAccessibilityProps.isHighlightable = highlightable;
         }
         break;
       }
@@ -1513,7 +1504,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         const Property::Map* map = value.GetMap();
         if(map && !map->Empty())
         {
-          controlImpl.mImpl->mAccessibilityAttributes = *map;
+          controlImpl.mImpl->mAccessibilityProps.extraAttributes = *map;
         }
         break;
       }
@@ -1533,7 +1524,7 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         bool hidden;
         if(value.Get(hidden))
         {
-          controlImpl.mImpl->mAccessibilityHidden = hidden;
+          controlImpl.mImpl->mAccessibilityProps.isHidden = hidden;
 
           auto accessible = controlImpl.GetAccessibleObject();
           if(DALI_LIKELY(accessible))
@@ -1571,7 +1562,17 @@ void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const
         std::string automationId;
         if(value.Get(automationId))
         {
-          controlImpl.mImpl->mAutomationId = automationId;
+          controlImpl.mImpl->mAccessibilityProps.automationId = std::move(automationId);
+        }
+        break;
+      }
+
+      case Toolkit::DevelControl::Property::ACCESSIBILITY_VALUE:
+      {
+        std::string accessibilityValue;
+        if(value.Get(accessibilityValue))
+        {
+          controlImpl.mImpl->mAccessibilityProps.value = std::move(accessibilityValue);
         }
         break;
       }
@@ -1692,37 +1693,31 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i
 
       case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME:
       {
-        value = controlImpl.mImpl->mAccessibilityName;
+        value = controlImpl.mImpl->mAccessibilityProps.name;
         break;
       }
 
       case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION:
       {
-        value = controlImpl.mImpl->mAccessibilityDescription;
-        break;
-      }
-
-      case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN:
-      {
-        value = controlImpl.mImpl->mAccessibilityTranslationDomain;
+        value = controlImpl.mImpl->mAccessibilityProps.description;
         break;
       }
 
       case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE:
       {
-        value = Property::Value(controlImpl.mImpl->mAccessibilityRole);
+        value = Property::Value(controlImpl.mImpl->mAccessibilityProps.role);
         break;
       }
 
       case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE:
       {
-        value = controlImpl.mImpl->mAccessibilityHighlightable;
+        value = controlImpl.mImpl->mAccessibilityProps.isHighlightable;
         break;
       }
 
       case Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES:
       {
-        value = controlImpl.mImpl->mAccessibilityAttributes;
+        value = controlImpl.mImpl->mAccessibilityProps.extraAttributes;
         break;
       }
 
@@ -1734,7 +1729,7 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i
 
       case Toolkit::DevelControl::Property::ACCESSIBILITY_HIDDEN:
       {
-        value = controlImpl.mImpl->mAccessibilityHidden;
+        value = controlImpl.mImpl->mAccessibilityProps.isHidden;
         break;
       }
 
@@ -1752,7 +1747,13 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i
 
       case Toolkit::DevelControl::Property::AUTOMATION_ID:
       {
-        value = controlImpl.mImpl->mAutomationId;
+        value = controlImpl.mImpl->mAccessibilityProps.automationId;
+        break;
+      }
+
+      case Toolkit::DevelControl::Property::ACCESSIBILITY_VALUE:
+      {
+        value = controlImpl.mImpl->mAccessibilityProps.value;
         break;
       }
     }
@@ -1763,16 +1764,16 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i
 
 void Control::Impl::RemoveAccessibilityAttribute(const std::string& key)
 {
-  Property::Value* value = mAccessibilityAttributes.Find(key);
+  Property::Value* value = mAccessibilityProps.extraAttributes.Find(key);
   if(value)
   {
-    mAccessibilityAttributes[key] = Property::Value();
+    mAccessibilityProps.extraAttributes[key] = Property::Value();
   }
 }
 
 void Control::Impl::ClearAccessibilityAttributes()
 {
-  mAccessibilityAttributes.Clear();
+  mAccessibilityProps.extraAttributes.Clear();
 }
 
 void Control::Impl::SetAccessibilityReadingInfoType(const Dali::Accessibility::ReadingInfoTypes types)
@@ -1812,7 +1813,7 @@ void Control::Impl::SetAccessibilityReadingInfoType(const Dali::Accessibility::R
 Dali::Accessibility::ReadingInfoTypes Control::Impl::GetAccessibilityReadingInfoType() const
 {
   std::string value{};
-  auto        place = mAccessibilityAttributes.Find(READING_INFO_TYPE_ATTRIBUTE_NAME);
+  auto        place = mAccessibilityProps.extraAttributes.Find(READING_INFO_TYPE_ATTRIBUTE_NAME);
   if(place)
   {
     place->Get(value);
index 6320864dc9c7bcd249c937b92eafe891face9499..dac71d23b089ac9282aa667c59339cbd21f16958 100644 (file)
@@ -589,7 +589,6 @@ public:
   Control&            mControlImpl;
   DevelControl::State mState;
   std::string         mSubStateName;
-  Property::Map       mAccessibilityAttributes;
 
   int mLeftFocusableActorId;             ///< Actor ID of Left focusable control.
   int mRightFocusableActorId;            ///< Actor ID of Right focusable control.
@@ -624,19 +623,20 @@ public:
   Toolkit::DevelControl::AccessibilityGetDescriptionSignalType mAccessibilityGetDescriptionSignal;
   Toolkit::DevelControl::AccessibilityDoGestureSignalType      mAccessibilityDoGestureSignal;
 
-  std::string mAccessibilityName;
-  std::string mAccessibilityDescription;
-  std::string mAccessibilityTranslationDomain;
-  std::string mAutomationId;
-
-  bool mAccessibilityHighlightable = false;
-  bool mAccessibilityHidden        = false;
-  bool mAccessibleCreatable        = true;
-
-  Dali::Accessibility::Role mAccessibilityRole = Dali::Accessibility::Role::UNKNOWN;
-
-  std::map<Dali::Accessibility::RelationType, std::set<Accessibility::Accessible*>> mAccessibilityRelations;
-  std::shared_ptr<Toolkit::DevelControl::ControlAccessible>                         mAccessibleObject;
+  struct AccessibilityProps
+  {
+    std::string name{};
+    std::string description{};
+    std::string value{};
+    std::string automationId{};
+    Dali::Accessibility::Role role = Dali::Accessibility::Role::UNKNOWN;
+    std::map<Dali::Accessibility::RelationType, std::set<Accessibility::Accessible*>> relations;
+    Property::Map       extraAttributes{};
+    bool isHighlightable = false;
+    bool isHidden        = false;
+  } mAccessibilityProps;
+
+  bool mAccessibleCreatable     = true;
 
   // Gesture Detection
   PinchGestureDetector     mPinchGestureDetector;
@@ -687,6 +687,7 @@ public:
   static const PropertyRegistration PROPERTY_24;
   static const PropertyRegistration PROPERTY_25;
   static const PropertyRegistration PROPERTY_26;
+  static const PropertyRegistration PROPERTY_27;
 
 private:
   // Accessibility - notification for highlighted object to check if it is showing.
@@ -694,6 +695,9 @@ private:
   bool                                        mIsAccessibilityPropertySetSignalRegistered{false};
   Dali::PropertyNotification                  mAccessibilityPositionNotification;
   Dali::Accessibility::ScreenRelativeMoveType mAccessibilityLastScreenRelativeMoveType{Accessibility::ScreenRelativeMoveType::OUTSIDE};
+
+  std::shared_ptr<Toolkit::DevelControl::ControlAccessible>                         mAccessibleObject;
+
 };
 
 } // namespace Internal