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