diff --git a/services/include/form_data_mgr.h b/services/include/form_data_mgr.h index 249718cfddf52081f749deb766c003ee90b9d8ce..b056adedb7ad9fa2331a2d91f1879c36a7d3997c 100644 --- a/services/include/form_data_mgr.h +++ b/services/include/form_data_mgr.h @@ -511,6 +511,12 @@ public: * @param formId The form id. */ void StopRenderingForm(int32_t formId); + + /** + * @brief update host forms + * @param updateFormIds + */ + void UpdateHostForms(const std::vector &updateFormIds); private: /** * @brief Create form record. @@ -601,6 +607,7 @@ private: template bool GetAbilityFormInfo(const FormRecord &record, const std::vector &abilities, AbilityFormInfo &abilityFormInfo); + private: mutable std::recursive_mutex formRecordMutex_; mutable std::recursive_mutex formHostRecordMutex_; diff --git a/services/include/form_event_util.h b/services/include/form_event_util.h index d029d44768433f831f3e7ea8191fceecedc11141..4a8e7716cb5bb8653957818d833946ba50582c03 100644 --- a/services/include/form_event_util.h +++ b/services/include/form_event_util.h @@ -39,10 +39,8 @@ public: void HandleProviderRemoved(const std::string &bundleName, const int32_t userId); void HandleBundleDataCleared(const std::string &bundleName, int32_t userId); void HandleFormHostDataCleared(const int uid); - bool ProviderFormUpdated(const int64_t formId, const FormRecord &formRecord, - const std::vector &targetForms); - bool ProviderFormUpdated(int64_t formId, const FormRecord &formRecord, - const BundlePackInfo &bundlePackInfo); + bool ProviderFormUpdated(const int64_t formId, FormRecord &formRecord, const std::vector &targetForms); + bool ProviderFormUpdated(int64_t formId, FormRecord &formRecord, const BundlePackInfo &bundlePackInfo); void ClearFormDBRecordData(const int uid, std::map &removedFormsMap); void ClearTempFormRecordData(const int uid, std::map &removedFormsMap); void BatchDeleteNoHostTempForms(const int uid, std::map> &noHostTempFormsMap, @@ -53,6 +51,10 @@ public: void ReCreateForm(const int64_t formId); void BatchDeleteNoHostDBForms(const int uid, std::map> &noHostFormDbMap, std::map &removedFormsMap); + +private: + void UpateFormRecord(const FormInfo &formInfo, FormRecord &formRecord); + void UpateFormRecord(const AbilityFormInfo &formInfo, FormRecord &formRecord); }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_data_mgr.cpp b/services/src/form_data_mgr.cpp index 171408420dfb924985c3a8d82b9779abba7a8e3b..2d5862a6b5c0926b59a1143b1a5b53a49f593794 100644 --- a/services/src/form_data_mgr.cpp +++ b/services/src/form_data_mgr.cpp @@ -515,6 +515,27 @@ void FormDataMgr::CleanHostRemovedForms(const std::vector &removedFormI HILOG_INFO("%{public}s end", __func__); } + +void FormDataMgr::UpdateHostForms(const std::vector &updateFormIds) +{ + HILOG_INFO("%{public}s start, update form host record by formId list", __func__); + std::vector matchedIds; + std::lock_guard lock(formHostRecordMutex_); + for (FormHostRecord &record : clientRecords_) { + for (const int64_t &formId : updateFormIds) { + if (record.Contains(formId)) { + matchedIds.emplace_back(formId); + } + } + if (!matchedIds.empty()) { + HILOG_INFO("%{public}s, OnFormUninstalled called", __func__); + record.OnFormUninstalled(matchedIds); + matchedIds.clear(); + } + } + HILOG_INFO("%{public}s end", __func__); +} + /** * @brief Handle form host died. * @param remoteHost Form host proxy object. diff --git a/services/src/form_event_util.cpp b/services/src/form_event_util.cpp index 028b172eaa768e607c92f4f1c8eee4d0e87255ec..e5c5042eeac92b20ece5a26f12586a53e5134b60 100644 --- a/services/src/form_event_util.cpp +++ b/services/src/form_event_util.cpp @@ -56,7 +56,7 @@ void FormEventUtil::HandleProviderUpdated(const std::string &bundleName, const i bool hasPackInfo = FormBmsHelper::GetInstance().GetBundlePackInfo(bundleName, userId, bundlePackInfo); std::vector removedForms; std::vector updatedForms; - for (const FormRecord& formRecord : formInfos) { + for (FormRecord& formRecord : formInfos) { HILOG_INFO("%{public}s, provider update, formName:%{public}s", __func__, formRecord.formName.c_str()); int64_t formId = formRecord.formId; if (ProviderFormUpdated(formId, formRecord, targetForms)) { @@ -175,8 +175,8 @@ void FormEventUtil::HandleFormHostDataCleared(const int uid) } } -bool FormEventUtil::ProviderFormUpdated(const int64_t formId, - const FormRecord &formRecord, const std::vector &targetForms) +bool FormEventUtil::ProviderFormUpdated(const int64_t formId, FormRecord &formRecord, + const std::vector &targetForms) { HILOG_INFO("%{public}s start", __func__); if (targetForms.empty()) { @@ -190,9 +190,10 @@ bool FormEventUtil::ProviderFormUpdated(const int64_t formId, HILOG_INFO("%{public}s, no updated form.", __func__); return false; } - HILOG_INFO("%{public}s, form is still exist,form:%{public}s", __func__, formRecord.formName.c_str()); + // update resource + UpateFormRecord(updatedForm, formRecord); FormDataMgr::GetInstance().SetNeedRefresh(formId, true); FormCacheMgr::GetInstance().DeleteData(formId); FormBmsHelper::GetInstance().NotifyModuleNotRemovable(formRecord.bundleName, formRecord.moduleName); @@ -203,7 +204,7 @@ bool FormEventUtil::ProviderFormUpdated(const int64_t formId, return true; } -bool FormEventUtil::ProviderFormUpdated(const int64_t formId, const FormRecord &formRecord, +bool FormEventUtil::ProviderFormUpdated(const int64_t formId, FormRecord &formRecord, const BundlePackInfo &bundlePackInfo) { HILOG_INFO("%{public}s start", __func__); @@ -214,6 +215,7 @@ bool FormEventUtil::ProviderFormUpdated(const int64_t formId, const FormRecord & } HILOG_INFO("%{public}s, form is still in package info, form:%{public}s", __func__, formRecord.formName.c_str()); + UpateFormRecord(packForm, formRecord); FormDataMgr::GetInstance().SetRecordNeedFreeInstall(formId, true); FormTimerCfg timerCfg; GetTimerCfg(packForm.updateEnabled, packForm.updateDuration, packForm.scheduledUpdateTime, timerCfg); @@ -462,5 +464,33 @@ void FormEventUtil::BatchDeleteNoHostDBForms(const int uid, std::map time = FormUtil::StringSplit(formInfo.scheduledUpdateTime, Constants::TIME_DELIMETER); + if (time.size() == Constants::UPDATE_AT_CONFIG_COUNT) { + formRecord.updateAtHour = std::stoi(time[0]); + formRecord.updateAtMin = std::stoi(time[1]); + } + HILOG_INFO("%{public}s formId:%{public}lld", __func__, formRecord.formId); + FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord); +} + +void FormEventUtil::UpateFormRecord(const AbilityFormInfo &formInfo, FormRecord &formRecord) +{ + formRecord.uiSyntax = (formInfo.type.compare("arkts") == 0 ? FormType::ETS : FormType::JS); + formRecord.isEnableUpdate = formInfo.updateEnabled; + formRecord.updateDuration = formInfo.updateDuration; + std::vector time = FormUtil::StringSplit(formInfo.scheduledUpdateTime, Constants::TIME_DELIMETER); + if (time.size() == Constants::UPDATE_AT_CONFIG_COUNT) { + formRecord.updateAtHour = std::stoi(time[0]); + formRecord.updateAtMin = std::stoi(time[1]); + } + HILOG_INFO("%{public}s formId:%{public}lld", __func__, formRecord.formId); + FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord); +} } // namespace AppExecFwk } // namespace OHOS