• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     bool collaborationScreenOnFlag = PowerMgr::PowerMgrClient::GetInstance().IsCollaborationScreenOn();
453     if (!screenOnFlag && !collaborationScreenOnFlag) {
454         HILOG_WARN("screen off now");
455         return ERR_APPEXECFWK_FORM_COMMON_CODE;
456     }
457 #endif
458 
459     sptr<IAbilityConnection> formMsgEventConnection = new (std::nothrow) FormMsgEventConnection(formId, want,
460         record.bundleName, record.abilityName);
461     if (formMsgEventConnection == nullptr) {
462         HILOG_ERROR("create FormMsgEventConnection failed");
463         return ERR_APPEXECFWK_FORM_COMMON_CODE;
464     }
465     Want connectWant;
466     connectWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
467     connectWant.SetElementName(record.bundleName, record.abilityName);
468 
469     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(connectWant, formMsgEventConnection);
470     if (errorCode != ERR_OK) {
471         HILOG_ERROR("ConnectServiceAbility failed");
472         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
473     }
474 
475     return ERR_OK;
476 }
477 
478 /**
479  * @brief Increase the timer refresh count.
480  *
481  * @param formId The form id.
482  */
IncreaseTimerRefreshCount(const int64_t formId)483 void FormProviderMgr::IncreaseTimerRefreshCount(const int64_t formId)
484 {
485     FormRecord record;
486     if (!FormDataMgr::GetInstance().GetFormRecord(formId, record)) {
487         HILOG_ERROR("not exist such form:%{public}" PRId64 ".", formId);
488         return;
489     }
490 
491     if (record.isCountTimerRefresh) {
492         FormDataMgr::GetInstance().SetCountTimerRefresh(formId, false);
493         FormTimerMgr::GetInstance().IncreaseRefreshCount(formId);
494     }
495 }
496 
497 /**
498  * @brief Acquire form state.
499  * @param state form state.
500  * @param provider provider info.
501  * @param wantArg The want of onAcquireFormState.
502  * @return Returns ERR_OK on success, others on failure.
503  */
AcquireFormStateBack(FormState state,const std::string & provider,const Want & wantArg)504 ErrCode FormProviderMgr::AcquireFormStateBack(FormState state, const std::string& provider, const Want &wantArg)
505 {
506     HILOG_DEBUG("AcquireFormState start:%{public}d, provider:%{public}s", state, provider.c_str());
507     FormDataMgr::GetInstance().AcquireFormStateBack(state, provider, wantArg);
508     return ERR_OK;
509 }
510 
AcquireFormDataBack(const AAFwk::WantParams & wantParams,int64_t requestCode)511 ErrCode FormProviderMgr::AcquireFormDataBack(const AAFwk::WantParams &wantParams,
512     int64_t requestCode)
513 {
514     HILOG_DEBUG("start");
515     FormDataMgr::GetInstance().AcquireFormDataBack(wantParams, requestCode);
516     return ERR_OK;
517 }
518 
IsNeedToFresh(FormRecord & record,int64_t formId,bool isVisibleToFresh)519 bool FormProviderMgr::IsNeedToFresh(FormRecord &record, int64_t formId, bool isVisibleToFresh)
520 {
521     bool isEnableRefresh = FormDataMgr::GetInstance().IsEnableRefresh(formId);
522     HILOG_DEBUG("isEnableRefresh is %{public}d", isEnableRefresh);
523     if (isEnableRefresh) {
524         return true;
525     }
526 
527     HILOG_DEBUG("isVisibleToFresh is %{public}d, record.isVisible is %{public}d", isVisibleToFresh, record.isVisible);
528     if (isVisibleToFresh) {
529         if (!record.isVisible) {
530             FormRecordReport::GetInstance().IncreaseUpdateTimes(formId, HiSysEventPointType::TYPE_INVISIBLE_INTERCEPT);
531         }
532         return record.isVisible;
533     }
534 
535     bool isEnableUpdate = FormDataMgr::GetInstance().IsEnableUpdate(formId);
536     HILOG_DEBUG("isEnableUpdate is %{public}d", isEnableUpdate);
537     return isEnableUpdate;
538 }
539 
GetFormAbilityInfo(const FormRecord & record) const540 FormRecord FormProviderMgr::GetFormAbilityInfo(const FormRecord &record) const
541 {
542     FormRecord newRecord;
543     newRecord.bundleName = record.bundleName;
544     newRecord.moduleName = record.moduleName;
545     newRecord.abilityName = record.abilityName;
546     newRecord.isInited = record.isInited;
547     newRecord.versionUpgrade = record.versionUpgrade;
548     newRecord.needFreeInstall = record.needFreeInstall;
549     return newRecord;
550 }
551 
IsFormCached(const FormRecord & record)552 bool FormProviderMgr::IsFormCached(const FormRecord &record)
553 {
554     if (record.versionUpgrade) {
555         return false;
556     }
557     return FormCacheMgr::GetInstance().NeedAcquireProviderData(record.formId);
558 }
559 
RebindByFreeInstall(const FormRecord & record,Want & want,const sptr<AAFwk::IAbilityConnection> formRefreshConnection)560 ErrCode FormProviderMgr::RebindByFreeInstall(const FormRecord &record, Want &want,
561     const sptr<AAFwk::IAbilityConnection> formRefreshConnection)
562 {
563     HILOG_INFO("start");
564     want.AddFlags(Want::FLAG_INSTALL_ON_DEMAND | Want::FLAG_INSTALL_WITH_BACKGROUND_MODE);
565     want.SetModuleName(record.moduleName);
566     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formRefreshConnection);
567     if (errorCode != ERR_OK) {
568         HILOG_ERROR("ConnectServiceAbility failed, err:%{public}d", errorCode);
569         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
570     }
571     return ERR_OK;
572 }
573 }  // namespace AppExecFwk
574 }  // namespace OHOS
575