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 std::lock_guard<std::mutex> guard(formReport_);
152 auto it = formStatisticMap_.find(formId);
153 if (it != formStatisticMap_.end()) {
154 if (!formStatisticMap_[formId].durationEndTime_) {
155 formStatisticMap_[formId].durationEndTime_ = endTime;
156 HandleFirstUpdateStatistic(formId);
157 }
158 }
159 }
160
GetAddFormFinish(int64_t formId,bool & addFormFinish)161 void FormReport::GetAddFormFinish(int64_t formId, bool &addFormFinish)
162 {
163 std::lock_guard<std::mutex> guard(formReport_);
164 auto it = formStatisticMap_.find(formId);
165 if (it != formStatisticMap_.end()) {
166 addFormFinish = formStatisticMap_[formId].addFormFinish;
167 }
168 }
169
SetAddFormFinish(int64_t formId)170 void FormReport::SetAddFormFinish(int64_t formId)
171 {
172 std::lock_guard<std::mutex> guard(formReport_);
173 auto it = formStatisticMap_.find(formId);
174 if (it != formStatisticMap_.end()) {
175 if (!formStatisticMap_[formId].addFormFinish) {
176 formStatisticMap_[formId].addFormFinish = true;
177 }
178 }
179 }
180
InsertFormId(int64_t formId)181 void FormReport::InsertFormId(int64_t formId)
182 {
183 std::lock_guard<std::mutex> guard(formIdsMutex_);
184 FormIds.insert(formId);
185 }
186
RemoveFormId(int64_t formId)187 void FormReport::RemoveFormId(int64_t formId)
188 {
189 std::lock_guard<std::mutex> guard(formIdsMutex_);
190 if (FormIds.find(formId) != FormIds.end()) {
191 FormIds.erase(formId);
192 }
193 }
194
HandleAddFormStatistic(int64_t formId)195 void FormReport::HandleAddFormStatistic(int64_t formId)
196 {
197 std::lock_guard<std::mutex> guard(formReport_);
198 auto &record = formStatisticMap_[formId];
199 if (formStatisticMap_.count(formId) == 0) {
200 HILOG_INFO("invalid formId:%{public}" PRId64, formId);
201 return;
202 }
203 if (FormIds.find(formId) != FormIds.end()) {
204 HILOG_ERROR("hisysevent yet formid:%{public}" PRId64, formId);
205 return;
206 }
207 NewFormEventInfo eventInfo;
208 eventInfo.sessionId = 0;
209 eventInfo.formId = formId;
210 eventInfo.bundleName = record.bundleName_;
211 eventInfo.moduleName = record.moduleName_;
212 eventInfo.abilityName = record.abilityName_;
213 eventInfo.formName = record.formName_;
214 eventInfo.formDimension = record.dimensionId_;
215 if (record.endBindTime_ > record.startBindTime_) {
216 eventInfo.bindDuration = (record.endBindTime_ - record.startBindTime_);
217 } else {
218 eventInfo.bindDuration = 0;
219 HILOG_ERROR("bindDuration error formid:%{public}" PRId64, formId);
220 }
221 if (record.endGetTime_ > record.startGetTime_) {
222 eventInfo.getDuration = (record.endGetTime_ - record.startGetTime_);
223 } else {
224 eventInfo.bindDuration = 0;
225 HILOG_ERROR("getDuration error formid:%{public}" PRId64, formId);
226 }
227 eventInfo.acquireDuration = (record.endAquireTime_ - record.startAquireTime_);
228 FormEventReport::SendFirstAddFormEvent(FormEventName::FIRST_ADD_FORM_DURATION,
229 HiSysEventType::STATISTIC, eventInfo);
230 InsertFormId(formId);
231 }
232
HandleFirstUpdateStatistic(int64_t formId)233 void FormReport::HandleFirstUpdateStatistic(int64_t formId)
234 {
235 if (formId <= 0) {
236 return;
237 }
238 NewFormEventInfo eventInfo;
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