[Tizen][AT-SPI] Allow manual control of ReadingMaterial::listChildrenCount 89/293389/1
authorArtur Świgoń <a.swigon@samsung.com>
Thu, 25 May 2023 11:01:24 +0000 (13:01 +0200)
committerArtur Świgoń <a.swigon@samsung.com>
Thu, 25 May 2023 11:01:55 +0000 (13:01 +0200)
In complex UIs, where the logical number of children (i.e. not the number of
Actors) is difficult to determine, because (1) the children have differing
roles, or (2) the children are not direct descendants of the parent object, the
best-effort calculation done by the AT-SPI bridge (for the purpose of reading
"Showing %d items") will often be wrong.

This patch recognizes the "item_count" attribute as a high-priority, manual
setting of the number of children for the purpose of reading "Showing %d
items" with the provided value.

Change-Id: I2d027ea4930d7e9f63dee9fc4bb55a14caebf7b8

dali/internal/accessibility/bridge/bridge-accessible.cpp

index 0d0f9ed415711c969549e4d486ae965df2809710..8fa36d2ae9b84d26846940d44b20e3c243c2cf5a 100644 (file)
@@ -528,9 +528,16 @@ BridgeAccessible::ReadingMaterialType BridgeAccessible::GetReadingMaterial()
     }
   }
 
+  auto    attributes        = self->GetAttributes();
+  auto    itemCount         = attributes.find("item_count");
   auto    atspiRole         = self->GetRole();
   int32_t listChildrenCount = 0;
-  if(atspiRole == Role::DIALOG)
+  if(itemCount != attributes.end())
+  {
+    // "item_count" gives manual control to the application, so it has priority
+    listChildrenCount = std::atoi(itemCount->second.c_str());
+  }
+  else if(atspiRole == Role::DIALOG)
   {
     listChildrenCount = GetItemCountOfFirstDescendantContainer(self, Role::LIST, Role::LIST_ITEM, true);
   }
@@ -546,7 +553,6 @@ BridgeAccessible::ReadingMaterialType BridgeAccessible::GetReadingMaterial()
     nameFromTextInterface = textInterface->GetText(0, textInterface->GetCharacterCount());
   }
 
-  auto attributes        = self->GetAttributes();
   auto name              = self->GetName();
   auto role              = static_cast<uint32_t>(atspiRole);
   auto states            = self->GetStates();