1 /*
2  * Copyright (c) 2021-2022 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_provider_mgr.h"
17 
18 #include <cinttypes>
19 
20 #include "fms_log_wrapper.h"
21 #include "form_ams_helper.h"
22 #include "form_batch_delete_connection.h"
23 #include "form_cache_mgr.h"
24 #include "form_constants.h"
25 #include "form_data_mgr.h"
26 #include "form_delete_connection.h"
27 #include "form_mgr_errors.h"
28 #include "form_msg_event_connection.h"
29 #include "form_record.h"
30 #include "form_refresh_connection.h"
31 #include "form_timer_mgr.h"
32 #include "form_report.h"
33 #include "form_record_report.h"
34 #ifdef SUPPORT_POWER
35 #include "power_mgr_client.h"
36 #endif
37 namespace OHOS {
38 namespace AppExecFwk {
FormProviderMgr()39 FormProviderMgr::FormProviderMgr() {}
~FormProviderMgr()40 FormProviderMgr::~FormProviderMgr() {}
41 /**
42  * @brief handle for acquire back from ams.
43  * @param formId The id of the form.
44  * @param formProviderInfo provider form info.
45  * @return Returns ERR_OK on success, others on failure.
46  */
AcquireForm(const int64_t formId, const FormProviderInfo &formProviderInfo)47 ErrCode FormProviderMgr::AcquireForm(const int64_t formId, const FormProviderInfo &formProviderInfo)
48 {
49     HILOG_DEBUG("formId:%{public}" PRId64 "", formId);
50 
51     if (formId <= 0) {
52         HILOG_ERROR("formId not greater than 0");
53         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
54     }
55 
56     FormRecord formRecord;
57     bool isGetFormRecord = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
58     if (!isGetFormRecord) {
59         HILOG_ERROR("not exist such form, formId:%{public}" PRId64 "", formId);
60         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
61     }
62 
63     std::vector<FormHostRecord> clientHosts;
64     FormDataMgr::GetInstance().GetFormHostRecord(formId, clientHosts);
65     if (clientHosts.empty()) {
66         HILOG_ERROR("empty clientHosst");
67         return ERR_APPEXECFWK_FORM_COMMON_CODE;
68     }
69 
70     if (formRecord.isInited) {
71         if (IsFormCached(formRecord)) {
72             formRecord.formProviderInfo = formProviderInfo;
73             for (auto &iter : clientHosts) {
74                 iter.OnAcquire(formId, formRecord);
75             }
76         } else {
77             Want want;
78             RefreshForm(formId, want, true);
79         }
80         return ERR_OK;
81     }
82     formRecord.isInited = true;
83     formRecord.needRefresh = false;
84     FormDataMgr::GetInstance().SetFormCacheInited(formId, true);
85 
86     formRecord.formProviderInfo = formProviderInfo;
87     for (auto &iter : clientHosts) {
88         iter.OnAcquire(formId, formRecord);
89     }
90 
91     if (formProviderInfo.NeedCache()) {
92         HILOG_WARN("acquire js card,cache the card");
93         FormCacheMgr::GetInstance().AddData(formId, formProviderInfo.GetFormData());
94     }
95     return ERR_OK;
96 }
97 
98 /**
99  * @brief Refresh form.
100  *
101  * @param formId The form id.
102  * @param want The want of the form to request.
103  * @param isVisibleToFresh The form is visible to fresh.
104  * @return Returns ERR_OK on success, others on failure.
105  */
RefreshForm(const int64_t formId, const Want &want, bool isVisibleToFresh)106 ErrCode FormProviderMgr::RefreshForm(const int64_t formId, const Want &want, bool isVisibleToFresh)
107 {
108     FormRecord record;
109     ErrCode result = RefreshCheck(record, formId, want);
110     if (result != ERR_OK) {
111         return result;
112     }
113     HILOG_INFO("FormProviderMgr::RefreshForm, formId:%{public}" PRId64 "., record.enableForm = %{public}d",
114         formId, record.enableForm);
115     if (!record.enableForm) {
116         FormDataMgr::GetInstance().SetRefreshDuringDisableForm(formId, true);
117         return ERR_APPEXECFWK_FORM_DISABLE_REFRESH;
118     }
119     bool isCountTimerRefresh = want.GetBoolParam(Constants::KEY_IS_TIMER, false);
120     Want newWant(want);
121     newWant.RemoveParam(Constants::KEY_IS_TIMER);
122 
123     if (isCountTimerRefresh) {
124         FormDataMgr::GetInstance().SetCountTimerRefresh(formId, true);
125     }
126 
127     bool isTimerRefresh = want.GetBoolParam(Constants::KEY_TIMER_REFRESH, false);
128     newWant.RemoveParam(Constants::KEY_TIMER_REFRESH);
129 
130     if (isTimerRefresh) {
131         FormDataMgr::GetInstance().SetTimerRefresh(formId, true);
132         bool isFormVisible = record.formVisibleNotifyState == Constants::FORM_VISIBLE;
133         if (!isFormVisible) {
134             HILOG_DEBUG("form is invisible");
135             FormDataMgr::GetInstance().SetNeedRefresh(formId, true);
136             FormRecordReport::GetInstance().IncreaseUpdateTimes(formId, HiSysEventPointType::TYPE_INVISIBLE_INTERCEPT);
137             return ERR_OK;
138         }
139     }
140 
141 #ifdef SUPPORT_POWER
142     bool screenOnFlag = PowerMgr::PowerMgrClient::GetInstance().IsScreenOn();
143     bool collaborationScreenOnFlag = PowerMgr::PowerMgrClient::GetInstance().IsCollaborationScreenOn();
144     if (!screenOnFlag && !collaborationScreenOnFlag) {
145         FormDataMgr::GetInstance().SetNeedRefresh(formId, true);
146         HILOG_DEBUG("screen off, set refresh flag, do not refresh now");
147         return ERR_OK;
148     }
149 #endif
150 
151     bool needRefresh = IsNeedToFresh(record, formId, isVisibleToFresh);
152     if (!needRefresh) {
153         FormDataMgr::GetInstance().SetNeedRefresh(formId, true);
154         HILOG_ERROR("no one needReresh, set refresh flag, do not refresh now");
155         return ERR_OK;
156     }
157 
158     FormRecord refreshRecord = GetFormAbilityInfo(record);
159     refreshRecord.isCountTimerRefresh = isCountTimerRefresh;
160     refreshRecord.isTimerRefresh = isTimerRefresh;
161     return ConnectAmsForRefresh(formId, refreshRecord, newWant, isCountTimerRefresh);
162 }
163 
RefreshCheck(FormRecord &record, const int64_t formId, const Want &want)164 ErrCode FormProviderMgr::RefreshCheck(FormRecord &record, const int64_t formId, const Want &want)
165 {
166     bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record);
167     if (!bGetRecord) {
168         HILOG_ERROR("not exist such form:%{public}" PRId64 "", formId);
169         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
170     }
171 
172     // get current userId
173     int32_t currentActiveUserId = want.GetIntParam(Constants::PARAM_FORM_USER_ID, Constants::DEFAULT_PROVIDER_USER_ID);
174     if (currentActiveUserId != record.providerUserId) {
175         FormDataMgr::GetInstance().SetNeedRefresh(formId, true);
176         HILOG_ERROR("not current user, just set refresh flag, userId:%{public}d",
177             record.providerUserId);
178         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
179     }
180 
181     bool addFormFinish = false;
182     FormReport::GetInstance().GetAddFormFinish(formId, addFormFinish);
183     if (!addFormFinish) {
184         HILOG_ERROR("form is adding form:%{public}" PRId64 "", formId);
185         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
186     }
187 
188     return ERR_OK;
189 }
190 
191 /**
192  * @brief Connect ams for refresh form
193  *
194  * @param formId The form id.
195  * @param record Form data.
196  * @param want The want of the form.
197  * @param isTimerRefresh The flag of timer refresh.
198  * @return Returns ERR_OK on success, others on failure.
199  */
ConnectAmsForRefresh(const int64_t formId, const FormRecord &record, const Want &want, const bool isCountTimerRefresh)200 ErrCode FormProviderMgr::ConnectAmsForRefresh(const int64_t formId,
201     const FormRecord &record, const Want &want, const bool isCountTimerRefresh)
202 {
203     HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s, needFreeInstall:%{public}d",
204         record.bundleName.c_str(), record.abilityName.c_str(), record.needFreeInstall);
205 
206     sptr<IAbilityConnection> formRefreshConnection = new (std::nothrow) FormRefreshConnection(formId, want,
207         record.bundleName, record.abilityName, record.needFreeInstall);
208     if (formRefreshConnection == nullptr) {
209         HILOG_ERROR("create FormRefreshConnection failed");
210         return ERR_APPEXECFWK_FORM_COMMON_CODE;
211     }
212     Want connectWant;
213     connectWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
214     connectWant.SetElementName(record.bundleName, record.abilityName);
215 
216     if (record.needFreeInstall) {
217         return RebindByFreeInstall(record, connectWant, formRefreshConnection);
218     }
219 
220     if (isCountTimerRefresh) {
221         if (!FormTimerMgr::GetInstance().IsLimiterEnableRefresh(formId)) {
222             HILOG_ERROR("timer refresh,already limit");
223             return ERR_APPEXECFWK_FORM_PROVIDER_DEL_FAIL;
224         }
225     }
226 
227     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(connectWant, formRefreshConnection);
228     if (errorCode != ERR_OK) {
229         HILOG_ERROR("ConnectServiceAbility failed");
230         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
231     }
232 
233     if (record.isCountTimerRefresh) {
234         IncreaseTimerRefreshCount(formId);
235     }
236 
237     if (record.isTimerRefresh) {
238         FormDataMgr::GetInstance().SetTimerRefresh(formId, false);
239     }
240 
241     return ERR_OK;
242 }
243 
244 /**
245  * @brief Connect ability manager service for refresh app permission
246  *
247  * @param formId The form id.
248  * @param want The want of the form.
249  * @return Returns ERR_OK on success, others on failure.
250  */
ConnectAmsForRefreshPermission(const int64_t formId, Want &want)251 ErrCode FormProviderMgr::ConnectAmsForRefreshPermission(const int64_t formId, Want &want)
252 {
253     HILOG_DEBUG("ConnectAmsForRefreshPermission start, form id:%{public}" PRId64 "", formId);
254     if (!want.HasParameter(Constants::FORM_PERMISSION_NAME_KEY) ||
255         !want.HasParameter(Constants::FORM_PERMISSION_GRANTED_KEY)) {
256         HILOG_ERROR("permissionInfo not exist,form:%{public}" PRId64 "", formId);
257         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
258     }
259     FormRecord record;
260     bool result = FormDataMgr::GetInstance().GetFormRecord(formId, record);
261     if (!result) {
262         HILOG_ERROR("not exist such form:%{public}" PRId64 "", formId);
263         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
264     }
265     want.RemoveParam(Constants::KEY_IS_TIMER);
266     want.RemoveParam(Constants::KEY_TIMER_REFRESH);
267 
268     sptr<IAbilityConnection> formRefreshConnection = new (std::nothrow) FormRefreshConnection(formId, want,
269         record.bundleName, record.abilityName, record.needFreeInstall);
270     if (formRefreshConnection == nullptr) {
271         HILOG_ERROR("create FormRefreshConnection failed");
272         return ERR_APPEXECFWK_FORM_COMMON_CODE;
273     }
274 
275     Want connectWant;
276     connectWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
277     connectWant.SetElementName(record.bundleName, record.abilityName);
278 
279     if (record.needFreeInstall) {
280         connectWant.AddFlags(Want::FLAG_INSTALL_ON_DEMAND | Want::FLAG_INSTALL_WITH_BACKGROUND_MODE);
281         connectWant.SetModuleName(record.moduleName);
282     }
283 
284     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(connectWant, formRefreshConnection);
285     if (errorCode != ERR_OK) {
286         HILOG_ERROR("ConnectServiceAbility failed");
287         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
288     }
289 
290     return ERR_OK;
291 }
292 
293 /**
294  * @brief Notify provider form delete.
295  * @param formId The form id.
296  * @param record Form information.
297  * @return Function result and has other host flag.
298  */
NotifyProviderFormDelete(const int64_t formId, const FormRecord &formRecord)299 ErrCode FormProviderMgr::NotifyProviderFormDelete(const int64_t formId, const FormRecord &formRecord)
300 {
301     if (formRecord.abilityName.empty()) {
302         HILOG_ERROR("empty formRecord.abilityName");
303         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
304     }
305 
306     if (formRecord.bundleName.empty()) {
307         HILOG_ERROR("empty formRecord.bundleName");
308         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
309     }
310 
311     HILOG_DEBUG("connectAbility,bundleName:%{public}s, abilityName:%{public}s",
312         formRecord.bundleName.c_str(), formRecord.abilityName.c_str());
313     sptr<IAbilityConnection> formDeleteConnection = new (std::nothrow) FormDeleteConnection(formId,
314         formRecord.bundleName, formRecord.abilityName);
315     if (formDeleteConnection == nullptr) {
316         HILOG_ERROR("create FormDeleteConnection failed");
317         return ERR_APPEXECFWK_FORM_COMMON_CODE;
318     }
319     Want want;
320     want.SetElementName(formRecord.bundleName, formRecord.abilityName);
321     want.SetFlags(Want::FLAG_ABILITY_FORM_ENABLED);
322 
323     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formDeleteConnection);
324     if (errorCode != ERR_OK) {
325         HILOG_ERROR("ConnectServiceAbility failed");
326         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
327     }
328     return ERR_OK;
329 }
330 
331 /**
332  * @brief Notify provider forms batch delete.
333  * @param bundleName BundleName.
334  * @param bundleName AbilityName.
335  * @param formIds form id list.
336  * @return Returns ERR_OK on success, others on failure.
337  */
NotifyProviderFormsBatchDelete(const std::string &bundleName, const std::string &abilityName, const std::set<int64_t> &formIds)338 ErrCode FormProviderMgr::NotifyProviderFormsBatchDelete(const std::string &bundleName,
339     const std::string &abilityName, const std::set<int64_t> &formIds)
340 {
341     if (abilityName.empty()) {
342         HILOG_ERROR("empty abilityName");
343         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
344     }
345 
346     if (bundleName.empty()) {
347         HILOG_ERROR("empty bundleName");
348         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
349     }
350 
351     HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s",
352         bundleName.c_str(), abilityName.c_str());
353     sptr<IAbilityConnection> batchDeleteConnection = new FormBatchDeleteConnection(formIds, bundleName, abilityName);
354     if (batchDeleteConnection == nullptr) {
355         HILOG_ERROR("create FormBatchDeleteConnection failed");
356         return ERR_APPEXECFWK_FORM_COMMON_CODE;
357     }
358     Want want;
359     want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
360     want.SetElementName(bundleName, abilityName);
361 
362     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, batchDeleteConnection);
363     if (errorCode != ERR_OK) {
364         HILOG_ERROR("ConnectServiceAbility failed");
365         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
366     }
367     return ERR_OK;
368 }
369 /**
370  * @brief Update form.
371  * @param formId The form's id.
372  * @param formProviderData form provider data.
373  * @return Returns ERR_OK on success, others on failure.
374  */
UpdateForm(const int64_t formId, const FormProviderInfo &formProviderInfo)375 ErrCode FormProviderMgr::UpdateForm(const int64_t formId, const FormProviderInfo &formProviderInfo)
376 {
377     // check exist and get the formRecord
378     FormRecord formRecord;
379     if (!FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
380         HILOG_ERROR("not exist such form:%{public}" PRId64 ".", formId);
381         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
382     }
383     return UpdateForm(formId, formRecord, formProviderInfo.GetFormData());
384 }
385 /**
386  * handle for update form event from provider.
387  *
388  * @param formId The id of the form.
389  * @param formRecord The form's record.
390  * @param formProviderData provider form info.
391  * @return Returns ERR_OK on success, others on failure.
392  */
UpdateForm(const int64_t formId, FormRecord &formRecord, const FormProviderData &formProviderData)393 ErrCode FormProviderMgr::UpdateForm(const int64_t formId,
394     FormRecord &formRecord, const FormProviderData &formProviderData)
395 {
396     HILOG_INFO("imageDateState is %{public}d", formProviderData.GetImageDataState());
397     if (formRecord.versionUpgrade) {
398         formRecord.formProviderInfo.SetFormData(formProviderData);
399         formRecord.formProviderInfo.SetUpgradeFlg(true);
400     } else {
401         nlohmann::json addJsonData = formProviderData.GetData();
402         formRecord.formProviderInfo.MergeData(addJsonData);
403         // merge image
404         auto formData = formRecord.formProviderInfo.GetFormData();
405         formData.SetImageDataState(formProviderData.GetImageDataState());
406         formData.SetImageDataMap(formProviderData.GetImageDataMap());
407         formRecord.formProviderInfo.SetFormData(formData);
408     }
409 
410     // formRecord init
411     formRecord.isInited = true;
412     formRecord.needRefresh = false;
413     FormDataMgr::GetInstance().SetFormCacheInited(formId, true);
414 
415     // update form for host clients
416     FormDataMgr::GetInstance().UpdateHostNeedRefresh(formId, true);
417 
418 #ifdef SUPPORT_POWER
419     bool screenOnFlag = PowerMgr::PowerMgrClient::GetInstance().IsScreenOn();
420     if (screenOnFlag) {
421         if (FormDataMgr::GetInstance().UpdateHostForm(formId, formRecord)) {
422             FormDataMgr::GetInstance().SetVersionUpgrade(formId, false);
423             formRecord.formProviderInfo.SetUpgradeFlg(false);
424         }
425     }
426     HILOG_DEBUG("screenOn:%{public}d", screenOnFlag);
427 #endif
428 
429     if (formRecord.formProviderInfo.NeedCache()) {
430         HILOG_INFO("updateJsForm, data is less than 1k, cache data");
431         FormCacheMgr::GetInstance().AddData(formId, formRecord.formProviderInfo.GetFormData());
432     } else {
433         FormCacheMgr::GetInstance().DeleteData(formId);
434     }
435 
436     // the update form is successfully
437     return ERR_OK;
438 }
439 /**
440  * @brief Process js message event.
441  * @param formId Indicates the unique id of form.
442  * @param record Form record.
443  * @param want information passed to supplier.
444  * @return Returns true if execute success, false otherwise.
445  */
MessageEvent(const int64_t formId, const FormRecord &record, const Want &want)446 int FormProviderMgr::MessageEvent(const int64_t formId, const FormRecord &record, const Want &want)
447 {
448     HILOG_INFO("formId:%{public}" PRId64, formId);
449 
450 #ifdef SUPPORT_POWER
451     bool screenOnFlag = PowerMgr::PowerMgrClient::GetInstance().IsScreenOn();
452     if (!screenOnFlag) {
453         HILOG_WARN("screen off now");
454         return ERR_APPEXECFWK_FORM_COMMON_CODE;
455     }
456 #endif
457 
458     sptr<IAbilityConnection> formMsgEventConnection = new (std::nothrow) FormMsgEventConnection(formId, want,
459         record.bundleName, record.abilityName);
460     if (formMsgEventConnection == nullptr) {
461         HILOG_ERROR("create FormMsgEventConnection failed");
462         return ERR_APPEXECFWK_FORM_COMMON_CODE;
463     }
464     Want connectWant;
465     connectWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
466     connectWant.SetElementName(record.bundleName, record.abilityName);
467 
468     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(connectWant, formMsgEventConnection);
469     if (errorCode != ERR_OK) {
470         HILOG_ERROR("ConnectServiceAbility failed");
471         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
472     }
473 
474     return ERR_OK;
475 }
476 
477 /**
478  * @brief Increase the timer refresh count.
479  *
480  * @param formId The form id.
481  */
IncreaseTimerRefreshCount(const int64_t formId)482 void FormProviderMgr::IncreaseTimerRefreshCount(const int64_t formId)
483 {
484     FormRecord record;
485     if (!FormDataMgr::GetInstance().GetFormRecord(formId, record)) {
486         HILOG_ERROR("not exist such form:%{public}" PRId64 ".", formId);
487         return;
488     }
489 
490     if (record.isCountTimerRefresh) {
491         FormDataMgr::GetInstance().SetCountTimerRefresh(formId, false);
492         FormTimerMgr::GetInstance().IncreaseRefreshCount(formId);
493     }
494 }
495 
496 /**
497  * @brief Acquire form state.
498  * @param state form state.
499  * @param provider provider info.
500  * @param wantArg The want of onAcquireFormState.
501  * @return Returns ERR_OK on success, others on failure.
502  */
AcquireFormStateBack(FormState state, const std::string& provider, const Want &wantArg)503 ErrCode FormProviderMgr::AcquireFormStateBack(FormState state, const std::string& provider, const Want &wantArg)
504 {
505     HILOG_DEBUG("AcquireFormState start:%{public}d, provider:%{public}s", state, provider.c_str());
506     FormDataMgr::GetInstance().AcquireFormStateBack(state, provider, wantArg);
507     return ERR_OK;
508 }
509 
AcquireFormDataBack(const AAFwk::WantParams &wantParams, int64_t requestCode)510 ErrCode FormProviderMgr::AcquireFormDataBack(const AAFwk::WantParams &wantParams,
511     int64_t requestCode)
512 {
513     HILOG_DEBUG("start");
514     FormDataMgr::GetInstance().AcquireFormDataBack(wantParams, requestCode);
515     return ERR_OK;
516 }
517 
IsNeedToFresh(FormRecord &record, int64_t formId, bool isVisibleToFresh)518 bool FormProviderMgr::IsNeedToFresh(FormRecord &record, int64_t formId, bool isVisibleToFresh)
519 {
520     bool isEnableRefresh = FormDataMgr::GetInstance().IsEnableRefresh(formId);
521     HILOG_DEBUG("isEnableRefresh is %{public}d", isEnableRefresh);
522     if (isEnableRefresh) {
523         return true;
524     }
525 
526     HILOG_DEBUG("isVisibleToFresh is %{public}d, record.isVisible is %{public}d", isVisibleToFresh, record.isVisible);
527     if (isVisibleToFresh) {
528         if (!record.isVisible) {
529             FormRecordReport::GetInstance().IncreaseUpdateTimes(formId, HiSysEventPointType::TYPE_INVISIBLE_INTERCEPT);
530         }
531         return record.isVisible;
532     }
533 
534     bool isEnableUpdate = FormDataMgr::GetInstance().IsEnableUpdate(formId);
535     HILOG_DEBUG("isEnableUpdate is %{public}d", isEnableUpdate);
536     return isEnableUpdate;
537 }
538 
GetFormAbilityInfo(const FormRecord &record) const539 FormRecord FormProviderMgr::GetFormAbilityInfo(const FormRecord &record) const
540 {
541     FormRecord newRecord;
542     newRecord.bundleName = record.bundleName;
543     newRecord.moduleName = record.moduleName;
544     newRecord.abilityName = record.abilityName;
545     newRecord.isInited = record.isInited;
546     newRecord.versionUpgrade = record.versionUpgrade;
547     newRecord.needFreeInstall = record.needFreeInstall;
548     return newRecord;
549 }
550 
IsFormCached(const FormRecord &record)551 bool FormProviderMgr::IsFormCached(const FormRecord &record)
552 {
553     if (record.versionUpgrade) {
554         return false;
555     }
556     return FormCacheMgr::GetInstance().NeedAcquireProviderData(record.formId);
557 }
558 
RebindByFreeInstall(const FormRecord &record, Want &want, const sptr<AAFwk::IAbilityConnection> formRefreshConnection)559 ErrCode FormProviderMgr::RebindByFreeInstall(const FormRecord &record, Want &want,
560     const sptr<AAFwk::IAbilityConnection> formRefreshConnection)
561 {
562     HILOG_INFO("start");
563     want.AddFlags(Want::FLAG_INSTALL_ON_DEMAND | Want::FLAG_INSTALL_WITH_BACKGROUND_MODE);
564     want.SetModuleName(record.moduleName);
565     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formRefreshConnection);
566     if (errorCode != ERR_OK) {
567         HILOG_ERROR("ConnectServiceAbility failed, err:%{public}d", errorCode);
568         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
569     }
570     return ERR_OK;
571 }
572 }  // namespace AppExecFwk
573 }  // namespace OHOS
574