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