From cf8a3b82241a320f568f8448184df6da5bbcf152 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Mon, 30 Apr 2012 16:49:59 -0700 Subject: Accessibility should not change input focus behavior. 1. Removed a change in the input focus behavior I forgot to take out when submitted the main accessibility focus patch. Ugh.. bug:6320098 Change-Id: Id7942e8aac64ba4bf6df7e19f733fa70b368d1bb --- core/java/android/view/ViewRootImpl.java | 57 ++++++++++---------------------- 1 file changed, 18 insertions(+), 39 deletions(-) (limited to 'core/java/android/view/ViewRootImpl.java') diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index c5c7746d4d11..510e4d804680 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3013,24 +3013,23 @@ public final class ViewRootImpl implements ViewParent, // be when the window is first being added, and mFocused isn't // set yet. final View focused = mView.findFocus(); - if (focused != null) { - if (focused.isFocusableInTouchMode()) { - return true; - } + if (focused != null && !focused.isFocusableInTouchMode()) { + final ViewGroup ancestorToTakeFocus = findAncestorToTakeFocusInTouchMode(focused); if (ancestorToTakeFocus != null) { // there is an ancestor that wants focus after its descendants that // is focusable in touch mode.. give it focus return ancestorToTakeFocus.requestFocus(); + } else { + // nothing appropriate to have focus in touch mode, clear it out + mView.unFocus(); + mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(focused, null); + mFocusedView = null; + mOldFocusedView = null; + return true; } } - // nothing appropriate to have focus in touch mode, clear it out - mView.unFocus(); - mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(focused, null); - mFocusedView = null; - mOldFocusedView = null; - return true; } } return false; @@ -3061,45 +3060,25 @@ public final class ViewRootImpl implements ViewParent, private boolean leaveTouchMode() { if (mView != null) { - boolean inputFocusValid = false; if (mView.hasFocus()) { // i learned the hard way to not trust mFocusedView :) mFocusedView = mView.findFocus(); if (!(mFocusedView instanceof ViewGroup)) { // some view has focus, let it keep it - inputFocusValid = true; - } else if (((ViewGroup) mFocusedView).getDescendantFocusability() != + return false; + } else if (((ViewGroup)mFocusedView).getDescendantFocusability() != ViewGroup.FOCUS_AFTER_DESCENDANTS) { // some view group has focus, and doesn't prefer its children // over itself for focus, so let them keep it. - inputFocusValid = true; + return false; } } - // In accessibility mode we always have a view that has the - // accessibility focus and input focus follows it, i.e. we - // try to give input focus to the accessibility focused view. - if (!AccessibilityManager.getInstance(mView.mContext).isEnabled()) { - // If the current input focus is not valid, find the best view to give - // focus to in this brave new non-touch-mode world. - if (!inputFocusValid) { - final View focused = focusSearch(null, View.FOCUS_DOWN); - if (focused != null) { - return focused.requestFocus(View.FOCUS_DOWN); - } - } - } else { - // If the current input focus is not valid clear it but do not - // give it to another view since the accessibility focus is - // leading now and the input one follows. - if (!inputFocusValid) { - if (mFocusedView != null) { - mView.unFocus(); - mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mFocusedView, null); - mFocusedView = null; - mOldFocusedView = null; - return true; - } - } + + // find the best view to give focus to in this brave new non-touch-mode + // world + final View focused = focusSearch(null, View.FOCUS_DOWN); + if (focused != null) { + return focused.requestFocus(View.FOCUS_DOWN); } } return false; -- cgit v1.2.3