Add imgSrc to GetAttribute return map if available 78/309578/6
authorYoungsun Suh <youngsun.suh@samsung.com>
Fri, 12 Apr 2024 07:19:18 +0000 (16:19 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Mon, 15 Apr 2024 05:24:24 +0000 (14:24 +0900)
Change-Id: I9f9df3905ab13442e5ff12a04414484a25f3d41b

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

index f76c4a0..eee08a7 100644 (file)
 // test harness headers before dali headers.
 #include <dali-toolkit-test-suite-utils.h>
 
-#include <dali.h>
 #include <dali-toolkit/dali-toolkit.h>
 #include <dali-toolkit/devel-api/controls/control-devel.h>
+#include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
+#include <dali.h>
 
-#include <dali/devel-api/adaptor-framework/accessibility.h>
 #include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
+#include <dali/devel-api/adaptor-framework/accessibility.h>
 #include <dali/devel-api/atspi-interfaces/accessible.h>
 
 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/dbus-wrapper.h>
@@ -45,10 +46,10 @@ int utcDaliAccessibilityCheckBoxButtonGetStates(void)
   ToolkitTestApplication application;
 
   auto check_box_button = Toolkit::CheckBoxButton::New();
-  auto q = Dali::Accessibility::Accessible::Get( check_box_button );
-  DALI_TEST_CHECK( q );
+  auto q                = Dali::Accessibility::Accessible::Get(check_box_button);
+  DALI_TEST_CHECK(q);
   auto states = q->GetStates();
-  DALI_TEST_EQUALS( (int) states[ Dali::Accessibility::State::SELECTABLE ], (int) true, TEST_LOCATION );
+  DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SELECTABLE], (int)true, TEST_LOCATION);
 
   END_TEST;
 }
@@ -60,9 +61,9 @@ int utcDaliAccessibilityCheckLabelText(void)
   auto check_box_button = Toolkit::CheckBoxButton::New();
   //check_box_button.SetLabelText( "button" );
   check_box_button.SetProperty(Toolkit::Button::Property::LABEL, "button");
-  auto q = Dali::Accessibility::Accessible::Get( check_box_button );
-  DALI_TEST_CHECK( q );
-  DALI_TEST_EQUALS( q->GetName(), "button", TEST_LOCATION );
+  auto q = Dali::Accessibility::Accessible::Get(check_box_button);
+  DALI_TEST_CHECK(q);
+  DALI_TEST_EQUALS(q->GetName(), "button", TEST_LOCATION);
 
   END_TEST;
 }
@@ -77,7 +78,7 @@ int UtcDaliAccessibilityCheckShowingState(void)
   parentButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
   parentButton.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f));
   parentButton.SetProperty(Actor::Property::SIZE, Dali::Vector2(200.0f, 200.0f));
-  application.GetScene().Add( parentButton );
+  application.GetScene().Add(parentButton);
 
   // Toatally inside of parent
   auto buttonA = Toolkit::PushButton::New();
@@ -99,7 +100,7 @@ int UtcDaliAccessibilityCheckShowingState(void)
   auto buttonC = Toolkit::PushButton::New();
   buttonC.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
   buttonC.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
-  buttonC.SetProperty(Actor::Property::POSITION, Dali::Vector2(100.0f,100.0f));
+  buttonC.SetProperty(Actor::Property::POSITION, Dali::Vector2(100.0f, 100.0f));
   buttonC.SetProperty(Actor::Property::SIZE, Dali::Vector2(200.0f, 200.0f));
   parentButton.Add(buttonC);
 
@@ -109,17 +110,17 @@ int UtcDaliAccessibilityCheckShowingState(void)
   auto q = Dali::Accessibility::Accessible::Get(buttonA);
   DALI_TEST_CHECK(q);
   auto states = q->GetStates();
-  DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION);
+  DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)true, TEST_LOCATION);
 
   q = Dali::Accessibility::Accessible::Get(buttonB);
   DALI_TEST_CHECK(q);
   states = q->GetStates();
