• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 #include "base/ressched/ressched_report.h"
17 
18 #define LIKELY(x) __builtin_expect(!!(x), 1)
19 
20 namespace OHOS::Ace {
21 namespace Ressched {
22 constexpr uint32_t RES_TYPE_CLICK_RECOGNIZE = 9;
23 constexpr uint32_t RES_TYPE_PUSH_PAGE       = 10;
24 constexpr uint32_t RES_TYPE_SLIDE           = 11;
25 constexpr uint32_t RES_TYPE_POP_PAGE        = 28;
26 constexpr uint32_t RES_TYPE_WEB_GESTURE     = 29;
27 constexpr uint32_t RES_TYPE_LOAD_PAGE       = 34;
28 constexpr uint32_t RES_TYPE_KEY_EVENT       = 122;
29 constexpr uint32_t RES_TYPE_AXIS_EVENT      = 123;
30 constexpr uint32_t RES_TYPE_PAGE_TRANSITION = 140;
31 constexpr uint32_t RES_TYPE_CHECK_APP_IS_IN_SCHEDULE_LIST = 504;
32 #ifdef FFRT_EXISTS
33 constexpr uint32_t RES_TYPE_LONG_FRAME     = 71;
34 #endif
35 constexpr int32_t TOUCH_DOWN_EVENT          = 1;
36 constexpr int32_t CLICK_EVENT               = 2;
37 constexpr int32_t TOUCH_UP_EVENT            = 3;
38 constexpr int32_t TOUCH_PULL_UP_EVENT = 4;
39 constexpr int32_t KEY_DOWN_EVENT = 1;
40 constexpr int32_t KEY_UP_EVENT = 2;
41 constexpr int32_t SLIDE_OFF_EVENT = 0;
42 constexpr int32_t SLIDE_DETECTING = 2;
43 constexpr int32_t AUTO_PLAY_ON_EVENT = 5;
44 constexpr int32_t AUTO_PLAY_OFF_EVENT = 6;
45 constexpr int32_t MOVE_DETECTING = 7;
46 constexpr int32_t PUSH_PAGE_START_EVENT = 0;
47 constexpr int32_t PUSH_PAGE_COMPLETE_EVENT = 1;
48 constexpr int32_t POP_PAGE_EVENT = 0;
49 constexpr int32_t AXIS_OFF_EVENT = 1;
50 constexpr int32_t AXIS_IS_PAD = 0;
51 constexpr int32_t AXIS_IS_MOUSE = 1;
52 constexpr int64_t TIME_INTERVAL = 300;
53 #ifdef FFRT_EXISTS
54 constexpr int32_t LONG_FRAME_START_EVENT = 0;
55 constexpr int32_t LONG_FRAME_END_EVENT = 1;
56 #endif
57 constexpr char NAME[] = "name";
58 constexpr char PID[] = "pid";
59 constexpr char UID[] = "uid";
60 constexpr char BUNDLE_NAME[] = "bundleName";
61 constexpr char ABILITY_NAME[] = "abilityName";
62 constexpr char CLICK[] = "click";
63 constexpr char KEY_EVENT[] = "key_event";
64 constexpr char PUSH_PAGE[] = "push_page";
65 constexpr char POP_PAGE[] = "pop_page";
66 constexpr char PAGE_END_FLUSH[] = "page_end_flush";
67 constexpr char AUTO_PLAY_ON[] = "auto_play_on";
68 constexpr char AUTO_PLAY_OFF[] = "auto_play_off";
69 constexpr char SLIDE_OFF[] = "slide_off";
70 constexpr char TOUCH[] = "touch";
71 constexpr char WEB_GESTURE[] = "web_gesture";
72 constexpr char LOAD_PAGE[] = "load_page";
73 constexpr char UP_SPEED_KEY[] = "up_speed";
74 constexpr char KEY_CODE[] = "key_code";
75 constexpr char AXIS_OFF[] = "axis_off";
76 constexpr char AXIS_NORMAL_UP_SPEED[] = "0.0";
77 constexpr char AXIS_EVENT_TYPE[] = "axis_event_type";
78 constexpr char FROM_PAGE_INFO[] = "from_page";
79 constexpr char TO_PAGE_INFO[] = "to_page";
80 constexpr char TRANSITION_MODE[] = "transition_mode";
81 #ifdef FFRT_EXISTS
82 constexpr char LONG_FRAME_START[] = "long_frame_start";
83 constexpr char LONG_FRAME_END[] = "long_frame_end";
84 #endif
85 
LoadAceApplicationContext(std::unordered_map<std::string,std::string> & payload)86 void LoadAceApplicationContext(std::unordered_map<std::string, std::string>& payload)
87 {
88     auto& aceApplicationInfo = AceApplicationInfo::GetInstance();
89     payload[PID] = std::to_string(aceApplicationInfo.GetPid());
90     payload[UID] = std::to_string(aceApplicationInfo.GetUid());
91     payload[BUNDLE_NAME] = aceApplicationInfo.GetPackageName();
92     payload[ABILITY_NAME] = aceApplicationInfo.GetAbilityName();
93 }
94 }
95 
96 using namespace Ressched;
97 
GetInstance()98 ResSchedReport& ResSchedReport::GetInstance()
99 {
100     static ResSchedReport instance;
101     return instance;
102 }
103 
ResSchedReport()104 ResSchedReport::ResSchedReport()
105 {
106     reportDataFunc_ = LoadReportDataFunc();
107     reportSyncEventFunc_ = LoadReportSyncEventFunc();
108 }
109 
ResSchedDataReport(const char * name,const std::unordered_map<std::string,std::string> & param)110 void ResSchedReport::ResSchedDataReport(const char* name, const std::unordered_map<std::string, std::string>& param)
111 {
112     std::unordered_map<std::string, std::string> payload = param;
113     payload[Ressched::NAME] = name;
114     if (!reportDataFunc_) {
115         reportDataFunc_ = LoadReportDataFunc();
116     }
117     if (!reportDataFunc_) {
118         return;
119     }
120     static std::unordered_map<std::string, std::function<void(std::unordered_map<std::string, std::string>&)>>
121         functionMap = {
122             { CLICK,
123                 [this](std::unordered_map<std::string, std::string>& payload) {
124                     reportDataFunc_(RES_TYPE_CLICK_RECOGNIZE, CLICK_EVENT, payload);
125                 }
126             },
127             { AUTO_PLAY_ON,
128                 [this](std::unordered_map<std::string, std::string>& payload) {
129                     reportDataFunc_(RES_TYPE_SLIDE, AUTO_PLAY_ON_EVENT, payload);
130                 }
131             },
132             { AUTO_PLAY_OFF,
133                 [this](std::unordered_map<std::string, std::string>& payload) {
134                     reportDataFunc_(RES_TYPE_SLIDE, AUTO_PLAY_OFF_EVENT, payload);
135                 }
136             },
137             { SLIDE_OFF,
138                 [this](std::unordered_map<std::string, std::string>& payload) {
139                     reportDataFunc_(RES_TYPE_SLIDE, SLIDE_OFF_EVENT, payload);
140                 }
141             },
142             { POP_PAGE,
143                 [this](std::unordered_map<std::string, std::string>& payload) {
144                     LoadAceApplicationContext(payload);
145                     reportDataFunc_(RES_TYPE_POP_PAGE, POP_PAGE_EVENT, payload);
146                 }
147             },
148             { PAGE_END_FLUSH,
149                 [this](std::unordered_map<std::string, std::string>& payload) {
150                     ResSchedReport::GetInstance().LoadPageEvent(ResDefine::LOAD_PAGE_NO_REQUEST_FRAME_EVENT);
151                 }
152             },
153             { WEB_GESTURE,
154                 [this](std::unordered_map<std::string, std::string>& payload) {
155                     reportDataFunc_(RES_TYPE_WEB_GESTURE, 0, payload);
156                 }
157             },
158             { AXIS_OFF,
159                 [this](std::unordered_map<std::string, std::string>& payload) {
160                     ResSchedReport::GetInstance().AxisEventReportEnd();
161                 }
162             },
163 #ifdef FFRT_EXISTS
164             { LONG_FRAME_START,
165                 [this](std::unordered_map<std::string, std::string>& payload) {
166                     LoadAceApplicationContext(payload);
167                     reportDataFunc_(RES_TYPE_LONG_FRAME, LONG_FRAME_START_EVENT, payload);
168                 }
169             },
170             { LONG_FRAME_END,
171                 [this](std::unordered_map<std::string, std::string>& payload) {
172                     LoadAceApplicationContext(payload);
173                     reportDataFunc_(RES_TYPE_LONG_FRAME, LONG_FRAME_END_EVENT, payload);
174                 }
175             },
176 #endif
177         };
178     auto it = functionMap.find(name);
179     if (it == functionMap.end()) {
180         return;
181     }
182     it->second(payload);
183 }
184 
ResSchedDataReport(uint32_t resType,int32_t value,const std::unordered_map<std::string,std::string> & payload)185 void ResSchedReport::ResSchedDataReport(uint32_t resType, int32_t value,
186     const std::unordered_map<std::string, std::string>& payload)
187 {
188     if (!reportDataFunc_) {
189         LOGD("reportDataFunc_ is null!");
190         return;
191     }
192     reportDataFunc_(resType, value, payload);
193 }
194 
ResScheSyncEventReport(const uint32_t resType,const int64_t value,const std::unordered_map<std::string,std::string> & payload,std::unordered_map<std::string,std::string> & reply)195 void ResSchedReport::ResScheSyncEventReport(const uint32_t resType, const int64_t value,
196     const std::unordered_map<std::string, std::string>& payload, std::unordered_map<std::string, std::string>& reply)
197 {
198     if (!reportSyncEventFunc_) {
199         LOGD("reportSyncEventFunc_ is null!");
200         return;
201     }
202     reportSyncEventFunc_(resType, value, payload, reply);
203 }
204 
AppWhiteListCheck(const std::unordered_map<std::string,std::string> & payload,std::unordered_map<std::string,std::string> & reply)205 bool ResSchedReport::AppWhiteListCheck(const std::unordered_map<std::string, std::string>& payload,
206     std::unordered_map<std::string, std::string>& reply)
207 {
208     ResScheSyncEventReport(RES_TYPE_CHECK_APP_IS_IN_SCHEDULE_LIST, 0, payload, reply);
209     return reply["result"] == "\"true\"" ? true : false;
210 }
211 
OnTouchEvent(const TouchEvent & touchEvent)212 void ResSchedReport::OnTouchEvent(const TouchEvent& touchEvent)
213 {
214     switch (touchEvent.type) {
215         case TouchType::DOWN:
216             HandleTouchDown(touchEvent);
217             break;
218         case TouchType::UP:
219             HandleTouchUp(touchEvent);
220             break;
221         case TouchType::MOVE:
222             HandleTouchMove(touchEvent);
223             break;
224         case TouchType::CANCEL:
225             HandleTouchCancel(touchEvent);
226             break;
227         case TouchType::PULL_DOWN:
228             HandleTouchPullDown(touchEvent);
229             break;
230         case TouchType::PULL_UP:
231             HandleTouchPullUp(touchEvent);
232             break;
233         case TouchType::PULL_MOVE:
234             HandleTouchPullMove(touchEvent);
235             break;
236         default:
237             break;
238     }
239 }
240 
IsRateLimit(int64_t maxCount,std::chrono::seconds durTime,int64_t & keyEventCount,std::chrono::steady_clock::time_point & startTime)241 bool ResSchedReport::IsRateLimit(int64_t maxCount, std::chrono::seconds durTime,
242     int64_t& keyEventCount, std::chrono::steady_clock::time_point& startTime)
243 {
244     if (keyEventCount == -1) {
245         startTime = std::chrono::steady_clock::now();
246         keyEventCount = 0;
247     }
248 
249     if (keyEventCount > maxCount) {
250         auto curTime = std::chrono::steady_clock::now();
251         auto elapsedTime = std::chrono::duration_cast<std::chrono::seconds>(curTime - startTime).count();
252         if (elapsedTime < durTime.count()) {
253             LOGD("The event report exceeds the throttling limit");
254             return true;
255         }
256         keyEventCount = 0;
257         startTime = curTime;
258     }
259     keyEventCount++;
260     return false;
261 }
262 
IsPerSecRateLimit()263 bool ResSchedReport::IsPerSecRateLimit()
264 {
265     int64_t maxCountMS = 10;
266     auto durTimeMS = std::chrono::seconds(1);
267     return IsRateLimit(maxCountMS, durTimeMS, keyEventCountMS, startTimeMS);
268 }
269 
IsPerMinRateLimit()270 bool ResSchedReport::IsPerMinRateLimit()
271 {
272     int64_t maxCountS = 180;
273     auto durTimeS = std::chrono::seconds(60);
274     return IsRateLimit(maxCountS, durTimeS, keyEventCountS, startTimeS);
275 }
276 
OnKeyEvent(const KeyEvent & event)277 void ResSchedReport::OnKeyEvent(const KeyEvent& event)
278 {
279     if (IsPerSecRateLimit() || IsPerMinRateLimit()) {
280         return;
281     }
282     switch (event.action) {
283         case KeyAction::DOWN:
284             HandleKeyDown(event);
285             break;
286         case KeyAction::UP:
287             HandleKeyUp(event);
288             break;
289         default:
290             break;
291     }
292 }
293 
RecordTouchEvent(const TouchEvent & touchEvent,bool enforce)294 void ResSchedReport::RecordTouchEvent(const TouchEvent& touchEvent, bool enforce)
295 {
296     if (enforce) {
297         lastTouchEvent_.timeStamp = touchEvent.GetTimeStamp();
298         lastTouchEvent_.offset = touchEvent.GetOffset();
299         curTouchEvent_.timeStamp = touchEvent.GetTimeStamp();
300         curTouchEvent_.offset = touchEvent.GetOffset();
301     } else if (curTouchEvent_.offset != touchEvent.GetOffset()) {
302         lastTouchEvent_.timeStamp = curTouchEvent_.timeStamp;
303         lastTouchEvent_.offset = curTouchEvent_.offset;
304         curTouchEvent_.timeStamp = touchEvent.GetTimeStamp();
305         curTouchEvent_.offset = touchEvent.GetOffset();
306     }
307 }
308 
HandleTouchDown(const TouchEvent & touchEvent)309 void ResSchedReport::HandleTouchDown(const TouchEvent& touchEvent)
310 {
311     std::unordered_map<std::string, std::string> payload;
312     payload[Ressched::NAME] = TOUCH;
313     ResSchedDataReport(RES_TYPE_CLICK_RECOGNIZE, TOUCH_DOWN_EVENT, payload);
314     RecordTouchEvent(touchEvent, true);
315     isInTouch_ = true;
316 }
317 
HandleKeyDown(const KeyEvent & event)318 void ResSchedReport::HandleKeyDown(const KeyEvent& event)
319 {
320     std::unordered_map<std::string, std::string> payload;
321     payload[Ressched::NAME] = KEY_EVENT;
322     payload[KEY_CODE] = std::to_string(static_cast<int>(event.code));
323     ResSchedDataReport(RES_TYPE_KEY_EVENT, KEY_DOWN_EVENT, payload);
324 }
325 
HandleTouchUp(const TouchEvent & touchEvent)326 void ResSchedReport::HandleTouchUp(const TouchEvent& touchEvent)
327 {
328     std::unordered_map<std::string, std::string> payload;
329     RecordTouchEvent(touchEvent);
330     payload[Ressched::NAME] = TOUCH;
331     payload[UP_SPEED_KEY] = std::to_string(GetUpVelocity(lastTouchEvent_, curTouchEvent_));
332     ResSchedDataReport(RES_TYPE_CLICK_RECOGNIZE, TOUCH_UP_EVENT, payload);
333     isInSlide_ = false;
334     isInTouch_ = false;
335     averageDistance_.Reset();
336 }
337 
HandleKeyUp(const KeyEvent & event)338 void ResSchedReport::HandleKeyUp(const KeyEvent& event)
339 {
340     std::unordered_map<std::string, std::string> payload;
341     payload[Ressched::NAME] = KEY_EVENT;
342     payload[KEY_CODE] = std::to_string(static_cast<int>(event.code));
343     ResSchedDataReport(RES_TYPE_KEY_EVENT, KEY_UP_EVENT, payload);
344 }
345 
HandleTouchMove(const TouchEvent & touchEvent)346 void ResSchedReport::HandleTouchMove(const TouchEvent& touchEvent)
347 {
348     RecordTouchEvent(touchEvent);
349     averageDistance_ += curTouchEvent_.offset - lastTouchEvent_.offset;
350     if (averageDistance_.GetDistance() >= ResDefine::JUDGE_DISTANCE &&
351         !isInSlide_ && isInTouch_) {
352         std::unordered_map<std::string, std::string> payload;
353         LoadAceApplicationContext(payload);
354         ResSchedDataReport(RES_TYPE_SLIDE, SLIDE_DETECTING, payload);
355         isInSlide_ = true;
356     }
357     static uint64_t lastTime = 0;
358     auto now = std::chrono::steady_clock::now();
359     uint64_t curMs = static_cast<uint64_t>(
360         std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count());
361     if (isInSlide_ && curMs - lastTime >= TIME_INTERVAL) {
362         lastTime = curMs;
363         std::unordered_map<std::string, std::string> payload;
364         LoadAceApplicationContext(payload);
365         ResSchedDataReport(RES_TYPE_SLIDE, MOVE_DETECTING, payload);
366     }
367 }
368 
HandleTouchCancel(const TouchEvent & touchEvent)369 void ResSchedReport::HandleTouchCancel(const TouchEvent& touchEvent)
370 {
371     isInSlide_ = false;
372     isInTouch_ = false;
373     averageDistance_.Reset();
374 }
375 
HandleTouchPullDown(const TouchEvent & touchEvent)376 void ResSchedReport::HandleTouchPullDown(const TouchEvent& touchEvent)
377 {
378     RecordTouchEvent(touchEvent, true);
379     isInTouch_ = true;
380 }
381 
HandleTouchPullUp(const TouchEvent & touchEvent)382 void ResSchedReport::HandleTouchPullUp(const TouchEvent& touchEvent)
383 {
384     std::unordered_map<std::string, std::string> payload;
385     payload[Ressched::NAME] = TOUCH;
386     ResSchedDataReport(RES_TYPE_CLICK_RECOGNIZE, TOUCH_PULL_UP_EVENT, payload);
387     averageDistance_.Reset();
388     isInTouch_ = false;
389 }
390 
HandleTouchPullMove(const TouchEvent & touchEvent)391 void ResSchedReport::HandleTouchPullMove(const TouchEvent& touchEvent)
392 {
393     if (!isInSlide_) {
394         std::unordered_map<std::string, std::string> payload;
395         LoadAceApplicationContext(payload);
396         ResSchedDataReport(RES_TYPE_SLIDE, SLIDE_DETECTING, payload);
397         isInSlide_ = true;
398     }
399     RecordTouchEvent(touchEvent);
400 }
401 
GetUpVelocity(const ResEventInfo & lastMoveInfo,const ResEventInfo & upEventInfo)402 double ResSchedReport::GetUpVelocity(const ResEventInfo& lastMoveInfo,
403     const ResEventInfo& upEventInfo)
404 {
405     double distance = (upEventInfo.offset - lastMoveInfo.offset).GetDistance();
406     int64_t time = std::chrono::duration_cast<std::chrono::milliseconds>(upEventInfo.timeStamp -
407         lastMoveInfo.timeStamp).count();
408     if (time <= 0) {
409         return 0.0f;
410     }
411     return distance * dpi_ / static_cast<double>(time); //unit: pixel/ms
412 }
413 
LoadPageEvent(int32_t value)414 void ResSchedReport::LoadPageEvent(int32_t value)
415 {
416     if (LIKELY((value == ResDefine::LOAD_PAGE_COMPLETE_EVENT && loadPageOn_ == false)
417         || (value == ResDefine::LOAD_PAGE_NO_REQUEST_FRAME_EVENT && loadPageRequestFrameOn_ == false))) {
418         return;
419     } else if (value == ResDefine::LOAD_PAGE_COMPLETE_EVENT && loadPageOn_ == true) {
420         loadPageOn_ = false;
421     } else if (value == ResDefine::LOAD_PAGE_NO_REQUEST_FRAME_EVENT && loadPageRequestFrameOn_ == true) {
422         loadPageRequestFrameOn_ = false;
423     } else if (value == ResDefine::LOAD_PAGE_START_EVENT) {
424         loadPageOn_ = true;
425         loadPageRequestFrameOn_ = true;
426     }
427 
428     std::unordered_map<std::string, std::string> payload;
429     payload[Ressched::NAME] = LOAD_PAGE;
430     LoadAceApplicationContext(payload);
431     ResSchedDataReport(RES_TYPE_LOAD_PAGE, value, payload);
432 }
433 
HandleAxisBegin(const AxisEvent & axisEvent)434 void ResSchedReport::HandleAxisBegin(const AxisEvent& axisEvent)
435 {
436     RecordAxisEvent(axisEvent, true);
437     std::unordered_map<std::string, std::string> payload;
438     LoadAceApplicationContext(payload);
439     ResSchedDataReport(RES_TYPE_SLIDE, SLIDE_DETECTING, payload);
440 }
441 
HandleAxisUpdate(const AxisEvent & axisEvent)442 void ResSchedReport::HandleAxisUpdate(const AxisEvent& axisEvent)
443 {
444     RecordAxisEvent(axisEvent);
445 }
446 
HandleAxisEnd(const AxisEvent & axisEvent)447 void ResSchedReport::HandleAxisEnd(const AxisEvent& axisEvent)
448 {
449     RecordAxisEvent(axisEvent);
450 }
451 
RecordAxisEvent(const AxisEvent & axisEvent,bool enforce)452 void ResSchedReport::RecordAxisEvent(const AxisEvent& axisEvent, bool enforce)
453 {
454     if (enforce) {
455         lastAxisEvent_.timeStamp = axisEvent.time;
456         lastAxisEvent_.offset = axisEvent.ConvertToOffset();
457         lastAxisEvent_.sourceTool = axisEvent.sourceTool;
458         curAxisEvent_.timeStamp = axisEvent.time;
459         curAxisEvent_.offset = axisEvent.ConvertToOffset();
460         curAxisEvent_.sourceTool = axisEvent.sourceTool;
461     } else if (axisEvent.ConvertToOffset().GetX() != 0 || axisEvent.ConvertToOffset().GetY() != 0) {
462         lastAxisEvent_.timeStamp = curAxisEvent_.timeStamp;
463         lastAxisEvent_.offset = curAxisEvent_.offset;
464         lastAxisEvent_.sourceTool = curAxisEvent_.sourceTool;
465         curAxisEvent_.timeStamp = axisEvent.time;
466         curAxisEvent_.offset = axisEvent.ConvertToOffset();
467         curAxisEvent_.sourceTool = axisEvent.sourceTool;
468     }
469 }
470 
GetAxisUpVelocity(const ResEventInfo & lastAxisEvent,const ResEventInfo & curAxisEvent)471 double ResSchedReport::GetAxisUpVelocity(const ResEventInfo& lastAxisEvent, const ResEventInfo& curAxisEvent)
472 {
473     double distance = curAxisEvent.offset.GetDistance();
474     int64_t time = std::chrono::duration_cast<std::chrono::milliseconds>(curAxisEvent.timeStamp -
475         lastAxisEvent.timeStamp).count();
476     if (time <= 0) {
477         return 0.0;
478     }
479     return distance * dpi_ / static_cast<double>(time); //unit: pixel/ms
480 }
481 
AxisEventReportEnd()482 void ResSchedReport::AxisEventReportEnd()
483 {
484     std::unordered_map<std::string, std::string> payload;
485     payload[Ressched::NAME] = TOUCH;
486     if (curAxisEvent_.sourceTool != SourceTool::TOUCHPAD) {
487         payload[UP_SPEED_KEY] = Ressched::AXIS_NORMAL_UP_SPEED;
488         payload[AXIS_EVENT_TYPE] = AXIS_IS_MOUSE;
489     } else {
490         payload[UP_SPEED_KEY] = std::to_string(GetAxisUpVelocity(lastAxisEvent_, curAxisEvent_));
491         payload[AXIS_EVENT_TYPE] = AXIS_IS_PAD;
492     }
493     ResSchedReport::GetInstance().ResSchedDataReport(Ressched::RES_TYPE_AXIS_EVENT, Ressched::AXIS_OFF_EVENT, payload);
494 }
495 
OnAxisEvent(const AxisEvent & axisEvent)496 void ResSchedReport::OnAxisEvent(const AxisEvent& axisEvent)
497 {
498     switch (axisEvent.action) {
499         case AxisAction::BEGIN:
500             HandleAxisBegin(axisEvent);
501             break;
502         case AxisAction::UPDATE:
503             HandleAxisUpdate(axisEvent);
504             break;
505         case AxisAction::END:
506             HandleAxisEnd(axisEvent);
507             break;
508         default:
509             break;
510     }
511 }
512 
HandlePageTransition(const std::string & fromPage,const std::string & toPage,const std::string & mode)513 void ResSchedReport::HandlePageTransition(const std::string& fromPage,
514     const std::string& toPage, const std::string& mode)
515 {
516     if (fromPage.empty() || toPage.empty()) {
517         TAG_LOGD(AceLogTag::ACE_ROUTER, "rss report page transition empty info:%{public}s, %{public}s",
518             fromPage.c_str(), toPage.c_str());
519         return;
520     }
521     std::unordered_map<std::string, std::string> payload;
522     payload[FROM_PAGE_INFO] = fromPage;
523     payload[TO_PAGE_INFO] = toPage;
524     payload[TRANSITION_MODE] = mode;
525     LoadAceApplicationContext(payload);
526     ResSchedDataReport(RES_TYPE_PAGE_TRANSITION, 0, payload);
527 }
528 
ResSchedReportScope(const std::string & name,const std::unordered_map<std::string,std::string> & param)529 ResSchedReportScope::ResSchedReportScope(const std::string& name,
530     const std::unordered_map<std::string, std::string>& param) : name_(name), payload_(param)
531 {
532     name_ = name;
533     payload_[Ressched::NAME] = name;
534     LoadAceApplicationContext(payload_);
535     if (name_ == PUSH_PAGE) {
536         ResSchedReport::GetInstance().ResSchedDataReport(RES_TYPE_PUSH_PAGE, PUSH_PAGE_START_EVENT, payload_);
537         ResSchedReport::GetInstance().LoadPageEvent(ResDefine::LOAD_PAGE_START_EVENT);
538     }
539 }
540 
~ResSchedReportScope()541 ResSchedReportScope::~ResSchedReportScope()
542 {
543     if (name_ == PUSH_PAGE) {
544         ResSchedReport::GetInstance().ResSchedDataReport(RES_TYPE_PUSH_PAGE, PUSH_PAGE_COMPLETE_EVENT, payload_);
545     }
546 }
547 } // namespace OHOS::Ace
548