/* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include "EventHub.h" #include "InputDevice.h" #include "InputReaderContext.h" #include "NotifyArgs.h" #include "ui/Rotation.h" #include "include/gestures.h" namespace android { // Converts Gesture structs from the gestures library into NotifyArgs and the appropriate // PointerController calls. class GestureConverter { public: GestureConverter(InputReaderContext& readerContext, const InputDeviceContext& deviceContext, int32_t deviceId); std::string dump() const; void setOrientation(ui::Rotation orientation) { mOrientation = orientation; } [[nodiscard]] std::list reset(nsecs_t when); void populateMotionRanges(InputDeviceInfo& info) const; [[nodiscard]] std::list handleGesture(nsecs_t when, nsecs_t readTime, const Gesture& gesture); private: [[nodiscard]] NotifyMotionArgs handleMove(nsecs_t when, nsecs_t readTime, const Gesture& gesture); [[nodiscard]] std::list handleButtonsChange(nsecs_t when, nsecs_t readTime, const Gesture& gesture); [[nodiscard]] std::list releaseAllButtons(nsecs_t when, nsecs_t readTime); [[nodiscard]] std::list handleScroll(nsecs_t when, nsecs_t readTime, const Gesture& gesture); [[nodiscard]] std::list handleFling(nsecs_t when, nsecs_t readTime, const Gesture& gesture); [[nodiscard]] NotifyMotionArgs endScroll(nsecs_t when, nsecs_t readTime); [[nodiscard]] std::list handleMultiFingerSwipe(nsecs_t when, nsecs_t readTime, uint32_t fingerCount, float dx, float dy); [[nodiscard]] std::list handleMultiFingerSwipeLift(nsecs_t when, nsecs_t readTime); [[nodiscard]] std::list handlePinch(nsecs_t when, nsecs_t readTime, const Gesture& gesture); [[nodiscard]] std::list endPinch(nsecs_t when, nsecs_t readTime); NotifyMotionArgs makeMotionArgs(nsecs_t when, nsecs_t readTime, int32_t action, int32_t actionButton, int32_t buttonState, uint32_t pointerCount, const PointerProperties* pointerProperties, const PointerCoords* pointerCoords, float xCursorPosition, float yCursorPosition); const int32_t mDeviceId; InputReaderContext& mReaderContext; std::shared_ptr mPointerController; ui::Rotation mOrientation = ui::ROTATION_0; RawAbsoluteAxisInfo mXAxisInfo; RawAbsoluteAxisInfo mYAxisInfo; // The current button state according to the gestures library, but converted into MotionEvent // button values (AMOTION_EVENT_BUTTON_...). uint32_t mButtonState = 0; nsecs_t mDownTime = 0; MotionClassification mCurrentClassification = MotionClassification::NONE; // Only used when mCurrentClassification is MULTI_FINGER_SWIPE. uint32_t mSwipeFingerCount = 0; static constexpr float INITIAL_PINCH_SEPARATION_PX = 200.0; // Only used when mCurrentClassification is PINCH. float mPinchFingerSeparation; static constexpr size_t MAX_FAKE_FINGERS = 4; // We never need any PointerProperties other than the finger tool type, so we can just keep a // const array of them. const std::array mFingerProps = {{ {.id = 0, .toolType = ToolType::FINGER}, {.id = 1, .toolType = ToolType::FINGER}, {.id = 2, .toolType = ToolType::FINGER}, {.id = 3, .toolType = ToolType::FINGER}, }}; std::array mFakeFingerCoords = {}; // TODO(b/260226362): consider what the appropriate source for these events is. static constexpr uint32_t SOURCE = AINPUT_SOURCE_MOUSE; }; } // namespace android