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 }