summaryrefslogtreecommitdiff
path: root/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java
diff options
context:
space:
mode:
authorTadashi G. Takaoka <takaoka@google.com>2013-07-31 18:13:42 +0900
committerTadashi G. Takaoka <takaoka@google.com>2013-08-01 18:18:33 +0900
commitb6cc3a85ab68cff2fae4c3858b48d9c5d7b45690 (patch)
tree8c3595e06cce9e783c00af2629cee49998913b5f /java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java
parenta299421f67e6800e3d19021df275029f5d084a8b (diff)
Move non-distinct multitouch support to a separate class
Move code that support non-distinct multitouch screen device to the NonDistinchMultitouchHelper class. Change-Id: I2e44f782b83dbcd095ee8e51c36b0766da0cd457
Diffstat (limited to 'java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java')
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java90
1 files changed, 90 insertions, 0 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java b/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java
new file mode 100644
index 000000000..53fff6986
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.internal;
+
+import android.util.Log;
+import android.view.MotionEvent;
+
+import com.android.inputmethod.keyboard.Key;
+import com.android.inputmethod.keyboard.PointerTracker;
+import com.android.inputmethod.keyboard.PointerTracker.KeyEventHandler;
+import com.android.inputmethod.latin.utils.CoordinateUtils;
+
+public final class NonDistinctMultitouchHelper {
+ private static final String TAG = NonDistinctMultitouchHelper.class.getSimpleName();
+
+ private int mOldPointerCount = 1;
+ private Key mOldKey;
+
+ public void processMotionEvent(final MotionEvent me, final KeyEventHandler keyEventHandler) {
+ final int pointerCount = me.getPointerCount();
+ final int oldPointerCount = mOldPointerCount;
+ mOldPointerCount = pointerCount;
+ // Ignore continuous multitouch events because we can't trust the coordinates in mulitouch
+ // events.
+ if (pointerCount > 1 && oldPointerCount > 1) {
+ return;
+ }
+
+ final int action = me.getActionMasked();
+ final int index = me.getActionIndex();
+ final long eventTime = me.getEventTime();
+ final int x = (int)me.getX(index);
+ final int y = (int)me.getY(index);
+ // Use only main (id=0) pointer tracker.
+ final PointerTracker mainTracker = PointerTracker.getPointerTracker(0, keyEventHandler);
+
+ // In single touch.
+ if (oldPointerCount == 1 && pointerCount == 1) {
+ mainTracker.processMotionEvent(action, x, y, eventTime, keyEventHandler);
+ return;
+ }
+
+ // Single-touch to multi-touch transition.
+ if (oldPointerCount == 1 && pointerCount == 2) {
+ // Send an up event for the last pointer, be cause we can't trust the corrdinates of
+ // this multitouch event.
+ final int[] lastCoords = CoordinateUtils.newInstance();
+ mainTracker.getLastCoordinates(lastCoords);
+ mOldKey = mainTracker.getKeyOn(
+ CoordinateUtils.x(lastCoords), CoordinateUtils.y(lastCoords));
+ // TODO: Stop calling PointerTracker.onUpEvent directly.
+ mainTracker.onUpEvent(
+ CoordinateUtils.x(lastCoords), CoordinateUtils.y(lastCoords), eventTime);
+ return;
+ }
+
+ // Multi-touch to single touch transition.
+ if (oldPointerCount == 2 && pointerCount == 1) {
+ // Send a down event for the latest pointer if the key is different from the
+ // previous key.
+ final Key newKey = mainTracker.getKeyOn(x, y);
+ if (mOldKey != newKey) {
+ // TODO: Stop calling PointerTracker.onDownEvent directly.
+ mainTracker.onDownEvent(x, y, eventTime, keyEventHandler);
+ if (action == MotionEvent.ACTION_UP) {
+ // TODO: Stop calling PointerTracker.onUpEvent directly.
+ mainTracker.onUpEvent(x, y, eventTime);
+ }
+ }
+ return;
+ }
+
+ Log.w(TAG, "Unknown touch panel behavior: pointer count is "
+ + pointerCount + " (previously " + oldPointerCount + ")");
+ }
+}