diff options
| author | Tadashi G. Takaoka <takaoka@google.com> | 2013-07-31 18:13:42 +0900 |
|---|---|---|
| committer | Tadashi G. Takaoka <takaoka@google.com> | 2013-08-01 18:18:33 +0900 |
| commit | b6cc3a85ab68cff2fae4c3858b48d9c5d7b45690 (patch) | |
| tree | 8c3595e06cce9e783c00af2629cee49998913b5f /java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java | |
| parent | a299421f67e6800e3d19021df275029f5d084a8b (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.java | 90 |
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 + ")"); + } +} |
