Fix bug of SimulatedTrackball
Simulated trackball should not generate KeyEvent if dispatchGenericMotionEvent
returns true
b/8022205
Change-Id: I1857e25407c508c98ef4db85fe146b1e25a0803e
diff --git a/core/java/android/view/SimulatedTrackball.java b/core/java/android/view/SimulatedDpad.java
similarity index 83%
rename from core/java/android/view/SimulatedTrackball.java
rename to core/java/android/view/SimulatedDpad.java
index 4ab557a..0a37fdd 100644
--- a/core/java/android/view/SimulatedTrackball.java
+++ b/core/java/android/view/SimulatedDpad.java
@@ -28,15 +28,15 @@
import android.util.Log;
/**
- * This class creates trackball events from touchpad events.
+ * This class creates DPAD events from touchpad events.
*
* @see ViewRootImpl
*/
//TODO: Make this class an internal class of ViewRootImpl.java
-class SimulatedTrackball {
+class SimulatedDpad {
- private static final String TAG = "SimulatedTrackball";
+ private static final String TAG = "SimulatedDpad";
// Maximum difference in milliseconds between the down and up of a touch
// event for it to be considered a tap
@@ -97,7 +97,7 @@
// How quickly the repeated events die off
private float mFlickDecay;
- public SimulatedTrackball(Context context) {
+ public SimulatedDpad(Context context) {
mDistancePerTick = SystemProperties.getInt("persist.vr_dist_tick", 64);
mDistancePerTickSquared = mDistancePerTick * mDistancePerTick;
mMaxRepeatDelay = SystemProperties.getInt("persist.vr_repeat_delay", 300);
@@ -140,7 +140,11 @@
}
};
- public void updateTrackballDirection(ViewRootImpl viewroot, MotionEvent event) {
+ public void updateTouchPad(ViewRootImpl viewroot, MotionEvent event,
+ boolean synthesizeNewKeys) {
+ if (!synthesizeNewKeys) {
+ mHandler.removeMessages(MSG_FLICK);
+ }
// Store what time the touchpad event occurred
final long time = SystemClock.uptimeMillis();
switch (event.getAction()) {
@@ -159,8 +163,9 @@
mEdgeSwipePossible = true;
}
// Clear any flings
- mHandler.removeMessages(MSG_FLICK);
-
+ if (synthesizeNewKeys) {
+ mHandler.removeMessages(MSG_FLICK);
+ }
break;
case MotionEvent.ACTION_MOVE:
// Determine whether the move is slop or an intentional move
@@ -226,12 +231,16 @@
while (dominantAxis * dominantAxis > mDistancePerTickSquared) {
repeatCount++;
dominantAxis -= sign * mDistancePerTick;
- viewroot.enqueueInputEvent(new KeyEvent(time, time,
- KeyEvent.ACTION_DOWN, key, 0, event.getMetaState(),
- event.getDeviceId(), 0, KeyEvent.FLAG_FALLBACK, event.getSource()));
- viewroot.enqueueInputEvent(new KeyEvent(time, time,
- KeyEvent.ACTION_UP, key, 0, event.getMetaState(),
- event.getDeviceId(), 0, KeyEvent.FLAG_FALLBACK, event.getSource()));
+ if (synthesizeNewKeys) {
+ viewroot.enqueueInputEvent(new KeyEvent(time, time,
+ KeyEvent.ACTION_DOWN, key, 0, event.getMetaState(),
+ event.getDeviceId(), 0, KeyEvent.FLAG_FALLBACK,
+ event.getSource()));
+ viewroot.enqueueInputEvent(new KeyEvent(time, time,
+ KeyEvent.ACTION_UP, key, 0, event.getMetaState(),
+ event.getDeviceId(), 0, KeyEvent.FLAG_FALLBACK,
+ event.getSource()));
+ }
}
// Save new axis values
mAccumulatedX = isXAxis ? dominantAxis : 0;
@@ -244,18 +253,16 @@
break;
case MotionEvent.ACTION_UP:
if (time - mLastTouchPadStartTimeMs < MAX_TAP_TIME && mAlwaysInTapRegion) {
- // Trackball Down
- MotionEvent trackballEvent = MotionEvent.obtain(mLastTouchPadStartTimeMs, time,
- MotionEvent.ACTION_DOWN, 0, 0, 0, 0, event.getMetaState(),
- 10f, 10f, event.getDeviceId(), 0);
- trackballEvent.setSource(InputDevice.SOURCE_TRACKBALL);
- viewroot.enqueueInputEvent(trackballEvent);
- // Trackball Release
- trackballEvent = MotionEvent.obtain(mLastTouchPadStartTimeMs, time,
- MotionEvent.ACTION_UP, 0, 0, 0, 0, event.getMetaState(),
- 10f, 10f, event.getDeviceId(), 0);
- trackballEvent.setSource(InputDevice.SOURCE_TRACKBALL);
- viewroot.enqueueInputEvent(trackballEvent);
+ if (synthesizeNewKeys) {
+ viewroot.enqueueInputEvent(new KeyEvent(mLastTouchPadStartTimeMs, time,
+ KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, 0,
+ event.getMetaState(), event.getDeviceId(), 0,
+ KeyEvent.FLAG_FALLBACK, event.getSource()));
+ viewroot.enqueueInputEvent(new KeyEvent(mLastTouchPadStartTimeMs, time,
+ KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER, 0,
+ event.getMetaState(), event.getDeviceId(), 0,
+ KeyEvent.FLAG_FALLBACK, event.getSource()));
+ }
} else {
float xMoveSquared = mLastMoveX * mLastMoveX;
float yMoveSquared = mLastMoveY * mLastMoveY;
@@ -267,10 +274,12 @@
mLastSource = event.getSource();
mLastMetaState = event.getMetaState();
- Message message = Message.obtain(mHandler, MSG_FLICK,
- mKeySendRateMs, mLastKeySent, viewroot);
- message.setAsynchronous(true);
- mHandler.sendMessageDelayed(message, mKeySendRateMs);
+ if (synthesizeNewKeys) {
+ Message message = Message.obtain(mHandler, MSG_FLICK,
+ mKeySendRateMs, mLastKeySent, viewroot);
+ message.setAsynchronous(true);
+ mHandler.sendMessageDelayed(message, mKeySendRateMs);
+ }
}
}
mEdgeSwipePossible = false;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 9ef9d01..58e6fbe 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -144,7 +144,7 @@
final TrackballAxis mTrackballAxisX = new TrackballAxis();
final TrackballAxis mTrackballAxisY = new TrackballAxis();
- final SimulatedTrackball mSimulatedTrackball;
+ final SimulatedDpad mSimulatedDpad;
int mLastJoystickXDirection;
int mLastJoystickYDirection;
@@ -392,7 +392,7 @@
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mAttachInfo.mScreenOn = powerManager.isScreenOn();
loadSystemProperties();
- mSimulatedTrackball = new SimulatedTrackball(context);
+ mSimulatedDpad = new SimulatedDpad(context);
}
/**
@@ -3452,8 +3452,7 @@
if (isJoystick) {
updateJoystickDirection(event, false);
} else if (isTouchPad) {
- //Convert TouchPad motion into a TrackBall event
- mSimulatedTrackball.updateTrackballDirection(this, event);
+ mSimulatedDpad.updateTouchPad(this, event, false);
}
return EVENT_NOT_HANDLED;
}
@@ -3463,8 +3462,7 @@
if (isJoystick) {
updateJoystickDirection(event, false);
} else if (isTouchPad) {
- //Convert TouchPad motion into a TrackBall event
- mSimulatedTrackball.updateTrackballDirection(this, event);
+ mSimulatedDpad.updateTouchPad(this, event, false);
}
return EVENT_HANDLED;
}
@@ -3476,8 +3474,7 @@
return EVENT_HANDLED;
}
if (isTouchPad) {
- //Convert TouchPad motion into a TrackBall event
- mSimulatedTrackball.updateTrackballDirection(this, event);
+ mSimulatedDpad.updateTouchPad(this, event, true);
return EVENT_HANDLED;
}
return EVENT_NOT_HANDLED;