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