1 /*
2  * Copyright (c) 2022-2023 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_event_util.h"
17 
18 #include <regex>
19 
20 #include "fms_log_wrapper.h"
21 #include "form_bms_helper.h"
22 #include "form_cache_mgr.h"
23 #include "form_data_mgr.h"
24 #include "form_data_proxy_mgr.h"
25 #include "form_db_cache.h"
26 #include "form_info_mgr.h"
27 #include "form_mgr_adapter.h"
28 #include "form_render_mgr.h"
29 #include "form_timer_mgr.h"
30 #include "form_trust_mgr.h"
31 #include "form_util.h"
32 #include "form_provider_mgr.h"
33 #include "want.h"
34 
35 namespace OHOS {
36 namespace AppExecFwk {
37 namespace {
UpdateRecordByBundleInfo(const BundleInfo & bundleInfo,FormRecord & formRecord)38 void UpdateRecordByBundleInfo(const BundleInfo &bundleInfo, FormRecord &formRecord)
39 {
40     formRecord.modulePkgNameMap.clear();
41     if (!bundleInfo.hapModuleInfos.empty()) {
42         for (auto hapModuleInfo : bundleInfo.hapModuleInfos) {
43             auto hapPath = hapModuleInfo.hapPath;
44             auto moduleName = hapModuleInfo.moduleName;
45             HILOG_DEBUG("update record %{public}" PRId64 ". packageName is %{public}s, hap path is %{public}s",
46                 formRecord.formId, hapModuleInfo.packageName.c_str(), hapPath.c_str());
47             if (hapPath.find(Constants::ABS_CODE_PATH) != std::string::npos) {
48                 hapPath = std::regex_replace(hapPath, std::regex(Constants::ABS_CODE_PATH), Constants::LOCAL_BUNDLES);
49             }
50             nlohmann::json moduleInfos = {
51                 {Constants::MODULE_PKG_NAME_KEY, hapModuleInfo.packageName},
52                 {Constants::MODULE_HAP_PATH_KEY, hapPath}
53             };
54             formRecord.modulePkgNameMap.emplace(std::make_pair(moduleName, moduleInfos.dump()));
55             if (moduleName == formRecord.moduleName) {
56                 formRecord.jsFormCodePath = hapPath;
57             }
58         }
59     }
60 
61     formRecord.hapSourceDirs.clear();
62     for (const auto &item : bundleInfo.applicationInfo.moduleInfos) {
63         if (formRecord.moduleName == item.moduleName) {
64             formRecord.hapSourceDirs.emplace_back(item.moduleSourceDir);
65         }
66     }
67 }
68 }
HandleBundleFormInfoChanged(const std::string & bundleName,int32_t userId)69 void FormEventUtil::HandleBundleFormInfoChanged(const std::string &bundleName, int32_t userId)
70 {
71     FormTrustMgr::GetInstance().MarkTrustFlag(bundleName, true);
72     FormInfoMgr::GetInstance().UpdateStaticFormInfos(bundleName, userId);
73 }
74 
HandleUpdateFormCloud(const std::string & bundleName)75 void FormEventUtil::HandleUpdateFormCloud(const std::string &bundleName)
76 {
77     FormMgrAdapter::GetInstance().UpdateFormCloudUpdateDuration(bundleName);
78 }
79 
HandleProviderUpdated(const std::string & bundleName,const int userId)80 void FormEventUtil::HandleProviderUpdated(const std::string &bundleName, const int userId)
81 {
82     HILOG_INFO("bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
83     std::vector<FormRecord> formInfos;
84     if (!FormDataMgr::GetInstance().GetFormRecord(bundleName, formInfos)) {
85         return;
86     }
87 
88     std::vector<FormInfo> targetForms;
89     if (FormInfoMgr::GetInstance().GetFormsInfoByBundle(bundleName, targetForms, userId) != ERR_OK) {
90         return;
91     }
92 
93     BundlePackInfo bundlePackInfo;
94     bool hasPackInfo = FormBmsHelper::GetInstance().GetBundlePackInfo(bundleName, userId, bundlePackInfo);
95     BundleInfo bundleInfo;
96     if (FormBmsHelper::GetInstance().GetBundleInfoV9(bundleName, userId, bundleInfo) != ERR_OK) {
97         HILOG_ERROR("bundle update, failed to get bundle info.");
98         return;
99     }
100     std::vector<int64_t> removedForms;
101     std::vector<FormRecord> updatedForms;
102     for (FormRecord& formRecord : formInfos) {
103         HILOG_INFO("bundle update, formName:%{public}s", formRecord.formName.c_str());
104         int64_t formId = formRecord.formId;
105         if (bundleInfo.versionCode == formRecord.versionCode) {
106             HILOG_INFO("form: %{public}s, versionCode is same. formId:%{public}" PRId64,
107                        formRecord.formName.c_str(), formId);
108             continue;
109         }
110         if (ProviderFormUpdated(formId, formRecord, targetForms, bundleInfo)) {
111             updatedForms.emplace_back(formRecord);
112             continue;
113         }
114         if (hasPackInfo && ProviderFormUpdated(formId, formRecord, bundlePackInfo, bundleInfo)) {
115             updatedForms.emplace_back(formRecord);
116             continue;
117         }
118 
119         if (formRecord.formTempFlag) {
120             FormDataMgr::GetInstance().DeleteTempForm(formId);
121         } else {
122             FormDbCache::GetInstance().DeleteFormInfo(formId);
123         }
124         HILOG_INFO("form %{public}s deleted", formRecord.formName.c_str());
125         removedForms.emplace_back(formId);
126         FormDataMgr::GetInstance().DeleteFormRecord(formId);
127         FormRenderMgr::GetInstance().StopRenderingForm(formId, formRecord);
128         FormDataProxyMgr::GetInstance().UnsubscribeFormData(formId);
129     }
130 
131     if (!removedForms.empty()) {
132         HILOG_INFO("clean removed forms and timer");
133         FormDataMgr::GetInstance().CleanHostRemovedForms(removedForms);
134         for (const int64_t id : removedForms) {
135             FormTimerMgr::GetInstance().RemoveFormTimer(id);
136         }
137     }
138 
139     Want want;
140     want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
141     want.SetParam(Constants::FORM_ENABLE_UPDATE_REFRESH_KEY, true);
142     for (const auto &updatedForm : updatedForms) {
143         FormProviderMgr::GetInstance().RefreshForm(updatedForm.formId, want, true);
144     }
145     FormRenderMgr::GetInstance().ReloadForm(std::move(updatedForms), bundleName, userId);
146 }
147 
HandleOnUnlock()148 void FormEventUtil::HandleOnUnlock()
149 {
150     FormRenderMgr::GetInstance().OnUnlock();
151 }
152 
HandleBundleFormInfoRemoved(const std::string & bundleName,int32_t userId)153 void FormEventUtil::HandleBundleFormInfoRemoved(const std::string &bundleName, int32_t userId)
154 {
155     FormTrustMgr::GetInstance().MarkTrustFlag(bundleName, true);
156     FormInfoMgr::GetInstance().Remove(bundleName, userId);
157     FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
158 }
159 
HandleProviderRemoved(const std::string & bundleName,const int32_t userId)160 void FormEventUtil::HandleProviderRemoved(const std::string &bundleName, const int32_t userId)
161 {
162     HILOG_INFO("bundleName:%{public}s, userId:%{public}d",
163         bundleName.c_str(), userId);
164     // clean removed form in DB
165     std::set<int64_t> removedForms;
166     std::vector<FormDBInfo> removedDBForm;
167     FormDbCache::GetInstance().DeleteFormInfoByBundleName(bundleName, userId, removedDBForm);
168     for (const auto &dbForm : removedDBForm) {
169         removedForms.emplace(dbForm.formId);
170         int32_t matchCount = FormDbCache::GetInstance().GetMatchCount(dbForm.bundleName, dbForm.moduleName);
171         if (matchCount == 0) {
172             FormBmsHelper::GetInstance().NotifyModuleRemovable(dbForm.bundleName, dbForm.moduleName);
173         }
174     }
175     // clean removed form in FormRecords
176     FormDataMgr::GetInstance().CleanRemovedFormRecords(bundleName, removedForms);
177     // clean removed temp form in FormRecords
178     FormDataMgr::GetInstance().CleanRemovedTempFormRecords(bundleName, userId, removedForms);
179     // clean removed forms in FormHostRecords
180     std::vector<int64_t> vRemovedForms;
181     vRemovedForms.assign(removedForms.begin(), removedForms.end());
182     FormDataMgr::GetInstance().CleanHostRemovedForms(vRemovedForms);
183     // clean removed form timers
184     for (auto &formId : removedForms) {
185         FormTimerMgr::GetInstance().RemoveFormTimer(formId);
186         FormDataProxyMgr::GetInstance().UnsubscribeFormData(formId);
187     }
188 
189     FormRenderMgr::GetInstance().DeleteAcquireForbiddenTasksByBundleName(bundleName);
190 }
191 
HandleBundleDataCleared(const std::string & bundleName,int32_t userId)192 void FormEventUtil::HandleBundleDataCleared(const std::string &bundleName, int32_t userId)
193 {
194     HILOG_DEBUG("bundleName:%{public}s, userId:%{public}d", bundleName.c_str(), userId);
195     // clear dynamic form info
196     FormInfoMgr::GetInstance().RemoveAllDynamicFormsInfo(bundleName, userId);
197 
198     // as provider data is cleared
199     std::set<int64_t> reCreateForms;
200     FormDataMgr::GetInstance().GetReCreateFormRecordsByBundleName(bundleName, reCreateForms);
201     if (!reCreateForms.empty()) {
202         for (int64_t formId : reCreateForms) {
203             ReCreateForm(formId);
204         }
205     }
206 
207     int32_t uid = FormBmsHelper::GetInstance().GetUidByBundleName(bundleName, userId);
208     if (uid == FormBmsHelper::INVALID_UID) {
209         HILOG_ERROR("invalid uid");
210         return;
211     }
212     // as form host data is cleared
213     HandleFormHostDataCleared(uid);
214 }
215 
HandleFormHostDataCleared(const int uid)216 void FormEventUtil::HandleFormHostDataCleared(const int uid)
217 {
218     HILOG_DEBUG("uid:%{public}d", uid);
219     std::map<int64_t, bool> removedFormsMap;
220     // clear formDBRecord
221     ClearFormDBRecordData(uid, removedFormsMap);
222 
223     // clear temp form
224     ClearTempFormRecordData(uid, removedFormsMap);
225 
226     // clear host data
227     FormDataMgr::GetInstance().ClearHostDataByUId(uid);
228 
229     // delete forms timer
230     for (const auto &removedForm : removedFormsMap) {
231         if (removedForm.second) {
232             FormTimerMgr::GetInstance().RemoveFormTimer(removedForm.first);
233         }
234     }
235 }
236 
ProviderFormUpdated(const int64_t formId,FormRecord & formRecord,const std::vector<FormInfo> & targetForms,const BundleInfo & bundleInfo)237 bool FormEventUtil::ProviderFormUpdated(const int64_t formId, FormRecord &formRecord,
238     const std::vector<FormInfo> &targetForms, const BundleInfo &bundleInfo)
239 {
240     HILOG_INFO("start");
241     if (targetForms.empty()) {
242         HILOG_ERROR("empty targetForms");
243         return false;
244     }
245 
246     FormInfo updatedForm;
247     bool bGetForm = FormDataMgr::GetInstance().GetUpdatedForm(formRecord, targetForms, updatedForm);
248     if (!bGetForm) {
249         HILOG_INFO("no updated form");
250         return false;
251     }
252     HILOG_INFO("form is still exist, form:%{public}s", formRecord.formName.c_str());
253 
254     // update resource
255     FormDataMgr::GetInstance().SetNeedRefresh(formId, true);
256     FormCacheMgr::GetInstance().DeleteData(formId);
257     FormBmsHelper::GetInstance().NotifyModuleNotRemovable(formRecord.bundleName, formRecord.moduleName);
258     FormTimerCfg timerCfg;
259     GetTimerCfg(updatedForm.updateEnabled, updatedForm.updateDuration, updatedForm.scheduledUpdateTime, timerCfg);
260     HandleTimerUpdate(formId, formRecord, timerCfg);
261     UpdateRecordByBundleInfo(bundleInfo, formRecord);
262     UpdateFormRecord(updatedForm, formRecord);
263     FormDataMgr::GetInstance().SetVersionUpgrade(formId, true);
264     return true;
265 }
266 
ProviderFormUpdated(const int64_t formId,FormRecord & formRecord,const BundlePackInfo & bundlePackInfo,const BundleInfo & bundleInfo)267 bool FormEventUtil::ProviderFormUpdated(const int64_t formId, FormRecord &formRecord,
268     const BundlePackInfo &bundlePackInfo, const BundleInfo &bundleInfo)
269 {
270     HILOG_INFO("start");
271     AbilityFormInfo packForm;
272     if (!FormDataMgr::GetInstance().GetPackageForm(formRecord, bundlePackInfo, packForm)) {
273         HILOG_INFO("no updated form");
274         return false;
275     }
276 
277     HILOG_INFO("form is still in package info, form:%{public}s", formRecord.formName.c_str());
278     FormDataMgr::GetInstance().SetRecordNeedFreeInstall(formId, true);
279     FormTimerCfg timerCfg;
280     GetTimerCfg(packForm.updateEnabled, packForm.updateDuration, packForm.scheduledUpdateTime, timerCfg);
281     HandleTimerUpdate(formId, formRecord, timerCfg);
282     UpdateRecordByBundleInfo(bundleInfo, formRecord);
283     UpdateFormRecord(packForm, formRecord);
284     FormDataMgr::GetInstance().SetVersionUpgrade(formId, true);
285     return true;
286 }
287 
ClearFormDBRecordData(const int uid,std::map<int64_t,bool> & removedFormsMap)288 void FormEventUtil::ClearFormDBRecordData(const int uid, std::map<int64_t, bool> &removedFormsMap)
289 {
290     std::map<int64_t, bool> foundFormsMap;
291     std::map<FormIdKey, std::set<int64_t>> noHostFormDbMap;
292     FormDbCache::GetInstance().GetNoHostDBForms(uid, noHostFormDbMap, foundFormsMap);
293     if (!foundFormsMap.empty()) {
294         for (const auto &element : foundFormsMap) {
295             FormDataMgr::GetInstance().DeleteFormUserUid(element.first, uid);
296         }
297     }
298 
299     HILOG_DEBUG("noHostFormDbMap size:%{public}zu", noHostFormDbMap.size());
300     if (!noHostFormDbMap.empty()) {
301         BatchDeleteNoHostDBForms(uid, noHostFormDbMap, foundFormsMap);
302     }
303 
304     if (!foundFormsMap.empty()) {
305         removedFormsMap.insert(foundFormsMap.begin(), foundFormsMap.end());
306     }
307 }
308 
ClearTempFormRecordData(const int uid,std::map<int64_t,bool> & removedFormsMap)309 void FormEventUtil::ClearTempFormRecordData(const int uid, std::map<int64_t, bool> &removedFormsMap)
310 {
311     std::map<int64_t, bool> foundFormsMap;
312     std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
313     FormDataMgr::GetInstance().GetNoHostTempForms(uid, noHostTempFormsMap, foundFormsMap);
314     HILOG_DEBUG("noHostTempFormsMap size:%{public}zu", noHostTempFormsMap.size());
315     if (!noHostTempFormsMap.empty()) {
316         BatchDeleteNoHostTempForms(uid, noHostTempFormsMap, foundFormsMap);
317     }
318     if (!foundFormsMap.empty()) {
319         removedFormsMap.insert(foundFormsMap.begin(), foundFormsMap.end());
320     }
321 }
322 
BatchDeleteNoHostTempForms(const int uid,std::map<FormIdKey,std::set<int64_t>> & noHostTempFormsMap,std::map<int64_t,bool> & foundFormsMap)323 void FormEventUtil::BatchDeleteNoHostTempForms(const int uid, std::map<FormIdKey,
324     std::set<int64_t>> &noHostTempFormsMap, std::map<int64_t, bool> &foundFormsMap)
325 {
326     for (const auto &element : noHostTempFormsMap) {
327         std::set<int64_t> formIds = element.second;
328         FormIdKey formIdKey = element.first;
329         std::string bundleName = formIdKey.bundleName;
330         std::string abilityName = formIdKey.abilityName;
331         int result = FormProviderMgr::GetInstance().NotifyProviderFormsBatchDelete(bundleName, abilityName, formIds);
332         if (result != ERR_OK) {
333             HILOG_ERROR("NotifyProviderFormsBatchDelete fail bundle:%{public}s ability:%{public}s",
334                 bundleName.c_str(), abilityName.c_str());
335             for (int64_t formId : formIds) {
336                 FormDataMgr::GetInstance().AddFormUserUid(formId, uid);
337             }
338         } else {
339             for (int64_t formId : formIds) {
340                 foundFormsMap.emplace(formId, true);
341                 FormDataMgr::GetInstance().DeleteFormRecord(formId);
342                 FormDataMgr::GetInstance().DeleteTempForm(formId);
343             }
344         }
345     }
346 }
347 
GetTimerCfg(const bool updateEnabled,const int updateDuration,const std::string & configUpdateAt,FormTimerCfg & cfg)348 void FormEventUtil::GetTimerCfg(const bool updateEnabled,
349     const int updateDuration, const std::string &configUpdateAt, FormTimerCfg& cfg)
350 {
351     HILOG_INFO("start");
352     if (!updateEnabled) {
353         HILOG_INFO("update disable");
354         return;
355     }
356 
357     if (updateDuration > 0) {
358         // interval timer
359         HILOG_INFO("interval timer updateDuration:%{public}d", updateDuration);
360         if (updateDuration <= Constants::MIN_CONFIG_DURATION) {
361             cfg.updateDuration = Constants::MIN_PERIOD;
362         } else if (updateDuration >= Constants::MAX_CONFIG_DURATION) {
363             cfg.updateDuration = Constants::MAX_PERIOD;
364         } else {
365             cfg.updateDuration = updateDuration * Constants::TIME_CONVERSION;
366         }
367         cfg.enableUpdate = true;
368         return;
369     } else {
370         // updateAtTimer
371         if (configUpdateAt.empty()) {
372             HILOG_INFO("empty configUpdateAt");
373             return;
374         }
375         HILOG_INFO("update at timer:%{public}s", configUpdateAt.c_str());
376         std::vector<std::string> temp = FormUtil::StringSplit(configUpdateAt, Constants::TIME_DELIMETER);
377         if (temp.size() != Constants::UPDATE_AT_CONFIG_COUNT) {
378             HILOG_ERROR("invalid config");
379             return;
380         }
381         int hour = std::stoi(temp[0]);
382         int min = std::stoi(temp[1]);
383         if (hour < Constants::MIN_TIME || hour > Constants::MAX_HOUR || min < Constants::MIN_TIME || min >
384             Constants::MAX_MINUTE) {
385             HILOG_ERROR("invalid time");
386             return;
387         }
388 
389         cfg.updateAtHour = hour;
390         cfg.updateAtMin = min;
391         cfg.enableUpdate = true;
392         return;
393     }
394 }
395 
HandleTimerUpdate(const int64_t formId,const FormRecord & record,const FormTimerCfg & timerCfg)396 void FormEventUtil::HandleTimerUpdate(const int64_t formId,
397     const FormRecord &record, const FormTimerCfg &timerCfg)
398 {
399     // both disable
400     if (!record.isEnableUpdate && !timerCfg.enableUpdate) {
401         return;
402     }
403 
404     // enable to disable
405     if (record.isEnableUpdate && !timerCfg.enableUpdate) {
406         FormDataMgr::GetInstance().SetEnableUpdate(formId, false);
407         FormTimerMgr::GetInstance().RemoveFormTimer(formId);
408         return;
409     }
410 
411     // disable to enable
412     if (!record.isEnableUpdate && timerCfg.enableUpdate) {
413         FormDataMgr::GetInstance().SetUpdateInfo(formId, true,
414             timerCfg.updateDuration, timerCfg.updateAtHour, timerCfg.updateAtMin);
415         if (timerCfg.updateDuration > 0) {
416             HILOG_INFO("add interval timer:%{public}" PRId64, timerCfg.updateDuration);
417             int64_t updateDuration = timerCfg.updateDuration;
418             if (!FormMgrAdapter::GetInstance().GetValidFormUpdateDuration(formId, updateDuration)) {
419                 HILOG_WARN("Get updateDuration failed, uses local configuration");
420             }
421             FormTimerMgr::GetInstance().AddFormTimer(formId, updateDuration, record.providerUserId);
422         } else {
423             HILOG_INFO("add at timer:%{public}d,%{public}d", timerCfg.updateAtHour, timerCfg.updateAtMin);
424             FormTimerMgr::GetInstance().AddFormTimer(formId, timerCfg.updateAtHour,
425                 timerCfg.updateAtMin, record.providerUserId);
426         }
427         return;
428     }
429 
430     // both enable
431     UpdateType type = GetUpdateType(record, timerCfg);
432     if (type == TYPE_NO_CHANGE) {
433         return;
434     }
435 
436     FormDataMgr::GetInstance().SetUpdateInfo(formId, true,
437         timerCfg.updateDuration, timerCfg.updateAtHour, timerCfg.updateAtMin);
438     auto newTimerCfg = timerCfg;
439     if (type == TYPE_INTERVAL_CHANGE || type == TYPE_ATTIME_TO_INTERVAL) {
440         int64_t updateDuration = timerCfg.updateDuration;
441         if (!FormMgrAdapter::GetInstance().GetValidFormUpdateDuration(formId, updateDuration)) {
442             HILOG_WARN("Get updateDuration failed, uses local configuration");
443         }
444         newTimerCfg.updateDuration = updateDuration;
445     }
446     FormTimerMgr::GetInstance().UpdateFormTimer(formId, type, newTimerCfg);
447 }
448 
GetUpdateType(const FormRecord & record,const FormTimerCfg & timerCfg)449 UpdateType FormEventUtil::GetUpdateType(const FormRecord &record, const FormTimerCfg &timerCfg)
450 {
451     HILOG_DEBUG("call");
452     if (record.updateDuration > 0) {
453         if (timerCfg.updateDuration > 0) {
454             // no change
455             if (record.updateDuration == timerCfg.updateDuration) {
456                 return TYPE_NO_CHANGE;
457             }
458             // interval change
459             return TYPE_INTERVAL_CHANGE;
460         } else {
461             // interval to update at time
462             return TYPE_INTERVAL_TO_ATTIME;
463         }
464     } else {
465         if (timerCfg.updateDuration > 0) {
466             // update at time to interval
467             return TYPE_ATTIME_TO_INTERVAL;
468         } else {
469             if (record.updateAtHour == timerCfg.updateAtHour && record.updateAtMin == timerCfg.updateAtMin) {
470                 return TYPE_NO_CHANGE;
471             }
472             // update at time change
473             return TYPE_ATTIME_CHANGE;
474         }
475     }
476 }
477 
ReCreateForm(const int64_t formId)478 void FormEventUtil::ReCreateForm(const int64_t formId)
479 {
480     HILOG_INFO("formId:%{public}" PRId64, formId);
481     FormRecord record;
482     bool isGetForm = FormDataMgr::GetInstance().GetFormRecord(formId, record);
483     if (!isGetForm) {
484         HILOG_ERROR("not exist such form:%{public}" PRId64 "", formId);
485         return;
486     }
487     FormCacheMgr::GetInstance().DeleteData(formId);
488     FormRecord reCreateRecord;
489     reCreateRecord.bundleName = record.bundleName;
490     reCreateRecord.abilityName = record.abilityName;
491     reCreateRecord.formName = record.formName;
492     reCreateRecord.specification = record.specification;
493     reCreateRecord.formTempFlag = record.formTempFlag;
494     reCreateRecord.isInited = record.isInited;
495     reCreateRecord.versionUpgrade = record.versionUpgrade;
496 
497     Want want;
498     want.SetParam(Constants::PARAM_FORM_NAME_KEY, reCreateRecord.formName);
499     want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, reCreateRecord.specification);
500     want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, reCreateRecord.formTempFlag);
501     want.SetParam(Constants::RECREATE_FORM_KEY, true);
502     want.SetParam(Constants::PARAM_FORM_RENDERINGMODE_KEY, (int)record.renderingMode);
503 
504     FormProviderMgr::GetInstance().ConnectAmsForRefresh(formId, reCreateRecord, want, false);
505 }
506 
BatchDeleteNoHostDBForms(const int uid,std::map<FormIdKey,std::set<int64_t>> & noHostFormDbMap,std::map<int64_t,bool> & removedFormsMap)507 void FormEventUtil::BatchDeleteNoHostDBForms(const int uid, std::map<FormIdKey, std::set<int64_t>> &noHostFormDbMap,
508     std::map<int64_t, bool> &removedFormsMap)
509 {
510     std::set<FormIdKey> removableModuleSet;
511     for (const auto &element: noHostFormDbMap) {
512         std::set<int64_t> formIds = element.second;
513         FormIdKey formIdKey = element.first;
514         std::string bundleName = formIdKey.bundleName;
515         std::string abilityName = formIdKey.abilityName;
516         int result = FormProviderMgr::GetInstance().NotifyProviderFormsBatchDelete(bundleName, abilityName, formIds);
517         if (result != ERR_OK) {
518             HILOG_ERROR("NotifyProviderFormsBatchDelete fail bundle:%{public}s ability:%{public}s",
519                 bundleName.c_str(), abilityName.c_str());
520             for (int64_t formId : formIds) {
521                 FormDBInfo dbInfo;
522                 int errCode = FormDbCache::GetInstance().GetDBRecord(formId, dbInfo);
523                 if (errCode == ERR_OK) {
524                     dbInfo.formUserUids.emplace_back(uid);
525                     FormDbCache::GetInstance().SaveFormInfo(dbInfo);
526                 }
527             }
528         } else {
529             for (const int64_t formId : formIds) {
530                 removedFormsMap.emplace(formId, true);
531                 FormDBInfo dbInfo;
532                 int errCode = FormDbCache::GetInstance().GetDBRecord(formId, dbInfo);
533                 if (errCode == ERR_OK) {
534                     FormIdKey removableModuleFormIdKey(dbInfo.bundleName, dbInfo.moduleName);
535                     removableModuleSet.emplace(removableModuleFormIdKey);
536                     FormDbCache::GetInstance().DeleteFormInfo(formId);
537                 }
538                 FormDataMgr::GetInstance().DeleteFormRecord(formId);
539             }
540         }
541     }
542 
543     for (const FormIdKey &item : removableModuleSet) {
544         int32_t matchCount = FormDbCache::GetInstance().GetMatchCount(item.bundleName, item.moduleName);
545         if (matchCount == 0) {
546             FormBmsHelper::GetInstance().NotifyModuleRemovable(item.bundleName, item.moduleName);
547         }
548     }
549 }
550 
HandleAdditionalInfoChanged(const std::string & bundleName)551 bool FormEventUtil::HandleAdditionalInfoChanged(const std::string &bundleName)
552 {
553     HILOG_DEBUG("Call, bundleName:%{public}s", bundleName.c_str());
554     FormMgrAdapter::GetInstance().UpdateFormCloudUpdateDuration(bundleName);
555     std::vector<FormRecord> formInfos;
556     if (!FormDataMgr::GetInstance().GetFormRecord(bundleName, formInfos)) {
557         HILOG_DEBUG("No form info");
558         return false;
559     }
560 
561     for (const auto& formRecord : formInfos) {
562         if (!formRecord.isEnableUpdate || (formRecord.updateDuration <= 0)) {
563             continue;
564         }
565         int64_t updateDuration = formRecord.updateDuration;
566         if (!FormMgrAdapter::GetInstance().GetValidFormUpdateDuration(formRecord.formId, updateDuration)) {
567             HILOG_WARN("Get updateDuration failed, uses local configuration");
568         }
569 
570         FormTimerCfg timerCfg;
571         timerCfg.enableUpdate = true;
572         timerCfg.updateDuration = updateDuration;
573         FormTimerMgr::GetInstance().UpdateFormTimer(formRecord.formId, UpdateType::TYPE_INTERVAL_CHANGE, timerCfg);
574     }
575     return true;
576 }
577 
UpdateFormRecord(const FormInfo & formInfo,FormRecord & formRecord)578 void FormEventUtil::UpdateFormRecord(const FormInfo &formInfo, FormRecord &formRecord)
579 {
580     formRecord.formSrc = formInfo.src;
581     formRecord.uiSyntax = formInfo.uiSyntax;
582     formRecord.isDynamic = formInfo.isDynamic;
583     formRecord.transparencyEnabled = formInfo.transparencyEnabled;
584     formRecord.privacyLevel = formInfo.privacyLevel;
585     formRecord.isEnableUpdate = formInfo.updateEnabled;
586     formRecord.updateDuration = formInfo.updateDuration * Constants::TIME_CONVERSION;
587     std::vector<std::string> time = FormUtil::StringSplit(formInfo.scheduledUpdateTime, Constants::TIME_DELIMETER);
588     if (time.size() == Constants::UPDATE_AT_CONFIG_COUNT) {
589         formRecord.updateAtHour = std::stoi(time[0]);
590         formRecord.updateAtMin = std::stoi(time[1]);
591     }
592     HILOG_DEBUG("formId:%{public}" PRId64 "", formRecord.formId);
593     FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord);
594 }
595 
UpdateFormRecord(const AbilityFormInfo & formInfo,FormRecord & formRecord)596 void FormEventUtil::UpdateFormRecord(const AbilityFormInfo &formInfo, FormRecord &formRecord)
597 {
598     formRecord.uiSyntax = (formInfo.type.compare("arkts") == 0 ? FormType::ETS : FormType::JS);
599     formRecord.isEnableUpdate = formInfo.updateEnabled;
600     formRecord.updateDuration = formInfo.updateDuration * Constants::TIME_CONVERSION;
601     std::vector<std::string> time = FormUtil::StringSplit(formInfo.scheduledUpdateTime, Constants::TIME_DELIMETER);
602     if (time.size() == Constants::UPDATE_AT_CONFIG_COUNT) {
603         formRecord.updateAtHour = std::stoi(time[0]);
604         formRecord.updateAtMin = std::stoi(time[1]);
605     }
606     HILOG_DEBUG("formId:%{public}" PRId64 "", formRecord.formId);
607     FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord);
608 }
609 } // namespace AppExecFwk
610 } // namespace OHOS
611