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