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

Commit 7b70f658 authored by Romain Guy's avatar Romain Guy
Browse files

Search for focusable views only after layout has happened when the window is first created.

Bug #2565564

Change-Id: I9eb58bbcba873ac1d6dc0b60b0de99e0e9979398
parent 083c715d
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -766,7 +766,7 @@ public final class ViewRoot extends Handler implements ViewParent,
                // make sure touch mode code executes by setting cached value
                // to opposite of the added touch mode.
                mAttachInfo.mInTouchMode = !mAddedTouchMode;
                ensureTouchModeLocally(mAddedTouchMode);
                ensureTouchModeLocally(mAddedTouchMode, false);
            } else {
                if (!mAttachInfo.mContentInsets.equals(mPendingContentInsets)) {
                    mAttachInfo.mContentInsets.set(mPendingContentInsets);
@@ -983,7 +983,7 @@ public final class ViewRoot extends Handler implements ViewParent,
            }

            boolean focusChangedDueToTouchMode = ensureTouchModeLocally(
                    (relayoutResult&WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE) != 0);
                    (relayoutResult&WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE) != 0, true);
            if (focusChangedDueToTouchMode || mWidth != host.mMeasuredWidth
                    || mHeight != host.mMeasuredHeight || contentInsetsChanged) {
                childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
@@ -1043,6 +1043,13 @@ public final class ViewRoot extends Handler implements ViewParent,
                startTime = SystemClock.elapsedRealtime();
            }
            host.layout(0, 0, host.mMeasuredWidth, host.mMeasuredHeight);
            if (mFirst) {
                if (mAddedTouchMode) {
                    enterTouchMode();
                } else {
                    leaveTouchMode();
                }
            }

            if (Config.DEBUG && ViewDebug.consistencyCheckEnabled) {
                if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) {
@@ -1892,7 +1899,7 @@ public final class ViewRoot extends Handler implements ViewParent,
                mAttachInfo.mHasWindowFocus = hasWindowFocus;
                if (hasWindowFocus) {
                    boolean inTouchMode = msg.arg2 != 0;
                    ensureTouchModeLocally(inTouchMode);
                    ensureTouchModeLocally(inTouchMode, true);

                    if (mGlWanted) {
                        checkEglErrors();
@@ -2002,16 +2009,17 @@ public final class ViewRoot extends Handler implements ViewParent,
        }

        // handle the change
        return ensureTouchModeLocally(inTouchMode);
        return ensureTouchModeLocally(inTouchMode, true);
    }

    /**
     * Ensure that the touch mode for this window is set, and if it is changing,
     * take the appropriate action.
     * @param inTouchMode Whether we want to be in touch mode.
     * @param dispatchFocus
     * @return True if the touch mode changed and focus changed was changed as a result
     */
    private boolean ensureTouchModeLocally(boolean inTouchMode) {
    private boolean ensureTouchModeLocally(boolean inTouchMode, boolean dispatchFocus) {
        if (DBG) Log.d("touchmode", "ensureTouchModeLocally(" + inTouchMode + "), current "
                + "touch mode is " + mAttachInfo.mInTouchMode);

@@ -2020,7 +2028,7 @@ public final class ViewRoot extends Handler implements ViewParent,
        mAttachInfo.mInTouchMode = inTouchMode;
        mAttachInfo.mTreeObserver.dispatchOnTouchModeChanged(inTouchMode);

        return (inTouchMode) ? enterTouchMode() : leaveTouchMode();
        return dispatchFocus && (inTouchMode) ? enterTouchMode() : leaveTouchMode();
    }

    private boolean enterTouchMode() {