1 /*
2 * Copyright (c) 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 "JankAnimatorReporterAdapter.h"
17 #include "hiview_logger.h"
18
19 DEFINE_LOG_LABEL(0xD002D66, "Hiview-XPerformance");;
20
JankAnimatorReporterAdapter(IJankAnimatorReportInfrastructure * impl,IScrollJankEventPoster * eventPoster)21 JankAnimatorReporterAdapter::JankAnimatorReporterAdapter(
22 IJankAnimatorReportInfrastructure* impl, IScrollJankEventPoster* eventPoster)
23 {
24 this->reporter = impl;
25 this->eventPoster = eventPoster;
26 }
27
ReportNormal(const JankAnimatorReportEvent & event)28 void JankAnimatorReporterAdapter::ReportNormal(const JankAnimatorReportEvent& event)
29 {
30 HIVIEW_LOGD("[JankAnimatorReporterAdapter::ReportNormal]");
31 try {
32 if (reporter != nullptr) {
33 JankAnimatorReportData data = ConvertReporterEventToData(event);
34 reporter->ReportNormal(data);
35 } else {
36 HIVIEW_LOGE("[JankAnimatorReporterAdapter ReportNormal] report is null");
37 }
38
39 if ((eventPoster != nullptr) && IsScrollJankEvent(event)) {
40 ScrollJankEventInfo evt = ConvertReportEventToEventInfo(event);
41 HIVIEW_LOGD("[JankAnimatorReporterAdapter::ReportNormal] PostScrollJankEvent begin");
42 eventPoster->PostScrollJankEvent(evt);
43 HIVIEW_LOGD("[JankAnimatorReporterAdapter::ReportNormal] PostScrollJankEvent end");
44 }
45 }
46 catch (std::logic_error& ex) {
47 HIVIEW_LOGE("[JankAnimatorReporterAdapter ReportNormal] exception: %{public}s", ex.what());
48 }
49 }
50
ReportCritical(const JankAnimatorReportEvent & event)51 void JankAnimatorReporterAdapter::ReportCritical(const JankAnimatorReportEvent& event)
52 {
53 HIVIEW_LOGD("[JankAnimatorReporterAdapter::ReportCritical]");
54 try {
55 JankAnimatorReportData data = ConvertReporterEventToData(event);
56 if (reporter != nullptr) {
57 reporter->ReportCritical(data);
58 } else {
59 HIVIEW_LOGE("[JankAnimatorReporterAdapter ReportCritical] report is null");
60 }
61 }
62 catch (std::logic_error& ex) {
63 HIVIEW_LOGE("[JankAnimatorReporterAdapter::ReportCritical] exception: %s", ex.what());
64 }
65 }
66
ConvertReporterEventToData(const JankAnimatorReportEvent & event)67 JankAnimatorReportData JankAnimatorReporterAdapter::ConvertReporterEventToData(const JankAnimatorReportEvent& event)
68 {
69 JankAnimatorReportData data;
70 data.appPid = event.appPid;
71 data.versionCode = event.versionCode;
72 data.versionName = event.versionName;
73 data.bundleName = event.bundleName;
74 data.processName = event.processName;
75 data.abilityName = event.abilityName;
76 data.pageUrl = event.pageUrl;
77 data.sceneId = event.sceneId;
78 data.bundleNameEx = event.bundleNameEx;
79 data.isFocus = event.isFocus;
80 data.startTime = event.startTime;
81 data.durition = event.durition;
82 data.totalAppFrames = event.totalAppFrames;
83 data.totalAppMissedFrames = event.totalAppMissedFrames;
84 data.maxAppFrameTime = event.maxAppFrameTime;
85 data.maxAppSeqMissedFrames = event.maxAppSeqMissedFrames;
86 data.isDisplayAnimator = event.isDisplayAnimator;
87 data.totalRenderFrames = event.totalRenderFrames;
88 data.totalRenderMissedFrames = event.totalRenderMissedFrames;
89 data.maxRenderFrameTime = event.maxRenderFrameTime;
90 data.averageRenderFrameTime = event.averageRenderFrameTime;
91 data.maxRenderSeqMissedFrames = event.maxRenderSeqMissedFrames;
92 data.isFoldDisp = event.isFoldDisp;
93 /* only for critical */
94 data.traceFileName = event.traceFileName;
95 data.infoFileName = event.infoFileName;
96 data.happenTime = event.happenTime;
97 return data;
98 }
99
ConvertReportEventToEventInfo(const JankAnimatorReportEvent & event)100 ScrollJankEventInfo JankAnimatorReporterAdapter::ConvertReportEventToEventInfo(const JankAnimatorReportEvent& event)
101 {
102 ScrollJankEventInfo info;
103 info.appPid = event.appPid;
104 info.versionCode = event.versionCode;
105 info.versionName = event.versionName;
106 info.bundleName = event.bundleName;
107 info.processName = event.processName;
108 info.abilityName = event.abilityName;
109 info.pageUrl = event.pageUrl;
110 info.sceneId = event.sceneId;
111 info.bundleNameEx = event.bundleNameEx;
112 info.isFocus = event.isFocus;
113 info.startTime = event.startTime;
114 info.duration = event.durition;
115 info.totalAppFrames = event.totalAppFrames;
116 info.totalAppMissedFrames = event.totalAppMissedFrames;
117 info.maxAppFrameTime = event.maxAppFrameTime;
118 info.maxAppSeqMissedFrames = event.maxAppSeqMissedFrames;
119 info.isDisplayAnimator = event.isDisplayAnimator;
120 info.totalRenderFrames = event.totalRenderFrames;
121 info.totalRenderMissedFrames = event.totalRenderMissedFrames;
122 info.maxRenderFrameTime = event.maxRenderFrameTime;
123 info.averageRenderFrameTime = event.averageRenderFrameTime;
124 info.maxRenderSeqMissedFrames = event.maxRenderSeqMissedFrames;
125 info.isFoldDisp = event.isFoldDisp;
126 /* only for critical */
127 info.traceFileName = event.traceFileName;
128 info.infoFileName = event.infoFileName;
129 info.happenTime = event.happenTime;
130 return info;
131 }
132
IsScrollJankEvent(const JankAnimatorReportEvent & event)133 bool JankAnimatorReporterAdapter::IsScrollJankEvent(const JankAnimatorReportEvent& event)
134 {
135 const std::string sceneId = event.sceneId;
136 return ((sceneId == "APP_LIST_FLING") || (sceneId == "APP_SWIPER_SCROLL") || (sceneId == "APP_SWIPER_FLING"));
137 }