diff options
| author | Svetoslav Ganov <svetoslavganov@google.com> | 2012-04-30 17:39:24 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-04-30 17:39:24 -0700 |
| commit | fb68fdb9c6e915e38ec5c7f4b0d526b613e4ea8b (patch) | |
| tree | c0ce6fdfd1d533d43bdad24fe8093eebca8d24fc /core/java/android/view/ViewRootImpl.java | |
| parent | f2dc6fc442385e08745762fcc2468ad89e2c78dc (diff) | |
| parent | cf8a3b82241a320f568f8448184df6da5bbcf152 (diff) | |
Merge "Accessibility should not change input focus behavior." into jb-dev
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 57 |
1 files changed, 18 insertions, 39 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 9565547610a6..e1d821f1022d 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3019,24 +3019,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; @@ -3067,45 +3066,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; |
