am fb68fdb9: Merge "Accessibility should not change input focus behavior." into jb-dev
* commit 'fb68fdb9c6e915e38ec5c7f4b0d526b613e4ea8b': Accessibility should not change input focus behavior.
This commit is contained in:
@@ -3019,24 +3019,23 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
// be when the window is first being added, and mFocused isn't
|
// be when the window is first being added, and mFocused isn't
|
||||||
// set yet.
|
// set yet.
|
||||||
final View focused = mView.findFocus();
|
final View focused = mView.findFocus();
|
||||||
if (focused != null) {
|
if (focused != null && !focused.isFocusableInTouchMode()) {
|
||||||
if (focused.isFocusableInTouchMode()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
final ViewGroup ancestorToTakeFocus =
|
final ViewGroup ancestorToTakeFocus =
|
||||||
findAncestorToTakeFocusInTouchMode(focused);
|
findAncestorToTakeFocusInTouchMode(focused);
|
||||||
if (ancestorToTakeFocus != null) {
|
if (ancestorToTakeFocus != null) {
|
||||||
// there is an ancestor that wants focus after its descendants that
|
// there is an ancestor that wants focus after its descendants that
|
||||||
// is focusable in touch mode.. give it focus
|
// is focusable in touch mode.. give it focus
|
||||||
return ancestorToTakeFocus.requestFocus();
|
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;
|
return false;
|
||||||
@@ -3067,45 +3066,25 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
|
|
||||||
private boolean leaveTouchMode() {
|
private boolean leaveTouchMode() {
|
||||||
if (mView != null) {
|
if (mView != null) {
|
||||||
boolean inputFocusValid = false;
|
|
||||||
if (mView.hasFocus()) {
|
if (mView.hasFocus()) {
|
||||||
// i learned the hard way to not trust mFocusedView :)
|
// i learned the hard way to not trust mFocusedView :)
|
||||||
mFocusedView = mView.findFocus();
|
mFocusedView = mView.findFocus();
|
||||||
if (!(mFocusedView instanceof ViewGroup)) {
|
if (!(mFocusedView instanceof ViewGroup)) {
|
||||||
// some view has focus, let it keep it
|
// some view has focus, let it keep it
|
||||||
inputFocusValid = true;
|
return false;
|
||||||
} else if (((ViewGroup) mFocusedView).getDescendantFocusability() !=
|
} else if (((ViewGroup)mFocusedView).getDescendantFocusability() !=
|
||||||
ViewGroup.FOCUS_AFTER_DESCENDANTS) {
|
ViewGroup.FOCUS_AFTER_DESCENDANTS) {
|
||||||
// some view group has focus, and doesn't prefer its children
|
// some view group has focus, and doesn't prefer its children
|
||||||
// over itself for focus, so let them keep it.
|
// 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
|
// find the best view to give focus to in this brave new non-touch-mode
|
||||||
// try to give input focus to the accessibility focused view.
|
// world
|
||||||
if (!AccessibilityManager.getInstance(mView.mContext).isEnabled()) {
|
final View focused = focusSearch(null, View.FOCUS_DOWN);
|
||||||
// If the current input focus is not valid, find the best view to give
|
if (focused != null) {
|
||||||
// focus to in this brave new non-touch-mode world.
|
return focused.requestFocus(View.FOCUS_DOWN);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user