Merge "Fix bug of SimulatedTrackball" into jb-mr1-aah-dev

This commit is contained in:
Dake Gu
2013-01-18 21:22:26 +00:00
committed by Android (Google) Code Review
2 changed files with 43 additions and 37 deletions

View File

@@ -28,15 +28,15 @@ import android.os.UserHandle;
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 @@ class SimulatedTrackball {
// 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 @@ class SimulatedTrackball {
}
};
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 @@ class SimulatedTrackball {
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 @@ class SimulatedTrackball {
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 @@ class SimulatedTrackball {
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 @@ class SimulatedTrackball {
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;

View File

@@ -144,7 +144,7 @@ public final class ViewRootImpl implements ViewParent,
final TrackballAxis mTrackballAxisX = new TrackballAxis();
final TrackballAxis mTrackballAxisY = new TrackballAxis();
final SimulatedTrackball mSimulatedTrackball;
final SimulatedDpad mSimulatedDpad;
int mLastJoystickXDirection;
int mLastJoystickYDirection;
@@ -392,7 +392,7 @@ public final class ViewRootImpl implements ViewParent,
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 @@ public final class ViewRootImpl implements ViewParent,
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 @@ public final class ViewRootImpl implements ViewParent,
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 @@ public final class ViewRootImpl implements ViewParent,
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;