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 POINTER_TRACKER_H 17 #define POINTER_TRACKER_H 18 19 #include <map> 20 #include <chrono> 21 #include <utility> 22 #include <functional> 23 #include <algorithm> 24 #include <fstream> 25 #include <nlohmann/json.hpp> 26 #include "find_widget.h" 27 #include "utils.h" 28 #include "ui_driver.h" 29 #include "velocity_tracker.h" 30 #include "pointer_info.h" 31 32 namespace OHOS::uitest { 33 class FingerTracker { 34 public: 35 FingerTracker() = default; 36 ~FingerTracker() = default; 37 void HandleDownEvent(TouchEventInfo& event); 38 void HandleMoveEvent(TouchEventInfo& event); 39 void HandleUpEvent(TouchEventInfo& event); 40 void UpdatevelocityTracker(TouchEventInfo& event); 41 bool IsRecentSpeedLimit(TouchEventInfo& touchEvent); 42 void BuildFingerInfo(); GetMoveDistance()43 double GetMoveDistance() const 44 { 45 return Offset(velocityTracker.GetFirstPosition(), velocityTracker.GetPosition()).GetDistance(); 46 } GetFingerInfo()47 FingerInfo& GetFingerInfo() 48 { 49 return fingerInfo; 50 } GetVelocityTracker()51 VelocityTracker& GetVelocityTracker() 52 { 53 return velocityTracker; 54 } 55 56 private: 57 FingerInfo fingerInfo {}; // 输出封装 58 VelocityTracker velocityTracker {}; 59 double preSpeed = 0; 60 }; 61 62 class PointerTracker { 63 public: 64 PointerTracker() = default; 65 ~PointerTracker() = default; 66 67 void HandleDownEvent(TouchEventInfo& event); 68 void HandleMoveEvent(TouchEventInfo& event); 69 void HandleUpEvent(TouchEventInfo& event); 70 void HandleMoveEvent(TouchEventInfo& event, TouchOpt touchOpt); 71 void HandleUpEvent(TouchEventInfo& event, TouchOpt touchOpt); 72 73 void InitJudgeChain(); 74 bool IsClick(TouchEventInfo& touchEvent); // click(back) 75 bool IsLongClick(TouchEventInfo& touchEvent); 76 bool IsDrag(TouchEventInfo& touchEvent); 77 bool IsSwip(TouchEventInfo& touchEvent); // swip 78 bool IsFling(TouchEventInfo& touchEvent); // fling 79 bool IsRecent(TouchEventInfo& touchEvent); 80 bool IsHome(TouchEventInfo& touchEvent); 81 bool IsBack(TouchEventInfo& touchEvent); 82 83 // cout 84 std::string WriteData(PointerInfo pointerInfo, shared_ptr<mutex> &cout_lock); 85 // record.csv 86 nlohmann::json WriteData(PointerInfo pointerInfo, ofstream &outFile, shared_ptr<mutex> &csv_lock); 87 // clear 88 void ClearFingerTrackersValues(); SetWindow(Rect window)89 void SetWindow(Rect window) 90 { 91 windowBounds = window; 92 } 93 IsNeedWrite()94 bool IsNeedWrite() 95 { 96 return isNeedWrite; 97 } 98 SetNeedWrite(bool needWirte)99 void SetNeedWrite(bool needWirte) 100 { 101 isNeedWrite = needWirte; 102 } 103 GetLastClickInfo()104 PointerInfo GetLastClickInfo() 105 { 106 return lastClickInfo; 107 } 108 GetSnapshootPointerInfo()109 PointerInfo& GetSnapshootPointerInfo() 110 { 111 return snapshootPointerInfo; 112 } 113 SetLastClickInTracker(bool isLastClick)114 void SetLastClickInTracker(bool isLastClick) 115 { 116 isLastClickInTracker = isLastClick; 117 } 118 GetInterVal()119 double GetInterVal() const 120 { 121 // 两次down事件的间隔 122 std::chrono::duration<double> inter = 123 lastClickInfo.GetFirstTrackPoint().GetDownTimeStamp()- firstTrackPoint_.GetDownTimeStamp(); 124 auto interval = inter.count(); 125 return interval; 126 } 127 Resets()128 void Resets() 129 { 130 ClearFingerTrackersValues(); 131 maxFingerNum = 0; 132 currentFingerNum = 0; 133 isUpStage = false; 134 isNeedWrite = false; 135 isLastClickInTracker = false; 136 isStartRecent = false; 137 } 138 139 PointerInfo BuildPointerInfo(); // 输出封装 140 public: 141 static constexpr float ERROR_POINTER = 1; // move后长时间没有Up说明异常 142 static constexpr float INTERVAL_THRESHOLD = 0.2; // 双击间隔时间上限 143 static constexpr float MAX_THRESHOLD = 15.0; // 长按位移上限 144 static constexpr float DURATIOIN_THRESHOLD = 0.6; // 长按时间下限 145 static constexpr float FLING_THRESHOLD = 45.0; // 快慢划离手速度界限 146 static constexpr int32_t NAVI_VERTI_THRE_V = 200; // home/recent/back步长下限 147 static constexpr float NAVI_THRE_D = 0.9; // home/recent起始位置 148 static constexpr float RECENT_ACCELERAT = 0.05; // recent中加速度判断 149 static constexpr float RECENT_SPEED2 = -2.0; // recent中速度判断 150 static constexpr float RECENT_SPEED1 = -1.0; // recent中速度判断 151 static constexpr int32_t RECENT_TIME = 80; // recent中时间判断 152 static constexpr float RECENT_DISTANCE = 0.15; // recent 最小位移 153 static constexpr float HOME_DISTANCE = 0.1; // home 最小位移 154 private: 155 std::map <int64_t, FingerTracker*> fingerTrackers; // finger记录 156 int maxFingerNum = 0; 157 int currentFingerNum = 0; 158 Rect windowBounds = Rect(0, 0, 0, 0); 159 std::map<TouchOpt, std::function<bool(TouchEventInfo&)>> pointerTypeJudgMap_; 160 std::vector<TouchOpt> pointerTypeJudgChain_; 161 bool isUpStage = false; 162 bool isNeedWrite = false; 163 bool isLastClickInTracker = false; 164 TouchEventInfo firstTrackPoint_; 165 PointerInfo lastClickInfo; // for doubleclick 166 PointerInfo snapshootPointerInfo; 167 std::string recordMode = ""; 168 bool isStartRecent = false; 169 170 private: 171 template<typename T, typename... Args> RemoveTypeJudge(std::vector<T> & vec,Args &&...args)172 void RemoveTypeJudge(std::vector<T>& vec, Args&&... args) 173 { 174 auto removeFunc = [&](const T& value) { 175 return ((value == args) || ...); 176 }; 177 vec.erase(std::remove_if(vec.begin(), vec.end(), removeFunc), vec.end()); 178 } 179 }; 180 } 181 #endif // POINTER_TRACKER_H 182