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