-  DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION);
+  DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)true, TEST_LOCATION);
 
   q = Dali::Accessibility::Accessible::Get(buttonC);
   DALI_TEST_CHECK(q);
   states = q->GetStates();
-  DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION);
+  DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)true, TEST_LOCATION);
 
   // Make SHOWING object invisible
   buttonC.SetProperty(Actor::Property::VISIBLE, false);
@@ -128,7 +129,7 @@ int UtcDaliAccessibilityCheckShowingState(void)
   application.Render(16);
 
   states = q->GetStates();
-  DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) false, TEST_LOCATION);
+  DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)false, TEST_LOCATION);
 
   // Make SHOWING parent invisible
   parentButton.SetProperty(Actor::Property::VISIBLE, false);
@@ -139,7 +140,7 @@ int UtcDaliAccessibilityCheckShowingState(void)
   q = Dali::Accessibility::Accessible::Get(buttonA);
   DALI_TEST_CHECK(q);
   states = q->GetStates();
-  DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) false, TEST_LOCATION);
+  DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)false, TEST_LOCATION);
 
   END_TEST;
 }
@@ -206,3 +207,70 @@ int utcDaliAutomationId(void)
 
   END_TEST;
 }
+
+int utcDaliImgSrc(void)
+{
+  ToolkitTestApplication application;
+  const std::string      imageSrcKey = "imgSrc";
+  // Check that imgSrc is NOT added for non-image view w/ no additional property
+  {
+    const auto checkBoxButton    = Toolkit::CheckBoxButton::New();
+    const auto controlAccessible = Dali::Accessibility::Accessible::Get(checkBoxButton);
+    auto       attributes        = controlAccessible->GetAttributes();
+    DALI_TEST_CHECK(attributes.find(imageSrcKey) == attributes.end());
+  }
+
+  // Check that imgSrc is NOT added for non-image view w/ additional properties
+  {
+    const auto textLabel         = Toolkit::TextLabel::New("Hello");
+    const auto controlAccessible = Dali::Accessibility::Accessible::Get(textLabel);
+    auto       attributes        = controlAccessible->GetAttributes();
+    DALI_TEST_CHECK(attributes.find(imageSrcKey) == attributes.end());
+  }
+
+  // Check that imgSrc is added for image view w/ Url
+  {
+    const std::string imagePath         = "gallery-small-1.jpg";
+    const auto        imageView         = Toolkit::ImageView::New(imagePath);
+    const auto        controlAccessible = Dali::Accessibility::Accessible::Get(imageView);
+    auto              attributes        = controlAccessible->GetAttributes();
+    DALI_TEST_CHECK(attributes.find(imageSrcKey) != attributes.end());
+    DALI_TEST_EQUALS(attributes[imageSrcKey], imagePath, TEST_LOCATION);
+  }
+
+  // Check that imgSrc is added for image view w/ imageMap; single url case
+  {
+    const std::string imagePathForImageMap = "icon-edit.png";
+    Property::Map     imageMap;
+    imageMap[Toolkit::ImageVisual::Property::URL]            = imagePathForImageMap;
+    imageMap[Toolkit::ImageVisual::Property::RELEASE_POLICY] = Toolkit::ImageVisual::ReleasePolicy::DETACHED;
+
+    auto imageView = Toolkit::ImageView::New();
+    imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
+
+    const auto controlAccessible = Dali::Accessibility::Accessible::Get(imageView);
+    auto       attributes        = controlAccessible->GetAttributes();
+    DALI_TEST_CHECK(attributes.find(imageSrcKey) != attributes.end());
+    DALI_TEST_EQUALS(attributes[imageSrcKey], imagePathForImageMap, TEST_LOCATION);
+  }
+
+  // Check that imgSrc is added for image view w/ imageMap; url array returns first element
+  {
+    const std::string image1 = "application-icon-20.png";
+    const std::string image2 = "application-icon-21.png";
+    Property::Map     imageMap;
+    Property::Array   urls{image1, image2};
+    imageMap[Toolkit::ImageVisual::Property::URL]            = urls;
+    imageMap[Toolkit::ImageVisual::Property::RELEASE_POLICY] = Toolkit::ImageVisual::ReleasePolicy::DETACHED;
+
+    auto imageView = Toolkit::ImageView::New();
+    imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
+
+    const auto controlAccessible = Dali::Accessibility::Accessible::Get(imageView);
+    auto       attributes        = controlAccessible->GetAttributes();
+    DALI_TEST_CHECK(attributes.find(imageSrcKey) != attributes.end());
+    DALI_TEST_EQUALS(attributes[imageSrcKey], image1, TEST_LOCATION);
+  }
+
+  END_TEST;
+}
index 8788ade..4aef1f0 100644 (file)
 
 #include <dali/devel-api/actors/actor-devel.h>
 #include <dali/devel-api/adaptor-framework/window-devel.h>
