Fixed NPE in onAddFocusables
If the currently focused child is invalidated, findViewByPosition could
return null for valid focused child index. This caused onAddFocusables
crash when adding focusable views for the currently focused child.
Bug: 36738635
Test: Not reproduciable for now
Change-Id: I6c455f5b25fc8ce3cdd476fa5c6f19c76a302100
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
index 748c993..5ab9ba0 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -3188,9 +3188,13 @@
final View focused = recyclerView.findFocus();
final int focusedIndex = findImmediateChildIndex(focused);
final int focusedPos = getAdapterPositionByIndex(focusedIndex);
+ // Even if focusedPos != NO_POSITION, findViewByPosition could return null if the view
+ // is ignored or getLayoutPosition does not match the adapter position of focused view.
+ final View immediateFocusedChild = (focusedPos == NO_POSITION) ? null
+ : findViewByPosition(focusedPos);
// Add focusables of focused item.
- if (focusedPos != NO_POSITION) {
- findViewByPosition(focusedPos).addFocusables(views, direction, focusableMode);
+ if (immediateFocusedChild != null) {
+ immediateFocusedChild.addFocusables(views, direction, focusableMode);
}
if (mGrid == null || getChildCount() == 0) {
// no grid information, or no child, bail out.
@@ -3201,7 +3205,7 @@
return true;
}
// Add focusables of neighbor depending on the focus search direction.
- final int focusedRow = mGrid != null && focusedPos != NO_POSITION
+ final int focusedRow = mGrid != null && immediateFocusedChild != null
? mGrid.getLocation(focusedPos).row : NO_POSITION;
final int focusableCount = views.size();
int inc = movement == NEXT_ITEM || movement == NEXT_ROW ? 1 : -1;
@@ -3217,9 +3221,9 @@
if (child.getVisibility() != View.VISIBLE || !child.hasFocusable()) {
continue;
}
- // if there wasn't any focusing item, add the very first focusable
+ // if there wasn't any focused item, add the very first focusable
// items and stop.
- if (focusedPos == NO_POSITION) {
+ if (immediateFocusedChild == null) {
child.addFocusables(views, direction, focusableMode);
if (views.size() > focusableCount) {
break;