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 "common/util/form_report.h"
17 #include "data_center/form_record/form_record_report.h"
18
19 #include "fms_log_wrapper.h"
20 #include "common/event/form_event_report.h"
21 #include "form_render/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 std::lock_guard<std::mutex> guard(formReport_);
84 auto it = formStatisticMap_.find(formId);
85 if (it != formStatisticMap_.end()) {
86 endTime = formStatisticMap_[formId].endAquireTime_;
87 }
88 }
89
SetStartBindTime(int64_t formId,int64_t startTime)90 void FormReport::SetStartBindTime(int64_t formId, int64_t startTime)
91 {
92 std::lock_guard<std::mutex> guard(formReport_);
93 auto it = formStatisticMap_.find(formId);
94 if (it != formStatisticMap_.end()) {
95 formStatisticMap_[formId].startBindTime_ = startTime;
96 return;
97 }
98 FormStatistic tmp;
99 tmp.startBindTime_ = startTime;
100 formStatisticMap_[formId] = tmp;
101 }
102
SetEndBindTime(int64_t formId,int64_t endTime)103 void FormReport::SetEndBindTime(int64_t formId, int64_t endTime)
104 {
105 std::lock_guard<std::mutex> guard(formReport_);
106 auto it = formStatisticMap_.find(formId);
107 if (it != formStatisticMap_.end()) {
108 formStatisticMap_[formId].endBindTime_ = endTime;
109 return;
110 }
111 }
112
SetStartGetTime(int64_t formId,int64_t startTime)113 void FormReport::SetStartGetTime(int64_t formId, int64_t startTime)
114 {
115 std::lock_guard<std::mutex> guard(formReport_);
116 auto it = formStatisticMap_.find(formId);
117 if (it != formStatisticMap_.end()) {
118 formStatisticMap_[formId].startGetTime_ = startTime;
119 return;
120 }
121 FormStatistic tmp;
122 tmp.startGetTime_ = startTime;
123 formStatisticMap_[formId] = tmp;
124 }
125
SetEndGetTime(int64_t formId,int64_t endTime)126 void FormReport::SetEndGetTime(int64_t formId, int64_t endTime)
127 {
128 std::lock_guard<std::mutex> guard(formReport_);
129 auto it = formStatisticMap_.find(formId);
130 if (it != formStatisticMap_.end()) {
131 formStatisticMap_[formId].endGetTime_ = endTime;
132 return;
133 }
134 }
135
SetDurationStartTime(int64_t formId,int64_t startTime)136 void FormReport::SetDurationStartTime(int64_t formId, int64_t startTime)
137 {
138 std::lock_guard<std::mutex> guard(formReport_);
139 auto it = formStatisticMap_.find(formId);
140 if (it != formStatisticMap_.end()) {
141 formStatisticMap_[formId].durationStartTime_ = startTime;
142 return;
143 }
144 FormStatistic tmp;
145 tmp.durationStartTime_ = startTime;
146 tmp.durationEndTime_ = 0;
147 formStatisticMap_[formId] = tmp;
148 }
149
SetDurationEndTime(int64_t formId,int64_t endTime)150 void FormReport::SetDurationEndTime(int64_t formId, int64_t endTime)
151 {
152 std::lock_guard<std::mutex> guard(formReport_);
153 auto it = formStatisticMap_.find(formId);
154 if (it != formStatisticMap_.end()) {
155 if (!formStatisticMap_[formId].durationEndTime_) {
156 formStatisticMap_[formId].durationEndTime_ = endTime;
157 HandleFirstUpdateStatistic(formId);
158 }
159 }
160 }
161
GetAddFormFinish(int64_t formId,bool & addFormFinish)162 void FormReport::GetAddFormFinish(int64_t formId, bool &addFormFinish)
163 {
164 std::lock_guard<std::mutex> guard(formReport_);
165 auto it = formStatisticMap_.find(formId);
166 if (it != formStatisticMap_.end()) {
167 addFormFinish = formStatisticMap_[formId].addFormFinish;
168 }
169 }
170
SetAddFormFinish(int64_t formId)171 void FormReport::SetAddFormFinish(int64_t formId)
172 {
173 std::lock_guard<std::mutex> guard(formReport_);
174 auto it = formStatisticMap_.find(formId);
175 if (it != formStatisticMap_.end()) {
176 if (!formStatisticMap_[formId].addFormFinish) {
177 formStatisticMap_[formId].addFormFinish = true;
178 }
179 }
180 }
181
InsertFormId(int64_t formId)182 void FormReport::InsertFormId(int64_t formId)
183 {
184 std::lock_guard<std::mutex> guard(formIdsMutex_);
185 formIds_.insert(formId);
186 }
187
RemoveFormId(int64_t formId)188 void FormReport::RemoveFormId(int64_t formId)
189 {
190 std::lock_guard<std::mutex> guard(formIdsMutex_);
191 if (formIds_.find(formId) != formIds_.end()) {
192 formIds_.erase(formId);
193 }
194 }
195
HasFormId(int64_t formId)196 bool FormReport::HasFormId(int64_t formId)
197 {
198 std::lock_guard<std::mutex> guard(formIdsMutex_);
199 return formIds_.find(formId) != formIds_.end();
200 }
201
HandleAddFormStatistic(int64_t formId)202 void FormReport::HandleAddFormStatistic(int64_t formId)
203 {
204 std::lock_guard<std::mutex> guard(formReport_);
205 auto &record = formStatisticMap_[formId];
206 if (formStatisticMap_.count(formId) == 0) {
207 HILOG_INFO("invalid formId:%{public}" PRId64, formId);
208 return;
209 }
210 if (HasFormId(formId)) {
211 HILOG_ERROR("hisysevent yet formid:%{public}" PRId64, formId);
212 return;
213 }
214 NewFormEventInfo eventInfo;
215 eventInfo.sessionId = 0;
216 eventInfo.formId = formId;
217 eventInfo.bundleName = record.bundleName_;
218 eventInfo.moduleName = record.moduleName_;
219 eventInfo.abilityName = record.abilityName_;
220 eventInfo.formName = record.formName_;
221 eventInfo.formDimension = record.dimensionId_;
222 if (record.endBindTime_ > record.startBindTime_) {
223 eventInfo.bindDuration = (record.endBindTime_ - record.startBindTime_);
224 } else {
225 eventInfo.bindDuration = 0;
226 HILOG_ERROR("bindDuration error formid:%{public}" PRId64, formId);
227 }
228 if (record.endGetTime_ > record.startGetTime_) {
229 eventInfo.getDuration = (record.endGetTime_ - record.startGetTime_);
230 } else {
231 eventInfo.bindDuration = 0;
232 HILOG_ERROR("getDuration error formid:%{public}" PRId64, formId);
233 }
234 eventInfo.acquireDuration = (record.endAquireTime_ - record.startAquireTime_);
235 FormEventReport::SendFirstAddFormEvent(FormEventName::FIRST_ADD_FORM_DURATION,
236 HiSysEventType::STATISTIC, eventInfo);
237 InsertFormId(formId);
238 }
239
HandleFirstUpdateStatistic(int64_t formId)240 void FormReport::HandleFirstUpdateStatistic(int64_t formId)
241 {
242 if (formId <= 0) {
243 return;
244 }
245 NewFormEventInfo eventInfo;
246 for (auto iter = formStatisticMap_.begin(); iter != formStatisticMap_.end(); ++iter) {
247 if (formId == iter->first) {
248 FormStatistic& record = iter->second;
249 if (!record.durationStartTime_) {
250 return;
251 }
252 int64_t durationNow = (record.durationEndTime_ - record.durationStartTime_);
253 eventInfo.sessionId = 0;
254 eventInfo.formId = formId;
255 if (durationNow >= DELAY_TIME_MICROSECONDS) {
256 eventInfo.durationType = 1;
257 } else {
258 eventInfo.durationType = 0;
259 }
260 eventInfo.duration = durationNow;
261 FormEventReport::SendFirstUpdateFormEvent(FormEventName::FIRST_UPDATE_FORM_DURATION,
262 HiSysEventType::STATISTIC, eventInfo);
263 iter->second.durationStartTime_ = 0;
264 }
265 }
266 }
267
GetStatistic()268 std::unordered_map<int64_t, FormStatistic>& FormReport::GetStatistic()
269 {
270 return formStatisticMap_;
271 }
272 } // namespace AppExecFwk
273 } // namespace OHOS