1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ACCESSIBILITY_SCREEN_TOUCH_H 17 #define ACCESSIBILITY_SCREEN_TOUCH_H 18 19 #include <atomic> 20 #include <string> 21 #include <thread> 22 #include "accessibility_event_transmission.h" 23 #include "accessibility_gesture_recognizer.h" 24 25 namespace OHOS { 26 namespace Accessibility { 27 28 enum ScreenTouchState : int32_t { 29 DEFAULT_STATE, 30 CLICK_RESPONSE_DELAY_STATE, 31 IGNORE_REPEAT_CLICK_STATE, 32 BOTH_RESPONSE_DELAY_IGNORE_REPEAT_CLICK 33 }; 34 35 class AccessibilityScreenTouch; 36 class ScreenTouchHandler : public AppExecFwk::EventHandler { 37 public: 38 ScreenTouchHandler(const std::shared_ptr<AppExecFwk::EventRunner> &runner, AccessibilityScreenTouch &server); 39 virtual ~ScreenTouchHandler() = default; 40 /** 41 * @brief Process the event of install system bundles. 42 * @param event Indicates the event to be processed. 43 */ 44 virtual void ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) override; 45 private: 46 AccessibilityScreenTouch &server_; 47 }; 48 49 class AccessibilityScreenTouch : public EventTransmission { 50 public: 51 static constexpr uint32_t FINGER_DOWN_DELAY_MSG = 0; 52 53 /** 54 * @brief A constructor used to create a screen touch instance. 55 */ 56 AccessibilityScreenTouch(); 57 58 /** 59 * @brief A destructor used to delete the screen touch instance. 60 */ 61 ~AccessibilityScreenTouch(); 62 63 /** 64 * @brief Handle pointer events from previous event stream node. 65 * 66 * @param event the pointer event to be handled. 67 * @return true: the event has been processed and does not need to be passed to the next node; 68 * false: the event is not processed. 69 */ 70 bool OnPointerEvent(MMI::PointerEvent &event) override; 71 72 uint32_t GetRealClickResponseTime(); 73 uint32_t GetRealIgnoreRepeatClickTime(); 74 bool GetRealIgnoreRepeatClickState(); 75 void SendInterceptedEvent(); 76 private: 77 void HandleResponseDelayStateInnerDown(MMI::PointerEvent &event); 78 void HandleResponseDelayStateInnerMove(MMI::PointerEvent &event); 79 void HandleResponseDelayStateInnerUp(MMI::PointerEvent &event); 80 void HandleResponseDelayState(MMI::PointerEvent &event); 81 82 void HandleIgnoreRepeatClickStateInnerDown(MMI::PointerEvent &event); 83 void HandleIgnoreRepeatClickStateInnerMove(MMI::PointerEvent &event); 84 void HandleIgnoreRepeatClickStateInnerUp(MMI::PointerEvent &event); 85 void HandleIgnoreRepeatClickState(MMI::PointerEvent &event); 86 87 void HandleBothStateInnerDown(MMI::PointerEvent &event); 88 void HandleBothStateInnerMove(MMI::PointerEvent &event); 89 void HandleBothStateInnerUp(MMI::PointerEvent &event); 90 void HandleBothState(MMI::PointerEvent &event); 91 92 void Clear(); 93 94 void HandleCoordinates(MMI::PointerEvent::PointerItem &item); 95 void ConversionCoordinates(int32_t originalX, int32_t originalY); 96 void DrawCircleProgress(); 97 98 bool isMoveBeyondThreshold_ = false; 99 int64_t startTime_ = 0; // microsecond 100 std::shared_ptr<MMI::PointerEvent::PointerItem> startPointer_ = nullptr; 101 int32_t screenId_ = 0; 102 103 int64_t lastUpTime_ = 0; 104 bool isInterceptClick_ = false; 105 106 ScreenTouchState currentState_; 107 uint32_t clickResponseTime_; 108 bool ignoreRepeatClickState_; 109 uint32_t ignoreRepeatClickTime_; 110 111 std::atomic<int32_t> circleCenterPhysicalX_; 112 std::atomic<int32_t> circleCenterPhysicalY_; 113 int32_t startAngle_ = 0; 114 std::atomic<bool> isStopDrawCircle_; 115 std::shared_ptr<std::thread> drawCircleThread_ = nullptr; 116 117 static int64_t lastUpTime; // global last up time 118 119 std::shared_ptr<ScreenTouchHandler> handler_ = nullptr; 120 std::shared_ptr<AppExecFwk::EventRunner> runner_ = nullptr; 121 122 std::list<MMI::PointerEvent> cachedDownPointerEvents_ {}; 123 }; 124 } // namespace Accessibility 125 } // namespace OHOS 126 #endif // ACCESSIBILITY_TOUCH_GUIDER_H