Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/maestro-android-testid.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"react-native-bottom-tabs": patch
---

Expose Android tab button test IDs as accessibility resource IDs for UIAutomator-based E2E tools.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.view.AccessibilityDelegateCompat
import androidx.core.view.MenuItemCompat
import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import androidx.core.view.forEachIndexed
import coil3.ImageLoader
import coil3.asDrawable
Expand Down Expand Up @@ -281,12 +284,7 @@ class ReactBottomNavigationView(context: Context) : LinearLayout(context) {
onTabSelected(menuItem)
}

item.testID?.let { testId ->
view.findViewById<View>(com.google.android.material.R.id.navigation_bar_item_content_container)
?.apply {
tag = testId
}
}
applyTestID(view, item.testID)
}
}
}
Expand All @@ -301,6 +299,28 @@ class ReactBottomNavigationView(context: Context) : LinearLayout(context) {
return bottomNavigation.menu.findItem(index) ?: bottomNavigation.menu.add(0, index, 0, title)
}

private fun applyTestID(itemView: View, testID: String?) {
val contentContainer =
itemView.findViewById<View>(com.google.android.material.R.id.navigation_bar_item_content_container)
?: return

contentContainer.tag = testID
if (testID == null) {
ViewCompat.setAccessibilityDelegate(contentContainer, null)
return
}

ViewCompat.setAccessibilityDelegate(contentContainer, object : AccessibilityDelegateCompat() {
override fun onInitializeAccessibilityNodeInfo(
host: View,
info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.viewIdResourceName = testID
}
})
}

private fun updateIconTintMode(menuItem: MenuItem, item: TabInfo) {
MenuItemCompat.setIconTintMode(
menuItem,
Expand Down
Loading