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

Commit b3f78979 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Cancel gesture typing by sliding out from keyboard

Bug: 7594165
Change-Id: I7849d763e49b57716e8418fb8b6f90eca3a5d2ec
parent befc1a05
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ public interface KeyboardActionListener {
     */
    public void onEndBatchInput(InputPointers batchPointers);

    public void onCancelBatchInput();

    /**
     * Called when user released a finger outside any key.
     */
@@ -107,6 +109,8 @@ public interface KeyboardActionListener {
        @Override
        public void onEndBatchInput(InputPointers batchPointers) {}
        @Override
        public void onCancelBatchInput() {}
        @Override
        public void onCancelInput() {}
        @Override
        public boolean onCustomRequest(int requestCode) {
+36 −19
Original line number Diff line number Diff line
@@ -305,8 +305,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
    // true if keyboard layout has been changed.
    private boolean mKeyboardLayoutHasBeenChanged;

    // true if event is already translated to a key action.
    private boolean mKeyAlreadyProcessed;
    // true if this pointer is no longer tracking touch event.
    private boolean mIsTrackingCanceled;

    // true if this pointer has been long-pressed and is showing a more keys panel.
    private boolean mIsShowingMoreKeysPanel;
@@ -517,7 +517,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        mKeyboard = keyDetector.getKeyboard();
        final int keyWidth = mKeyboard.mMostCommonKeyWidth;
        final int keyHeight = mKeyboard.mMostCommonKeyHeight;
        mGestureStrokeWithPreviewPoints.setKeyboardGeometry(keyWidth);
        mGestureStrokeWithPreviewPoints.setKeyboardGeometry(keyWidth, mKeyboard.mOccupiedHeight);
        final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY);
        if (newKey != mCurrentKey) {
            if (mDrawingProxy != null) {
@@ -730,15 +730,17 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        synchronized (sAggregratedPointers) {
            mGestureStrokeWithPreviewPoints.appendAllBatchPoints(sAggregratedPointers);
            if (getActivePointerTrackerCount() == 1) {
                sInGesture = false;
                sTimeRecorder.onEndBatchInput(eventTime);
                if (!mIsTrackingCanceled) {
                    if (DEBUG_LISTENER) {
                        Log.d(TAG, String.format("[%d] onEndBatchInput   : batchPoints=%d",
                                mPointerId, sAggregratedPointers.getPointerSize()));
                    }
                sInGesture = false;
                sTimeRecorder.onEndBatchInput(eventTime);
                    mListener.onEndBatchInput(sAggregratedPointers);
                }
            }
        }
        mDrawingProxy.showGesturePreviewTrail(this, isOldestTrackerInQueue(this));
    }

@@ -784,7 +786,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
                if (ProductionFlag.IS_EXPERIMENTAL) {
                    ResearchLogger.pointerTracker_onDownEvent(deltaT, distance * distance);
                }
                mKeyAlreadyProcessed = true;
                cancelTracking();
                return;
            }
        }
@@ -821,7 +823,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
                || (key != null && key.isModifier())
                || mKeyDetector.alwaysAllowsSlidingInput();
        mKeyboardLayoutHasBeenChanged = false;
        mKeyAlreadyProcessed = false;
        mIsTrackingCanceled = false;
        resetSlidingKeyInput();
        if (key != null) {
            // This onPress call may have changed keyboard layout. Those cases are detected at
@@ -853,7 +855,17 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
            final boolean isMajorEvent, final Key key) {
        final int gestureTime = (int)(eventTime - sGestureFirstDownTime);
        if (mIsDetectingGesture) {
            mGestureStrokeWithPreviewPoints.addPoint(x, y, gestureTime, isMajorEvent);
            final boolean onValidArea = mGestureStrokeWithPreviewPoints.addPointOnKeyboard(
                    x, y, gestureTime, isMajorEvent);
            if (!onValidArea) {
                sPointerTrackerQueue.cancelAllPointerTracker();
                if (DEBUG_LISTENER) {
                    Log.d(TAG, String.format("[%d] onCancelBatchInput: batchPoints=%d",
                            mPointerId, sAggregratedPointers.getPointerSize()));
                }
                mListener.onCancelBatchInput();
                return;
            }
            mayStartBatchInput(key);
            if (sInGesture) {
                mayUpdateBatchInput(eventTime, key);
@@ -865,7 +877,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        if (DEBUG_MOVE_EVENT) {
            printTouchEvent("onMoveEvent:", x, y, eventTime);
        }
        if (mKeyAlreadyProcessed) {
        if (mIsTrackingCanceled) {
            return;
        }

@@ -979,11 +991,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
                        + " detected sliding finger while multi touching", mPointerId));
            }
            onUpEvent(x, y, eventTime);
            mKeyAlreadyProcessed = true;
            cancelTracking();
            setReleasedKeyGraphics(oldKey);
        } else {
            if (!mIsDetectingGesture) {
                mKeyAlreadyProcessed = true;
                cancelTracking();
            }
            setReleasedKeyGraphics(oldKey);
        }
@@ -997,7 +1009,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
            onMoveToNewKey(null, x, y);
        } else {
            if (!mIsDetectingGesture) {
                mKeyAlreadyProcessed = true;
                cancelTracking();
            }
        }
    }
