From d2482b9603828bd545f5585b5d3937d63d1695a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20M=C4=85drzejewski?= Date: Tue, 29 Sep 2026 15:17:01 +0200 Subject: [PATCH 1/3] fix(android): give cluster markers a TalkBack label Cluster badges had no title, so TalkBack announced them as unlabeled markers. Co-authored-by: Cursor --- .../nitro/nitromaps/ClusterElement+AccessibilityLabel.kt | 6 ++++++ .../com/margelo/nitro/nitromaps/MapOverlayController.kt | 2 ++ package/android/src/main/res/values/strings.xml | 7 +++++++ 3 files changed, 15 insertions(+) create mode 100644 package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt create mode 100644 package/android/src/main/res/values/strings.xml diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt new file mode 100644 index 0000000..e4c3cb7 --- /dev/null +++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt @@ -0,0 +1,6 @@ +package com.margelo.nitro.nitromaps + +import android.content.res.Resources + +internal fun ClusterElement.Cluster.accessibilityLabel(resources: Resources): String = + resources.getQuantityString(R.plurals.better_maps_cluster_description, count, count) diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt index 405b094..5faeeec 100644 --- a/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt +++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt @@ -316,6 +316,7 @@ internal class MapOverlayController( .position(element.position) .icon(iconFactory.icon(element.count)) .anchor(0.5f, 0.5f) + .title(element.accessibilityLabel(context.resources)) if (shouldAnimate) { options.alpha(0f) } @@ -356,6 +357,7 @@ internal class MapOverlayController( marker.alpha = 1f marker.position = element.position marker.setIcon(iconFactory.icon(element.count)) + marker.title = element.accessibilityLabel(context.resources) clusterByKey[key] = element } } diff --git a/package/android/src/main/res/values/strings.xml b/package/android/src/main/res/values/strings.xml new file mode 100644 index 0000000..0a7fc28 --- /dev/null +++ b/package/android/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + %d marker in this cluster + %d markers in this cluster + + From a289ab7a1a7bc9a97e8c54f59d7783d28f4558cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20M=C4=85drzejewski?= Date: Tue, 29 Sep 2026 15:37:52 +0200 Subject: [PATCH 2/3] docs(android): record why the cluster TalkBack label uses the marker title A live marker can only update that text through setTitle. Co-authored-by: Cursor --- .../nitromaps/ClusterElement+AccessibilityLabel.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt index e4c3cb7..51bfc88 100644 --- a/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt +++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt @@ -2,5 +2,15 @@ package com.margelo.nitro.nitromaps import android.content.res.Resources +/** + * TalkBack label for a cluster. The badge may abbreviate the count. This uses + * the exact member count. + * + * The label is the marker title. play-services-maps 19.0.0 has + * `MarkerOptions.contentDescription`, but a live marker can change its + * accessibility text only through `Marker.setTitle`. Maps copies that title + * into the accessibility node's content description, including when the count + * changes on the retained-cluster path. + */ internal fun ClusterElement.Cluster.accessibilityLabel(resources: Resources): String = resources.getQuantityString(R.plurals.better_maps_cluster_description, count, count) From e806469c897f08a222cc92b57990ba3191862803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20M=C4=85drzejewski?= Date: Tue, 29 Sep 2026 15:40:00 +0200 Subject: [PATCH 3/3] Revert "docs(android): record why the cluster TalkBack label uses the marker title" This reverts commit a289ab7a1a7bc9a97e8c54f59d7783d28f4558cd. --- .../nitromaps/ClusterElement+AccessibilityLabel.kt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt index 51bfc88..e4c3cb7 100644 --- a/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt +++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/ClusterElement+AccessibilityLabel.kt @@ -2,15 +2,5 @@ package com.margelo.nitro.nitromaps import android.content.res.Resources -/** - * TalkBack label for a cluster. The badge may abbreviate the count. This uses - * the exact member count. - * - * The label is the marker title. play-services-maps 19.0.0 has - * `MarkerOptions.contentDescription`, but a live marker can change its - * accessibility text only through `Marker.setTitle`. Maps copies that title - * into the accessibility node's content description, including when the count - * changes on the retained-cluster path. - */ internal fun ClusterElement.Cluster.accessibilityLabel(resources: Resources): String = resources.getQuantityString(R.plurals.better_maps_cluster_description, count, count)