+#include <dali/public-api/object/property-map.h>
 #include <dali/public-api/object/type-info.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/devel-api/asset-manager/asset-manager.h>
 #include <dali-toolkit/internal/controls/control/control-data-impl.h>
+#include <dali-toolkit/internal/visuals/image/image-visual.h>
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/public-api/controls/control.h>
 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
@@ -39,7 +41,9 @@ namespace Dali::Toolkit::DevelControl
 {
 namespace
 {
-static std::string GetLocaleText(std::string string, const char* domain = "dali-toolkit")
+constexpr const char* ATTR_IMG_SRC_KEY = "imgSrc";
+
+std::string GetLocaleText(std::string string, const char* domain = "dali-toolkit")
 {
 #ifdef DGETTEXT_ENABLED
   /*TODO: currently non-localized string is used as a key for translation lookup. In case the lookup key formatting is forced
@@ -50,7 +54,7 @@ static std::string GetLocaleText(std::string string, const char* domain = "dali-
 #endif
 }
 
-static Dali::Actor CreateHighlightIndicatorActor()
+Dali::Actor CreateHighlightIndicatorActor()
 {
   std::string focusBorderImagePath(AssetManager::GetDaliImagePath());
   focusBorderImagePath += "/keyboard_focus.9.png";
@@ -65,6 +69,45 @@ static Dali::Actor CreateHighlightIndicatorActor()
 
   return actor;
 }
+
+std::string FetchImageSrcFromMap(const Dali::Property::Map& imageMap)
+{
+  auto urlVal = imageMap.Find(Toolkit::ImageVisual::Property::URL);
+  if(urlVal)
+  {
+    if(urlVal->GetType() == Dali::Property::STRING)
+    {
+      return urlVal->Get<std::string>();
+    }
+    else if(urlVal->GetType() == Dali::Property::ARRAY)
+    {
+      auto urlArray = urlVal->GetArray();
+      if(urlArray && !urlArray->Empty())
+      {
+        // Returns first element if url is an array
+        return (*urlArray)[0].Get<std::string>();
+      }
+    }
+  }
+  return {};
+}
+
+std::string FetchImageSrc(const Toolkit::ImageView& imageView)
+{
+  const auto imageUrl = imageView.GetProperty<std::string>(Toolkit::ImageView::Property::IMAGE);
+  if(!imageUrl.empty())
+  {
+    return imageUrl;
+  }
+
+  const auto imageMap = imageView.GetProperty<Dali::Property::Map>(Toolkit::ImageView::Property::IMAGE);
+  if(!imageMap.Empty())
+  {
+    return FetchImageSrcFromMap(imageMap);
+  }
+  return {};
+}
+
 } // unnamed namespace
 
 ControlAccessible::ControlAccessible(Dali::Actor self)
@@ -235,6 +278,15 @@ Dali::Accessibility::Attributes ControlAccessible::GetAttributes() const
     result.emplace(automationIdKey, std::move(automationId));
   }
 
+  if(auto imageView = Toolkit::ImageView::DownCast(Self()))
+  {
+    auto imageSrc = FetchImageSrc(imageView);
+    if(!imageSrc.empty())
+    {
+      result.emplace(ATTR_IMG_SRC_KEY, std::move(imageSrc));
+    }
+  }
+
   // Add "class" if not present already
   if(result.find(classKey) == result.end())
   {