diff options
author | 2010-09-02 01:17:56 -0700 | |
---|---|---|
committer | 2010-09-02 01:17:56 -0700 | |
commit | 3491c877dd25df829e5e6541a72f375cc2842ea5 (patch) | |
tree | ad55dff9215e202de5d0481c3825bad6984d7651 /java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java | |
parent | 8f5b0ccc507ea7569fec0b8fb0260eedc486ed95 (diff) | |
parent | 40a05f62edc6cdedb4365a722b48a72826ef2bf6 (diff) | |
download | latinime-3491c877dd25df829e5e6541a72f375cc2842ea5.tar.gz latinime-3491c877dd25df829e5e6541a72f375cc2842ea5.tar.xz latinime-3491c877dd25df829e5e6541a72f375cc2842ea5.zip |
Merge "Queuing PointerTracker to support n-key roll-over and shift modifier." into gingerbread
Diffstat (limited to 'java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java')
-rw-r--r-- | java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java | 67 |
1 files changed, 64 insertions, 3 deletions
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 4daf6515f..30042d8a1 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -33,6 +33,7 @@ import android.inputmethodservice.Keyboard.Key; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; +import android.util.Log; import android.util.TypedValue; import android.view.GestureDetector; import android.view.Gravity; @@ -45,6 +46,7 @@ import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedList; import java.util.Map; /** @@ -62,6 +64,7 @@ import java.util.Map; */ public class LatinKeyboardBaseView extends View implements View.OnClickListener, PointerTracker.UIProxy { + private static final String TAG = "LatinKeyboardBaseView"; private static final boolean DEBUG = false; public static final int NOT_A_TOUCH_COORDINATE = -1; @@ -199,6 +202,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, private OnKeyboardActionListener mKeyboardActionListener; private final ArrayList<PointerTracker> mPointerTrackers = new ArrayList<PointerTracker>(); + private final PointerQueue mPointerQueue = new PointerQueue(); private final float mDebounceHysteresis; protected KeyDetector mKeyDetector = new ProximityKeyDetector(); @@ -316,6 +320,41 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, } }; + static class PointerQueue { + private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); + + public void add(PointerTracker tracker) { + mQueue.add(tracker); + } + + public int lastIndexOf(PointerTracker tracker) { + LinkedList<PointerTracker> queue = mQueue; + for (int index = queue.size() - 1; index >= 0; index--) { + PointerTracker t = queue.get(index); + if (t == tracker) + return index; + } + return -1; + } + + public void releasePointersOlderThan(PointerTracker tracker, long eventTime) { + LinkedList<PointerTracker> queue = mQueue; + int oldestPos = 0; + for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) { + if (t.isModifier()) { + oldestPos++; + } else { + t.onUpEvent(t.getLastX(), t.getLastY(), eventTime); + queue.remove(oldestPos); + } + } + } + + public void remove(PointerTracker tracker) { + mQueue.remove(tracker); + } + } + public LatinKeyboardBaseView(Context context, AttributeSet attrs) { this(context, attrs, R.attr.keyboardViewStyle); } @@ -1107,14 +1146,14 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: - tracker.onDownEvent(touchX, touchY, eventTime); + onDownEvent(tracker, touchX, touchY, eventTime); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: - tracker.onUpEvent(touchX, touchY, eventTime); + onUpEvent(tracker, touchX, touchY, eventTime); break; case MotionEvent.ACTION_CANCEL: - tracker.onCancelEvent(touchX, touchY, eventTime); + onCancelEvent(tracker, touchX, touchY, eventTime); break; } } @@ -1122,6 +1161,28 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, return true; } + private void onDownEvent(PointerTracker tracker, int touchX, int touchY, long eventTime) { + tracker.onDownEvent(touchX, touchY, eventTime); + mPointerQueue.add(tracker); + } + + private void onUpEvent(PointerTracker tracker, int touchX, int touchY, long eventTime) { + int index = mPointerQueue.lastIndexOf(tracker); + if (index >= 0) { + mPointerQueue.releasePointersOlderThan(tracker, eventTime); + } else { + Log.w(TAG, "onUpEvent: corresponding down event not found for pointer " + + tracker.mPointerId); + } + tracker.onUpEvent(touchX, touchY, eventTime); + mPointerQueue.remove(tracker); + } + + private void onCancelEvent(PointerTracker tracker, int touchX, int touchY, long eventTime) { + tracker.onCancelEvent(touchX, touchY, eventTime); + mPointerQueue.remove(tracker); + } + protected void swipeRight() { mKeyboardActionListener.swipeRight(); } |