• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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