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

Commit c7c6203f authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Introduce multiple PointerTracker" into gingerbread

parents d44b79eb a521b31d
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)