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