/** step 3 */
  private boolean performMultiPointerUp() {
    if (mTouches == null) {
      return false;
    }

    boolean ret = true;
    MotionEvent event;

    // For each pointer get the last coordinates
    for (int x = 0; x < mTouches.length; x++)
      mPointerCoords[x] = mTouches[x][mTouches[x].length - 1];

    // touch up
    for (int x = 1; x < mTouches.length; x++) {
      event =
          MotionEvent.obtain(
              mDownTime,
              SystemClock.uptimeMillis(),
              getPointerAction(MotionEvent.ACTION_POINTER_UP, x),
              x + 1,
              mProperties,
              mPointerCoords,
              0,
              0,
              1,
              1,
              0,
              0,
              InputDevice.SOURCE_TOUCHSCREEN,
              0);
      ret &= mUiAutomation.injectInputEvent(event, true);
    }

    // first to touch down is last up
    event =
        MotionEvent.obtain(
            mDownTime,
            SystemClock.uptimeMillis(),
            MotionEvent.ACTION_UP,
            1,
            mProperties,
            mPointerCoords,
            0,
            0,
            1,
            1,
            0,
            0,
            InputDevice.SOURCE_TOUCHSCREEN,
            0);
    ret &= mUiAutomation.injectInputEvent(event, true);

    return ret;
  }
 /** 按下 */
 public void touchDown(int x, int y, int duration) {
   mTouchDownTime = SystemClock.uptimeMillis();
   MotionEvent event =
       MotionEvent.obtain(
           mTouchDownTime, mTouchDownTime + duration, MotionEvent.ACTION_DOWN, x, y, 0);
   event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
   mUiAutomation.injectInputEvent(event, true);
 }
 /** 抬起 */
 public void touchUp(int x, int y) {
   MotionEvent event =
       MotionEvent.obtain(mTouchDownTime, mTouchDownTime, MotionEvent.ACTION_UP, x, y, 0);
   event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
   mUiAutomation.injectInputEvent(event, true);
 }
  /** step 2 */
  private boolean performMultiPointerDown() {
    if (mTouches == null) {
      return false;
    }

    boolean ret = true;
    MotionEvent event;

    // Touch down all pointers
    mDownTime = SystemClock.uptimeMillis();
    event =
        MotionEvent.obtain(
            mDownTime,
            SystemClock.uptimeMillis(),
            MotionEvent.ACTION_DOWN,
            1,
            mProperties,
            mPointerCoords,
            0,
            0,
            1,
            1,
            0,
            0,
            InputDevice.SOURCE_TOUCHSCREEN,
            0);
    ret &= mUiAutomation.injectInputEvent(event, true);

    for (int x = 1; x < mTouches.length; x++) {
      event =
          MotionEvent.obtain(
              mDownTime,
              SystemClock.uptimeMillis(),
              getPointerAction(MotionEvent.ACTION_POINTER_DOWN, x),
              x + 1,
              mProperties,
              mPointerCoords,
              0,
              0,
              1,
              1,
              0,
              0,
              InputDevice.SOURCE_TOUCHSCREEN,
              0);
      ret &= mUiAutomation.injectInputEvent(event, true);
    }

    //        // Move all pointers
    //        for (int i = 1; i < mMaxSteps - 1; i++) {
    //            // for each pointer
    //            for (int x = 0; x < mTouches.length; x++) {
    //                // check if it has coordinates to move
    //                if (mTouches[x].length > i)
    //                    mPointerCoords[x] = mTouches[x][i];
    //                else
    //                    mPointerCoords[x] = mTouches[x][mTouches[x].length - 1];
    //            }
    //
    //            event = MotionEvent.obtain(mDownTime, SystemClock.uptimeMillis(),
    //                    MotionEvent.ACTION_MOVE, mTouches.length, mProperties, mPointerCoords, 0,
    // 0, 1, 1,
    //                    0, 0, InputDevice.SOURCE_TOUCHSCREEN, 0);
    //
    //            ret &= mUiAutomation.injectInputEvent(event, true);
    //            SystemClock.sleep(5);
    //        }

    return ret;
  }