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