summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2009-08-12 17:13:55 -0700
committerDianne Hackborn <hackbod@google.com>2009-08-12 17:13:55 -0700
commit2a2b34434a256cf0e035e97580b310f997f9fcd3 (patch)
tree87a8a6f72bcc92fa43c94c62d44c7f69d5e4b8f6 /services
parent72c82ab9923025a91bbabb32e56bfea27bfd083b (diff)
downloadframeworks_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.java8
-rw-r--r--services/java/com/android/server/KeyInputQueue.java35
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,