Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85a06152 authored by Dake Gu's avatar Dake Gu Committed by Android Git Automerger
Browse files

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

* commit 'fe88f1be':
  Fix bug of SimulatedTrackball
parents 00ef2a36 fe88f1be
Loading
Loading
Loading
Loading
+38 −29
Original line number Diff line number Diff line
@@ -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
                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;
                        if (synthesizeNewKeys) {
                            viewroot.enqueueInputEvent(new KeyEvent(time, time,
                                    KeyEvent.ACTION_DOWN, key, 0, event.getMetaState(),
                                event.getDeviceId(), 0, KeyEvent.FLAG_FALLBACK, event.getSource()));
                                    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()));
                                    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,12 +274,14 @@ class SimulatedTrackball {
                        mLastSource = event.getSource();
                        mLastMetaState = event.getMetaState();

                        if (synthesizeNewKeys) {
                            Message message = Message.obtain(mHandler, MSG_FLICK,
                                    mKeySendRateMs, mLastKeySent, viewroot);
                            message.setAsynchronous(true);
                            mHandler.sendMessageDelayed(message, mKeySendRateMs);
                        }
                    }
                }
                mEdgeSwipePossible = false;
                break;
        }
+5 −8
Original line number Diff line number Diff line
@@ -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;