Skip to content

Commit

Permalink
fix: set focus to last element of group if we move from field that do…
Browse files Browse the repository at this point in the history
…esn't belong to the group (Android)
  • Loading branch information
kirillzyusko committed Feb 10, 2024
1 parent c728ae3 commit 63138cd
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,36 +62,34 @@ object ViewHierarchyNavigator {
// Iterate over siblings in the specified direction
while (i != end) {
val nextChild = parentViewGroup.getChildAt(i)
findEditTextOrGoDeeper(nextChild)?.let { return it } // Return if an EditText is found
findEditTextOrGoDeeper(nextChild, direction)?.let { return it } // Return if an EditText is found
i += direction
}

// Recurse to the parent's parent if no sibling EditText is found
return findEditTextInDirection(parentViewGroup, direction)
}

private fun findEditTextInHierarchy(viewGroup: ViewGroup): EditText? {
for (i in 0 until viewGroup.childCount) {
val child = viewGroup.getChildAt(i)

val editText = findEditTextOrGoDeeper(child)
private fun findEditTextInHierarchy(viewGroup: ViewGroup, direction: Int): EditText? {
val range = if (direction > 0) 0 until viewGroup.childCount else viewGroup.childCount - 1 downTo 0

if (editText != null) {
return editText
}
for (i in range) {
val child = viewGroup.getChildAt(i)
findEditTextOrGoDeeper(child, direction)?.let { return it }
}

return null // No EditText found in the current view group
// No EditText found in the current view group
return null
}

private fun findEditTextOrGoDeeper(child: View): EditText? {
private fun findEditTextOrGoDeeper(child: View, direction: Int): EditText? {
var result: EditText? = null

if (child is EditText && child.isEnabled) {
result = child
} else if (child is ViewGroup) {
// If the child is a ViewGroup, check its children recursively
result = findEditTextInHierarchy(child)
result = findEditTextInHierarchy(child, direction)
}

return result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,17 @@ class ViewHierarchyNavigatorTest {
assertTrue(editText6.hasFocus())
}

@Test
fun `setFocusTo to 'prev' should set focus relatively to current group`() {
editText7.requestFocus()

ViewHierarchyNavigator.setFocusTo("prev", editText7)

ShadowLooper.runUiThreadTasksIncludingDelayedTasks()

assertTrue(editText6.hasFocus())
}

@Test
fun `setFocusTo to 'next' should correctly exit from current group`() {
editText7.requestFocus()
Expand All @@ -140,4 +151,37 @@ class ViewHierarchyNavigatorTest {

assertTrue(editText8.hasFocus())
}

@Test
fun `setFocusTo to 'prev' should set focus to last element in group`() {
editText8.requestFocus()

ViewHierarchyNavigator.setFocusTo("prev", editText8)

ShadowLooper.runUiThreadTasksIncludingDelayedTasks()

assertTrue(editText7.hasFocus())
}

@Test
fun `setFocusTo to 'next' should do nothing if it's last element`() {
editText13.requestFocus()

ViewHierarchyNavigator.setFocusTo("next", editText13)

ShadowLooper.runUiThreadTasksIncludingDelayedTasks()

assertTrue(editText13.hasFocus())
}

@Test
fun `setFocusTo to 'prev' should do nothing if it's first element`() {
editText1.requestFocus()

ViewHierarchyNavigator.setFocusTo("prev", editText1)

ShadowLooper.runUiThreadTasksIncludingDelayedTasks()

assertTrue(editText1.hasFocus())
}
}

0 comments on commit 63138cd

Please sign in to comment.