ReviewOS

also looking at this

craft-native/craft

fix(mobile): preserve native editing, navigation, and durable media requests

#369
Merged chris wants to merge codex/native-vertical-scroll-tab-swipes into main
36 files +864 -185

Review threads live on the whole diff, not on one commit, so none are shown here - a thread's line means something in the branch's final form, and painting it into an intermediate step would put it on code it is not about.

packages/android/fixtures/native-navigation/NativeNavigationTest.ktmodified+13-0
Changes to packages/android/fixtures/native-navigation/NativeNavigationTest.kt
@@ -755,6 +755,19 @@ class NativeNavigationTest {
755755 throw AssertionError("The native accessibility tree did not expose STX testID $id")
756756 }
757757 try {
758 awaitView(activity, "home-title")
759 val homeTab = node("craft-tab-/")
760 assertEquals("Home", homeTab.contentDescription.toString())
761 assertEquals(Button::class.java.name, homeTab.className.toString())
762 assertTrue(homeTab.isSelected)
763 val detailsTab = node("craft-tab-/details")
764 assertEquals("Details", detailsTab.contentDescription.toString())
765 assertFalse(detailsTab.isSelected)
766 assertTrue("The native tab did not accept its accessibility click",
767 detailsTab.performAction(AccessibilityNodeInfo.ACTION_CLICK))
768 awaitView(activity, "details-title")
769 assertTrue(node("craft-tab-/details").isSelected)
770 assertTrue(node("craft-tab-/").performAction(AccessibilityNodeInfo.ACTION_CLICK))
758771 awaitView(activity, "home-title")
759772 val title = node("home-title")
760773 assertEquals("Home", title.text.toString())
packages/android/templates/CraftNativeShell.kt.templatemodified+14-0
Changes to packages/android/templates/CraftNativeShell.kt.template
@@ -21,6 +21,9 @@ import android.widget.FrameLayout
2121import android.widget.ImageView
2222import android.widget.LinearLayout
2323import android.widget.TextView
24import androidx.core.view.AccessibilityDelegateCompat
25import androidx.core.view.ViewCompat
26import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
2427import androidx.core.content.ContextCompat
2528import androidx.security.crypto.EncryptedSharedPreferences
2629import androidx.security.crypto.MasterKey
@@ -810,7 +813,17 @@ internal class CraftNativeChrome(context: Context, private val tabs: List<CraftN
810813 cell.background = rippleBackground()
811814 cell.contentDescription = tab.title
812815 cell.tag = "craft-tab-${tab.id}"
816 cell.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
817 ViewCompat.setAccessibilityDelegate(cell, object : AccessibilityDelegateCompat() {
818 override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfoCompat) {
819 super.onInitializeAccessibilityNodeInfo(host, info)
820 info.viewIdResourceName = "craft-tab-${tab.id}"
821 info.className = android.widget.Button::class.java.name
822 info.isSelected = host.isSelected
823 }
824 })
813825 val icon = TextView(context)
826 icon.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
814827 icon.text = CraftNativeSymbols.glyph(tab.symbol)
815828 icon.textSize = 22f
816829 icon.minWidth = dp(26)
@@ -818,6 +831,7 @@ internal class CraftNativeChrome(context: Context, private val tabs: List<CraftN
818831 icon.gravity = Gravity.CENTER
819832 icon.includeFontPadding = false
820833 val label = TextView(context)
834 label.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
821835 label.text = tab.title
822836 label.textSize = 12f
823837 label.fontFeatureSettings = "tnum"