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