@@ -1060,7 +1072,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
            printTouchEvent("onPhntEvent:", getLastX(), getLastY(), eventTime);
        }
        onUpEventInternal(eventTime);
        mKeyAlreadyProcessed = true;
        cancelTracking();
    }

    private void onUpEventInternal(final long eventTime) {
@@ -1084,7 +1096,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
            return;
        }

        if (mKeyAlreadyProcessed) {
        if (mIsTrackingCanceled) {
            return;
        }
        if (currentKey != null && !currentKey.isRepeatable()) {
@@ -1098,8 +1110,13 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        onDownEvent(x, y, SystemClock.uptimeMillis(), handler);
    }

    @Override
    public void cancelTracking() {
        mIsTrackingCanceled = true;
    }

    public void onLongPressed() {
        mKeyAlreadyProcessed = true;
        cancelTracking();
        setReleasedKeyGraphics(mCurrentKey);
        sPointerTrackerQueue.remove(this);
    }
@@ -1202,6 +1219,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
        final Key key = mKeyDetector.detectHitKey(x, y);
        final String code = KeyDetector.printableCode(key);
        Log.d(TAG, String.format("[%d]%s%s %4d %4d %5d %s", mPointerId,
                (mKeyAlreadyProcessed ? "-" : " "), title, x, y, eventTime, code));
                (mIsTrackingCanceled ? "-" : " "), title, x, y, eventTime, code));
    }
}
+22 −3
Original line number Diff line number Diff line
@@ -27,6 +27,10 @@ public class GestureStroke {
    private static final boolean DEBUG = false;
    private static final boolean DEBUG_SPEED = false;

    // The height of extra area above the keyboard to draw gesture trails.
    // Proportional to the keyboard height.
    public static final float EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO = 0.25f;

    public static final int DEFAULT_CAPACITY = 128;

    private final int mPointerId;
@@ -37,6 +41,8 @@ public class GestureStroke {
    private final GestureStrokeParams mParams;

    private int mKeyWidth; // pixel
    private int mMinYCoordinate; // pixel
    private int mMaxYCoordinate; // pixel
    // Static threshold for starting gesture detection
    private int mDetectFastMoveSpeedThreshold; // pixel /sec
    private int mDetectFastMoveTime;
@@ -135,8 +141,10 @@ public class GestureStroke {
        mParams = params;
    }

    public void setKeyboardGeometry(final int keyWidth) {
    public void setKeyboardGeometry(final int keyWidth, final int keyboardHeight) {
        mKeyWidth = keyWidth;
        mMinYCoordinate = -(int)(keyboardHeight * EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO);
        mMaxYCoordinate = keyboardHeight - 1;
        // TODO: Find an appropriate base metric for these length. Maybe diagonal length of the key?
        mDetectFastMoveSpeedThreshold = (int)(keyWidth * mParams.mDetectFastMoveSpeedThreshold);
        mGestureDynamicDistanceThresholdFrom =
@@ -167,7 +175,7 @@ public class GestureStroke {
                    elapsedTimeAfterTyping, mAfterFastTyping ? " afterFastTyping" : ""));
        }
        final int elapsedTimeFromFirstDown = (int)(downTime - gestureFirstDownTime);
        addPoint(x, y, elapsedTimeFromFirstDown, true /* isMajorEvent */);
        addPointOnKeyboard(x, y, elapsedTimeFromFirstDown, true /* isMajorEvent */);
    }

    private int getGestureDynamicDistanceThreshold(final int deltaTime) {
@@ -277,7 +285,17 @@ public class GestureStroke {
        return dist;
    }

    public void addPoint(final int x, final int y, final int time, final boolean isMajorEvent) {
    /**
     * Add a touch event as a gesture point. Returns true if the touch event is on the valid
     * gesture area.
     * @param x the x-coordinate of the touch event
     * @param y the y-coordinate of the touch event
     * @param time the elapsed time in millisecond from the first gesture down
     * @param isMajorEvent false if this is a historical move event
     * @return true if the touch event is on the valid gesture area
     */
    public boolean addPointOnKeyboard(final int x, final int y, final int time,
            final boolean isMajorEvent) {
        final int size = mEventTimes.getLength();
        if (size <= 0) {
            // Down event
@@ -293,6 +311,7 @@ public class GestureStroke {
            updateIncrementalRecognitionSize(x, y, time);
            updateMajorEvent(x, y, time);
        }
        return y >= mMinYCoordinate && y < mMaxYCoordinate;
    }

    private void updateIncrementalRecognitionSize(final int x, final int y, final int time) {
+6 −4
Original line number Diff line number Diff line
@@ -56,8 +56,8 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke {
    }

    @Override
    public void setKeyboardGeometry(final int keyWidth) {
        super.setKeyboardGeometry(keyWidth);
    public void setKeyboardGeometry(final int keyWidth, final int keyboardHeight) {
        super.setKeyboardGeometry(keyWidth, keyboardHeight);
        final float sampleLength = keyWidth * MIN_PREVIEW_SAMPLE_LENGTH_RATIO_TO_KEY_WIDTH;
        mMinPreviewSampleLengthSquare = (int)(sampleLength * sampleLength);
    }
@@ -69,8 +69,9 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke {
    }

    @Override
    public void addPoint(final int x, final int y, final int time, final boolean isMajorEvent) {
        super.addPoint(x, y, time, isMajorEvent);
    public boolean addPointOnKeyboard(final int x, final int y, final int time,
            final boolean isMajorEvent) {
        final boolean onValidArea = super.addPointOnKeyboard(x, y, time, isMajorEvent);
        if (isMajorEvent || needsSampling(x, y)) {
            mPreviewEventTimes.add(time);
            mPreviewXCoordinates.add(x);
@@ -78,6 +79,7 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke {
            mLastX = x;
            mLastY = y;
        }
        return onValidArea;
    }

    public void appendPreviewStroke(final ResizableIntArray eventTimes,
+10 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ public final class PointerTrackerQueue {
        public boolean isModifier();
        public boolean isInSlidingKeyInput();
        public void onPhantomUpEvent(long eventTime);
        public void cancelTracking();
    }

    private static final int INITIAL_CAPACITY = 10;
@@ -182,6 +183,15 @@ public final class PointerTrackerQueue {
        return false;
    }

    public synchronized void cancelAllPointerTracker() {
        final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
        final int arraySize = mArraySize;
        for (int index = 0; index < arraySize; index++) {
            final Element element = expandableArray.get(index);
            element.cancelTracking();
        }
    }

    @Override
    public synchronized String toString() {
        final StringBuilder sb = new StringBuilder();
Loading