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 "form_report.h"
17 #include "form_record_report.h"
18
19 #include "fms_log_wrapper.h"
20 #include "form_event_report.h"
21 #include "form_render_mgr.h"
22
23 namespace OHOS {
24 namespace AppExecFwk {
25 namespace {
26 constexpr int64_t DELAY_TIME_MICROSECONDS = 10 * 1000;
27 }
28
FormReport()29 FormReport::FormReport()
30 {
31 HILOG_INFO("begin");
32 }
33
~FormReport()34 FormReport::~FormReport()
35 {
36 }
37
SetFormRecordInfo(int64_t formId,const Want & want)38 void FormReport::SetFormRecordInfo(int64_t formId, const Want &want)
39 {
40 std::lock_guard<std::mutex> guard(formReport_);
41 auto it = formStatisticMap_.find(formId);
42 if (it != formStatisticMap_.end()) {
43 formStatisticMap_[formId].bundleName_ = want.GetElement().GetBundleName();
44 formStatisticMap_[formId].moduleName_ = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
45 formStatisticMap_[formId].abilityName_ = want.GetElement().GetAbilityName();
46 formStatisticMap_[formId].formName_ = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
47 formStatisticMap_[formId].dimensionId_ = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
48 return;
49 }
50 FormStatistic info;
51 info.bundleName_ = want.GetElement().GetBundleName();
52 info.moduleName_ = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
53 info.abilityName_ = want.GetElement().GetAbilityName();
54 info.formName_ = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
55 info.dimensionId_ = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
56 formStatisticMap_[formId] = info;
57 }
58
SetStartAquireTime(int64_t formId,int64_t startTime)59 void FormReport::SetStartAquireTime(int64_t formId, int64_t startTime)
60 {
61 std::lock_guard<std::mutex> guard(formReport_);
62 auto it = formStatisticMap_.find(formId);
63 if (it != formStatisticMap_.end()) {
64 formStatisticMap_[formId].startAquireTime_ = startTime;
65 return;
66 }
67 FormStatistic tmp;
68 tmp.startAquireTime_ = startTime;
69 formStatisticMap_[formId] = tmp;
70 }
71
SetEndAquireTime(int64_t formId,int64_t endTime)72 void FormReport::SetEndAquireTime(int64_t formId, int64_t endTime)
73 {
74 std::lock_guard<std::mutex> guard(formReport_);
75 auto it = formStatisticMap_.find(formId);
76 if (it != formStatisticMap_.end()) {
77 formStatisticMap_[formId].endAquireTime_ = endTime;
78 }
79 }
80
GetEndAquireTime(int64_t formId,int64_t & endTime)81 void FormReport::GetEndAquireTime(int64_t formId, int64_t &endTime)
82 {
83 auto it = formStatisticMap_.find(formId);
84 if (it != formStatisticMap_.end()) {
85 endTime = formStatisticMap_[formId].endAquireTime_;
86 }
87 }
88
SetStartBindTime(int64_t formId,int64_t startTime)89 void FormReport::SetStartBindTime(int64_t formId, int64_t startTime)
90 {
91 std::lock_guard<std::mutex> guard(formReport_);
92 auto it = formStatisticMap_.find(formId);
93 if (it != formStatisticMap_.end()) {
94 formStatisticMap_[formId].startBindTime_ = startTime;
95 return;
96 }
97 FormStatistic tmp;
98 tmp.startBindTime_ = startTime;
99 formStatisticMap_[formId] = tmp;
100 }
101
SetEndBindTime(int64_t formId,int64_t endTime)102 void FormReport::SetEndBindTime(int64_t formId, int64_t endTime)
103 {
104 std::lock_guard<std::mutex> guard(formReport_);
105 auto it = formStatisticMap_.find(formId);
106 if (it != formStatisticMap_.end()) {
107 formStatisticMap_[formId].endBindTime_ = endTime;
108 return;
109 }
110 }
111
SetStartGetTime(int64_t formId,int64_t startTime)112 void FormReport::SetStartGetTime(int64_t formId, int64_t startTime)
113 {
114 std::lock_guard<std::mutex> guard(formReport_);
115 auto it = formStatisticMap_.find(formId);
116 if (it != formStatisticMap_.end()) {
117 formStatisticMap_[formId].startGetTime_ = startTime;
118 return;
119 }
120 FormStatistic tmp;
121 tmp.startGetTime_ = startTime;
122 formStatisticMap_[formId] = tmp;
123 }
124
SetEndGetTime(int64_t formId,int64_t endTime)125 void FormReport::SetEndGetTime(int64_t formId, int64_t endTime)
126 {
127 std::lock_guard<std::mutex> guard(formReport_);
128 auto it = formStatisticMap_.find(formId);
129 if (it != formStatisticMap_.end()) {
130 formStatisticMap_[formId].endGetTime_ = endTime;
131 return;
132 }
133 }
134
SetDurationStartTime(int64_t formId,int64_t startTime)135 void FormReport::SetDurationStartTime(int64_t formId, int64_t startTime)
136 {
137 std::lock_guard<std::mutex> guard(formReport_);
138 auto it = formStatisticMap_.find(formId);
139 if (it != formStatisticMap_.end()) {
140 formStatisticMap_[formId].durationStartTime_ = startTime;
141 return;
142 }
143 FormStatistic tmp;
144 tmp.durationStartTime_ = startTime;
145 tmp.durationEndTime_ = 0;
146 formStatisticMap_[formId] = tmp;
147 }
148
SetDurationEndTime(int64_t formId,int64_t endTime)149 void FormReport::SetDurationEndTime(int64_t formId, int64_t endTime)
150 {
151 auto it = formStatisticMap_.find(formId);
152 if (it != formStatisticMap_.end()) {
153 if (!formStatisticMap_[formId].durationEndTime_) {
154 formStatisticMap_[formId].durationEndTime_ = endTime;
155 HandleFirstUpdateStatistic(formId);
156 }
157 }
158 }
159
GetAddFormFinish(int64_t formId,bool & addFormFinish)160 void FormReport::GetAddFormFinish(int64_t formId, bool &addFormFinish)
161 {
162 std::lock_guard<std::mutex> guard(formReport_);
163 auto it = formStatisticMap_.find(formId);
164 if (it != formStatisticMap_.end()) {
165 addFormFinish = formStatisticMap_[formId].addFormFinish;
166 }
167 }
168
SetAddFormFinish(int64_t formId)169 void FormReport::SetAddFormFinish(int64_t formId)
170 {
171 std::lock_guard<std::mutex> guard(formReport_);
172 auto it = formStatisticMap_.find(formId);
173 if (it != formStatisticMap_.end()) {
174 if (!formStatisticMap_[formId].addFormFinish) {
175 formStatisticMap_[formId].addFormFinish = true;
176 }
177 }
178 }
179
InsertFormId(int64_t formId)180 void FormReport::InsertFormId(int64_t formId)
181 {
182 std::lock_guard<std::mutex> guard(formIdsMutex_);
183 FormIds.insert(formId);
184 }
185
RemoveFormId(int64_t formId)186 void FormReport::RemoveFormId(int64_t formId)
187 {
188 std::lock_guard<std::mutex> guard(formIdsMutex_);
189 if (FormIds.find(formId) != FormIds.end()) {
190 FormIds.erase(formId);
191 }
192 }
193
HandleAddFormStatistic(int64_t formId)194 void FormReport::HandleAddFormStatistic(int64_t formId)
195 {
196 std::lock_guard<std::mutex> guard(formReport_);
197 auto &record = formStatisticMap_[formId];
198 if (formStatisticMap_.count(formId) == 0) {
199 HILOG_INFO("invalid formId:%{public}" PRId64, formId);
200 return;
201 }
202 if (FormIds.find(formId) != FormIds.end()) {
203 HILOG_ERROR("hisysevent yet formid:%{public}" PRId64, formId);
204 return;
205 }
206 NewFormEventInfo eventInfo;
207 eventInfo.sessionId = 0;
208 eventInfo.formId = formId;
209 eventInfo.bundleName = record.bundleName_;
210 eventInfo.moduleName = record.moduleName_;
211 eventInfo.abilityName = record.abilityName_;
212 eventInfo.formName = record.formName_;
213 eventInfo.formDimension = record.dimensionId_;
214 if (record.endBindTime_ > record.startBindTime_) {
215 eventInfo.bindDuration = (record.endBindTime_ - record.startBindTime_);
216 } else {
217 eventInfo.bindDuration = 0;
218 HILOG_ERROR("bindDuration error formid:%{public}" PRId64, formId);
219 }
220 if (record.endGetTime_ > record.startGetTime_) {
221 eventInfo.getDuration = (record.endGetTime_ - record.startGetTime_);
222 } else {
223 eventInfo.bindDuration = 0;
224 HILOG_ERROR("getDuration error formid:%{public}" PRId64, formId);
225 }
226 eventInfo.acquireDuration = (record.endAquireTime_ - record.startAquireTime_);
227 FormEventReport::SendFirstAddFormEvent(FormEventName::FIRST_ADD_FORM_DURATION,
228 HiSysEventType::STATISTIC, eventInfo);
229 InsertFormId(formId);
230 }
231
HandleFirstUpdateStatistic(int64_t formId)232 void FormReport::HandleFirstUpdateStatistic(int64_t formId)
233 {
234 if (formId <= 0) {
235 return;
236 }
237 NewFormEventInfo eventInfo;
238 std::lock_guard<std::mutex> guard(formReport_);
239 for (auto iter = formStatisticMap_.begin(); iter != formStatisticMap_.end(); ++iter) {
240 if (formId == iter->first) {
241 FormStatistic& record = iter->second;
242 if (!record.durationStartTime_) {
243 return;
244 }
245 int64_t durationNow = (record.durationEndTime_ - record.durationStartTime_);
246 eventInfo.sessionId = 0;
247 eventInfo.formId = formId;
248 if (durationNow >= DELAY_TIME_MICROSECONDS) {
249 eventInfo.durationType = 1;
250 } else {
251 eventInfo.durationType = 0;
252 }
253 eventInfo.duration = durationNow;
254 FormEventReport::SendFirstUpdateFormEvent(FormEventName::FIRST_UPDATE_FORM_DURATION,
255 HiSysEventType::STATISTIC, eventInfo);
256 iter->second.durationStartTime_ = 0;
257 }
258 }
259 }
260
GetStatistic()261 std::unordered_map<int64_t, FormStatistic>& FormReport::GetStatistic()
262 {
263 return formStatisticMap_;
264 }
265 } // namespace AppExecFwk
266 } // namespace OHOS