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