Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4d08a9c authored by Alan Viverette's avatar Alan Viverette Committed by The Android Automerger
Browse files

Use clearFocus() when entering touch mode

Calling unFocus() leaves the view hierarchy in an inconsistent
state. This is okay in ViewGroup, where the state is manually
updated, but causes issues in ViewRootImpl.

BUG: 9983358
Change-Id: Id63e62962d895e6bd4f816f202dcf77254ceab4e
parent 2b763ff2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -4588,6 +4588,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    /**
     * Called internally by the view system when a new view is getting focus.
     * This is what clears the old focus.
     * <p>
     * <b>NOTE:</b> The parent view's focused child must be updated manually
     * after calling this method. Otherwise, the view hierarchy may be left in
     * an inconstent state.
     */
    void unFocus() {
        if (DBG) {
+17 −18
Original line number Diff line number Diff line
@@ -3250,27 +3250,26 @@ public final class ViewRootImpl implements ViewParent,
    }

    private boolean enterTouchMode() {
        if (mView != null) {
            if (mView.hasFocus()) {
        if (mView != null && mView.hasFocus()) {
            // note: not relying on mFocusedView here because this could
            // be when the window is first being added, and mFocused isn't
            // set yet.
            final View focused = mView.findFocus();
            if (focused != null && !focused.isFocusableInTouchMode()) {
                    final ViewGroup ancestorToTakeFocus =
                            findAncestorToTakeFocusInTouchMode(focused);
                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
                    // 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
                        focused.unFocus();
                    // nothing appropriate to have focus in touch mode, clear it
                    // out
                    focused.clearFocus();
                    return true;
                }
            }
        }
        }
        return false;
    }