[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 0d0f9ed..8fa36d2 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();