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