diff --git a/app/src/main/java/com/neo/speaktouch/utils/NodeValidator.kt b/app/src/main/java/com/neo/speaktouch/utils/NodeValidator.kt index 46da826e..ef30689b 100644 --- a/app/src/main/java/com/neo/speaktouch/utils/NodeValidator.kt +++ b/app/src/main/java/com/neo/speaktouch/utils/NodeValidator.kt @@ -79,7 +79,7 @@ object NodeValidator { if (mustReadContent(node)) return false - return isClickable(node) && hasReadableChild(node) + return hasInteraction(node) && hasReadableChild(node) } /** @@ -87,6 +87,9 @@ object NodeValidator { */ fun hasReadableChild(node: AccessibilityNodeInfoCompat): Boolean { + // List items must be announced individually + if (isExplorableCollection(node)) return false + if (!node.isVisibleToUser) return false for (child in node) { @@ -101,6 +104,9 @@ object NodeValidator { */ fun hasReadableContent(node: AccessibilityNodeInfoCompat): Boolean { + // List items must be announced individually + if (isExplorableCollection(node)) return false + if (!node.isVisibleToUser) return false if (node.isCheckable) return true @@ -111,6 +117,14 @@ object NodeValidator { return hasTextToRead(node) } + /** + * @return true if [node] is an explorable collection + */ + fun isExplorableCollection(node: AccessibilityNodeInfoCompat) : Boolean { + + return node.collectionInfo != null && node.childCount > 0 + } + /** * @return true if [node] cannot be read directly */ diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index 35d1aeb5..e5dfd1ce 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -29,3 +29,7 @@ dependencyResolutionManagement { } } } + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0" +} diff --git a/settings.gradle.kts b/settings.gradle.kts index c07aa791..e222c662 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,9 +34,7 @@ dependencyResolutionManagement { } } -plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0" -} + rootProject.name = "SpeakTouch" diff --git a/test/src/main/java/com/neo/test/fragment/ReadChildrenFragment.kt b/test/src/main/java/com/neo/test/fragment/ReadChildrenFragment.kt index 28326c9b..f84f5fc7 100644 --- a/test/src/main/java/com/neo/test/fragment/ReadChildrenFragment.kt +++ b/test/src/main/java/com/neo/test/fragment/ReadChildrenFragment.kt @@ -1,6 +1,61 @@ package com.neo.test.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView import com.neo.test.R +import com.neo.test.databinding.FragmentReadChildrenBinding -class ReadChildrenFragment : Fragment(R.layout.fragment_read_children) +class ReadChildrenFragment : Fragment(R.layout.fragment_read_children) { + + private var _binding: FragmentReadChildrenBinding? = null + private val binding get() = _binding!! + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + _binding = FragmentReadChildrenBinding.bind(view) + + binding.recyclerView.adapter = TestAdapter() + } + + override fun onDestroyView() { + super.onDestroyView() + + _binding = null + } +} + +private class TestAdapter : RecyclerView.Adapter() { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): Holder { + + return Holder( + LayoutInflater.from(parent.context).inflate( + android.R.layout.simple_list_item_1, + parent, + false + ) + ) + } + + override fun getItemCount() = 2 + + override fun onBindViewHolder(holder: Holder, position: Int) { + holder.text1.text = "test: $position" + } + + class Holder( + private val binding: View + ) : RecyclerView.ViewHolder(binding) { + + val text1 = itemView.findViewById(android.R.id.text1) + } +} diff --git a/test/src/main/res/layout/fragment_read_children.xml b/test/src/main/res/layout/fragment_read_children.xml index 9516e1dc..4e44cb3c 100644 --- a/test/src/main/res/layout/fragment_read_children.xml +++ b/test/src/main/res/layout/fragment_read_children.xml @@ -2,11 +2,15 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical" + android:padding="8dp"> @@ -58,4 +64,31 @@ + + + + + + + +