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

Commit ac69ab40 authored by Tom Ouyang's avatar Tom Ouyang
Browse files

Refactor more keys menu framework (part 3)

Make it possible to re-enter gesture input even after triggering the long-press
menu. This is useful for new users who may pause at the start of a word. Works
for both single and bi-manual gestures.

Bug: 7595193
Change-Id: Ieaecfd5385ed6c10ae9347b99c2e35a0de5e895d
parent be68b41c
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -1013,7 +1013,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy,
    public void closing() {
        dismissAllKeyPreviews();
        cancelAllMessages();

        onCancelMoreKeysPanel();
        mInvalidateAllKeys = true;
        requestLayout();
    }
@@ -1031,11 +1031,11 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy,
        return (mMoreKeysPanel != null);
    }

    public boolean dismissMoreKeysPanel() {
    @Override
    public void onCancelMoreKeysPanel() {
        if (isShowingMoreKeysPanel()) {
            return mMoreKeysPanel.dismissMoreKeysPanel();
            mMoreKeysPanel.dismissMoreKeysPanel();
        }
        return false;
    }

    @Override
+7 −1
Original line number Diff line number Diff line
@@ -844,10 +844,16 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
    @Override
    public void closing() {
        super.closing();
        dismissMoreKeysPanel();
        onCancelMoreKeysPanel();
        mMoreKeysPanelCache.clear();
    }

    @Override
    public void onCancelMoreKeysPanel() {
        super.onCancelMoreKeysPanel();
        PointerTracker.dismissAllMoreKeysPanels();
    }

    @Override
    public boolean onDismissMoreKeysPanel() {
        dimEntireKeyboard(false /* dimmed */);
+8 −0
Original line number Diff line number Diff line
@@ -120,7 +120,15 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel

    @Override
    public void onMoveEvent(int x, int y, final int pointerId, long eventTime) {
        if (mActivePointerId != pointerId) {
            return;
        }
        final boolean hasOldKey = (mCurrentKey != null);
        onMoveKeyInternal(x, y, pointerId);
        if (hasOldKey && mCurrentKey == null) {
            // If the pointer has moved too far away from any target then cancel the panel.
            mController.onCancelMoreKeysPanel();
        }
    }

    @Override
+5 −0
Original line number Diff line number Diff line
@@ -30,6 +30,11 @@ public interface MoreKeysPanel {
         * Remove the current {@link MoreKeysPanel} from the target view.
         */
        public boolean onDismissMoreKeysPanel();

        /**
         * Instructs the parent to cancel the panel (e.g., when entering a different input mode).
         */
        public void onCancelMoreKeysPanel();
    }

    /**
+27 −4
Original line number Diff line number Diff line
@@ -412,6 +412,17 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        }
    }

    public static void dismissAllMoreKeysPanels() {
        final int trackersSize = sTrackers.size();
        for (int i = 0; i < trackersSize; ++i) {
            final PointerTracker tracker = sTrackers.get(i);
            if (tracker.isShowingMoreKeysPanel()) {
                tracker.mMoreKeysPanel.dismissMoreKeysPanel();
                tracker.mMoreKeysPanel = null;
            }
        }
    }

    private PointerTracker(final int id, final KeyEventHandler handler) {
        if (handler == null) {
            throw new NullPointerException();
@@ -715,6 +726,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
            sLastRecognitionPointSize = 0;
            sLastRecognitionTime = 0;
            mListener.onStartBatchInput();
            dismissAllMoreKeysPanels();
        }
        mTimerProxy.cancelLongPressTimer();
        mDrawingProxy.showGesturePreviewTrail(this, isOldestTrackerInQueue(this));
@@ -846,7 +858,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        }
        // A gesture should start only from a non-modifier key.
        mIsDetectingGesture = (mKeyboard != null) && mKeyboard.mId.isAlphabetKeyboard()
                && !isShowingMoreKeysPanel() && key != null && !key.isModifier();
                && key != null && !key.isModifier();
        if (mIsDetectingGesture) {
            if (getActivePointerTrackerCount() == 1) {
                sGestureFirstDownTime = eventTime;
@@ -907,6 +919,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
                cancelBatchInput();
                return;
            }
            // If the MoreKeysPanel is showing then do not attempt to enter gesture mode. However,
            // the gestured touch points are still being recorded in case the panel is dismissed.
            if (isShowingMoreKeysPanel()) {
                return;
            }
            mayStartBatchInput(key);
            if (sInGesture) {
                mayUpdateBatchInput(eventTime, key);
@@ -926,7 +943,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
            final int translatedX = mMoreKeysPanel.translateX(x);
            final int translatedY = mMoreKeysPanel.translateY(y);
            mMoreKeysPanel.onMoveEvent(translatedX, translatedY, mPointerId, eventTime);
            return;
        }

        if (sShouldHandleGesture && me != null) {
@@ -941,6 +957,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
                        false /* isMajorEvent */, null);
            }
        }

        if (isShowingMoreKeysPanel()) {
            // Do not handle sliding keys (or show key pop-ups) when the MoreKeysPanel is visible.
            return;
        }
        onMoveEventInternal(x, y, eventTime);
    }

@@ -1199,9 +1220,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        mTimerProxy.cancelKeyTimers();
        setReleasedKeyGraphics(mCurrentKey);
        resetSlidingKeyInput();
        if (isShowingMoreKeysPanel()) {
            mMoreKeysPanel.dismissMoreKeysPanel();
            mMoreKeysPanel = null;
        }
    }

    private void startRepeatKey(final Key key) {
        if (key != null && key.isRepeatable() && !sInGesture) {
Loading