• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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