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