Skip to content

Commit bed47d4

Browse files
committed
Fix text selectable node crash
- Guard AccessibilityNodeInfo.isTextSelectable behind the API 33 runtime check so Android 12 devices do not crash while classifying nodes - Preserve text-selectable capability reporting on supported Android versions with a defensive fallback for OEM framework issues - Add classifier coverage for text-selectable facts so capability propagation stays covered 🤖 Auto-generated
1 parent b5851f5 commit bed47d4

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

app/src/main/java/com/enaboapps/switchify/service/techniques/nodes/NodeCapabilityClassifier.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.enaboapps.switchify.service.techniques.nodes
22

33
import android.graphics.Rect
4+
import android.os.Build
45
import android.view.accessibility.AccessibilityNodeInfo
56
import android.view.accessibility.AccessibilityWindowInfo
67

@@ -67,7 +68,7 @@ internal object NodeCapabilityClassifier {
6768
isScrollable = nodeInfo.isScrollable,
6869
isCheckable = nodeInfo.isCheckable,
6970
isChecked = nodeInfo.isCheckedCompat(),
70-
isTextSelectable = nodeInfo.isTextSelectable,
71+
isTextSelectable = nodeInfo.isTextSelectableCompat(),
7172
actionIds = nodeInfo.actionList?.map { it.id }?.toSet().orEmpty(),
7273
hasCollectionInfo = collectionInfo != null,
7374
hasCollectionItemInfo = collectionItemInfo != null,
@@ -192,3 +193,11 @@ private fun Rect?.hasUsableHighlightBounds(): Boolean {
192193
private fun AccessibilityNodeInfo.isCheckedCompat(): Boolean {
193194
return isChecked
194195
}
196+
197+
private fun AccessibilityNodeInfo.isTextSelectableCompat(): Boolean {
198+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
199+
runCatching { isTextSelectable }.getOrDefault(false)
200+
} else {
201+
false
202+
}
203+
}

app/src/test/java/com/enaboapps/switchify/service/techniques/nodes/NodeCapabilityClassifierTest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,13 @@ class NodeCapabilityClassifierTest {
223223
assertEquals(NodeRole.TextOnly, capabilities.role)
224224
assertFalse(capabilities.isCurrentlyScannable)
225225
}
226+
227+
@Test
228+
fun textSelectableFactIsRecorded() {
229+
val capabilities = NodeCapabilityClassifier.classifyFacts(
230+
RawNodeCapabilityFacts(isTextSelectable = true)
231+
)
232+
233+
assertTrue(capabilities.isTextSelectable)
234+
}
226235
}

0 commit comments

Comments
 (0)