From 27093def8d5b13982b5dd4d949909ecdf7ec2fd6 Mon Sep 17 00:00:00 2001 From: alanv Date: Mon, 10 Sep 2012 11:10:25 -0700 Subject: [PATCH] Check for null ViewRootImpl when saving accessibility focus in ListView. Bug: 7135071 Change-Id: Ide8b6af38b7f1b9bb809e4f8b1c933cb5ddb5e86 --- core/java/android/widget/ListView.java | 34 +++++++++++++++----------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 938979a05faee..03507b5ffd8ad 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -38,6 +38,7 @@ import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.ViewRootImpl; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.RemoteViews.RemoteView; @@ -1590,20 +1591,25 @@ public class ListView extends AbsListView { } // Remember which child, if any, had accessibility focus. - final View accessFocusedView = getViewRootImpl().getAccessibilityFocusedHost(); - if (accessFocusedView != null) { - final View accessFocusedChild = findAccessibilityFocusedChild(accessFocusedView); - if (accessFocusedChild != null) { - if (!dataChanged || isDirectChildHeaderOrFooter(accessFocusedChild)) { - // If the views won't be changing, try to maintain focus - // on the current view host and (if applicable) its - // virtual view. - accessibilityFocusLayoutRestoreView = accessFocusedView; - accessibilityFocusLayoutRestoreNode = getViewRootImpl() - .getAccessibilityFocusedVirtualView(); - } else { - // Otherwise, try to maintain focus at the same position. - accessibilityFocusPosition = getPositionForView(accessFocusedChild); + final ViewRootImpl viewRootImpl = getViewRootImpl(); + if (viewRootImpl != null) { + final View accessFocusedView = viewRootImpl.getAccessibilityFocusedHost(); + if (accessFocusedView != null) { + final View accessFocusedChild = findAccessibilityFocusedChild( + accessFocusedView); + if (accessFocusedChild != null) { + if (!dataChanged || isDirectChildHeaderOrFooter(accessFocusedChild)) { + // If the views won't be changing, try to maintain + // focus on the current view host and (if + // applicable) its virtual view. + accessibilityFocusLayoutRestoreView = accessFocusedView; + accessibilityFocusLayoutRestoreNode = viewRootImpl + .getAccessibilityFocusedVirtualView(); + } else { + // Otherwise, try to maintain focus at the same + // position. + accessibilityFocusPosition = getPositionForView(accessFocusedChild); + } } } }