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

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

Introduce multiple PointerTracker

Bug: 2910379
Change-Id: Iefafa2d30ad16f898a00664e4bf3e3e88dcd2cb2
parent 409731fb
Loading
Loading
Loading
Loading
+54 −26
Original line number Diff line number Diff line
@@ -39,11 +39,11 @@ import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup.LayoutParams;
import android.widget.PopupWindow;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -199,7 +199,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,
    /** Listener for {@link OnKeyboardActionListener}. */
    private OnKeyboardActionListener mKeyboardActionListener;

    private final PointerTracker mPointerTracker;
    private final ArrayList<PointerTracker> mPointerTrackers = new ArrayList<PointerTracker>();
    private final float mDebounceHysteresis;

    private final ProximityKeyDetector mProximityKeyDetector = new ProximityKeyDetector();
@@ -473,13 +473,14 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,
        final boolean ignoreMultitouch = true;
        mGestureDetector = new GestureDetector(getContext(), listener, null, ignoreMultitouch);
        mGestureDetector.setIsLongpressEnabled(false);

        mPointerTracker = new PointerTracker(mHandler, mProximityKeyDetector, this);
    }

    public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
        mKeyboardActionListener = listener;
        mPointerTracker.setOnKeyboardActionListener(listener);
        for (PointerTracker tracker : mPointerTrackers) {
            if (tracker != null)
                tracker.setOnKeyboardActionListener(listener);
        }
    }

    /**
@@ -509,7 +510,10 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,
        List<Key> keys = mKeyboard.getKeys();
        mKeys = keys.toArray(new Key[keys.size()]);
        mProximityKeyDetector.setKeyboard(keyboard, mKeys);
        mPointerTracker.setKeyboard(mKeys, mDebounceHysteresis);
        for (PointerTracker tracker : mPointerTrackers) {
            if (tracker != null)
                tracker.setKeyboard(mKeys, mDebounceHysteresis);
        }
        requestLayout();
        // Hint to reallocate the buffer if the size changed
        mKeyboardChanged = true;
@@ -779,7 +783,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,

        if (DEBUG) {
            if (mShowTouchPoints) {
                PointerTracker tracker = mPointerTracker;
                for (PointerTracker tracker : mPointerTrackers) {
                    if (tracker == null) continue;
                    int startX = tracker.getStartX();
                    int startY = tracker.getStartY();
                    int lastX = tracker.getLastX();
@@ -794,6 +799,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,
                    canvas.drawCircle((startX + lastX) / 2, (startY + lastY) / 2, 2, paint);
                }
            }
        }

        mDrawPending = false;
        mDirtyRect.setEmpty();
@@ -801,8 +807,9 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,

    // TODO: clean up this method.
    private void dismissKeyPreview() {
        mPointerTracker.updateKey(NOT_A_KEY);
        showPreview(NOT_A_KEY, mPointerTracker);
        for (PointerTracker tracker : mPointerTrackers)
            tracker.updateKey(NOT_A_KEY);
        showPreview(NOT_A_KEY, null);
    }

    public void showPreview(int keyIndex, PointerTracker tracker) {
@@ -813,7 +820,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,
            if (keyIndex == NOT_A_KEY) {
                mHandler.cancelPopupPreview();
                mHandler.dismissPreview(DELAY_AFTER_PREVIEW);
            } else {
            } else if (tracker != null) {
                mHandler.popupPreview(DELAY_BEFORE_PREVIEW, keyIndex, tracker);
            }
        }
@@ -1042,6 +1049,25 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,
        return (int)y + mVerticalCorrection - getPaddingTop();
    }

    private PointerTracker getPointerTracker(final int id) {
        final ArrayList<PointerTracker> pointers = mPointerTrackers;
        final Key[] keys = mKeys;
        final OnKeyboardActionListener listener = mKeyboardActionListener;

        // Create pointer trackers until we can get 'id+1'-th tracker, if needed.
        for (int i = pointers.size(); i <= id; i++) {
            final PointerTracker tracker =
                new PointerTracker(mHandler, mProximityKeyDetector, this);
            if (keys != null)
                tracker.setKeyboard(keys, mDebounceHysteresis);
            if (listener != null)
                tracker.setOnKeyboardActionListener(listener);
            pointers.add(tracker);
        }

        return pointers.get(id);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        // Convert multi-pointer up/down events to single up/down events to
@@ -1082,25 +1108,27 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener,
            // Up event will pass through.
        }

        // TODO: Should remove this implicit reference to id=0 pointer tracker in the future.
        PointerTracker tracker = getPointerTracker(0);
        int touchX = getTouchX(me.getX());
        int touchY = getTouchY(me.getY());
        if (pointerCount != mOldPointerCount) {
            if (pointerCount == 1) {
                // Send a down event for the latest pointer
                mPointerTracker.onDownEvent(touchX, touchY, eventTime);
                tracker.onDownEvent(touchX, touchY, eventTime);
                // If it's an up action, then deliver the up as well.
                if (action == MotionEvent.ACTION_UP) {
                    mPointerTracker.onUpEvent(touchX, touchY, eventTime);
                    tracker.onUpEvent(touchX, touchY, eventTime);
                }
            } else {
                // Send an up event for the last pointer
                mPointerTracker.onUpEvent(mOldPointerX, mOldPointerY, eventTime);
                tracker.onUpEvent(mOldPointerX, mOldPointerY, eventTime);
            }
            mOldPointerCount = pointerCount;
            return true;
        } else {
            if (pointerCount == 1) {
                mPointerTracker.onModifiedTouchEvent(action, touchX, touchY, eventTime);
                tracker.onModifiedTouchEvent(action, touchX, touchY, eventTime);
                mOldPointerX = touchX;
                mOldPointerY = touchY;
                return true;
+1 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ public class PointerTracker {
    private final StringBuilder mPreviewLabel = new StringBuilder(1);

    // pressed key
    private int mPreviousKey;
    private int mPreviousKey = NOT_A_KEY;

    public PointerTracker(UIHandler handler, ProximityKeyDetector keyDetector, UIProxy proxy) {
        if (proxy == null || handler == null || keyDetector == null)