GESTURE_STATE DragDetector::Detect()

in PlayAssetDelivery/NativeSample/common/ndk_helper/gestureDetector.cpp [232:289]


GESTURE_STATE DragDetector::Detect(const AInputEvent* event) {
  GESTURE_STATE ret = GESTURE_STATE_NONE;
  int32_t action = AMotionEvent_getAction(event);
  int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>
                  AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
  uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
  event_ = event;

  int32_t count = AMotionEvent_getPointerCount(event);
  switch (flags) {
    case AMOTION_EVENT_ACTION_DOWN:
      vec_pointers_.push_back(AMotionEvent_getPointerId(event, 0));
      ret = GESTURE_STATE_START;
      break;
    case AMOTION_EVENT_ACTION_POINTER_DOWN:
      vec_pointers_.push_back(AMotionEvent_getPointerId(event, index));
      break;
    case AMOTION_EVENT_ACTION_UP:
      vec_pointers_.pop_back();
      ret = GESTURE_STATE_END;
      break;
    case AMOTION_EVENT_ACTION_POINTER_UP: {
      int32_t released_pointer_id = AMotionEvent_getPointerId(event, index);

      auto it = vec_pointers_.begin();
      auto it_end = vec_pointers_.end();
      int32_t i = 0;
      for (; it != it_end; ++it, ++i) {
        if (*it == released_pointer_id) {
          vec_pointers_.erase(it);
          break;
        }
      }

      if (i <= 1) {
        // Reset pinch or drag
        if (count == 2) {
          ret = GESTURE_STATE_START;
        }
      }
      break;
    }
    case AMOTION_EVENT_ACTION_MOVE:
      switch (count) {
        case 1:
          // Drag
          ret = GESTURE_STATE_MOVE;
          break;
        default:
          break;
      }
      break;
    case AMOTION_EVENT_ACTION_CANCEL:
      break;
  }

  return ret;
}