1 /*
2 * Copyright (c) 2025 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_refresh/strategy/refresh_cache_mgr.h"
17
18 #include "form_refresh/strategy/refresh_exec_mgr.h"
19 #include "common/util/form_util.h"
20 #include "data_center/form_data_mgr.h"
21 #include "data_center/form_record/form_record_report.h"
22 #include "fms_log_wrapper.h"
23 #include "form_refresh/form_refresh_mgr.h"
24
25 namespace OHOS {
26 namespace AppExecFwk {
27
RefreshCacheMgr()28 RefreshCacheMgr::RefreshCacheMgr() {}
~RefreshCacheMgr()29 RefreshCacheMgr::~RefreshCacheMgr() {}
30
AddToOverloadTaskQueue(const FormTimer & task)31 void RefreshCacheMgr::AddToOverloadTaskQueue(const FormTimer &task)
32 {
33 HILOG_WARN("add overload formId:%{public} " PRId64 ", userId:%{public}d", task.formId, task.userId);
34 std::lock_guard<std::mutex> lock(overloadTaskMutex_);
35 for (auto &item : overloadTask_) {
36 if (item.formId == task.formId && item.userId == task.userId) {
37 item = task;
38 HILOG_INFO("already exists, update task");
39 return;
40 }
41 }
42 overloadTask_.emplace_back(task);
43 return;
44 }
45
ConsumeOverloadTaskQueue()46 void RefreshCacheMgr::ConsumeOverloadTaskQueue()
47 {
48 std::vector<FormTimer> tasksToProcess;
49 {
50 std::lock_guard<std::mutex> lock(overloadTaskMutex_);
51 tasksToProcess.swap(overloadTask_);
52 }
53 for (const auto &item : tasksToProcess) {
54 HILOG_INFO("cosume overload task(formId:%{public}" PRId64 ", userId:%{public}d)", item.formId, item.userId);
55 RefreshData data;
56 data.formId = item.formId;
57 data.formTimer = item;
58 FormRefreshMgr::GetInstance().RequestRefresh(data, TYPE_TIMER);
59 }
60 }
61
AddFlagByHealthyControl(const int64_t formId,bool isAskForProviderData)62 void RefreshCacheMgr::AddFlagByHealthyControl(const int64_t formId, bool isAskForProviderData)
63 {
64 HILOG_WARN("healthy control formId:%{public}" PRId64", ask for data:%{public}d", formId, isAskForProviderData);
65 if (isAskForProviderData) {
66 FormDataMgr::GetInstance().SetRefreshDuringDisableForm(formId, true);
67 } else {
68 FormDataMgr::GetInstance().SetUpdateDuringDisableForm(formId, true);
69 }
70 }
71
ConsumeHealthyControlFlag(std::vector<FormRecord>::iterator & record,const int32_t userId)72 void RefreshCacheMgr::ConsumeHealthyControlFlag(std::vector<FormRecord>::iterator &record, const int32_t userId)
73 {
74 if (record->isRefreshDuringDisableForm) {
75 HILOG_INFO("ask for data, formId:%{public}" PRId64, record->formId);
76 record->isRefreshDuringDisableForm = false;
77 Want want;
78 want.SetElementName(record->bundleName, record->abilityName);
79 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
80 want.SetParam(Constants::PARAM_MODULE_NAME_KEY, record->moduleName);
81 want.SetParam(Constants::PARAM_FORM_NAME_KEY, record->formName);
82 want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, record->specification);
83 want.SetParam(Constants::PARAM_FORM_RENDERINGMODE_KEY, static_cast<int32_t>(record->renderingMode));
84 want.SetParam(Constants::PARAM_DYNAMIC_NAME_KEY, record->isDynamic);
85 want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, record->formTempFlag);
86 RefreshData data;
87 data.formId = record->formId;
88 data.record = *record;
89 data.want = want;
90 FormRefreshMgr::GetInstance().RequestRefresh(data, TYPE_UNCONTROL);
91 } else if (record->isUpdateDuringDisableForm) {
92 HILOG_INFO("update provider data, formId:%{public}" PRId64, record->formId);
93 record->isUpdateDuringDisableForm = false;
94 FormProviderData data = record->formProviderInfo.GetFormData();
95 RefreshExecMgr::UpdateByProviderData(record->formId, data, true);
96 }
97 }
98
AddFlagByInvisible(const int64_t formId,int refreshType)99 void RefreshCacheMgr::AddFlagByInvisible(const int64_t formId, int refreshType)
100 {
101 HILOG_WARN("add invisible form:%{public}" PRId64", refreshType:%{public}d", formId, refreshType);
102 FormDataMgr::GetInstance().SetNeedRefresh(formId, true);
103 FormDataMgr::GetInstance().SetRefreshType(formId, refreshType);
104 FormRecordReport::GetInstance().IncreaseUpdateTimes(formId, HiSysEventPointType::TYPE_INVISIBLE_INTERCEPT);
105 }
106
ConsumeInvisibleFlag(const int64_t formId,const int32_t userId)107 void RefreshCacheMgr::ConsumeInvisibleFlag(const int64_t formId, const int32_t userId)
108 {
109 FormRecord record;
110 bool flag = FormDataMgr::GetInstance().GetFormRecord(formId, record);
111 if (!flag) {
112 HILOG_ERROR("not exist such, formId:%{public}" PRId64 ", visible refresh", formId);
113 return;
114 }
115
116 HILOG_INFO("formId:%{public}" PRId64", userId:%{public}d, isTimerRefresh:%{public}d, isHostRefresh:%{public}d",
117 formId, userId, record.isTimerRefresh, record.isHostRefresh);
118 Want want;
119 if (record.isTimerRefresh) {
120 want.SetParam(Constants::KEY_IS_TIMER, true);
121 want.SetParam(Constants::KEY_TIMER_REFRESH, true);
122 want.SetParam(Constants::PARAM_FORM_REFRESH_TYPE, Constants::REFRESHTYPE_VISIABLE);
123 }
124 // multi user
125 if (FormUtil::IsActiveUser(userId)) {
126 HILOG_INFO("userId is current user, formId:%{public}" PRId64, formId);
127 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
128 }
129 if (record.isHostRefresh && record.wantCacheMap.find(formId) != record.wantCacheMap.end()) {
130 FormDataMgr::GetInstance().MergeFormWant(record.wantCacheMap[formId], want);
131 }
132 RefreshData data;
133 data.formId = formId;
134 data.record = record;
135 data.want = want;
136 FormRefreshMgr::GetInstance().RequestRefresh(data, TYPE_UNCONTROL);
137 }
138
AddFlagByScreenOff(const int64_t formId,const Want & want,FormRecord & record)139 void RefreshCacheMgr::AddFlagByScreenOff(const int64_t formId, const Want &want, FormRecord &record)
140 {
141 HILOG_WARN("add screen off formId:%{public}" PRId64, formId);
142 FormDataMgr::GetInstance().UpdateFormWant(formId, want, record);
143 FormDataMgr::GetInstance().UpdateFormRecord(formId, record);
144 FormDataMgr::GetInstance().SetHostRefresh(formId, true);
145 FormDataMgr::GetInstance().SetNeedRefresh(formId, true);
146 }
147
ConsumeScreenOffFlag()148 void RefreshCacheMgr::ConsumeScreenOffFlag()
149 {
150 const int32_t currUserId = FormUtil::GetCurrentAccountId();
151 HILOG_INFO("screen on and refresh forms, currUserId:%{public}d", currUserId);
152 std::vector<FormRecord> formRecords;
153 FormDataMgr::GetInstance().GetFormRecordsByUserId(currUserId, formRecords);
154 for (const FormRecord& formRecord : formRecords) {
155 if (!formRecord.needRefresh) {
156 continue;
157 }
158 if (formRecord.formVisibleNotifyState == Constants::FORM_INVISIBLE) {
159 continue;
160 }
161 ConsumeInvisibleFlag(formRecord.formId, currUserId);
162 }
163 }
164
AddRenderTask(int64_t formId,std::function<void ()> task)165 void RefreshCacheMgr::AddRenderTask(int64_t formId, std::function<void()> task)
166 {
167 std::lock_guard<std::mutex> lock(renderTaskMapMutex_);
168 auto search = renderTaskMap_.find(formId);
169 if (search == renderTaskMap_.end()) {
170 renderTaskMap_.emplace(formId, task);
171 } else {
172 search->second = task;
173 }
174 HILOG_WARN("add render task, formId:%{public}" PRId64, formId);
175 }
176
ConsumeRenderTask(int64_t formId)177 void RefreshCacheMgr::ConsumeRenderTask(int64_t formId)
178 {
179 std::function<void()> task;
180 bool findTask = false;
181 {
182 std::lock_guard<std::mutex> lock(renderTaskMapMutex_);
183 auto search = renderTaskMap_.find(formId);
184 if (search != renderTaskMap_.end()) {
185 task = search->second;
186 findTask = true;
187 renderTaskMap_.erase(search);
188 }
189 }
190 if (findTask) {
191 HILOG_INFO("cosume render task, formId:%{public}" PRId64, formId);
192 task();
193 }
194 }
195
DelRenderTask(int64_t formId)196 void RefreshCacheMgr::DelRenderTask(int64_t formId)
197 {
198 std::lock_guard<std::mutex> lock(renderTaskMapMutex_);
199 auto search = renderTaskMap_.find(formId);
200 if (search != renderTaskMap_.end()) {
201 renderTaskMap_.erase(search);
202 HILOG_INFO("delete render task, formId:%{public}" PRId64, formId);
203 }
204 }
205
206 } // namespace AppExecFwk
207 } // namespace OHOS