• 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 "data_center/form_record/form_record_report.h"
17 #include "fms_log_wrapper.h"
18 #include "common/event/form_event_report.h"
19 #include "data_center/form_basic_info_mgr.h"
20 
21 namespace OHOS {
22 namespace AppExecFwk {
23 namespace {
24 constexpr size_t REPORT_INFO_QUEUE_MAX_LEN = 2;
25 constexpr size_t REPORT_INFO_QUEUE_MIN_LEN = 1;
26 }
27 
FormRecordReport()28 FormRecordReport::FormRecordReport()
29 {
30 }
31 
~FormRecordReport()32 FormRecordReport::~FormRecordReport()
33 {
34     ClearReportInfo();
35 }
36 
GetFormRecords()37 std::map<int64_t, std::queue<FormRecordReportInfo>>& FormRecordReport::GetFormRecords()
38 {
39     return formRecordReportMap_;
40 }
41 
SetFormRecordRecordInfo(int64_t formId,const Want & want)42 void FormRecordReport::SetFormRecordRecordInfo(int64_t formId, const Want &want)
43 {
44     FormRecordReportInfo info;
45     std::lock_guard<std::mutex> guard(formRecordReportMutex_);
46     if (formRecordReportMap_.find(formId) == formRecordReportMap_.end()) {
47         std::queue<FormRecordReportInfo> queue;
48         queue.push(info);
49         formRecordReportMap_[formId] = queue;
50     }
51 }
52 
IncreaseUpdateTimes(int64_t formId,HiSysEventPointType type)53 void FormRecordReport::IncreaseUpdateTimes(int64_t formId, HiSysEventPointType type)
54 {
55     HILOG_DEBUG("formId:%{public}" PRId64, formId);
56     std::lock_guard<std::mutex> guard(formRecordReportMutex_);
57     if (formRecordReportMap_.find(formId) != formRecordReportMap_.end()) {
58         auto &queue = formRecordReportMap_[formId];
59         if (queue.empty()) {
60             queue.push(FormRecordReportInfo());
61         }
62         FormRecordReportInfo &info = formRecordReportMap_[formId].back();
63         switch (type) {
64             case TYPE_DAILY_REFRESH:
65                 info.dailyRefreshTimes++;
66                 break;
67             case TYPE_INVISIBLE_UPDATE:
68                 info.invisibleRefreshTimes++;
69                 break;
70             case TYPE_HIGH_FREQUENCY:
71                 info.hfRefreshBlockTimes++;
72                 break;
73             case TYPE_INVISIBLE_INTERCEPT:
74                 info.invisibleRefreshBlockTimes++;
75                 break;
76             case TYPE_HIGH_LOAD:
77                 info.highLoadRefreshBlockTimes = 0;
78                 break;
79             case TYPE_ACTIVE_RECVOER_UPDATE:
80                 info.activeRecoverRefreshTimes = 0;
81                 break;
82             case TYPE_PASSIVE_RECOVER_UPDATE:
83                 info.passiveRecoverRefreshTimes++;
84                 break;
85             case TYPE_HF_RECOVER_UPDATE:
86                 info.hfRecoverRefreshTimes++;
87                 break;
88             case TYPE_OFFLOAD_RECOVER_UPDATE:
89                 info.offloadRecoverRefreshTimes = 0;
90                 break;
91             case TYPE_DISABLE_FORM_INTERCEPT:
92                 info.disableFormRefreshTimes++;
93                 break;
94             default:
95                 break;
96         }
97     }
98 }
99 
100 // Reports the form refresh statistics for the previous day.
101 // After the report is successfully submitted, the data will be deleted.
HandleFormRefreshCount()102 void FormRecordReport::HandleFormRefreshCount()
103 {
104     std::lock_guard<std::mutex> guard(formRecordReportMutex_);
105     for (auto& entry : formRecordReportMap_) {
106         int64_t formId = entry.first;
107         auto &queue = entry.second;
108         if (formId <= 0 || queue.empty()) {
109             return;
110         }
111         FormRecordReportInfo record = queue.front();
112         NewFormEventInfo eventInfo;
113         eventInfo.formId = formId;
114         eventInfo.bundleName = FormBasicInfoMgr::GetInstance().GetFormBundleName(formId);
115         eventInfo.moduleName = FormBasicInfoMgr::GetInstance().GetFormModuleName(formId);
116         eventInfo.formName = FormBasicInfoMgr::GetInstance().GetFormName(formId);
117         eventInfo.dailyRefreshTimes = record.dailyRefreshTimes;
118         eventInfo.invisibleRefreshTimes = record.invisibleRefreshTimes;
119         eventInfo.hfRefreshBlockTimes = record.hfRefreshBlockTimes;
120         eventInfo.invisibleRefreshBlockTimes = record.invisibleRefreshBlockTimes;
121         eventInfo.highLoadRefreshBlockTimes = record.highLoadRefreshBlockTimes;
122         eventInfo.activeRecoverRefreshTimes = record.activeRecoverRefreshTimes;
123         eventInfo.passiveRecoverRefreshTimes = record.passiveRecoverRefreshTimes;
124         eventInfo.hfRecoverRefreshTimes = record.hfRecoverRefreshTimes;
125         eventInfo.offloadRecoverRefreshTimes = record.offloadRecoverRefreshTimes;
126         eventInfo.disableFormRefreshTimes = record.disableFormRefreshTimes;
127         FormEventReport::SendFormRefreshCountEvent(FormEventName::UPDATE_FORM_REFRESH_TIMES,
128             HiSysEventType::STATISTIC, eventInfo);
129         while (queue.size() > REPORT_INFO_QUEUE_MIN_LEN) {
130             queue.pop();
131         }
132     }
133 }
134 
ClearReportInfo()135 void FormRecordReport::ClearReportInfo()
136 {
137     std::lock_guard<std::mutex> guard(formRecordReportMutex_);
138     formRecordReportMap_.clear();
139 }
140 
AddNewDayReportInfo()141 void FormRecordReport::AddNewDayReportInfo()
142 {
143     std::lock_guard<std::mutex> guard(formRecordReportMutex_);
144     for (auto &entry : formRecordReportMap_) {
145         auto &queue = entry.second;
146         if (queue.size() < REPORT_INFO_QUEUE_MAX_LEN) {
147             FormRecordReportInfo record;
148             queue.push(record);
149         }
150     }
151 }
152 
153 }  // namespace AppExecFwk
154 }  // namespace OHOS