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