diff options
author | Dianne Hackborn <hackbod@google.com> | 2009-08-12 17:13:55 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2009-08-12 17:13:55 -0700 |
commit | 2a2b34434a256cf0e035e97580b310f997f9fcd3 (patch) | |
tree | 87a8a6f72bcc92fa43c94c62d44c7f69d5e4b8f6 /services | |
parent | 72c82ab9923025a91bbabb32e56bfea27bfd083b (diff) | |
download | frameworks_base-2a2b34434a256cf0e035e97580b310f997f9fcd3.zip frameworks_base-2a2b34434a256cf0e035e97580b310f997f9fcd3.tar.gz frameworks_base-2a2b34434a256cf0e035e97580b310f997f9fcd3.tar.bz2 |
Fix issue #2045895: Finger IDs are not tracked properly.
This was a problem with not dealing well with how the driver was
reporting data in the old touch protocol.
Also fixed issue with not correctly rotating non-primary touches.
Diffstat (limited to 'services')
-rw-r--r-- | services/java/com/android/server/InputDevice.java | 8 | ||||
-rw-r--r-- | services/java/com/android/server/KeyInputQueue.java | 35 |
2 files changed, 29 insertions, 14 deletions
diff --git a/services/java/com/android/server/InputDevice.java b/services/java/com/android/server/InputDevice.java index cb23c45..e1bce73 100644 --- a/services/java/com/android/server/InputDevice.java +++ b/services/java/com/android/server/InputDevice.java @@ -42,6 +42,10 @@ public class InputDevice { long mKeyDownTime = 0; int mMetaKeysState = 0; + // For use by KeyInputQueue for keeping track of the current touch + // data in the old non-multi-touch protocol. + final int[] curTouchVals = new int[MotionEvent.NUM_SAMPLE_DATA * 2]; + final MotionState mAbs = new MotionState(0, 0); final MotionState mRel = new MotionState(TRACKBALL_MOVEMENT_THRESHOLD, TRACKBALL_MOVEMENT_THRESHOLD); @@ -410,7 +414,7 @@ public class InputDevice { switch (orientation) { case Surface.ROTATION_90: { - final float temp = reportData[MotionEvent.SAMPLE_X]; + final float temp = reportData[j + MotionEvent.SAMPLE_X]; reportData[j + MotionEvent.SAMPLE_X] = reportData[j + MotionEvent.SAMPLE_Y]; reportData[j + MotionEvent.SAMPLE_Y] = w-temp; break; @@ -421,7 +425,7 @@ public class InputDevice { break; } case Surface.ROTATION_270: { - final float temp = reportData[i + MotionEvent.SAMPLE_X]; + final float temp = reportData[j + MotionEvent.SAMPLE_X]; reportData[j + MotionEvent.SAMPLE_X] = h-reportData[j + MotionEvent.SAMPLE_Y]; reportData[j + MotionEvent.SAMPLE_Y] = temp; break; diff --git a/services/java/com/android/server/KeyInputQueue.java b/services/java/com/android/server/KeyInputQueue.java index dc7d22b..7ca12f2 100644 --- a/services/java/com/android/server/KeyInputQueue.java +++ b/services/java/com/android/server/KeyInputQueue.java @@ -521,31 +521,29 @@ public abstract class KeyInputQueue { // Finger 1 if (ev.scancode == RawInputEvent.ABS_X) { di.mAbs.changed = true; - di.mAbs.mNextData[MotionEvent.SAMPLE_X] = ev.value; + di.curTouchVals[MotionEvent.SAMPLE_X] = ev.value; } else if (ev.scancode == RawInputEvent.ABS_Y) { di.mAbs.changed = true; - di.mAbs.mNextData[MotionEvent.SAMPLE_Y] = ev.value; + di.curTouchVals[MotionEvent.SAMPLE_Y] = ev.value; } else if (ev.scancode == RawInputEvent.ABS_PRESSURE) { di.mAbs.changed = true; - di.mAbs.mNextData[MotionEvent.SAMPLE_PRESSURE] = ev.value; - di.mAbs.mNextData[MotionEvent.NUM_SAMPLE_DATA + di.curTouchVals[MotionEvent.SAMPLE_PRESSURE] = ev.value; + di.curTouchVals[MotionEvent.NUM_SAMPLE_DATA + MotionEvent.SAMPLE_PRESSURE] = ev.value; } else if (ev.scancode == RawInputEvent.ABS_TOOL_WIDTH) { di.mAbs.changed = true; - di.mAbs.mNextData[MotionEvent.SAMPLE_SIZE] = ev.value; - di.mAbs.mNextData[MotionEvent.NUM_SAMPLE_DATA + di.curTouchVals[MotionEvent.SAMPLE_SIZE] = ev.value; + di.curTouchVals[MotionEvent.NUM_SAMPLE_DATA + MotionEvent.SAMPLE_SIZE] = ev.value; // Finger 2 } else if (ev.scancode == RawInputEvent.ABS_HAT0X) { di.mAbs.changed = true; - di.mAbs.mNextData[(di.mAbs.mDown[0] ? - MotionEvent.NUM_SAMPLE_DATA : 0) + di.curTouchVals[MotionEvent.NUM_SAMPLE_DATA + MotionEvent.SAMPLE_X] = ev.value; } else if (ev.scancode == RawInputEvent.ABS_HAT0Y) { di.mAbs.changed = true; - di.mAbs.mNextData[(di.mAbs.mDown[0] ? - MotionEvent.NUM_SAMPLE_DATA : 0) + di.curTouchVals[MotionEvent.NUM_SAMPLE_DATA + MotionEvent.SAMPLE_Y] = ev.value; } @@ -603,8 +601,21 @@ public abstract class KeyInputQueue { |RawInputEvent.CLASS_TOUCHSCREEN_MT)) == RawInputEvent.CLASS_TOUCHSCREEN) { ms.mNextNumPointers = 0; - if (ms.mDown[0]) ms.mNextNumPointers++; - if (ms.mDown[1]) ms.mNextNumPointers++; + if (ms.mDown[0]) { + System.arraycopy(di.curTouchVals, 0, + ms.mNextData, 0, + MotionEvent.NUM_SAMPLE_DATA); + ms.mNextNumPointers++; + } + if (ms.mDown[1]) { + System.arraycopy(di.curTouchVals, + MotionEvent.NUM_SAMPLE_DATA, + ms.mNextData, + ms.mNextNumPointers + * MotionEvent.NUM_SAMPLE_DATA, + MotionEvent.NUM_SAMPLE_DATA); + ms.mNextNumPointers++; + } } boolean doMotion = !monitorVirtualKey(di, |