1 /*
2 * Copyright (c) 2021-2023 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_mgr_adapter.h"
17
18 #include <algorithm>
19 #include <cinttypes>
20 #include <regex>
21 #include <unordered_map>
22 #include <unordered_set>
23
24 #include "ability_manager_errors.h"
25 #include "form_record.h"
26 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
27 #include "bundle_active_client.h"
28 #endif
29 #include "fms_log_wrapper.h"
30 #include "form_acquire_connection.h"
31 #include "form_acquire_data_connection.h"
32 #include "form_acquire_state_connection.h"
33 #include "form_ams_helper.h"
34 #include "form_background_connection.h"
35 #include "form_bms_helper.h"
36 #include "form_cache_mgr.h"
37 #include "form_cast_temp_connection.h"
38 #include "form_constants.h"
39 #include "form_data_mgr.h"
40 #include "form_data_proxy_mgr.h"
41 #include "form_db_cache.h"
42 #include "form_db_info.h"
43 #include "form_dump_mgr.h"
44 #include "form_ecological_rule_param.h"
45 #include "form_ecological_rule_service.h"
46 #include "form_event_notify_connection.h"
47 #include "form_info_mgr.h"
48 #include "form_mgr_errors.h"
49 #include "form_publish_interceptor_interface.h"
50 #include "form_observer_record.h"
51 #include "form_provider_info.h"
52 #include "form_provider_interface.h"
53 #include "form_provider_mgr.h"
54 #include "form_router_proxy_mgr.h"
55 #include "form_render_connection.h"
56 #include "form_render_mgr.h"
57 #include "form_share_mgr.h"
58 #include "form_supply_callback.h"
59 #include "form_timer_mgr.h"
60 #include "form_trust_mgr.h"
61 #include "form_util.h"
62 #include "hitrace_meter.h"
63 #include "if_system_ability_manager.h"
64 #include "in_process_call_wrapper.h"
65 #include "ipc_skeleton.h"
66 #include "iservice_registry.h"
67 #include "js_form_state_observer_interface.h"
68 #include "nlohmann/json.hpp"
69 #include "os_account_manager.h"
70 #include "parameters.h"
71 #include "system_ability_definition.h"
72 #include "form_task_mgr.h"
73
74 namespace OHOS {
75 namespace AppExecFwk {
76 namespace {
77 constexpr int32_t CALLING_UID_TRANSFORM_DIVISOR = 200000;
78 constexpr int32_t SYSTEM_UID = 1000;
79 constexpr int32_t API_11 = 11;
80 const std::string POINT_ETS = ".ets";
81 constexpr int DATA_FIELD = 1;
82 constexpr int FORM_UPDATE_LEVEL_VALUE_MAX_LENGTH = 3; // update level is 1~336, so max length is 3.
83 const std::string EMPTY_BUNDLE = "";
84 const std::string FORM_CLICK_ROUTER = "router";
85 const std::string FORM_CLICK_MESSAGE = "message";
86 const std::string FORM_CLICK_CALL = "call";
87 const std::string FORM_SUPPORT_ECOLOGICAL_RULEMGRSERVICE = "persist.sys.fms.support.ecologicalrulemgrservice";
88 } // namespace
89
FormMgrAdapter()90 FormMgrAdapter::FormMgrAdapter()
91 {
92 HILOG_DEBUG("called.");
93 }
~FormMgrAdapter()94 FormMgrAdapter::~FormMgrAdapter()
95 {
96 HILOG_DEBUG("called.");
97 }
98
99 /**
100 * @brief Init properties like visibleNotifyDelayTime.
101 */
Init()102 void FormMgrAdapter::Init()
103 {
104 FormDataMgr::GetInstance().GetConfigParamFormMap(Constants::VISIBLE_NOTIFY_DELAY, visibleNotifyDelay_);
105 HILOG_INFO("load visibleNotifyDelayTime: %{public}d", visibleNotifyDelay_);
106 }
107
108 /**
109 * @brief Add form with want, send want to form manager service.
110 * @param formId The Id of the forms to add.
111 * @param want The want of the form to add.
112 * @param callerToken Caller ability token.
113 * @param formInfo Form info.
114 * @return Returns ERR_OK on success, others on failure.
115 */
AddForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo)116 int FormMgrAdapter::AddForm(const int64_t formId, const Want &want,
117 const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo)
118 {
119 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
120 HILOG_DEBUG("called.");
121 if (formId < 0 || callerToken == nullptr) {
122 HILOG_ERROR("fail, callerToken can not be NULL");
123 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
124 }
125
126 ErrCode ret = CheckFormCountLimit(formId, want);
127 if (ret != ERR_OK) {
128 HILOG_ERROR("CheckFormCountLimit failed");
129 return ret;
130 }
131
132 // get from config info
133 FormItemInfo formItemInfo;
134 int32_t errCode = GetFormConfigInfo(want, formItemInfo);
135 if (errCode != ERR_OK) {
136 HILOG_ERROR("fail, get form config info failed.");
137 return errCode;
138 }
139 // Check trust list
140 formItemInfo.SetFormId(formId);
141 if (!FormTrustMgr::GetInstance().IsTrust(formItemInfo.GetProviderBundleName())) {
142 HILOG_ERROR("AddForm fail, %{public}s is unTrust",
143 formItemInfo.GetProviderBundleName().c_str());
144 return ERR_APPEXECFWK_FORM_NOT_TRUST;
145 }
146
147 // publish form
148 if (formId > 0 && FormDataMgr::GetInstance().IsRequestPublishForm(formId)) {
149 ret = AddRequestPublishForm(formItemInfo, want, callerToken, formInfo);
150 if (ret != ERR_OK) {
151 HILOG_ERROR("failed, add request publish form failed.");
152 return ret;
153 }
154 bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
155 if (!tempFormFlag && (ret == ERR_OK)) {
156 HILOG_DEBUG("Checks if there is a listener listening for adding form");
157 HandleFormAddObserver(formInfo.formId);
158 }
159 }
160
161 ret = AllotForm(formId, want, callerToken, formInfo, formItemInfo);
162 if (ret != ERR_OK) {
163 HILOG_ERROR("failed, allot form failed.");
164 }
165 return ret;
166 }
167
CheckFormCountLimit(const int64_t formId,const Want & want)168 ErrCode FormMgrAdapter::CheckFormCountLimit(const int64_t formId, const Want &want)
169 {
170 bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
171 int callingUid = IPCSkeleton::GetCallingUid();
172 ErrCode checkCode = 0;
173 if (tempFormFlag && !FormRenderMgr::GetInstance().IsRerenderForRenderServiceDied(formId)) {
174 if (formId > 0) {
175 HILOG_ERROR("fail, temp form id is invalid, formId:%{public}" PRId64 "", formId);
176 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
177 }
178 checkCode = FormDataMgr::GetInstance().CheckTempEnoughForm();
179 } else {
180 if (formId == 0) {
181 // get current userId
182 int32_t currentUserId = GetCurrentUserId(callingUid);
183 checkCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, currentUserId);
184 }
185 }
186 if (checkCode != 0) {
187 HILOG_ERROR("fail, too much forms in system");
188 }
189 return checkCode;
190 }
191
AllotForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo,const FormItemInfo & formItemInfo)192 ErrCode FormMgrAdapter::AllotForm(const int64_t formId, const Want &want,
193 const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo, const FormItemInfo &formItemInfo)
194 {
195 Want newWant(want);
196 bool directCallInApp = newWant.GetBoolParam(Constants::KEY_DIRECT_CALL_INAPP, false);
197 // in application form
198 if (formItemInfo.GetProviderBundleName() == formItemInfo.GetHostBundleName() && directCallInApp) {
199 HILOG_DEBUG("form in application");
200 newWant.SetParam(Constants::PARAM_FORM_HOST_TOKEN, callerToken);
201 }
202
203 WantParams wantParams = newWant.GetParams();
204 // share form
205 if (formId == 0 && DelayedSingleton<FormShareMgr>::GetInstance()->IsShareForm(newWant)) {
206 DelayedSingleton<FormShareMgr>::GetInstance()->AddProviderData(newWant, wantParams);
207 }
208 //Specify the form Id
209 bool specificFormFlag = false;
210 if (want.HasParameter(Constants::PARAM_FORM_MIGRATE_FORM_KEY)) {
211 specificFormFlag = want.GetBoolParam(Constants::PARAM_FORM_MIGRATE_FORM_KEY, false);
212 wantParams.Remove(Constants::PARAM_FORM_MIGRATE_FORM_KEY);
213 }
214
215 if (!formItemInfo.IsTransparencyEnabled()) {
216 wantParams.Remove(Constants::PARAM_FORM_TRANSPARENCY_KEY);
217 }
218
219 ErrCode ret = 0;
220 if (formId > 0) {
221 if (specificFormFlag) {
222 ret = AllotFormBySpecificId(formItemInfo, callerToken, wantParams, formInfo);
223 } else {
224 ret = AllotFormById(formItemInfo, callerToken, wantParams, formInfo);
225 }
226 } else {
227 ret = AllotFormByInfo(formItemInfo, callerToken, wantParams, formInfo);
228 bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
229 if (!tempFormFlag && (ret == ERR_OK)) {
230 HILOG_DEBUG("Checks if there is a listener listening for adding form");
231 HandleFormAddObserver(formInfo.formId);
232 }
233 }
234 return ret;
235 }
236
HandleFormAddObserver(const int64_t formId)237 ErrCode FormMgrAdapter::HandleFormAddObserver(const int64_t formId)
238 {
239 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
240 std::string hostBundleName;
241 auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
242 if (ret != ERR_OK) {
243 HILOG_ERROR("failed to get BundleName");
244 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
245 }
246
247 // Checks if there is a observer on the current host.
248 return FormDataMgr::GetInstance().HandleFormAddObserver(hostBundleName, formId);
249 }
250
HandleFormRemoveObserver(const RunningFormInfo runningFormInfo)251 ErrCode FormMgrAdapter::HandleFormRemoveObserver(const RunningFormInfo runningFormInfo)
252 {
253 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
254 std::string hostBundleName;
255 auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
256 if (ret != ERR_OK) {
257 HILOG_ERROR("failed to get BundleName");
258 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
259 }
260
261 // Checks if there is a observer on the current host.
262 return FormDataMgr::GetInstance().HandleFormRemoveObserver(hostBundleName, runningFormInfo);
263 }
264
265 /**
266 * @brief Delete forms with formIds, send formIds to form manager service.
267 * @param formId The Id of the forms to delete.
268 * @param callerToken Caller ability token.
269 * @return Returns ERR_OK on success, others on failure.
270 */
DeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)271 int FormMgrAdapter::DeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
272 {
273 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
274 HILOG_INFO("formId is %{public}" PRId64, formId);
275 if (formId <= 0 || callerToken == nullptr) {
276 HILOG_ERROR("deleteForm invalid param");
277 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
278 }
279
280 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
281 // remove connection for in application form
282 FormSupplyCallback::GetInstance()->RemoveConnection(matchedFormId, callerToken);
283 FormDataProxyMgr::GetInstance().UnsubscribeFormData(matchedFormId);
284 if (FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
285 // delete temp form if receive delete form call
286 return HandleDeleteTempForm(matchedFormId, callerToken);
287 }
288 RunningFormInfo runningFormInfo;
289 FormDataMgr::GetInstance().GetRunningFormInfosByFormId(matchedFormId, runningFormInfo);
290 auto ret = HandleDeleteForm(matchedFormId, callerToken);
291 if (ret != ERR_OK) {
292 HILOG_ERROR("delete form failed.");
293 return ret;
294 }
295 HILOG_DEBUG("Checks if there is a listener listening for release form");
296 HandleFormRemoveObserver(runningFormInfo);
297 return ERR_OK;
298 }
299
300 /**
301 * @brief Stop rendering form.
302 * @param formId The Id of the forms to delete.
303 * @param compId The compId of the forms to delete.
304 * @return Returns ERR_OK on success, others on failure.
305 */
StopRenderingForm(const int64_t formId,const std::string & compId)306 int FormMgrAdapter::StopRenderingForm(const int64_t formId, const std::string &compId)
307 {
308 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
309 if (formId <= 0 || compId.empty()) {
310 HILOG_ERROR("%{public}s, deleteForm invalid param", __func__);
311 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
312 }
313
314 FormRecord record;
315 FormDataMgr::GetInstance().GetFormRecord(formId, record);
316 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, compId);
317 return ERR_OK;
318 }
319
320 /**
321 * @brief Release forms with formIds, send formIds to form Mgr service.
322 * @param formId The Id of the forms to release.
323 * @param callerToken Caller ability token.
324 * @param delCache Delete Cache or not.
325 * @return Returns ERR_OK on success, others on failure.
326 */
ReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const bool delCache)327 int FormMgrAdapter::ReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const bool delCache)
328 {
329 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
330 HILOG_INFO("formId is %{public}" PRId64, formId);
331 if (formId <= 0 || callerToken == nullptr) {
332 HILOG_ERROR("%{public}s, releaseForm invalid param", __func__);
333 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
334 }
335 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
336 // remove connection for in application form
337 FormSupplyCallback::GetInstance()->RemoveConnection(matchedFormId, callerToken);
338 if (FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
339 // delete temp form if receive release form call
340 return HandleDeleteTempForm(matchedFormId, callerToken);
341 }
342 FormRecord record;
343 FormDataMgr::GetInstance().GetFormRecord(formId, record);
344 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
345 FormRecord dbRecord;
346 if (FormDbCache::GetInstance().GetDBRecord(matchedFormId, dbRecord) != ERR_OK) {
347 HILOG_ERROR("%{public}s, not exist such db form:%{public}" PRId64 "", __func__, formId);
348 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
349 }
350 int callingUid = IPCSkeleton::GetCallingUid();
351 bool isSelfDbFormId = (FormUtil::GetCurrentAccountId() == dbRecord.providerUserId) &&
352 ((std::find(dbRecord.formUserUids.begin(), dbRecord.formUserUids.end(), callingUid)
353 != dbRecord.formUserUids.end()) ? true : false);
354 if (!isSelfDbFormId) {
355 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
356 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
357 }
358 if (delCache) {
359 ErrCode result = HandleReleaseForm(matchedFormId, callerToken);
360 if (result != ERR_OK) {
361 HILOG_ERROR("%{public}s, release form error.", __func__);
362 return result;
363 }
364 }
365
366 if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, matchedFormId)) {
367 HILOG_ERROR("%{public}s, failed to remove host record", __func__);
368 return ERR_APPEXECFWK_FORM_COMMON_CODE;
369 }
370 if (!FormTimerMgr::GetInstance().RemoveFormTimer(matchedFormId)) {
371 HILOG_ERROR("%{public}s, remove timer error", __func__);
372 return ERR_APPEXECFWK_FORM_COMMON_CODE;
373 }
374 return ERR_OK;
375 }
376
377 /**
378 * @brief Handle release form.
379 * @param formId The form id.
380 * @param callerToken Caller ability token.
381 * @return Returns ERR_OK on success, others on failure.
382 */
HandleReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)383 ErrCode FormMgrAdapter::HandleReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
384 {
385 HILOG_INFO("formId is %{public}" PRId64, formId);
386 if (!FormDataMgr::GetInstance().ExistFormRecord(formId)) {
387 HILOG_ERROR("%{public}s, not exist such db or temp form:%{public}" PRId64 "", __func__, formId);
388 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
389 }
390
391 FormHostRecord hostRecord;
392 bool hasRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, hostRecord);
393 bool isSelfId = hasRecord && hostRecord.Contains(formId);
394 if (!isSelfId) {
395 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
396 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
397 }
398
399 FormDataMgr::GetInstance().DeleteFormUserUid(formId, IPCSkeleton::GetCallingUid());
400 if (!FormDataMgr::GetInstance().HasFormUserUids(formId)) {
401 FormDataMgr::GetInstance().DeleteFormRecord(formId);
402 if (!FormTimerMgr::GetInstance().RemoveFormTimer(formId)) {
403 HILOG_ERROR("%{public}s, remove timer error", __func__);
404 return ERR_APPEXECFWK_FORM_COMMON_CODE;
405 }
406 }
407 return ERR_OK;
408 }
409
410 /**
411 * @brief Handle delete form.
412 * @param formId The form id.
413 * @param callerToken Caller ability token.
414 * @return Returns ERR_OK on success, others on failure.
415 */
HandleDeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)416 ErrCode FormMgrAdapter::HandleDeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
417 {
418 HILOG_INFO("formId is %{public}" PRId64, formId);
419 FormRecord dbRecord;
420 if (FormDbCache::GetInstance().GetDBRecord(formId, dbRecord) != ERR_OK) {
421 HILOG_ERROR("%{public}s, not exist such db form:%{public}" PRId64 "", __func__, formId);
422 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
423 }
424 FormRecord record;
425 FormDataMgr::GetInstance().GetFormRecord(formId, record);
426 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
427 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
428 DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
429 record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_REMOVED);
430 #endif
431 int callingUid = IPCSkeleton::GetCallingUid();
432 int32_t userId = FormUtil::GetCurrentAccountId();
433 bool isSelfDbFormId = (userId == dbRecord.providerUserId) && ((std::find(dbRecord.formUserUids.begin(),
434 dbRecord.formUserUids.end(), callingUid) != dbRecord.formUserUids.end()) ? true : false);
435 if (!isSelfDbFormId) {
436 HILOG_ERROR("not self form:%{public}" PRId64 ", callingUid:%{public}d", formId, callingUid);
437 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
438 }
439
440 ErrCode result = HandleDeleteFormCache(dbRecord, callingUid, formId);
441 if (result != ERR_OK) {
442 return result;
443 }
444
445 if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, formId)) {
446 HILOG_ERROR("failed to remove host record");
447 return ERR_APPEXECFWK_FORM_COMMON_CODE;
448 }
449
450 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
451 DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
452 #endif
453 return ERR_OK;
454 }
455
456 /**
457 * @brief Handle delete temp form.
458 * @param formId The form id.
459 * @param callerToken Caller ability token.
460 * @return Returns ERR_OK on success, others on failure.
461 */
HandleDeleteTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)462 ErrCode FormMgrAdapter::HandleDeleteTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
463 {
464 HILOG_INFO("formId is %{public}" PRId64, formId);
465 int uid = IPCSkeleton::GetCallingUid();
466 FormRecord record;
467 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, record);
468 bool isSelfTempFormId = false;
469 if (isFormRecExist && record.formTempFlag) {
470 isSelfTempFormId = (FormUtil::GetCurrentAccountId() == record.providerUserId) &&
471 ((std::find(record.formUserUids.begin(), record.formUserUids.end(), uid) !=
472 record.formUserUids.end()) ? true : false);
473 }
474 if (!isSelfTempFormId) {
475 HILOG_ERROR("not self form:%{public}" PRId64 "", formId);
476 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
477 }
478 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
479 FormDataMgr::GetInstance().DeleteFormUserUid(formId, uid);
480 if (!FormDataMgr::GetInstance().HasFormUserUids(formId)) {
481 int result = FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, record);
482 if (result != ERR_OK) {
483 HILOG_ERROR("%{public}s, failed!", __func__);
484 FormDataMgr::GetInstance().AddFormUserUid(formId, uid);
485 return result;
486 }
487 if (!FormDataMgr::GetInstance().DeleteTempForm(formId)) {
488 HILOG_ERROR("%{public}s, form id is not existed.", __func__);
489 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
490 }
491 FormDataMgr::GetInstance().DeleteFormRecord(formId);
492 if (!FormCacheMgr::GetInstance().DeleteData(formId)) {
493 HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
494 return ERR_APPEXECFWK_FORM_COMMON_CODE;
495 }
496 }
497
498 if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, formId)) {
499 HILOG_ERROR("%{public}s, failed to remove host record", __func__);
500 return ERR_APPEXECFWK_FORM_COMMON_CODE;
501 }
502
503 HILOG_DEBUG("%{public}s, record.formUserUids size: %{public}zu", __func__, record.formUserUids.size());
504 return ERR_OK;
505 }
506
507 /**
508 * @brief Handle delete form cache.
509 * @param dbRecord Form storage information.
510 * @param uid calling user id.
511 * @param formId The form id.
512 * @return Returns ERR_OK on success, others on failure.
513 */
HandleDeleteFormCache(FormRecord & dbRecord,const int uid,const int64_t formId)514 ErrCode FormMgrAdapter::HandleDeleteFormCache(FormRecord &dbRecord, const int uid, const int64_t formId)
515 {
516 HILOG_INFO("delete formDBRecords, formId: %{public}" PRId64 "", formId);
517 auto iter = std::find(dbRecord.formUserUids.begin(), dbRecord.formUserUids.end(), uid);
518 if (iter != dbRecord.formUserUids.end()) {
519 dbRecord.formUserUids.erase(iter);
520 }
521
522 ErrCode result = ERR_OK;
523 int32_t deleteFormError = ERR_OK;
524 if (dbRecord.formUserUids.empty()) {
525 result = FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, dbRecord);
526 if (result != ERR_OK) {
527 HILOG_ERROR("%{public}s, failed to notify provider form delete", __func__);
528 deleteFormError = deleteFormError != ERR_OK ? deleteFormError : result;
529 }
530 if (!FormDataMgr::GetInstance().DeleteFormRecord(formId)) {
531 HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
532 deleteFormError = deleteFormError != ERR_OK ? deleteFormError : ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
533 }
534 if (result = FormDbCache::GetInstance().DeleteFormInfo(formId); result != ERR_OK) {
535 HILOG_ERROR("failed to remove db data");
536 deleteFormError = deleteFormError != ERR_OK ? deleteFormError : result;
537 }
538
539 int32_t matchCount = FormDbCache::GetInstance().GetMatchCount(dbRecord.bundleName, dbRecord.moduleName);
540 if (matchCount == 0) {
541 FormBmsHelper::GetInstance().NotifyModuleRemovable(dbRecord.bundleName, dbRecord.moduleName);
542 }
543
544 if (!FormCacheMgr::GetInstance().DeleteData(formId)) {
545 HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
546 deleteFormError = deleteFormError != ERR_OK ? deleteFormError : ERR_APPEXECFWK_FORM_COMMON_CODE;
547 }
548 if (!FormTimerMgr::GetInstance().RemoveFormTimer(formId)) {
549 HILOG_ERROR("%{public}s, remove timer error", __func__);
550 deleteFormError = deleteFormError != ERR_OK ? deleteFormError : ERR_APPEXECFWK_FORM_COMMON_CODE;
551 }
552
553 return deleteFormError;
554 }
555
556 if (result = FormDbCache::GetInstance().UpdateDBRecord(formId, dbRecord); result != ERR_OK) {
557 return result;
558 }
559
560 HILOG_DEBUG("%{public}s, dbRecord.formUserUids size: %{public}zu", __func__, dbRecord.formUserUids.size());
561 FormBmsHelper::GetInstance().NotifyModuleNotRemovable(dbRecord.bundleName, dbRecord.moduleName);
562 FormDataMgr::GetInstance().DeleteFormUserUid(formId, uid);
563 return result;
564 }
565
UpdateForm(const int64_t formId,const int32_t callingUid,const FormProviderData & formProviderData,const std::vector<FormDataProxy> & formDataProxies)566 int FormMgrAdapter::UpdateForm(const int64_t formId, const int32_t callingUid,
567 const FormProviderData &formProviderData, const std::vector<FormDataProxy> &formDataProxies)
568 {
569 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
570 HILOG_INFO("formId is %{public}" PRId64, formId);
571
572 // check formId and bundleName
573 if (formId <= 0) {
574 HILOG_ERROR("error, invalid formId");
575 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
576 }
577
578 // find matched formId
579 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
580
581 // check exist and get the formRecord
582 FormRecord formRecord;
583 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
584 HILOG_ERROR("error, not exist such form:%{public}" PRId64 ".", matchedFormId);
585 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
586 }
587
588 // Checks if the form provider is the currently active user.
589 if (FormUtil::GetCurrentAccountId() != formRecord.providerUserId) {
590 HILOG_ERROR("fail, not under current user.");
591 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
592 }
593
594 // check bundleName match
595 if (formRecord.uid != callingUid) {
596 HILOG_ERROR("error, not match providerUid: %{public}d and callingUid: %{public}d", formRecord.uid, callingUid);
597 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
598 }
599
600 int32_t ret = ERR_OK;
601 if (formRecord.uiSyntax == FormType::ETS) {
602 WantParams wantParams;
603 ret = FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderData, wantParams, true);
604 } else {
605 // update Form
606 ret = FormProviderMgr::GetInstance().UpdateForm(matchedFormId, formRecord, formProviderData);
607 }
608
609 if (!formDataProxies.empty()) {
610 FormDataProxyMgr::GetInstance().UpdateSubscribeFormData(matchedFormId, formDataProxies);
611 }
612 return ret;
613 }
614
615 /**
616 * @brief Request form with formId and want, send formId and want to form manager service.
617 * @param formId The Id of the form to update.
618 * @param callerToken Caller ability token.
619 * @param want The want of the form to request.
620 * @return Returns ERR_OK on success, others on failure.
621 */
RequestForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const Want & want)622 int FormMgrAdapter::RequestForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const Want &want)
623 {
624 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
625 HILOG_INFO("formId is %{public}" PRId64, formId);
626 if (formId <= 0 || callerToken == nullptr) {
627 HILOG_ERROR("%{public}s fail, invalid formId or callerToken.", __func__);
628 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
629 }
630
631 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
632 if (!FormDataMgr::GetInstance().ExistFormRecord(matchedFormId)) {
633 HILOG_ERROR("%{public}s fail, not exist such formId:%{public}" PRId64 ".", __func__, matchedFormId);
634 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
635 }
636
637 FormHostRecord formHostRecord;
638 bool isHostExist = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
639 if (!isHostExist) {
640 HILOG_ERROR("%{public}s fail, cannot find target client.", __func__);
641 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
642 }
643
644 if (!formHostRecord.Contains(matchedFormId)) {
645 HILOG_ERROR("%{public}s fail, form is not self-owned.", __func__);
646 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
647 }
648
649 HILOG_INFO("%{public}s, find target client.", __func__);
650 Want reqWant(want);
651 int32_t currentActiveUserId = FormUtil::GetCurrentAccountId();
652 reqWant.SetParam(Constants::PARAM_FORM_USER_ID, currentActiveUserId);
653 return FormProviderMgr::GetInstance().RefreshForm(matchedFormId, reqWant, true);
654 }
655
656 /**
657 * @brief Form visible/invisible notify, send formIds to form manager service.
658 * @param formIds The vector of form Ids.
659 * @param callerToken Caller ability token.
660 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
661 * @return Returns ERR_OK on success, others on failure.
662 */
NotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,const int32_t formVisibleType)663 ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
664 const sptr<IRemoteObject> &callerToken, const int32_t formVisibleType)
665 {
666 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
667 HILOG_DEBUG("called.");
668 if (callerToken == nullptr) {
669 HILOG_ERROR("fail, callerToken can not be NULL.");
670 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
671 }
672
673 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
674 if (iBundleMgr == nullptr) {
675 HILOG_ERROR("fail, failed to get IBundleMgr.");
676 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
677 }
678
679 int64_t matchedFormId = 0;
680 int32_t userId = FormUtil::GetCurrentAccountId();
681 std::map<std::string, std::vector<int64_t>> eventMaps;
682 std::map<std::string, std::vector<FormInstance>> formInstanceMaps;
683
684 for (int64_t formId : formIds) {
685 if (formId <= 0) {
686 HILOG_WARN("formId %{public}" PRId64 " is less than 0", formId);
687 continue;
688 }
689 matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
690 FormRecord formRecord;
691
692 if (!isFormShouldUpdateProviderInfoToHost(matchedFormId, userId, callerToken, formRecord)) {
693 continue;
694 }
695
696 PaddingNotifyVisibleFormsMap(formVisibleType, formId, formInstanceMaps);
697
698 // Update info to host and check if the form was created by the system application.
699 if ((!UpdateProviderInfoToHost(matchedFormId, userId, callerToken, formVisibleType, formRecord)) ||
700 (!formRecord.isSystemApp)) {
701 continue;
702 }
703
704 // Check the value of formVisibleNotify.
705 AppExecFwk::ApplicationInfo info;
706
707 if (!IN_PROCESS_CALL(iBundleMgr->GetApplicationInfo(formRecord.bundleName,
708 AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO, formRecord.providerUserId, info))) {
709 HILOG_ERROR("failed to get Application info.");
710 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
711 }
712
713 if (!info.formVisibleNotify) {
714 HILOG_DEBUG("the value of formVisibleNotify is false.");
715 continue;
716 }
717
718 // Create eventMaps
719 if (!CreateHandleEventMap(matchedFormId, formRecord, eventMaps)) {
720 continue;
721 }
722 }
723
724 FormTaskMgr::GetInstance().PostVisibleNotify(formIds, formInstanceMaps, eventMaps, formVisibleType,
725 visibleNotifyDelay_);
726 return ERR_OK;
727 }
728
729 /**
730 * @brief Padding the formInstances map for visibleNotify.
731 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
732 * @param formId Form Id.
733 * @param formInstanceMaps formInstances for visibleNotify.
734 */
PaddingNotifyVisibleFormsMap(const int32_t formVisibleType,int64_t formId,std::map<std::string,std::vector<FormInstance>> & formInstanceMaps)735 void FormMgrAdapter::PaddingNotifyVisibleFormsMap(const int32_t formVisibleType, int64_t formId,
736 std::map<std::string, std::vector<FormInstance>> &formInstanceMaps)
737 {
738 std::string specialFlag = "#";
739 bool isVisibility = (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE));
740 FormInstance formInstance;
741 // Get the updated card status
742 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
743 FormDataMgr::GetInstance().GetFormInstanceById(matchedFormId, false, formInstance);
744 std::string formHostName = formInstance.formHostName;
745 std::string formAllHostName = EMPTY_BUNDLE;
746 if (formVisibleType == static_cast<int32_t>(formInstance.formVisiblity)) {
747 return;
748 }
749 for (auto formObserver : formObservers_) {
750 if (formObserver.first == formHostName + specialFlag + std::to_string(isVisibility) ||
751 formObserver.first == formAllHostName + specialFlag + std::to_string(isVisibility)) {
752 auto observer = formInstanceMaps.find(formObserver.first);
753 if (observer == formInstanceMaps.end()) {
754 std::vector<FormInstance> formInstances;
755 formInstance.formVisiblity = static_cast<FormVisibilityType>(formVisibleType);
756 formInstances.emplace_back(formInstance);
757 formInstanceMaps.emplace(formObserver.first, formInstances);
758 } else {
759 observer->second.emplace_back(formInstance);
760 }
761 }
762 }
763 }
764
765 /**
766 * @brief Handle forms visible/invisible notify after delay time, notification will be cancelled when
767 * formVisibleState recovered during the delay time.
768 * @param formIds The vector of form Ids.
769 * @param formInstanceMaps formInstances for visibleNotify.
770 * @param eventMaps eventMaps for event notify.
771 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
772 */
HandlerNotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,std::map<std::string,std::vector<FormInstance>> formInstanceMaps,std::map<std::string,std::vector<int64_t>> eventMaps,const int32_t formVisibleType)773 void FormMgrAdapter::HandlerNotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
774 std::map<std::string, std::vector<FormInstance>> formInstanceMaps,
775 std::map<std::string, std::vector<int64_t>> eventMaps, const int32_t formVisibleType)
776 {
777 HILOG_DEBUG("start");
778 FilterDataByVisibleType(formInstanceMaps, eventMaps, formVisibleType);
779 for (auto formObserver : formObservers_) {
780 NotifyWhetherFormsVisible(formObserver.first, formObserver.second, formInstanceMaps, formVisibleType);
781 }
782 for (auto iter = eventMaps.begin(); iter != eventMaps.end(); iter++) {
783 if (HandleEventNotify(iter->first, iter->second, formVisibleType) != ERR_OK) {
784 HILOG_WARN("HandleEventNotify error, key is %{public}s.", iter->first.c_str());
785 }
786 }
787 if (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
788 FormDataProxyMgr::GetInstance().EnableSubscribeFormData(formIds);
789 } else if (formVisibleType == static_cast<int32_t>(FormVisibilityType::INVISIBLE)) {
790 FormDataProxyMgr::GetInstance().DisableSubscribeFormData(formIds);
791 }
792 }
793
794 /**
795 * @brief Notify forms visible/invisible to remoteCallers.
796 * @param bundleName the caller's bundle name.
797 * @param remoteObjects refs of remoteCallers.
798 * @param formInstanceMaps formInstances for visibleNotify.
799 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
800 */
NotifyWhetherFormsVisible(const std::string & bundleName,std::vector<sptr<IRemoteObject>> & remoteObjects,std::map<std::string,std::vector<FormInstance>> & formInstanceMaps,const int32_t formVisibleType)801 void FormMgrAdapter::NotifyWhetherFormsVisible(const std::string &bundleName,
802 std::vector<sptr<IRemoteObject>> &remoteObjects,
803 std::map<std::string, std::vector<FormInstance>> &formInstanceMaps, const int32_t formVisibleType)
804 {
805 HILOG_DEBUG("bundleName: %{public}s, remoteObjects: %{public}d", bundleName.c_str(), (int)remoteObjects.size());
806 for (auto remoteObject : remoteObjects) {
807 sptr<AbilityRuntime::IJsFormStateObserver> remoteJsFormStateObserver =
808 iface_cast<AbilityRuntime::IJsFormStateObserver>(remoteObject);
809 auto observer = formInstanceMaps.find(bundleName);
810 if (observer != formInstanceMaps.end()) {
811 if (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
812 remoteJsFormStateObserver->NotifyWhetherFormsVisible(FormVisibilityType::VISIBLE,
813 bundleName, observer->second);
814 } else if (formVisibleType == static_cast<int32_t>(FormVisibilityType::INVISIBLE)) {
815 remoteJsFormStateObserver->NotifyWhetherFormsVisible(FormVisibilityType::INVISIBLE,
816 bundleName, observer->second);
817 }
818 }
819 }
820 }
821
822 /**
823 * @brief Forms formInstanceMaps or eventMaps should remove when visible/invisible status recovered.
824 * @param formInstanceMaps formInstances for visibleNotify.
825 * @param eventMaps eventMaps for event notify.
826 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
827 */
FilterDataByVisibleType(std::map<std::string,std::vector<FormInstance>> & formInstanceMaps,std::map<std::string,std::vector<int64_t>> & eventMaps,const int32_t formVisibleType)828 void FormMgrAdapter::FilterDataByVisibleType(std::map<std::string, std::vector<FormInstance>> &formInstanceMaps,
829 std::map<std::string, std::vector<int64_t>> &eventMaps, const int32_t formVisibleType)
830 {
831 HILOG_DEBUG("start");
832 std::map<int64_t, FormRecord> restoreFormRecords;
833 FilterFormInstanceMapsByVisibleType(formInstanceMaps, formVisibleType, restoreFormRecords);
834 FilterEventMapsByVisibleType(eventMaps, formVisibleType, restoreFormRecords);
835
836 for (auto formRecordEntry : restoreFormRecords) {
837 FormRecord formRecord = formRecordEntry.second;
838 formRecord.isNeedNotify = false;
839 HILOG_INFO("formRecord no need notify, formId: %{public}" PRId64 ".", formRecord.formId);
840 if (!FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord)) {
841 HILOG_ERROR("update restoreFormRecords failed, formId: %{public}" PRId64 ".", formRecord.formId);
842 }
843 }
844 }
845
846 /**
847 * @brief Forms formInstanceMaps should remove when visible/invisible status recovered.
848 * @param formInstanceMaps formInstances for visibleNotify.
849 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
850 * @param restoreFormRecords formRecords of forms no need to notify.
851 */
FilterFormInstanceMapsByVisibleType(std::map<std::string,std::vector<FormInstance>> & formInstanceMaps,const int32_t formVisibleType,std::map<int64_t,FormRecord> & restoreFormRecords)852 void FormMgrAdapter::FilterFormInstanceMapsByVisibleType(
853 std::map<std::string, std::vector<FormInstance>> &formInstanceMaps,
854 const int32_t formVisibleType, std::map<int64_t, FormRecord> &restoreFormRecords)
855 {
856 for (auto iter = formInstanceMaps.begin(); iter != formInstanceMaps.end();) {
857 std::vector<FormInstance> formInstances = iter->second;
858 HILOG_DEBUG("bundName: %{public}s, formInstances: %{public}d", iter->first.c_str(), (int)formInstances.size());
859 auto instanceIter = formInstances.begin();
860 while (instanceIter != formInstances.end()) {
861 FormRecord record;
862 if (!FormDataMgr::GetInstance().GetFormRecord(instanceIter->formId, record)) {
863 HILOG_WARN("get formRecord failed! formId: %{public}" PRId64 ".", instanceIter->formId);
864 ++instanceIter;
865 continue;
866 }
867 if (record.formVisibleNotifyState != formVisibleType) {
868 HILOG_INFO("erase formInstance formId: %{public}" PRId64 ", formVisibleNotifyState: %{public}d",
869 instanceIter->formId, record.formVisibleNotifyState);
870 restoreFormRecords[record.formId] = record;
871 instanceIter = formInstances.erase(instanceIter);
872 continue;
873 }
874 if (!record.isNeedNotify) {
875 HILOG_INFO("erase formInstance formId: %{public}" PRId64
876 ", isNeedNotify: %{public}d, formVisibleNotifyState %{public}d",
877 instanceIter->formId, record.isNeedNotify, record.formVisibleNotifyState);
878 instanceIter = formInstances.erase(instanceIter);
879 continue;
880 }
881 ++instanceIter;
882 }
883 if (formInstances.empty()) {
884 HILOG_INFO("formInstanceMaps remove bundName: %{public}s", iter->first.c_str());
885 iter = formInstanceMaps.erase(iter);
886 continue;
887 }
888 ++iter;
889 }
890 }
891
892 /**
893 * @brief Forms eventMaps should remove when visible/invisible status recovered.
894 * @param eventMaps eventMaps for event notify.
895 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
896 * @param restoreFormRecords formRecords of forms no need to notify.
897 */
FilterEventMapsByVisibleType(std::map<std::string,std::vector<int64_t>> & eventMaps,const int32_t formVisibleType,std::map<int64_t,FormRecord> & restoreFormRecords)898 void FormMgrAdapter::FilterEventMapsByVisibleType(std::map<std::string, std::vector<int64_t>> &eventMaps,
899 const int32_t formVisibleType, std::map<int64_t, FormRecord> &restoreFormRecords)
900 {
901 for (auto iter = eventMaps.begin(); iter != eventMaps.end();) {
902 std::vector<int64_t> formIds = iter->second;
903 HILOG_DEBUG("bundName: %{public}s, eventMaps: %{public}d", iter->first.c_str(), (int)formIds.size());
904 auto formItr = formIds.begin();
905 while (formItr != formIds.end()) {
906 FormRecord record;
907 if (!FormDataMgr::GetInstance().GetFormRecord(*formItr, record)) {
908 HILOG_WARN("get formRecord failed! formId: %{public}" PRId64 ".", *formItr);
909 ++formItr;
910 continue;
911 }
912 if (record.formVisibleNotifyState != formVisibleType) {
913 HILOG_INFO("erase notifyEvent formId: %{public}" PRId64 ", formVisibleNotifyState: %{public}d",
914 *formItr, record.formVisibleNotifyState);
915 restoreFormRecords[record.formId] = record;
916 formItr = formIds.erase(formItr);
917 continue;
918 }
919 if (!record.isNeedNotify) {
920 HILOG_INFO("erase notifyEvent formId: %{public}" PRId64
921 ", isNeedNotify: %{public}d, formVisibleNotifyState %{public}d",
922 *formItr, record.isNeedNotify, record.formVisibleNotifyState);
923 formItr = formIds.erase(formItr);
924 continue;
925 }
926 ++formItr;
927 }
928 if (formIds.empty()) {
929 HILOG_INFO("eventMaps remove bundName: %{public}s", iter->first.c_str());
930 iter = eventMaps.erase(iter);
931 continue;
932 }
933 ++iter;
934 }
935 }
936
937 /**
938 * @brief Temp form to normal form.
939 * @param formId The Id of the form.
940 * @param callerToken Caller ability token.
941 * @return Returns ERR_OK on success, others on failure.
942 */
CastTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)943 int FormMgrAdapter::CastTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
944 {
945 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
946 if (formId <= 0 || callerToken == nullptr) {
947 HILOG_ERROR("%{public}s, invalid formId or callerToken", __func__);
948 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
949 }
950
951 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
952 if (!FormDataMgr::GetInstance().ExistFormRecord(matchedFormId) ||
953 !FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
954 HILOG_ERROR("%{public}s, not exist such temp form:%{public}" PRId64 "", __func__, matchedFormId);
955 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
956 }
957
958 FormHostRecord record;
959 bool hasRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, record);
960 if (!hasRecord || !record.Contains(matchedFormId)) {
961 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, matchedFormId);
962 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
963 }
964
965 int callingUid = IPCSkeleton::GetCallingUid();
966 int32_t userId = GetCurrentUserId(callingUid);
967 int checkCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, userId);
968 if (checkCode != 0) {
969 HILOG_ERROR("%{public}s, %{public}" PRId64 " failed,because if too mush forms", __func__, matchedFormId);
970 return checkCode;
971 }
972
973 FormRecord formRecord;
974 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
975 HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 ".", __func__, matchedFormId);
976 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
977 }
978 int bindSupplierCheckCode = HandleCastTempForm(matchedFormId, formRecord);
979 if (bindSupplierCheckCode != 0) {
980 HILOG_ERROR("%{public}s, cast temp form bindSupplier failed", __func__);
981 return bindSupplierCheckCode;
982 }
983
984 if (!FormDataMgr::GetInstance().DeleteTempForm(matchedFormId)) {
985 HILOG_ERROR("%{public}s fail, delete temp form error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
986 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
987 }
988 if (!FormDataMgr::GetInstance().ModifyFormTempFlag(matchedFormId, false)) {
989 HILOG_ERROR("%{public}s fail, modify form temp flag error, formId:%{public}" PRId64 ".",
990 __func__, matchedFormId);
991 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
992 }
993 if (!FormDataMgr::GetInstance().AddFormUserUid(matchedFormId, callingUid)) {
994 HILOG_ERROR("%{public}s fail, add form user uid error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
995 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
996 }
997
998 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
999 HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 ".", __func__, matchedFormId);
1000 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1001 }
1002
1003 ErrCode errorCode = FormDbCache::GetInstance().UpdateDBRecord(matchedFormId, formRecord);
1004 if (errorCode != ERR_OK) {
1005 HILOG_ERROR("%{public}s fail, update db record error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
1006 return errorCode;
1007 }
1008
1009 // start timer
1010 return AddFormTimer(formRecord);
1011 }
1012 /**
1013 * @brief Handle cast temp form.
1014 * @param formId The form id.
1015 * @param record Form information.
1016 * @return Returns ERR_OK on success, others on failure.
1017 */
HandleCastTempForm(const int64_t formId,const FormRecord & record)1018 ErrCode FormMgrAdapter::HandleCastTempForm(const int64_t formId, const FormRecord &record)
1019 {
1020 HILOG_DEBUG("%{public}s, cast temp form to normal form, notify supplier, package:%{public}s, class:%{public}s",
1021 __func__, record.bundleName.c_str(), record.abilityName.c_str());
1022 sptr<IAbilityConnection> castTempConnection = new FormCastTempConnection(formId,
1023 record.bundleName, record.abilityName);
1024
1025 Want want;
1026 want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1027 want.SetElementName(record.bundleName, record.abilityName);
1028 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, castTempConnection);
1029 if (errorCode != ERR_OK) {
1030 HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1031 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1032 }
1033 return ERR_OK;
1034 }
1035 /**
1036 * @brief Dump all of form storage infos.
1037 * @param formInfos All of form storage infos.
1038 * @return Returns ERR_OK on success, others on failure.
1039 */
DumpStorageFormInfos(std::string & formInfos) const1040 int FormMgrAdapter::DumpStorageFormInfos(std::string &formInfos) const
1041 {
1042 std::vector<FormDBInfo> formDBInfos;
1043 FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
1044 if (formDBInfos.empty()) {
1045 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1046 }
1047 std::sort(formDBInfos.begin(), formDBInfos.end(),
1048 [] (const FormDBInfo &formDBInfoA, const FormDBInfo &formDBInfoB) -> bool {
1049 return formDBInfoA.formId < formDBInfoB.formId;
1050 });
1051 FormDumpMgr::GetInstance().DumpStorageFormInfos(formDBInfos, formInfos);
1052 return ERR_OK;
1053 }
1054 /**
1055 * @brief Dump all of temporary form infos.
1056 * @param formInfos All of temporary form infos.
1057 * @return Returns ERR_OK on success, others on failure.
1058 */
DumpTemporaryFormInfos(std::string & formInfos) const1059 int FormMgrAdapter::DumpTemporaryFormInfos(std::string &formInfos) const
1060 {
1061 HILOG_INFO("%{public}s called.", __func__);
1062 std::vector<FormRecord> formRecordInfos;
1063 if (!FormDataMgr::GetInstance().GetTempFormRecord(formRecordInfos)) {
1064 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1065 }
1066 FormDumpMgr::GetInstance().DumpTemporaryFormInfos(formRecordInfos, formInfos);
1067 return ERR_OK;
1068 }
1069
DumpStaticBundleFormInfos(std::string & formInfos) const1070 int FormMgrAdapter::DumpStaticBundleFormInfos(std::string &formInfos) const
1071 {
1072 HILOG_INFO("call");
1073 std::vector<FormInfo> bundleFormInfos;
1074 if (FormInfoMgr::GetInstance().GetAllFormsInfo(bundleFormInfos) != ERR_OK) {
1075 HILOG_ERROR("GetAllFormsInfo failed.");
1076 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
1077 }
1078 FormDumpMgr::GetInstance().DumpStaticBundleFormInfos(bundleFormInfos, formInfos);
1079 return ERR_OK;
1080 }
1081 /**
1082 * @brief Dump form info by a bundle name.
1083 * @param bundleName The bundle name of form provider.
1084 * @param formInfos Form infos.
1085 * @return Returns ERR_OK on success, others on failure.
1086 */
DumpFormInfoByBundleName(const std::string & bundleName,std::string & formInfos) const1087 int FormMgrAdapter::DumpFormInfoByBundleName(const std::string &bundleName, std::string &formInfos) const
1088 {
1089 HILOG_INFO("%{public}s called.", __func__);
1090 std::vector<FormRecord> formRecordInfos;
1091 if (!FormDataMgr::GetInstance().GetFormRecord(bundleName, formRecordInfos)) {
1092 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1093 }
1094
1095 /**
1096 * The updateDuration stored in FormRecord is the config.json configuration.
1097 * The app gallery may modify the updateDuration.
1098 * The real updateDuration value needs to be obtained from FormTimerMgr.
1099 */
1100 for (auto &formRecord : formRecordInfos) {
1101 FormTimer formTimer;
1102 if (formRecord.isEnableUpdate && formRecord.updateDuration > 0 &&
1103 FormTimerMgr::GetInstance().GetIntervalTimer(formRecord.formId, formTimer)) {
1104 formRecord.updateDuration = formTimer.period;
1105 }
1106 }
1107 FormDumpMgr::GetInstance().DumpFormInfos(formRecordInfos, formInfos);
1108 return ERR_OK;
1109 }
1110 /**
1111 * @brief Dump form info by a bundle name.
1112 * @param formId The id of the form.
1113 * @param formInfo Form info.
1114 * @return Returns ERR_OK on success, others on failure.
1115 */
DumpFormInfoByFormId(const std::int64_t formId,std::string & formInfo) const1116 int FormMgrAdapter::DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo) const
1117 {
1118 HILOG_INFO("%{public}s called.", __func__);
1119 int reply = ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1120 FormRecord formRecord;
1121 if (FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
1122 /**
1123 * The updateDuration stored in FormRecord is the config.json configuration.
1124 * The app gallery may modify the updateDuration.
1125 * The real updateDuration value needs to be obtained from FormTimerMgr.
1126 */
1127 FormTimer formTimer;
1128 if (formRecord.isEnableUpdate && formRecord.updateDuration > 0 &&
1129 FormTimerMgr::GetInstance().GetIntervalTimer(formRecord.formId, formTimer)) {
1130 formRecord.updateDuration = formTimer.period;
1131 }
1132 FormDumpMgr::GetInstance().DumpFormInfo(formRecord, formInfo);
1133 reply = ERR_OK;
1134 }
1135
1136 std::vector<std::string> subscribedKeys;
1137 int32_t count = 0;
1138 if (reply == ERR_OK) {
1139 FormDataProxyMgr::GetInstance().GetFormSubscribeInfo(formId, subscribedKeys, count);
1140 FormDumpMgr::GetInstance().DumpFormSubscribeInfo(subscribedKeys, count, formInfo);
1141 }
1142
1143 std::vector<FormHostRecord> formHostRecords;
1144 FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
1145 for (const auto &iter : formHostRecords) {
1146 FormDumpMgr::GetInstance().DumpFormHostInfo(iter, formInfo);
1147 reply = ERR_OK;
1148 }
1149
1150 return reply;
1151 }
1152 /**
1153 * @brief Dump form timer by form id.
1154 * @param formId The id of the form.
1155 * @param isTimingService "true" or "false".
1156 * @return Returns ERR_OK on success, others on failure.
1157 */
DumpFormTimerByFormId(const std::int64_t formId,std::string & isTimingService) const1158 int FormMgrAdapter::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) const
1159 {
1160 HILOG_INFO("%{public}s called.", __func__);
1161 FormTimer formTimer;
1162 UpdateAtItem updateAtItem;
1163 DynamicRefreshItem dynamicItem;
1164 bool resultInter = FormTimerMgr::GetInstance().GetIntervalTimer(formId, formTimer);
1165 bool resultUpdate = FormTimerMgr::GetInstance().GetUpdateAtTimer(formId, updateAtItem);
1166 bool resultDynamic = FormTimerMgr::GetInstance().GetDynamicItem(formId, dynamicItem);
1167 HILOG_INFO("%{public}s resultInter:%{public}d,resultUpdate:%{public}d,resultDynamic:%{public}d",
1168 __func__, resultInter, resultUpdate, resultDynamic);
1169 if (resultInter || resultUpdate || resultDynamic) {
1170 isTimingService = "true";
1171 } else {
1172 isTimingService = "false";
1173 }
1174 return ERR_OK;
1175 }
1176 /**
1177 * @brief Get form configure info.
1178 * @param want The want of the request.
1179 * @param formItemInfo Form configure info.
1180 * @return Returns ERR_OK on success, others on failure.
1181 */
GetFormConfigInfo(const Want & want,FormItemInfo & formConfigInfo)1182 ErrCode FormMgrAdapter::GetFormConfigInfo(const Want &want, FormItemInfo &formConfigInfo)
1183 {
1184 HILOG_DEBUG("GetFormConfigInfo start.");
1185 BundleInfo bundleInfo;
1186 std::string packageName;
1187 ErrCode errCode = GetBundleInfo(want, bundleInfo, packageName);
1188 if (errCode != ERR_OK) {
1189 HILOG_ERROR("Get bundle info failed");
1190 return errCode;
1191 }
1192
1193 FormInfo formInfo;
1194 errCode = GetFormInfo(want, formInfo);
1195 if (errCode != ERR_OK) {
1196 HILOG_ERROR("Get target form info failed");
1197 return errCode;
1198 }
1199 if (!formInfo.IsValid()) {
1200 HILOG_ERROR("The form info is invalid");
1201 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
1202 }
1203
1204 errCode = GetFormItemInfo(want, bundleInfo, formInfo, formConfigInfo);
1205 if (errCode != ERR_OK) {
1206 HILOG_ERROR("Get form item info failed.");
1207 return errCode;
1208 }
1209 formConfigInfo.SetPackageName(packageName);
1210 formConfigInfo.SetDeviceId(want.GetElement().GetDeviceID());
1211
1212 if (!formConfigInfo.IsValidItem()) {
1213 HILOG_ERROR("fail, input param itemInfo is invalid");
1214 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
1215 }
1216
1217 HILOG_DEBUG("GetFormConfigInfo end.");
1218 return ERR_OK;
1219 }
1220 /**
1221 * @brief Allocate form by formId.
1222 * @param info Form configure info.
1223 * @param callerToken Caller ability token.
1224 * @param wantParams WantParams of the request.
1225 * @param formInfo Form info for form host.
1226 * @return Returns ERR_OK on success, others on failure.
1227 */
AllotFormById(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1228 ErrCode FormMgrAdapter::AllotFormById(const FormItemInfo &info,
1229 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1230 {
1231 HILOG_INFO("allot form by id.");
1232 int64_t formId = FormDataMgr::GetInstance().PaddingUdidHash(info.GetFormId());
1233 FormRecord record;
1234 bool hasRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record);
1235 if (hasRecord && record.formTempFlag && !FormRenderMgr::GetInstance().IsRerenderForRenderServiceDied(formId)) {
1236 HILOG_ERROR("%{public}s, addForm can not acquire temp form when select form id", __func__);
1237 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1238 }
1239
1240 // ark ts form can only exist with one form host
1241 if (info.GetUiSyntax() == FormType::ETS &&
1242 !FormDbCache::GetInstance().IsHostOwner(formId, IPCSkeleton::GetCallingUid())) {
1243 HILOG_ERROR("the specified form id does not exist in caller. formId: %{public}s.",
1244 std::to_string(formId).c_str());
1245 return ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID;
1246 }
1247
1248 int32_t currentUserId = FormUtil::GetCurrentAccountId();
1249 if (hasRecord && (record.providerUserId == currentUserId)) {
1250 if (!info.IsMatch(record)) {
1251 HILOG_ERROR("%{public}s, formId and item info not match:%{public}" PRId64 "", __func__, formId);
1252 return ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID;
1253 }
1254 return AddExistFormRecord(info, callerToken, record, formId, wantParams, formInfo);
1255 }
1256
1257 // find in db but not in cache
1258 FormRecord dbRecord;
1259 ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
1260 if (getDbRet == ERR_OK && (dbRecord.providerUserId == currentUserId)) {
1261 return AddNewFormRecord(info, formId, callerToken, wantParams, formInfo);
1262 }
1263
1264 HILOG_INFO("%{public}s, addForm no such form %{public}" PRId64 "", __func__, formId);
1265
1266 // delete form data in provider
1267 FormRecord delRecord;
1268 delRecord.bundleName = info.GetProviderBundleName();
1269 delRecord.abilityName = info.GetAbilityName();
1270 FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, delRecord);
1271
1272 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1273 }
1274
AddExistFormRecord(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const FormRecord & record,const int64_t formId,const WantParams & wantParams,FormJsInfo & formInfo)1275 ErrCode FormMgrAdapter::AddExistFormRecord(const FormItemInfo &info, const sptr<IRemoteObject> &callerToken,
1276 const FormRecord &record, const int64_t formId, const WantParams &wantParams, FormJsInfo &formInfo)
1277 {
1278 HILOG_INFO("add exist formRecord, formId:%{public}" PRId64 "", formId);
1279 // allot form host record
1280 int callingUid = IPCSkeleton::GetCallingUid();
1281 bool isCreated = FormDataMgr::GetInstance().AllotFormHostRecord(info, callerToken, formId, callingUid);
1282 if (!isCreated) {
1283 HILOG_ERROR("%{public}s fail, AllotFormHostRecord failed when no matched formRecord", __func__);
1284 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1285 }
1286
1287 FormRecord newRecord(record);
1288 std::string cacheData;
1289 std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
1290 bool hasCacheData = FormCacheMgr::GetInstance().GetData(formId, cacheData, imageDataMap);
1291 if (hasCacheData) {
1292 newRecord.formProviderInfo.SetFormDataString(cacheData);
1293 newRecord.formProviderInfo.SetImageDataMap(imageDataMap);
1294 }
1295 FormRenderMgr::GetInstance().RenderForm(newRecord, wantParams, callerToken);
1296 if (newRecord.needRefresh || FormCacheMgr::GetInstance().NeedAcquireProviderData(newRecord.formId)) {
1297 newRecord.isInited = false;
1298 FormDataMgr::GetInstance().SetFormCacheInited(formId, false);
1299
1300 // acquire formInfo from provider
1301 ErrCode errorCode = AcquireProviderFormInfoAsync(formId, info, wantParams);
1302 if (errorCode != ERR_OK) {
1303 HILOG_ERROR("%{public}s fail, AcquireProviderFormInfoAsync failed", __func__);
1304 return errorCode;
1305 }
1306 }
1307
1308 // Add new form user uid.
1309 FormDataMgr::GetInstance().AddFormUserUid(formId, callingUid);
1310 if (std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(), callingUid) ==
1311 newRecord.formUserUids.end()) {
1312 newRecord.formUserUids.emplace_back(callingUid);
1313 }
1314
1315 if (hasCacheData) {
1316 HILOG_INFO("use cache data, formId:%{public}" PRId64 "", formId);
1317 formInfo.formData = cacheData;
1318 formInfo.formProviderData.SetDataString(cacheData);
1319 formInfo.formProviderData.SetImageDataMap(imageDataMap);
1320 }
1321
1322 FormDataMgr::GetInstance().CreateFormJsInfo(formId, record, formInfo);
1323
1324 // start update timer
1325 ErrCode errorCode = AddFormTimer(newRecord);
1326 if (errorCode != ERR_OK) {
1327 return errorCode;
1328 }
1329 if (!newRecord.formTempFlag) {
1330 return FormDbCache::GetInstance().UpdateDBRecord(formId, newRecord);
1331 }
1332 return ERR_OK;
1333 }
1334
AllotFormBySpecificId(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1335 ErrCode FormMgrAdapter::AllotFormBySpecificId(const FormItemInfo &info,
1336 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1337 {
1338 HILOG_DEBUG("start");
1339 int64_t formId = info.GetFormId();
1340 FormRecord record;
1341 bool hasRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record);
1342 // find in db but not in cache
1343 FormRecord dbRecord;
1344 ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
1345 if (getDbRet == ERR_OK || hasRecord) {
1346 HILOG_DEBUG("The specified ID already exists in the cache or db");
1347 return AllotFormByInfo(info, callerToken, wantParams, formInfo);
1348 }
1349 HILOG_DEBUG("Creates the form with the specified ID");
1350 return AddNewFormRecord(info, formId, callerToken, wantParams, formInfo);
1351 }
1352
1353 /**
1354 * @brief Allocate form by form configure info.
1355 * @param info Form configure info.
1356 * @param callerToken Caller ability token.
1357 * @param wantParams WantParams of the request.
1358 * @param formInfo Form info for form host.
1359 * @return Returns ERR_OK on success, others on failure.
1360 */
AllotFormByInfo(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1361 ErrCode FormMgrAdapter::AllotFormByInfo(const FormItemInfo &info,
1362 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1363 {
1364 // generate formId
1365 int64_t newFormId = FormDataMgr::GetInstance().GenerateFormId();
1366 if (newFormId < 0) {
1367 HILOG_ERROR("fail, generateFormId no invalid formId");
1368 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1369 }
1370 HILOG_DEBUG("newFormId:%{public}" PRId64 "", newFormId);
1371 return AddNewFormRecord(info, newFormId, callerToken, wantParams, formInfo);
1372 }
1373
1374 /**
1375 * @brief Add new form record.
1376 * @param info Form configure info.
1377 * @param formId The form id.
1378 * @param callerToken Caller ability token.
1379 * @param wantParams WantParams of the request.
1380 * @param formInfo Form info for form host.
1381 * @return Returns ERR_OK on success, others on failure.
1382 */
AddNewFormRecord(const FormItemInfo & info,const int64_t formId,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1383 ErrCode FormMgrAdapter::AddNewFormRecord(const FormItemInfo &info, const int64_t formId,
1384 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1385 {
1386 HILOG_INFO("add new formRecord");
1387 FormItemInfo newInfo(info);
1388 newInfo.SetFormId(formId);
1389 // allot form host record
1390 int callingUid = IPCSkeleton::GetCallingUid();
1391 if (!FormDataMgr::GetInstance().AllotFormHostRecord(newInfo, callerToken, formId, callingUid)) {
1392 HILOG_ERROR("fail, AllotFormHostRecord failed when no matched formRecord");
1393 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1394 }
1395
1396 // get current userId
1397 int32_t currentUserId = GetCurrentUserId(callingUid);
1398 // allot form record
1399 FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(newInfo, callingUid, currentUserId);
1400
1401 FormRenderMgr::GetInstance().RenderForm(formRecord, wantParams, callerToken);
1402
1403 // acquire formInfo from provider
1404 ErrCode errorCode = AcquireProviderFormInfoAsync(formId, newInfo, wantParams);
1405 if (errorCode != ERR_OK) {
1406 HILOG_ERROR("fail, AcquireProviderFormInfoAsync failed");
1407 return errorCode;
1408 }
1409
1410 // create form info for js
1411 FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formInfo);
1412
1413 // storage info
1414 if (!newInfo.IsTemporaryForm()) {
1415 errorCode = FormDbCache::GetInstance().UpdateDBRecord(formId, formRecord);
1416 if (errorCode != ERR_OK) {
1417 HILOG_ERROR("fail, UpdateDBRecord failed");
1418 return errorCode;
1419 }
1420 }
1421
1422 // start update timer
1423 if (info.GetProviderBundleName() != info.GetHostBundleName()) {
1424 return AddFormTimer(formRecord);
1425 }
1426 return ERR_OK;
1427 }
1428
1429 /**
1430 * @brief Add form timer.
1431 * @param formRecord Form information.
1432 * @return Returns ERR_OK on success, others on failure.
1433 */
AddFormTimer(const FormRecord & formRecord)1434 ErrCode FormMgrAdapter::AddFormTimer(const FormRecord &formRecord)
1435 {
1436 HILOG_INFO("add form timer start");
1437 if (!formRecord.isEnableUpdate || formRecord.formTempFlag) {
1438 HILOG_INFO("%{public}s isEnableUpdate:%{public}d formTempFlag:%{public}d.",
1439 __func__, formRecord.isEnableUpdate, formRecord.formTempFlag);
1440 return ERR_OK;
1441 }
1442 if (formRecord.updateDuration > 0 && !formRecord.isDataProxy) {
1443 if (!FormDataMgr::GetInstance().HasFormCloudUpdateDuration(formRecord.bundleName)) {
1444 UpdateFormCloudUpdateDuration(formRecord.bundleName);
1445 }
1446 int64_t updateDuration = formRecord.updateDuration;
1447 HILOG_INFO("Get form update duration start.");
1448 if (!GetValidFormUpdateDuration(formRecord.formId, updateDuration)) {
1449 HILOG_WARN("Get updateDuration failed, uses local configuration.");
1450 }
1451 HILOG_INFO("Get form update duration end.");
1452 bool ret = FormTimerMgr::GetInstance().AddFormTimer(formRecord.formId,
1453 updateDuration, formRecord.providerUserId);
1454 return ret ? ERR_OK : ERR_APPEXECFWK_FORM_COMMON_CODE;
1455 }
1456 if (formRecord.updateAtHour >= 0 && formRecord.updateAtMin >= 0) {
1457 bool ret = FormTimerMgr::GetInstance().AddFormTimer(formRecord.formId,
1458 formRecord.updateAtHour, formRecord.updateAtMin, formRecord.providerUserId);
1459 return ret ? ERR_OK : ERR_APPEXECFWK_FORM_COMMON_CODE;
1460 }
1461 HILOG_INFO("%{public}s no need add form timer.", __func__);
1462 return ERR_OK;
1463 }
1464
1465 /**
1466 * @brief Send event notify to form provider. The event notify type include FORM_VISIBLE and FORM_INVISIBLE.
1467 *
1468 * @param providerKey The provider key string which consists of the provider bundle name and ability name.
1469 * @param formIdsByProvider The vector of form Ids which have the same provider.
1470 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
1471 * @return Returns ERR_OK on success, others on failure.
1472 */
HandleEventNotify(const std::string & providerKey,const std::vector<int64_t> & formIdsByProvider,const int32_t formVisibleType)1473 ErrCode FormMgrAdapter::HandleEventNotify(const std::string &providerKey, const std::vector<int64_t> &formIdsByProvider,
1474 const int32_t formVisibleType)
1475 {
1476 HILOG_INFO("%{public}s called.", __func__);
1477 size_t position = providerKey.find(Constants::NAME_DELIMITER);
1478 std::string bundleName = providerKey.substr(0, position);
1479 std::string abilityName = providerKey.substr(position + strlen(Constants::NAME_DELIMITER));
1480 sptr<IAbilityConnection> formEventNotifyConnection = new (std::nothrow) FormEventNotifyConnection(formIdsByProvider,
1481 formVisibleType, bundleName, abilityName);
1482 if (formEventNotifyConnection == nullptr) {
1483 HILOG_ERROR("failed to create FormEventNotifyConnection.");
1484 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1485 }
1486 Want connectWant;
1487 connectWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1488 connectWant.SetElementName(bundleName, abilityName);
1489 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(connectWant, formEventNotifyConnection);
1490 if (errorCode != ERR_OK) {
1491 HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1492 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1493 }
1494
1495 return ERR_OK;
1496 }
1497
1498 /**
1499 * @brief Acquire form data from form provider.
1500 * @param formId The Id of the form.
1501 * @param info Form configure info.
1502 * @param wantParams WantParams of the request.
1503 * @return Returns ERR_OK on success, others on failure.
1504 */
AcquireProviderFormInfoAsync(const int64_t formId,const FormItemInfo & info,const WantParams & wantParams)1505 ErrCode FormMgrAdapter::AcquireProviderFormInfoAsync(const int64_t formId,
1506 const FormItemInfo &info, const WantParams &wantParams)
1507 {
1508 if (FormRenderMgr::GetInstance().GetIsVerified()) {
1509 HILOG_INFO("The authentication status of the current user is true.");
1510 return InnerAcquireProviderFormInfoAsync(formId, info, wantParams);
1511 }
1512
1513 HILOG_INFO("The current user is not unlocked.");
1514 auto task = [formId, newInfo = info, newWant = wantParams]() {
1515 FormMgrAdapter::GetInstance().InnerAcquireProviderFormInfoAsync(formId, newInfo, newWant);
1516 };
1517 FormRenderMgr::GetInstance().AddAcquireProviderFormInfoTask(task);
1518 return ERR_OK;
1519 }
1520
InnerAcquireProviderFormInfoAsync(const int64_t formId,const FormItemInfo & info,const WantParams & wantParams)1521 ErrCode FormMgrAdapter::InnerAcquireProviderFormInfoAsync(const int64_t formId,
1522 const FormItemInfo &info, const WantParams &wantParams)
1523 {
1524 if (formId <= 0) {
1525 HILOG_ERROR("%{public}s fail, formId should be greater than 0", __func__);
1526 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1527 }
1528
1529 Want newWant;
1530 newWant.SetParams(wantParams);
1531 auto hostToken = newWant.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
1532 sptr<IAbilityConnection> formAcquireConnection = new (std::nothrow) FormAcquireConnection(formId, info, wantParams,
1533 hostToken);
1534 if (formAcquireConnection == nullptr) {
1535 HILOG_ERROR("formAcquireConnection is null.");
1536 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1537 }
1538 Want want;
1539 want.SetElementName(info.GetProviderBundleName(), info.GetAbilityName());
1540 want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1541 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formAcquireConnection);
1542 if (errorCode != ERR_OK) {
1543 HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1544 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1545 }
1546 return ERR_OK;
1547 }
1548
1549 /**
1550 * @brief Get bundle info.
1551 * @param want The want of the request.
1552 * @param bundleInfo Bundle info.
1553 * @param packageName Package name.
1554 * @return Returns ERR_OK on success, others on failure.
1555 */
GetBundleInfo(const AAFwk::Want & want,BundleInfo & bundleInfo,std::string & packageName)1556 ErrCode FormMgrAdapter::GetBundleInfo(const AAFwk::Want &want, BundleInfo &bundleInfo, std::string &packageName)
1557 {
1558 HILOG_DEBUG("GetBundleInfo start.");
1559 std::string bundleName = want.GetElement().GetBundleName();
1560 std::string abilityName = want.GetElement().GetAbilityName();
1561 std::string deviceId = want.GetElement().GetDeviceID();
1562 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1563 if (bundleName.empty() || abilityName.empty() || moduleName.empty()) {
1564 HILOG_ERROR("GetBundleInfo bundleName or abilityName or moduleName is invalid");
1565 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1566 }
1567
1568 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1569 if (iBundleMgr == nullptr) {
1570 HILOG_ERROR("GetBundleMgr, failed to get IBundleMgr.");
1571 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1572 }
1573
1574 if (!IN_PROCESS_CALL(iBundleMgr->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES,
1575 bundleInfo, FormUtil::GetCurrentAccountId()))) {
1576 HILOG_ERROR("GetBundleInfo, failed to get bundle info.");
1577 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1578 }
1579
1580 bool moduleExist = false;
1581 for (const auto &moduleInfo : bundleInfo.moduleNames) {
1582 HILOG_DEBUG("bundleInfo.moduleNames, module name:%{public}s", moduleInfo.c_str());
1583 if (moduleInfo.compare(moduleName) == 0) {
1584 moduleExist = true;
1585 break;
1586 }
1587 }
1588 if (!moduleExist) {
1589 HILOG_ERROR("GetBundleInfo no such module, name:%{public}s", moduleName.c_str());
1590 return ERR_APPEXECFWK_FORM_NO_SUCH_MODULE;
1591 }
1592
1593 packageName = bundleName + moduleName;
1594 HILOG_DEBUG("GetBundleInfo end.");
1595 return ERR_OK;
1596 }
1597 /**
1598 * @brief Get form info.
1599 * @param want The want of the request.
1600 * @param formInfo Form info.
1601 * @return Returns ERR_OK on success, others on failure.
1602 */
GetFormInfo(const AAFwk::Want & want,FormInfo & formInfo)1603 ErrCode FormMgrAdapter::GetFormInfo(const AAFwk::Want &want, FormInfo &formInfo)
1604 {
1605 HILOG_DEBUG("GetFormInfo start.");
1606 std::string bundleName = want.GetElement().GetBundleName();
1607 std::string abilityName = want.GetElement().GetAbilityName();
1608 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1609 if (bundleName.empty() || abilityName.empty() || moduleName.empty()) {
1610 HILOG_ERROR("bundleName or abilityName or moduleName is invalid");
1611 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1612 }
1613
1614 std::vector<FormInfo> formInfos {};
1615 ErrCode errCode = FormInfoMgr::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
1616 if (errCode != ERR_OK) {
1617 HILOG_ERROR("GetFormsInfoByModule, failed to get form config info.");
1618 return errCode;
1619 }
1620
1621 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1622 bool abilityExisting = false;
1623 for (const auto &form : formInfos) {
1624 if (form.abilityName != abilityName) {
1625 continue;
1626 }
1627
1628 abilityExisting = true;
1629 if ((formName.empty() && form.defaultFlag) || form.name == formName) {
1630 formInfo = form;
1631 formInfo.moduleName = moduleName;
1632 HILOG_DEBUG("GetFormInfo end.");
1633 return ERR_OK;
1634 }
1635 }
1636
1637 HILOG_ERROR("failed to get form info failed. ability name is %{public}s, form name is %{public}s",
1638 abilityName.c_str(), formName.c_str());
1639 return abilityExisting ? ERR_APPEXECFWK_FORM_GET_INFO_FAILED : ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
1640 }
1641 /**
1642 * @brief Get form configure info.
1643 * @param want The want of the request.
1644 * @param bundleInfo Bundle info.
1645 * @param formInfo Form info.
1646 * @param formItemInfo Form configure info.
1647 * @return Returns ERR_OK on success, others on failure.
1648 */
GetFormItemInfo(const AAFwk::Want & want,const BundleInfo & bundleInfo,const FormInfo & formInfo,FormItemInfo & formItemInfo)1649 ErrCode FormMgrAdapter::GetFormItemInfo(const AAFwk::Want &want, const BundleInfo &bundleInfo,
1650 const FormInfo &formInfo, FormItemInfo &formItemInfo)
1651 {
1652 HILOG_DEBUG("GetFormItemInfo start.");
1653 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, formInfo.defaultDimension);
1654 if (!IsDimensionValid(formInfo, dimensionId)) {
1655 HILOG_ERROR("GetFormItemInfo failed, dimension is not valid.");
1656 return ERR_APPEXECFWK_FORM_NO_SUCH_DIMENSION;
1657 }
1658
1659 ErrCode ret = CreateFormItemInfo(bundleInfo, formInfo, formItemInfo, want);
1660 if (ret != ERR_OK) {
1661 HILOG_ERROR("GetFormItemInfo failed, CreateFormItemInfo failed.");
1662 return ret;
1663 }
1664 formItemInfo.SetSpecificationId(dimensionId);
1665 formItemInfo.SetTemporaryFlag(want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false));
1666 HILOG_DEBUG("GetFormItemInfo end.");
1667 return ERR_OK;
1668 }
1669 /**
1670 * @brief Dimension valid check.
1671 * @param formInfo Form info.
1672 * @param dimensionId Dimension id.
1673 * @return Returns true on success, false on failure.
1674 */
IsDimensionValid(const FormInfo & formInfo,int dimensionId) const1675 bool FormMgrAdapter::IsDimensionValid(const FormInfo &formInfo, int dimensionId) const
1676 {
1677 if (formInfo.supportDimensions.empty()) {
1678 HILOG_ERROR("Js form, no support dimension.");
1679 return false;
1680 }
1681
1682 for (size_t i = 0; i < formInfo.supportDimensions.size() && i < Constants::MAX_LAYOUT; i++) {
1683 if (formInfo.supportDimensions[i] == dimensionId) {
1684 return true;
1685 }
1686 }
1687
1688 HILOG_ERROR("No matched dimension found for %{public}d.", dimensionId);
1689 return false;
1690 }
1691 /**
1692 * @brief Create form configure info.
1693 * @param bundleInfo Bundle info.
1694 * @param formInfo Form info.
1695 * @param itemInfo Form configure info.
1696 * @return Returns ERR_OK on success, others on failure.
1697 */
CreateFormItemInfo(const BundleInfo & bundleInfo,const FormInfo & formInfo,FormItemInfo & itemInfo,const AAFwk::Want & want)1698 ErrCode FormMgrAdapter::CreateFormItemInfo(const BundleInfo &bundleInfo,
1699 const FormInfo &formInfo, FormItemInfo &itemInfo, const AAFwk::Want &want)
1700 {
1701 itemInfo.SetProviderBundleName(bundleInfo.name);
1702 itemInfo.SetVersionCode(bundleInfo.versionCode);
1703 itemInfo.SetVersionName(bundleInfo.versionName);
1704 itemInfo.SetCompatibleVersion(bundleInfo.compatibleVersion);
1705 itemInfo.SetSystemAppFlag(bundleInfo.applicationInfo.isSystemApp);
1706 itemInfo.SetProviderUid(bundleInfo.applicationInfo.uid);
1707 itemInfo.SetDescription(formInfo.description);
1708
1709 std::string hostBundleName;
1710 bool isSaUid = IPCSkeleton::GetCallingUid() == SYSTEM_UID;
1711 ErrCode ret = ERR_APPEXECFWK_FORM_COMMON_CODE;
1712 if (isSaUid) {
1713 hostBundleName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_HOST_BUNDLENAME_KEY);
1714 HILOG_INFO("sa uid call CreateFormItemInfo, hostBundleName is %{public}s", hostBundleName.c_str());
1715 ret = ERR_OK;
1716 } else {
1717 ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
1718 }
1719 if (ret != ERR_OK) {
1720 HILOG_ERROR("GetFormsInfoByModule, failed to get form config info.");
1721 return ret;
1722 }
1723 itemInfo.SetHostBundleName(hostBundleName);
1724 itemInfo.SetAbilityName(formInfo.abilityName);
1725 itemInfo.SetModuleName(formInfo.moduleName); // formInfo.moduleName: bundleMgr do not set
1726 itemInfo.SetFormName(formInfo.name);
1727 itemInfo.SetEnableUpdateFlag(formInfo.updateEnabled);
1728 itemInfo.SetUpdateDuration(formInfo.updateDuration);
1729 itemInfo.SetScheduledUpdateTime(formInfo.scheduledUpdateTime);
1730 itemInfo.SetJsComponentName(formInfo.jsComponentName);
1731 itemInfo.SetFormVisibleNotify(formInfo.formVisibleNotify);
1732 auto formSrc = formInfo.src;
1733 if (formSrc.rfind(POINT_ETS) == formSrc.size() - POINT_ETS.size()) {
1734 formSrc.erase(formSrc.end() - POINT_ETS.size(), formSrc.end());
1735 }
1736 itemInfo.SetFormSrc(formSrc);
1737 itemInfo.SetFormWindow(formInfo.window);
1738 itemInfo.SetType(formInfo.type);
1739 itemInfo.SetUiSyntax(formInfo.uiSyntax);
1740 itemInfo.SetIsDynamic(formInfo.isDynamic);
1741 itemInfo.SetTransparencyEnabled(formInfo.transparencyEnabled);
1742 itemInfo.SetPrivacyLevel(formInfo.privacyLevel);
1743
1744 for (const auto &abilityInfo : bundleInfo.abilityInfos) {
1745 if (abilityInfo.name == formInfo.abilityName) {
1746 itemInfo.SetAbilityModuleName(abilityInfo.moduleName);
1747 if (!abilityInfo.isModuleJson) {
1748 itemInfo.SetFormSrc("");
1749 }
1750 }
1751 auto hapPath = abilityInfo.hapPath;
1752 if (hapPath.find(Constants::ABS_CODE_PATH) != std::string::npos) {
1753 hapPath = std::regex_replace(hapPath, std::regex(Constants::ABS_CODE_PATH), Constants::LOCAL_BUNDLES);
1754 }
1755 itemInfo.AddModuleInfo(abilityInfo.moduleName, hapPath);
1756 HILOG_DEBUG("%{public}s hap path is %{public}s", abilityInfo.moduleName.c_str(), hapPath.c_str());
1757 }
1758
1759 HILOG_INFO("%{public}s moduleInfos size: %{public}zu", __func__, bundleInfo.applicationInfo.moduleInfos.size());
1760 for (const auto &item : bundleInfo.applicationInfo.moduleInfos) {
1761 HILOG_INFO("%{public}s moduleInfos, moduleName: %{public}s, moduleSourceDir: %{public}s", __func__,
1762 item.moduleName.c_str(), item.moduleSourceDir.c_str());
1763 if (formInfo.moduleName == item.moduleName) {
1764 itemInfo.AddHapSourceDirs(item.moduleSourceDir);
1765 }
1766 }
1767 itemInfo.SetDataProxyFlag(formInfo.dataProxyEnabled);
1768 return ERR_OK;
1769 }
1770
1771 /**
1772 * @brief set next refresh time.
1773 * @param formId The id of the form.
1774 * @param nextTime next refresh time.
1775 * @return Returns ERR_OK on success, others on failure.
1776 */
SetNextRefreshTime(const int64_t formId,const int64_t nextTime)1777 int FormMgrAdapter::SetNextRefreshTime(const int64_t formId, const int64_t nextTime)
1778 {
1779 HILOG_INFO("%{public}s begin here, formId:%{public}" PRId64 ",nextTime:%{public}" PRId64 "",
1780 __func__, formId, nextTime);
1781 if (formId <= 0) {
1782 HILOG_ERROR("%{public}s formId is invalid", __func__);
1783 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1784 }
1785
1786 std::string bundleName;
1787 auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(bundleName);
1788 if (ret != ERR_OK) {
1789 HILOG_ERROR("%{public}s failed to get BundleName", __func__);
1790 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1791 }
1792 int32_t callingUid = IPCSkeleton::GetCallingUid();
1793 int32_t userId = GetCurrentUserId(callingUid);
1794 HILOG_INFO("%{public}s, userId:%{public}d, callingUid:%{public}d.", __func__, userId, callingUid);
1795
1796 FormRecord formRecord;
1797 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
1798 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
1799 HILOG_ERROR("%{public}s, not found in form record.", __func__);
1800 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1801 }
1802
1803 if (userId != formRecord.providerUserId) {
1804 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
1805 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1806 }
1807
1808 // check bundleName
1809 if (bundleName != formRecord.bundleName) {
1810 HILOG_ERROR("%{public}s, not match bundleName:%{public}s", __func__, bundleName.c_str());
1811 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1812 }
1813
1814 if (formRecord.isDataProxy) {
1815 HILOG_ERROR("data proxy form not support set next refresh time.");
1816 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1817 }
1818
1819 return SetNextRefreshTimeLocked(matchedFormId, nextTime, userId);
1820 }
1821
ReleaseRenderer(int64_t formId,const std::string & compId)1822 int FormMgrAdapter::ReleaseRenderer(int64_t formId, const std::string &compId)
1823 {
1824 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1825 if (formId <= 0 || compId.empty()) {
1826 HILOG_ERROR("Release invalid param");
1827 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1828 }
1829
1830 FormRecord record;
1831 if (!FormDataMgr::GetInstance().GetFormRecord(formId, record)) {
1832 HILOG_ERROR("no matched form record");
1833 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1834 }
1835 FormRenderMgr::GetInstance().ReleaseRenderer(formId, record, compId);
1836 return ERR_OK;
1837 }
1838
CheckPublishForm(Want & want)1839 ErrCode FormMgrAdapter::CheckPublishForm(Want &want)
1840 {
1841 std::string bundleName;
1842 if (!GetBundleName(bundleName)) {
1843 HILOG_ERROR("failed to get BundleName");
1844 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1845 }
1846 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1847 if (iBundleMgr == nullptr) {
1848 HILOG_ERROR("fail, failed to get IBundleMgr.");
1849 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1850 }
1851
1852 if (!IsValidPublishEvent(iBundleMgr, bundleName, want)) {
1853 HILOG_ERROR("Check valid publish event failed.");
1854 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1855 }
1856
1857 if (want.GetElement().GetBundleName().empty()) {
1858 HILOG_WARN("The bundleName is empty, set to current calling bundle.");
1859 want.SetBundle(bundleName);
1860 }
1861
1862 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1863 if (moduleName.empty()) {
1864 HILOG_ERROR("error, moduleName is empty.");
1865 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1866 }
1867
1868 bool isTemporary = want.GetBoolParam(AppExecFwk::Constants::PARAM_FORM_TEMPORARY_KEY, false);
1869 if (isTemporary) {
1870 HILOG_WARN("The published form should not be temp.");
1871 want.SetParam(AppExecFwk::Constants::PARAM_FORM_TEMPORARY_KEY, false);
1872 }
1873
1874 std::string abilityName = want.GetElement().GetAbilityName();
1875 std::string formName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_NAME_KEY);
1876 std::vector<FormInfo> formInfos {};
1877 ErrCode errCode = FormInfoMgr::GetInstance()
1878 .GetFormsInfoByModuleWithoutCheck(want.GetElement().GetBundleName(), moduleName, formInfos);
1879 if (errCode != ERR_OK) {
1880 HILOG_ERROR("error, failed to get forms info.");
1881 return errCode;
1882 }
1883 for (auto &formInfo: formInfos) {
1884 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1885 if ((formInfo.abilityName == abilityName) && (formInfo.name == formName) &&
1886 (IsDimensionValid(formInfo, dimensionId))) {
1887 want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, dimensionId);
1888 return ERR_OK;
1889 }
1890 }
1891 HILOG_ERROR("failed to find match form info.");
1892 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1893 }
1894
QueryPublishFormToHost(Want & wantToHost)1895 ErrCode FormMgrAdapter::QueryPublishFormToHost(Want &wantToHost)
1896 {
1897 AppExecFwk::AbilityInfo formAbilityInfo;
1898 AppExecFwk::ExtensionAbilityInfo formExtensionAbilityInfo;
1899
1900 int callingUid = IPCSkeleton::GetCallingUid();
1901 int32_t userId = GetCurrentUserId(callingUid);
1902
1903 // Query the highest priority ability or extension ability for publishing form
1904 AppExecFwk::AbilityInfo abilityInfo;
1905 AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
1906 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(
1907 Constants::FORM_PUBLISH_ACTION, userId, abilityInfo, extensionAbilityInfo)) {
1908 HILOG_ERROR("Failed to ImplicitQueryInfoByPriority for publishing form");
1909 return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1910 }
1911
1912 if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
1913 HILOG_ERROR("Query highest priority ability failed, no form host ability found.");
1914 return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1915 }
1916
1917 if (!abilityInfo.name.empty()) {
1918 // highest priority ability
1919 HILOG_DEBUG("Query highest priority ability success. bundleName: %{public}s, ability:%{public}s",
1920 abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
1921 wantToHost.SetElementName(abilityInfo.bundleName, abilityInfo.name);
1922 } else {
1923 // highest priority extension ability
1924 HILOG_DEBUG("Query highest priority extension ability success. bundleName: %{public}s, ability:%{public}s",
1925 extensionAbilityInfo.bundleName.c_str(), extensionAbilityInfo.name.c_str());
1926 wantToHost.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
1927 }
1928 return ERR_OK;
1929 }
1930
RequestPublishFormToHost(Want & want)1931 ErrCode FormMgrAdapter::RequestPublishFormToHost(Want &want)
1932 {
1933 Want wantToHost;
1934 ElementName elementName = want.GetElement();
1935 wantToHost.SetParam(Constants::PARAM_BUNDLE_NAME_KEY, elementName.GetBundleName());
1936 wantToHost.SetParam(Constants::PARAM_ABILITY_NAME_KEY, elementName.GetAbilityName());
1937 std::string strFormId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY);
1938 wantToHost.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, strFormId);
1939 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1940 wantToHost.SetParam(Constants::PARAM_FORM_NAME_KEY, formName);
1941 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1942 wantToHost.SetParam(Constants::PARAM_MODULE_NAME_KEY, moduleName);
1943 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1944 wantToHost.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, dimensionId);
1945 bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
1946 wantToHost.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, tempFormFlag);
1947 std::string callerBundleName = want.GetStringParam(Constants::PARAM_CALLER_BUNDLE_NAME_KEY);
1948 wantToHost.SetParam(Constants::PARAM_CALLER_BUNDLE_NAME_KEY, callerBundleName);
1949 int32_t userId = want.GetIntParam(Constants::PARAM_FORM_USER_ID, -1);
1950 std::string bundleName = want.GetStringParam(Constants::PARAM_PUBLISH_FORM_HOST_BUNDLE_KEY);
1951 std::string abilityName = want.GetStringParam(Constants::PARAM_PUBLISH_FORM_HOST_ABILITY_KEY);
1952 wantToHost.SetElementName(bundleName, abilityName);
1953 wantToHost.SetAction(Constants::FORM_PUBLISH_ACTION);
1954
1955 ErrCode errCode = QueryPublishFormToHost(wantToHost);
1956 if (errCode == ERR_OK) {
1957 return FormAmsHelper::GetInstance().StartAbility(wantToHost, userId);
1958 }
1959
1960 // Handle by interceptor callback when the system handler is not found.
1961 if (formPublishInterceptor_ == nullptr) {
1962 HILOG_DEBUG("query publish form failed, and have not publish interceptor. errCode:%{public}d.", errCode);
1963 return errCode;
1964 }
1965 int ret = formPublishInterceptor_->ProcessPublishForm(wantToHost);
1966 if (ret == ERR_OK) {
1967 HILOG_DEBUG("success to ProcessPublishForm.");
1968 } else {
1969 HILOG_ERROR("failed to ProcessPublishForm.");
1970 }
1971 return ret;
1972 }
1973
RequestPublishForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId,const std::vector<FormDataProxy> & formDataProxies)1974 ErrCode FormMgrAdapter::RequestPublishForm(Want &want, bool withFormBindingData,
1975 std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId,
1976 const std::vector<FormDataProxy> &formDataProxies)
1977 {
1978 HILOG_DEBUG("called.");
1979 ErrCode errCode = CheckPublishForm(want);
1980 if (errCode != ERR_OK) {
1981 return errCode;
1982 }
1983
1984 int callingUid = IPCSkeleton::GetCallingUid();
1985 int32_t userId = GetCurrentUserId(callingUid);
1986 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
1987 want.SetAction(Constants::FORM_PUBLISH_ACTION);
1988
1989 // generate formId
1990 formId = FormDataMgr::GetInstance().GenerateFormId();
1991 if (formId < 0) {
1992 HILOG_ERROR("fail, generateFormId no invalid formId");
1993 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1994 }
1995 HILOG_DEBUG("formId:%{public}" PRId64 "", formId);
1996 std::string strFormId = std::to_string(formId);
1997 want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, strFormId);
1998
1999 if (withFormBindingData) {
2000 errCode = FormDataMgr::GetInstance().AddRequestPublishFormInfo(formId, want, formBindingData);
2001 } else {
2002 std::unique_ptr<FormProviderData> noFormBindingData = nullptr;
2003 errCode = FormDataMgr::GetInstance().AddRequestPublishFormInfo(formId, want, noFormBindingData);
2004 }
2005 if (errCode != ERR_OK) {
2006 HILOG_ERROR("fail, add form info error");
2007 return errCode;
2008 }
2009
2010 errCode = RequestPublishFormToHost(want);
2011 if (errCode != ERR_OK) {
2012 FormDataMgr::GetInstance().RemoveRequestPublishFormInfo(formId);
2013 }
2014 if (!formDataProxies.empty()) {
2015 FormDataProxyMgr::GetInstance().ProduceFormDataProxies(formId, formDataProxies);
2016 }
2017 return errCode;
2018 }
2019
CheckAddRequestPublishForm(const Want & want,const Want & formProviderWant)2020 ErrCode FormMgrAdapter::CheckAddRequestPublishForm(const Want &want, const Want &formProviderWant)
2021 {
2022 std::string bundleName = want.GetElement().GetBundleName();
2023 std::string bundleNameProvider = formProviderWant.GetElement().GetBundleName();
2024 if (bundleNameProvider != bundleName) {
2025 HILOG_ERROR("The bundleName is not match.");
2026 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2027 }
2028
2029 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
2030 std::string moduleNameProvider = formProviderWant.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
2031 if (moduleNameProvider != moduleName) {
2032 HILOG_ERROR("The moduleName is not match.");
2033 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2034 }
2035
2036 std::string abilityName = want.GetElement().GetAbilityName();
2037 std::string abilityNameProvider = formProviderWant.GetElement().GetAbilityName();
2038 if (abilityNameProvider != abilityName) {
2039 HILOG_ERROR("The abilityName is not match.");
2040 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2041 }
2042
2043 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
2044 std::string formNameProvider = formProviderWant.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
2045 if (formNameProvider != formName) {
2046 HILOG_ERROR("The formName is not match.");
2047 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2048 }
2049
2050 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
2051 int32_t dimensionIdProvider = formProviderWant.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
2052 if (dimensionIdProvider != dimensionId) {
2053 HILOG_ERROR("The dimensionId is not match.");
2054 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2055 }
2056
2057 bool isTemporary = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
2058 bool isTemporaryProvider = formProviderWant.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
2059 if (isTemporaryProvider != isTemporary) {
2060 HILOG_ERROR("The temporary is not match.");
2061 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2062 }
2063
2064 int32_t callingUid = IPCSkeleton::GetCallingUid();
2065 ErrCode errCode = ERR_OK;
2066 if (isTemporary) {
2067 errCode = FormDataMgr::GetInstance().CheckTempEnoughForm();
2068 } else {
2069 int32_t currentUserId = GetCurrentUserId(callingUid);
2070 errCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, currentUserId);
2071 }
2072 if (errCode != ERR_OK) {
2073 HILOG_ERROR("fail, too much forms in system");
2074 }
2075 return errCode;
2076 }
2077
AddRequestPublishForm(const FormItemInfo & formItemInfo,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formJsInfo)2078 ErrCode FormMgrAdapter::AddRequestPublishForm(const FormItemInfo &formItemInfo, const Want &want,
2079 const sptr<IRemoteObject> &callerToken, FormJsInfo &formJsInfo)
2080 {
2081 HILOG_INFO("Add request publish form.");
2082 Want formProviderWant;
2083 std::unique_ptr<FormProviderData> formProviderData = nullptr;
2084 auto formId = formItemInfo.GetFormId();
2085 ErrCode errCode = FormDataMgr::GetInstance().GetRequestPublishFormInfo(formId, formProviderWant, formProviderData);
2086 if (errCode != ERR_OK) {
2087 HILOG_ERROR("Failed to get request publish form");
2088 return errCode;
2089 }
2090
2091 errCode = CheckAddRequestPublishForm(want, formProviderWant);
2092 if (errCode != ERR_OK) {
2093 return errCode;
2094 }
2095
2096 int32_t callingUid = IPCSkeleton::GetCallingUid();
2097 if (!FormDataMgr::GetInstance().AllotFormHostRecord(formItemInfo, callerToken, formId, callingUid)) {
2098 HILOG_ERROR("%{public}s fail, AllotFormHostRecord failed when no matched formRecord", __func__);
2099 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2100 }
2101
2102 // get current userId
2103 int32_t currentUserId = GetCurrentUserId(callingUid);
2104 // allot form record
2105 FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(formItemInfo, callingUid, currentUserId);
2106 if (formProviderData != nullptr) {
2107 formRecord.formProviderInfo.SetFormData(*formProviderData);
2108 }
2109 FormRenderMgr::GetInstance().RenderForm(formRecord, want.GetParams()); // render for arkTs form
2110
2111 // create form info for js
2112 FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formJsInfo);
2113 if (formProviderData != nullptr) {
2114 formJsInfo.formData = formProviderData->GetDataString();
2115 formJsInfo.formProviderData = *formProviderData;
2116 if (formProviderData->NeedCache()) {
2117 HILOG_INFO("%{public}s, data is less than 1k, cache data.", __func__);
2118 FormCacheMgr::GetInstance().AddData(formId, formJsInfo.formProviderData);
2119 }
2120 }
2121 // storage info
2122 if (!formItemInfo.IsTemporaryForm()) {
2123 if (ErrCode errorCode = FormDbCache::GetInstance().UpdateDBRecord(formId, formRecord);
2124 errorCode != ERR_OK) {
2125 HILOG_ERROR("%{public}s fail, UpdateDBRecord failed", __func__);
2126 return errorCode;
2127 }
2128 }
2129 std::vector<FormDataProxy> formDataProxies;
2130 if (FormDataProxyMgr::GetInstance().ConsumeFormDataProxies(formId, formDataProxies)) {
2131 FormDataProxyMgr::GetInstance().SubscribeFormData(formId, formDataProxies);
2132 }
2133 // start update timer
2134 return AddFormTimer(formRecord);
2135 }
2136
2137 /**
2138 * @brief get bundleName.
2139 * @param bundleName for output.
2140 * @return Returns true on success, others on failure.
2141 */
GetBundleName(std::string & bundleName)2142 bool FormMgrAdapter::GetBundleName(std::string &bundleName)
2143 {
2144 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2145 if (iBundleMgr == nullptr) {
2146 HILOG_ERROR("%{public}s, failed to get IBundleMgr.", __func__);
2147 return false;
2148 }
2149
2150 int uid = IPCSkeleton::GetCallingUid();
2151 if (!IN_PROCESS_CALL(iBundleMgr->CheckIsSystemAppByUid(uid))) {
2152 HILOG_ERROR("%{public}s fail, form is not system app. uid:%{public}d", __func__, uid);
2153 return false;
2154 }
2155
2156 int32_t result = IN_PROCESS_CALL(iBundleMgr->GetNameForUid(uid, bundleName));
2157 if (result != ERR_OK || bundleName.empty()) {
2158 HILOG_ERROR("%{public}s failed, cannot get bundle name by uid:%{public}d", __func__, uid);
2159 return false;
2160 }
2161 return true;
2162 }
2163
2164 /**
2165 * @brief set next refresh time locked.
2166 * @param formId The form's id.
2167 * @param nextTime next refresh time.
2168 * @param userId User ID.
2169 * @return Returns ERR_OK on success, others on failure.
2170 */
SetNextRefreshTimeLocked(const int64_t formId,const int64_t nextTime,const int32_t userId)2171 int FormMgrAdapter::SetNextRefreshTimeLocked(const int64_t formId, const int64_t nextTime, const int32_t userId)
2172 {
2173 HILOG_ERROR("SetNextRefreshTimeLocked.");
2174 int32_t timerRefreshedCount = FormTimerMgr::GetInstance().GetRefreshCount(formId);
2175 if (timerRefreshedCount >= Constants::LIMIT_COUNT) {
2176 HILOG_ERROR("%{public}s, already refresh times:%{public}d", __func__, timerRefreshedCount);
2177 FormTimerMgr::GetInstance().MarkRemind(formId);
2178 return ERR_APPEXECFWK_FORM_MAX_REFRESH;
2179 }
2180
2181 if (!FormTimerMgr::GetInstance().SetNextRefreshTime(formId, nextTime * Constants::SEC_PER_MIN, userId)) {
2182 HILOG_ERROR("%{public}s failed", __func__);
2183 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2184 }
2185
2186 return ERR_OK;
2187 }
2188
2189 /**
2190 * @brief set next refresh time locked.
2191 * @param formId The form's id.
2192 * @param bundleName Provider ability bundleName.
2193 * @return Returns true or false.
2194 */
IsUpdateValid(const int64_t formId,const std::string & bundleName)2195 bool FormMgrAdapter::IsUpdateValid(const int64_t formId, const std::string &bundleName)
2196 {
2197 if (formId <= 0 || bundleName.empty()) {
2198 return false;
2199 }
2200 return true;
2201 }
2202
2203 /**
2204 * @brief enable update form.
2205 * @param formIDs The id of the forms.
2206 * @param callerToken Caller ability token.
2207 * @return Returns ERR_OK on success, others on failure.
2208 */
EnableUpdateForm(const std::vector<int64_t> formIDs,const sptr<IRemoteObject> & callerToken)2209 int FormMgrAdapter::EnableUpdateForm(const std::vector<int64_t> formIDs, const sptr<IRemoteObject> &callerToken)
2210 {
2211 HILOG_DEBUG("enableUpdateForm");
2212 return HandleUpdateFormFlag(formIDs, callerToken, true, false);
2213 }
2214
2215 /**
2216 * @brief disable update form.
2217 * @param formIDs The id of the forms.
2218 * @param callerToken Caller ability token.
2219 * @return Returns ERR_OK on success, others on failure.
2220 */
DisableUpdateForm(const std::vector<int64_t> formIDs,const sptr<IRemoteObject> & callerToken)2221 int FormMgrAdapter::DisableUpdateForm(const std::vector<int64_t> formIDs, const sptr<IRemoteObject> &callerToken)
2222 {
2223 HILOG_DEBUG("disableUpdateForm");
2224 return HandleUpdateFormFlag(formIDs, callerToken, false, false);
2225 }
2226
2227 /**
2228 * @brief Process js message event.
2229 * @param formId Indicates the unique id of form.
2230 * @param want information passed to supplier.
2231 * @param callerToken Caller ability token.
2232 * @return Returns true if execute success, false otherwise.
2233 */
MessageEvent(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)2234 int FormMgrAdapter::MessageEvent(const int64_t formId, const Want &want, const sptr<IRemoteObject> &callerToken)
2235 {
2236 HILOG_INFO("%{public}s called.", __func__);
2237 if (formId <= 0) {
2238 HILOG_ERROR("%{public}s form formId is invalid", __func__);
2239 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2240 }
2241
2242 if (callerToken == nullptr) {
2243 HILOG_ERROR("%{public}s failed, callerToken can not be NULL", __func__);
2244 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2245 }
2246
2247 if (!want.HasParameter(Constants::PARAM_MESSAGE_KEY)) {
2248 HILOG_ERROR("%{public}s failed, message info is not exist", __func__);
2249 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2250 }
2251
2252 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2253 FormRecord record;
2254 bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2255 if (!bGetRecord) {
2256 HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 "", __func__, matchedFormId);
2257 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2258 }
2259
2260 FormHostRecord formHostRecord;
2261 bool isHostExist = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2262 if (!isHostExist) {
2263 HILOG_ERROR("%{public}s failed, cannot find target client.", __func__);
2264 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2265 }
2266
2267 if (!formHostRecord.Contains(matchedFormId)) {
2268 HILOG_ERROR("%{public}s failed, form is not self-owned.", __func__);
2269 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
2270 }
2271
2272 auto errCode = FormProviderMgr::GetInstance().MessageEvent(matchedFormId, record, want);
2273 if (errCode != ERR_OK) {
2274 return errCode;
2275 }
2276 HILOG_INFO("%{public}s, find target client.", __func__);
2277
2278 NotifyFormClickEvent(formId, FORM_CLICK_MESSAGE);
2279 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
2280 if (!FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
2281 int callingUid = IPCSkeleton::GetCallingUid();
2282 int32_t userId = GetCurrentUserId(callingUid);
2283 DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
2284 record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_CLICKED);
2285 DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
2286 }
2287 #endif
2288 return ERR_OK;
2289 }
2290
2291 /**
2292 * @brief Process js router event.
2293 * @param formId Indicates the unique id of form.
2294 * @param want the want of the ability to start.
2295 * @param callerToken Caller ability token.
2296 * @return Returns true if execute success, false otherwise.
2297 */
RouterEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)2298 int FormMgrAdapter::RouterEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
2299 {
2300 HILOG_DEBUG("called.");
2301 if (formId <= 0) {
2302 HILOG_ERROR("form formId or bundleName is invalid");
2303 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2304 }
2305
2306 want.SetParam(Constants::PARAM_FORM_ID, formId);
2307 want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, formId);
2308 if (!want.GetUriString().empty()) {
2309 HILOG_INFO("Router by uri");
2310 if (FormRouterProxyMgr::GetInstance().HasRouterProxy(formId)) {
2311 HILOG_INFO("Router proxy was setted sucessful");
2312 FormRouterProxyMgr::GetInstance().OnFormRouterEvent(formId, want);
2313 return ERR_OK;
2314 }
2315 int32_t result = FormAmsHelper::GetInstance().GetAbilityManager()->StartAbility(want, callerToken);
2316 if (result != ERR_OK && result != START_ABILITY_WAITING) {
2317 HILOG_ERROR("Failed to StartAbility, result: %{public}d.", result);
2318 return result;
2319 }
2320 NotifyFormClickEvent(formId, FORM_CLICK_ROUTER);
2321 return ERR_OK;
2322 }
2323
2324 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2325 FormRecord record;
2326 bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2327 if (!bGetRecord) {
2328 HILOG_ERROR("error, not exist such form:%{public}" PRId64 "", matchedFormId);
2329 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2330 }
2331
2332 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2333 if (iBundleMgr == nullptr) {
2334 HILOG_ERROR("error, failed to get IBundleMgr.");
2335 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
2336 }
2337
2338 if (record.bundleName != want.GetBundle()) {
2339 if (!record.isSystemApp) {
2340 HILOG_WARN("Only system apps can launch the ability of the other apps.");
2341 want.SetBundle(record.bundleName);
2342 }
2343 }
2344 if (FormRouterProxyMgr::GetInstance().HasRouterProxy(formId)) {
2345 HILOG_INFO("Router proxy was setted sucessful");
2346 FormRouterProxyMgr::GetInstance().OnFormRouterEvent(formId, want);
2347 return ERR_OK;
2348 }
2349 int32_t result = FormAmsHelper::GetInstance().GetAbilityManager()->StartAbility(want, callerToken);
2350 if (result != ERR_OK && result != START_ABILITY_WAITING) {
2351 HILOG_ERROR("Failed to StartAbility, result: %{public}d.", result);
2352 return result;
2353 }
2354
2355 NotifyFormClickEvent(formId, FORM_CLICK_ROUTER);
2356 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
2357 if (!FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
2358 int32_t callingUid = IPCSkeleton::GetCallingUid();
2359 int32_t userId = GetCurrentUserId(callingUid);
2360 DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
2361 record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_CLICKED);
2362 DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
2363 }
2364 #endif
2365 return ERR_OK;
2366 }
2367
2368 /**
2369 * @brief Process background router event.
2370 * @param formId Indicates the unique id of form.
2371 * @param want the want of the ability to start.
2372 * @param callerToken Caller ability token.
2373 * @return Returns true if execute success, false otherwise.
2374 */
BackgroundEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)2375 int FormMgrAdapter::BackgroundEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
2376 {
2377 HILOG_DEBUG("called.");
2378 if (formId <= 0) {
2379 HILOG_ERROR("form formId or bundleName is invalid");
2380 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2381 }
2382
2383 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2384 FormRecord record;
2385 bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2386 if (!bGetRecord) {
2387 HILOG_ERROR("fail, not exist such form:%{public}" PRId64 "", matchedFormId);
2388 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2389 }
2390
2391 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2392 if (iBundleMgr == nullptr) {
2393 HILOG_ERROR("fail, failed to get IBundleMgr.");
2394 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
2395 }
2396 if (want.GetBundle().empty() || record.bundleName != want.GetBundle()) {
2397 HILOG_DEBUG("The parameter contains the wrong bundleName or the empty bundleName");
2398 want.SetBundle(record.bundleName);
2399 }
2400 if (!CheckKeepBackgroundRunningPermission(iBundleMgr, record.bundleName)) {
2401 HILOG_ERROR("The app does not have permission for keeping background running.");
2402 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
2403 }
2404
2405 std::string params = want.GetStringParam(Constants::FORM_CALL_EVENT_PARAMS);
2406 nlohmann::json jsonObject = nlohmann::json::parse(params, nullptr, false);
2407 if (jsonObject.is_discarded()) {
2408 HILOG_ERROR("failed to parse jsonDataString: %{public}s.", params.c_str());
2409 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2410 }
2411 if (!jsonObject.contains(Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY) ||
2412 !jsonObject.at(Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY).is_string()) {
2413 HILOG_ERROR("failed to get method from params");
2414 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2415 }
2416 sptr<IAbilityConnection> formBackgroundConnection = new (std::nothrow) FormBackgroundConnection(
2417 formId, want.GetBundle(), want.GetElement().GetAbilityName(),
2418 jsonObject[Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY].get<std::string>(), params);
2419 if (formBackgroundConnection == nullptr) {
2420 HILOG_ERROR("formBackgroundConnection is null.");
2421 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2422 }
2423
2424 want.SetParam(Constants::PARAM_FORM_ID, formId);
2425 want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, formId);
2426 int32_t result = IN_PROCESS_CALL(FormAmsHelper::GetInstance().GetAbilityManager()->StartAbilityByCall(want,
2427 formBackgroundConnection, callerToken));
2428 if (result != ERR_OK) {
2429 HILOG_ERROR("Failed to StartAbilityByCall, result: %{public}d.", result);
2430 return result;
2431 }
2432 NotifyFormClickEvent(formId, FORM_CLICK_CALL);
2433 return ERR_OK;
2434 }
2435
HandleUpdateFormFlag(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool flag,bool isOnlyEnableUpdate)2436 ErrCode FormMgrAdapter::HandleUpdateFormFlag(const std::vector<int64_t> &formIds,
2437 const sptr<IRemoteObject> &callerToken, bool flag, bool isOnlyEnableUpdate)
2438 {
2439 HILOG_DEBUG("called.");
2440 if (formIds.empty() || callerToken == nullptr) {
2441 HILOG_ERROR("invalid param");
2442 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2443 }
2444 std::vector<int64_t> refreshForms;
2445 int errCode = FormDataMgr::GetInstance().UpdateHostFormFlag(formIds, callerToken,
2446 flag, isOnlyEnableUpdate, refreshForms);
2447 if (errCode == ERR_OK && !refreshForms.empty()) {
2448 int32_t userId = FormUtil::GetCurrentAccountId();
2449 for (const int64_t id : refreshForms) {
2450 HILOG_DEBUG("formRecord need refresh: %{public}" PRId64 "", id);
2451 Want want;
2452 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
2453 FormProviderMgr::GetInstance().RefreshForm(id, want, false);
2454 }
2455 }
2456 return errCode;
2457 }
2458
2459 /**
2460 * @brief check form cached.
2461 * @param record Form information.
2462 * @return Returns true on cached, false on not.
2463 */
IsFormCached(const FormRecord record)2464 bool FormMgrAdapter::IsFormCached(const FormRecord record)
2465 {
2466 if (record.versionUpgrade) {
2467 return false;
2468 }
2469 return true;
2470 }
2471
AcquireProviderFormInfo(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)2472 void FormMgrAdapter::AcquireProviderFormInfo(const int64_t formId, const Want &want,
2473 const sptr<IRemoteObject> &remoteObject)
2474 {
2475 HILOG_INFO("%{public}s called.", __func__);
2476 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
2477 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
2478 if (formProviderProxy == nullptr) {
2479 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2480 HILOG_ERROR("%{public}s fail, Failed to get formProviderProxy", __func__);
2481 return;
2482 }
2483 FormRecord formRecord;
2484 FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
2485 FormJsInfo formJsInfo;
2486 FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formJsInfo);
2487 int error = formProviderProxy->AcquireProviderFormInfo(formJsInfo, want, FormSupplyCallback::GetInstance());
2488 if (error != ERR_OK) {
2489 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2490 HILOG_ERROR("%{public}s fail, Failed to get acquire provider form info", __func__);
2491 }
2492 }
2493
2494 /**
2495 * @brief Notify form provider for delete form.
2496 *
2497 * @param formId The Id of the from.
2498 * @param want The want of the form.
2499 * @param remoteObject Form provider proxy object.
2500 */
NotifyFormDelete(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)2501 void FormMgrAdapter::NotifyFormDelete(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
2502 {
2503 HILOG_INFO("%{public}s called.", __func__);
2504 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
2505 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
2506 if (formProviderProxy == nullptr) {
2507 HILOG_ERROR("%{public}s fail, Failed to get formProviderProxy", __func__);
2508 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2509 return;
2510 }
2511 int error = formProviderProxy->NotifyFormDelete(formId, want, FormSupplyCallback::GetInstance());
2512 if (error != ERR_OK) {
2513 HILOG_ERROR("%{public}s fail, Failed to NotifyFormDelete", __func__);
2514 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2515 }
2516 }
2517
2518 /**
2519 * @brief Create eventMaps for event notify.
2520 *
2521 * @param matchedFormId The Id of the form
2522 * @param formRecord Form storage information
2523 * @param eventMaps eventMaps for event notify
2524 * @return Returns true on success, false on failure.
2525 */
CreateHandleEventMap(const int64_t matchedFormId,const FormRecord & formRecord,std::map<std::string,std::vector<int64_t>> & eventMaps)2526 bool FormMgrAdapter::CreateHandleEventMap(const int64_t matchedFormId, const FormRecord &formRecord,
2527 std::map<std::string, std::vector<int64_t>> &eventMaps)
2528 {
2529 if (!formRecord.formVisibleNotify) {
2530 HILOG_WARN("%{public}s fail, the config 'formVisibleNotify' is false, formId:%{public}" PRId64 ".",
2531 __func__, matchedFormId);
2532 return false;
2533 }
2534
2535 std::string providerKey = formRecord.bundleName + Constants::NAME_DELIMITER + formRecord.abilityName;
2536 auto iter = eventMaps.find(providerKey);
2537 if (iter == eventMaps.end()) {
2538 std::vector<int64_t> formEventsByProvider {matchedFormId};
2539 eventMaps.insert(std::make_pair(providerKey, formEventsByProvider));
2540 } else {
2541 iter->second.emplace_back(matchedFormId);
2542 }
2543 return true;
2544 }
2545
2546 /**
2547 * @brief Check if the form should update information to the host.
2548 *
2549 * @param matchedFormId The Id of the form
2550 * @param userId User ID.
2551 * @param callerToken Caller ability token.
2552 * @param formRecord Form storage information
2553 * @return Returns true on success, false on failure.
2554 */
isFormShouldUpdateProviderInfoToHost(const int64_t & matchedFormId,const int32_t & userId,const sptr<IRemoteObject> & callerToken,FormRecord & formRecord)2555 bool FormMgrAdapter::isFormShouldUpdateProviderInfoToHost(const int64_t &matchedFormId, const int32_t &userId,
2556 const sptr<IRemoteObject> &callerToken, FormRecord &formRecord)
2557 {
2558 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
2559 HILOG_WARN("fail, not exist such form, formId:%{public}" PRId64 ".", matchedFormId);
2560 return false;
2561 }
2562
2563 if (formRecord.providerUserId != userId) {
2564 HILOG_WARN("fail, not self form, formId:%{public}" PRId64 ".", matchedFormId);
2565 return false;
2566 }
2567 FormHostRecord formHostRecord;
2568 bool hasFormHostRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2569 if (!(hasFormHostRecord && formHostRecord.Contains(matchedFormId))) {
2570 HILOG_WARN("fail, form is not belong to self, formId:%{public}" PRId64 ".", matchedFormId);
2571 return false;
2572 }
2573 return true;
2574 }
2575
2576 /**
2577 * @brief Update provider info to host
2578 *
2579 * @param matchedFormId The Id of the form
2580 * @param userId User ID.
2581 * @param callerToken Caller ability token.
2582 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
2583 * @param formRecord Form storage information
2584 * @return Returns true on success, false on failure.
2585 */
UpdateProviderInfoToHost(const int64_t & matchedFormId,const int32_t & userId,const sptr<IRemoteObject> & callerToken,const int32_t & formVisibleType,FormRecord & formRecord)2586 bool FormMgrAdapter::UpdateProviderInfoToHost(const int64_t &matchedFormId, const int32_t &userId,
2587 const sptr<IRemoteObject> &callerToken, const int32_t &formVisibleType, FormRecord &formRecord)
2588 {
2589 formRecord.formVisibleNotifyState = formVisibleType;
2590 formRecord.isNeedNotify = true;
2591 if (!FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, formRecord)) {
2592 HILOG_WARN("fail, set formVisibleNotifyState error, formId:%{public}" PRId64 ".",
2593 matchedFormId);
2594 return false;
2595 }
2596
2597 HILOG_INFO("formId:%{public}" PRId64 ", needRefresh: %{public}d, formVisibleType: %{public}d,"
2598 "isTimerRefresh: %{public}d.", matchedFormId, formRecord.needRefresh,
2599 static_cast<int32_t>(formVisibleType), formRecord.isTimerRefresh);
2600 // If the form need refresh flag is true and form visibleType is FORM_VISIBLE, refresh the form host.
2601 if (formRecord.needRefresh && formVisibleType == Constants::FORM_VISIBLE) {
2602 if (formRecord.isTimerRefresh) {
2603 Want want;
2604 want.SetParam(Constants::KEY_IS_TIMER, true);
2605 want.SetParam(Constants::KEY_TIMER_REFRESH, true);
2606 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
2607 FormProviderMgr::GetInstance().RefreshForm(formRecord.formId, want, false);
2608 } else {
2609 std::string cacheData;
2610 std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
2611 FormHostRecord formHostRecord;
2612 (void)FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2613 // If the form has business cache, refresh the form host.
2614 if (FormCacheMgr::GetInstance().GetData(matchedFormId, cacheData, imageDataMap)) {
2615 formRecord.formProviderInfo.SetFormDataString(cacheData);
2616 formRecord.formProviderInfo.SetImageDataMap(imageDataMap);
2617 formHostRecord.OnUpdate(matchedFormId, formRecord);
2618 }
2619 }
2620 }
2621 return true;
2622 }
2623 /**
2624 * @brief If the form provider is system app and the config item 'formVisibleNotify' is true,
2625 * notify the form provider that the current form is visible.
2626 * @param iBundleMgr BundleManagerProxy
2627 * @param bundleName BundleName
2628 * @param userId UserId
2629 * @return Returns true if the form provider is system app, false if not.
2630 */
CheckIsSystemAppByBundleName(const sptr<IBundleMgr> & iBundleMgr,const int32_t & userId,const std::string & bundleName)2631 bool FormMgrAdapter::CheckIsSystemAppByBundleName(const sptr<IBundleMgr> &iBundleMgr,
2632 const int32_t &userId, const std::string &bundleName)
2633 {
2634 AppExecFwk::ApplicationInfo appInfo;
2635 if (IN_PROCESS_CALL(iBundleMgr->GetApplicationInfoV9(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT,
2636 userId, appInfo)) != ERR_OK) {
2637 HILOG_ERROR("failed to get application info");
2638 return false;
2639 }
2640
2641 HILOG_DEBUG("bundle:%{public}s. isSystemApp=%{public}d", bundleName.c_str(), appInfo.isSystemApp);
2642 return appInfo.isSystemApp;
2643 }
2644
2645 /**
2646 * @brief Check whether the caller for publish form is in the whitelist.
2647 * @param iBundleMgr BundleManagerProxy
2648 * @param bundleName BundleName of caller
2649 * @param want want of target form
2650 * @return Returns ERR_OK if the caller is in the whitelist.
2651 */
IsValidPublishEvent(const sptr<IBundleMgr> & iBundleMgr,const std::string & bundleName,const Want & want)2652 bool FormMgrAdapter::IsValidPublishEvent(const sptr<IBundleMgr> &iBundleMgr,
2653 const std::string &bundleName, const Want &want)
2654 {
2655 int32_t userId = FormUtil::GetCurrentAccountId();
2656 if (!CheckIsSystemAppByBundleName(iBundleMgr, userId, bundleName)) {
2657 HILOG_ERROR("Only system app can request publish form.");
2658 return false;
2659 }
2660 std::vector<Want> wants{want};
2661 return IsErmsSupportPublishForm(bundleName, wants);
2662 }
2663
2664 /**
2665 * @brief if the ability have permission for keeping background running is true,
2666 * @param iBundleMgr BundleManagerProxy
2667 * @param bundleName BundleName
2668 * @return Returns true if the ability have permission for keeping background running, false if not.
2669 */
CheckKeepBackgroundRunningPermission(const sptr<IBundleMgr> & iBundleMgr,const std::string & bundleName)2670 bool FormMgrAdapter::CheckKeepBackgroundRunningPermission(const sptr<IBundleMgr> &iBundleMgr,
2671 const std::string &bundleName)
2672 {
2673 BundleInfo bundleInfo;
2674 if (FormBmsHelper::GetInstance().GetBundleInfoWithPermission(bundleName,
2675 FormUtil::GetCurrentAccountId(), bundleInfo)) {
2676 HILOG_DEBUG("%{public}s, get bundleInfo success", __func__);
2677 auto item = find(bundleInfo.reqPermissions.begin(), bundleInfo.reqPermissions.end(),
2678 Constants::PERMISSION_KEEP_BACKGROUND_RUNNING);
2679 if (item == bundleInfo.reqPermissions.end()) {
2680 return false;
2681 }
2682 } else {
2683 HILOG_WARN("%{public}s fail, can not get bundleInfo's uid", __func__);
2684 return false;
2685 }
2686
2687 return true;
2688 }
2689 /**
2690 * @brief Get current user ID.
2691 * @param callingUid calling Uid.
2692 * @return Returns user ID.
2693 */
GetCurrentUserId(const int callingUid)2694 int32_t FormMgrAdapter::GetCurrentUserId(const int callingUid)
2695 {
2696 // get current userId
2697 int32_t userId = callingUid / CALLING_UID_TRANSFORM_DIVISOR;
2698 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callingUid, userId);
2699 return userId;
2700 }
2701
2702 /**
2703 * @brief Delete the invalid forms.
2704 * @param formIds Indicates the ID of the valid forms.
2705 * @param callerToken Caller ability token.
2706 * @param numFormsDeleted Returns the number of the deleted forms.
2707 * @return Returns ERR_OK on success, others on failure.
2708 */
DeleteInvalidForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,int32_t & numFormsDeleted)2709 int FormMgrAdapter::DeleteInvalidForms(const std::vector<int64_t> &formIds,
2710 const sptr<IRemoteObject> &callerToken, int32_t &numFormsDeleted)
2711 {
2712 HILOG_INFO("%{public}s called.", __func__);
2713 if (callerToken == nullptr) {
2714 HILOG_ERROR("%{public}s, callerToken is nullptr", __func__);
2715 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2716 }
2717
2718 std::set<int64_t> matchedFormIds {};
2719 for (int64_t formId : formIds) {
2720 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2721 matchedFormIds.emplace(matchedFormId);
2722 HILOG_INFO("valid formId, matchedFormIds: %{public}" PRId64 "", formId);
2723 }
2724 std::map<int64_t, bool> removedFormsMap {};
2725 int32_t callingUid = IPCSkeleton::GetCallingUid();
2726 int32_t userId = FormUtil::GetCurrentAccountId();
2727
2728 // delete invalid DB form record
2729 FormDbCache::GetInstance().DeleteInvalidDBForms(userId, callingUid, matchedFormIds, removedFormsMap);
2730 // delete invalid temp form record
2731 FormDataMgr::GetInstance().DeleteInvalidTempForms(userId, callingUid, matchedFormIds, removedFormsMap);
2732
2733 if (!removedFormsMap.empty()) {
2734 FormDataMgr::GetInstance().ClearHostDataByInvalidForms(callingUid, removedFormsMap);
2735 // delete forms timer
2736 for (const auto &removedForm : removedFormsMap) {
2737 if (removedForm.second) {
2738 FormTimerMgr::GetInstance().RemoveFormTimer(removedForm.first);
2739 }
2740 }
2741 }
2742
2743 std::string bundleName;
2744 if (GetBundleName(bundleName)) {
2745 // delete invalid publish form data
2746 FormDataMgr::GetInstance().DeleteInvalidPublishForms(userId, bundleName, matchedFormIds);
2747 }
2748
2749 numFormsDeleted = static_cast<int32_t>(removedFormsMap.size());
2750 HILOG_INFO("%{public}s done, %{public}d forms deleted.", __func__, numFormsDeleted);
2751 return ERR_OK;
2752 }
2753
2754 /**
2755 * @brief AcquireFormState want check.
2756 * @param bundleName The bundle name of the form.
2757 * @param abilityName The ability name of the form.
2758 * @param want The want of the form.
2759 * @param provider the provider info.
2760 * @return Returns ERR_OK on success, others on failure.
2761 */
AcquireFormStateCheck(const std::string & bundleName,const std::string & abilityName,const Want & want,std::string & provider)2762 ErrCode FormMgrAdapter::AcquireFormStateCheck(const std::string &bundleName,
2763 const std::string &abilityName, const Want &want, std::string &provider)
2764 {
2765 if (bundleName.empty() || abilityName.empty()) {
2766 HILOG_ERROR("%{public}s error, bundleName or abilityName is empty.", __func__);
2767 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2768 }
2769
2770 std::string moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
2771 std::string formName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_NAME_KEY);
2772 int32_t dimensionId = want.GetIntParam(AppExecFwk::Constants::PARAM_FORM_DIMENSION_KEY, 1);
2773
2774 if (moduleName.empty() || formName.empty()) {
2775 HILOG_ERROR("%{public}s error, moduleName or formName is empty.", __func__);
2776 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2777 }
2778
2779 std::vector<FormInfo> formInfos {};
2780 ErrCode errCode = FormInfoMgr::GetInstance()
2781 .GetFormsInfoByModuleWithoutCheck(want.GetElement().GetBundleName(), moduleName, formInfos);
2782 if (errCode != ERR_OK) {
2783 HILOG_ERROR("%{public}s error, failed to get forms info.", __func__);
2784 return errCode;
2785 }
2786
2787 bool found = false;
2788 for (auto &formInfo : formInfos) {
2789 if ((formInfo.abilityName == abilityName) && (formInfo.name == formName) &&
2790 (IsDimensionValid(formInfo, dimensionId))) {
2791 found = true;
2792 HILOG_INFO("%{public}s form info found.", __func__);
2793 break;
2794 }
2795 }
2796 if (!found) {
2797 HILOG_INFO("failed to find match form info.");
2798 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2799 }
2800
2801 int32_t callingUid = IPCSkeleton::GetCallingUid();
2802 const std::string doubleColon = "::";
2803 provider.append(bundleName).append(doubleColon).append(abilityName).append(doubleColon)
2804 .append(moduleName).append(doubleColon).append(formName).append(doubleColon)
2805 .append(std::to_string(dimensionId)).append(doubleColon).append(std::to_string(callingUid));
2806 return ERR_OK;
2807 }
2808
2809 /**
2810 * @brief Acquire form state info by passing a set of parameters (using Want) to the form provider.
2811 * @param want Indicates a set of parameters to be transparently passed to the form provider.
2812 * @param callerToken Caller ability token.
2813 * @param stateInfo Returns the form's state info of the specify.
2814 * @return Returns ERR_OK on success, others on failure.
2815 */
AcquireFormState(const Want & want,const sptr<IRemoteObject> & callerToken,FormStateInfo & stateInfo)2816 int FormMgrAdapter::AcquireFormState(const Want &want, const sptr<IRemoteObject> &callerToken,
2817 FormStateInfo &stateInfo)
2818 {
2819 if (callerToken == nullptr) {
2820 HILOG_ERROR("%{public}s, callerToken is nullptr", __func__);
2821 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2822 }
2823 std::string bundleName = want.GetElement().GetBundleName();
2824 std::string abilityName = want.GetElement().GetAbilityName();
2825
2826 std::string provider;
2827 ErrCode errCode = AcquireFormStateCheck(bundleName, abilityName, want, provider);
2828 if (errCode != ERR_OK) {
2829 return errCode;
2830 }
2831
2832 int32_t callingUid = IPCSkeleton::GetCallingUid();
2833 FormItemInfo info;
2834 FormDataMgr::GetInstance().CreateFormStateRecord(provider, info, callerToken, callingUid);
2835
2836 HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s", bundleName.c_str(), abilityName.c_str());
2837 sptr<IAbilityConnection> connection =
2838 new (std::nothrow) FormAcquireStateConnection(bundleName, abilityName, want, provider);
2839 if (connection == nullptr) {
2840 HILOG_ERROR("failed to create FormAcquireStateConnection.");
2841 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2842 }
2843 Want targetWant;
2844 targetWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
2845 targetWant.SetElementName(bundleName, abilityName);
2846 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(targetWant, connection);
2847 if (errorCode != ERR_OK) {
2848 HILOG_ERROR("%{public}s, ConnectServiceAbility failed.", __func__);
2849 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2850 }
2851 stateInfo.state = FormState::DEFAULT;
2852 return ERR_OK;
2853 }
2854
AcquireFormData(int64_t formId,int64_t requestCode,const sptr<IRemoteObject> & callerToken,AAFwk::WantParams & formData)2855 int FormMgrAdapter::AcquireFormData(int64_t formId, int64_t requestCode, const sptr<IRemoteObject> &callerToken,
2856 AAFwk::WantParams &formData)
2857 {
2858 FormRecord formRecord;
2859 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
2860 if (!isFormRecExist) {
2861 HILOG_ERROR("form info get formRecord failed.");
2862 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
2863 }
2864 std::string bundleName = formRecord.bundleName;
2865 std::string abilityName = formRecord.abilityName;
2866
2867 HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s", bundleName.c_str(), abilityName.c_str());
2868 int32_t callingUid = IPCSkeleton::GetCallingUid();
2869 FormItemInfo info;
2870 FormDataMgr::GetInstance().CreateFormAcquireDataRecord(requestCode, info, callerToken, callingUid);
2871 sptr<IAbilityConnection> connection =
2872 new (std::nothrow) FormAcquireDataConnection(formId, bundleName, abilityName, requestCode);
2873 if (connection == nullptr) {
2874 HILOG_ERROR("failed to create FormAcquireDataConnection.");
2875 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2876 }
2877 Want targetWant;
2878 targetWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
2879 targetWant.SetElementName(bundleName, abilityName);
2880 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(targetWant, connection);
2881 if (errorCode != ERR_OK) {
2882 HILOG_ERROR("ConnectServiceAbility failed.");
2883 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2884 }
2885 return ERR_OK;
2886 }
2887
2888 /**
2889 * @brief Notify the form is visible or not.
2890 * @param formIds Indicates the ID of the forms.
2891 * @param isVisible Visible or not.
2892 * @param callerToken Host client.
2893 * @return Returns ERR_OK on success, others on failure.
2894 */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)2895 int FormMgrAdapter::NotifyFormsVisible(const std::vector<int64_t> &formIds,
2896 bool isVisible, const sptr<IRemoteObject> &callerToken)
2897 {
2898 HILOG_INFO("%{public}s, isVisible: %{public}d.", __func__, isVisible);
2899 return FormDataMgr::GetInstance().NotifyFormsVisible(formIds, isVisible, callerToken);
2900 }
2901
2902 /**
2903 * @brief Notify the form is enable to be updated or not.
2904 * @param formIds Indicates the ID of the forms.
2905 * @param isEnableUpdate enable update or not.
2906 * @param callerToken Host client.
2907 * @return Returns ERR_OK on success, others on failure.
2908 */
NotifyFormsEnableUpdate(const std::vector<int64_t> & formIds,bool isEnableUpdate,const sptr<IRemoteObject> & callerToken)2909 int FormMgrAdapter::NotifyFormsEnableUpdate(const std::vector<int64_t> &formIds,
2910 bool isEnableUpdate, const sptr<IRemoteObject> &callerToken)
2911 {
2912 HILOG_INFO("%{public}s, isEnableUpdate: %{public}d.", __func__, isEnableUpdate);
2913 return HandleUpdateFormFlag(formIds, callerToken, isEnableUpdate, true);
2914 }
2915
2916 /**
2917 * @brief Get All FormsInfo.
2918 * @param formInfos Return the forms' information of all forms provided.
2919 * @return Returns ERR_OK on success, others on failure.
2920 */
GetAllFormsInfo(std::vector<FormInfo> & formInfos)2921 int FormMgrAdapter::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
2922 {
2923 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2924 return FormInfoMgr::GetInstance().GetAllFormsInfo(formInfos);
2925 }
2926
2927 /**
2928 * @brief Get forms info by bundle name .
2929 * @param bundleName Application name.
2930 * @param formInfos Return the forms' information of the specify application name.
2931 * @return Returns ERR_OK on success, others on failure.
2932 */
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos)2933 int FormMgrAdapter::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos)
2934 {
2935 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2936 return FormInfoMgr::GetInstance().GetFormsInfoByBundle(bundleName, formInfos);
2937 }
2938
2939 /**
2940 * @brief Get forms info by bundle name and module name.
2941 * @param bundleName bundle name.
2942 * @param moduleName Module name of hap.
2943 * @param formInfos Return the forms' information of the specify bundle name and module name.
2944 * @return Returns ERR_OK on success, others on failure.
2945 */
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos)2946 int FormMgrAdapter::GetFormsInfoByModule(const std::string &bundleName,
2947 const std::string &moduleName, std::vector<FormInfo> &formInfos)
2948 {
2949 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2950 return FormInfoMgr::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
2951 }
2952
IsRequestPublishFormSupported()2953 bool FormMgrAdapter::IsRequestPublishFormSupported()
2954 {
2955 /* Query the highest priority ability or extension ability for publishing form */
2956 std::string bundleName;
2957 if (!GetBundleName(bundleName)) {
2958 HILOG_ERROR("%{public}s failed to get BundleName", __func__);
2959 return false;
2960 }
2961
2962 std::vector<Want> wants;
2963 bool isSupport = IsErmsSupportPublishForm(bundleName, wants);
2964 if (!isSupport) {
2965 HILOG_ERROR("Erms is not support to publish forms");
2966 return false;
2967 }
2968
2969 if (formPublishInterceptor_ != nullptr) {
2970 HILOG_DEBUG("query publish form has publish interceptor, return true.");
2971 return true;
2972 }
2973
2974 auto action = Constants::FORM_PUBLISH_ACTION;
2975 auto userId = GetCurrentUserId(IPCSkeleton::GetCallingUid());
2976 AppExecFwk::AbilityInfo abilityInfo;
2977 AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
2978 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(action, userId, abilityInfo, extensionAbilityInfo)) {
2979 HILOG_ERROR("Failed to ImplicitQueryInfoByPriority for publishing form");
2980 return false;
2981 }
2982
2983 if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
2984 HILOG_ERROR("Query highest priority ability failed, no form host ability found.");
2985 return false;
2986 }
2987 return true;
2988 }
2989
2990 /**
2991 * @brief check if the form host is system app
2992 * @param formRecord Form storage information
2993 * @return Returns true if the form host is system app, false if not.
2994 */
checkFormHostHasSaUid(const FormRecord & formRecord)2995 bool FormMgrAdapter::checkFormHostHasSaUid(const FormRecord &formRecord)
2996 {
2997 return std::find(formRecord.formUserUids.begin(), formRecord.formUserUids.end(),
2998 SYSTEM_UID) != formRecord.formUserUids.end();
2999 }
3000
RegisterFormAddObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)3001 ErrCode FormMgrAdapter::RegisterFormAddObserverByBundle(const std::string bundleName,
3002 const sptr<IRemoteObject> &callerToken)
3003 {
3004 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3005 return FormObserverRecord::GetInstance().SetFormAddObserver(bundleName, callerToken);
3006 }
3007
RegisterFormRemoveObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)3008 ErrCode FormMgrAdapter::RegisterFormRemoveObserverByBundle(const std::string bundleName,
3009 const sptr<IRemoteObject> &callerToken)
3010 {
3011 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3012 return FormObserverRecord::GetInstance().SetFormRemoveObserver(bundleName, callerToken);
3013 }
3014
GetFormsCount(bool isTempFormFlag,int32_t & formCount)3015 int32_t FormMgrAdapter::GetFormsCount(bool isTempFormFlag, int32_t &formCount)
3016 {
3017 HILOG_DEBUG("%{public}s, isTempFormFlag: %{public}d.", __func__, isTempFormFlag);
3018 if (isTempFormFlag) {
3019 return FormDataMgr::GetInstance().GetTempFormsCount(formCount);
3020 }
3021 return FormDataMgr::GetInstance().GetCastFormsCount(formCount);
3022 }
3023
GetHostFormsCount(std::string & bundleName,int32_t & formCount)3024 int32_t FormMgrAdapter::GetHostFormsCount(std::string &bundleName, int32_t &formCount)
3025 {
3026 HILOG_DEBUG("%{public}s, bundleName: %{public}s.", __func__, bundleName.c_str());
3027 return FormDataMgr::GetInstance().GetHostFormsCount(bundleName, formCount);
3028 }
3029
GetRunningFormInfos(bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)3030 ErrCode FormMgrAdapter::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
3031 {
3032 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3033 return FormDataMgr::GetInstance().GetRunningFormInfos(isUnusedIncluded, runningFormInfos);
3034 }
3035
GetRunningFormInfosByBundleName(const std::string & bundleName,bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)3036 ErrCode FormMgrAdapter::GetRunningFormInfosByBundleName(
3037 const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
3038 {
3039 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3040 return FormDataMgr::GetInstance().GetRunningFormInfosByBundleName(bundleName, isUnusedIncluded, runningFormInfos);
3041 }
3042
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)3043 ErrCode FormMgrAdapter::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
3044 std::vector<FormInstance> &formInstances)
3045 {
3046 return FormDataMgr::GetInstance().GetFormInstancesByFilter(formInstancesFilter, formInstances);
3047 }
3048
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)3049 ErrCode FormMgrAdapter::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
3050 {
3051 return FormDataMgr::GetInstance().GetFormInstanceById(formId, formInstance);
3052 }
3053
GetFormInstanceById(const int64_t formId,bool isUnusedIncluded,FormInstance & formInstance)3054 ErrCode FormMgrAdapter::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
3055 {
3056 return FormDataMgr::GetInstance().GetFormInstanceById(formId, isUnusedIncluded, formInstance);
3057 }
3058
RegisterAddObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)3059 ErrCode FormMgrAdapter::RegisterAddObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
3060 {
3061 HILOG_DEBUG("called.");
3062 std::lock_guard<std::mutex> lock(formObserversMutex_);
3063 auto formObserver = formObservers_.find(bundleName);
3064 if (formObserver == formObservers_.end()) {
3065 HILOG_DEBUG("%{public}s start register.", bundleName.c_str());
3066 std::vector<sptr<IRemoteObject>> remoteObjects;
3067 remoteObjects.emplace_back(callerToken);
3068 formObservers_.emplace(bundleName, remoteObjects);
3069 } else {
3070 auto &remoteObjects = formObserver->second;
3071 auto itr = std::find(remoteObjects.begin(), remoteObjects.end(), callerToken);
3072 if (itr != remoteObjects.end()) {
3073 HILOG_ERROR("callback is already exist");
3074 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
3075 }
3076 HILOG_DEBUG("%{public}s add register.", bundleName.c_str());
3077 remoteObjects.emplace_back(callerToken);
3078 }
3079 SetDeathRecipient(callerToken, new (std::nothrow) FormMgrAdapter::ClientDeathRecipient());
3080 HILOG_DEBUG("success.");
3081 return ERR_OK;
3082 }
3083
RegisterRemoveObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)3084 ErrCode FormMgrAdapter::RegisterRemoveObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
3085 {
3086 HILOG_DEBUG("%{public}s called.", __func__);
3087 std::lock_guard<std::mutex> lock(formObserversMutex_);
3088 auto formObserver = formObservers_.find(bundleName);
3089 if (formObserver == formObservers_.end()) {
3090 HILOG_ERROR("bundleName is not exist");
3091 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
3092 } else {
3093 auto &remoteObjects = formObserver->second;
3094 for (auto itr = remoteObjects.begin(); itr != remoteObjects.end();) {
3095 if (*itr == callerToken) {
3096 remoteObjects.erase(itr);
3097 SetDeathRecipient(callerToken, new (std::nothrow) FormMgrAdapter::ClientDeathRecipient());
3098 HILOG_DEBUG("success.");
3099 return ERR_OK;
3100 }
3101 ++itr;
3102 }
3103 }
3104 HILOG_ERROR("callback is not exist");
3105 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
3106 }
3107
RegisterFormRouterProxy(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken)3108 ErrCode FormMgrAdapter::RegisterFormRouterProxy(
3109 const std::vector<int64_t>& formIds, const sptr<IRemoteObject>& callerToken)
3110 {
3111 HILOG_DEBUG("Called.");
3112 if (callerToken == nullptr) {
3113 HILOG_ERROR("CallerToken is nullptr.");
3114 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3115 }
3116
3117 std::vector<int64_t> matchedFormIds {};
3118 std::vector<int64_t> hostOwnFormIds {};
3119 auto uid = IPCSkeleton::GetCallingUid();
3120 FormRecord record;
3121 for (int64_t formId : formIds) {
3122 if (formId <= 0) {
3123 HILOG_WARN("FormId %{public}" PRId64 " is less than 0", formId);
3124 continue;
3125 }
3126 auto matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3127 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3128 HILOG_ERROR("No matching formRecord was found for the formId: %{public}" PRId64 "", formId);
3129 continue;
3130 }
3131 matchedFormIds.push_back(formId);
3132
3133 if (record.providerUserId != FormUtil::GetCurrentAccountId()) {
3134 // Checks for cross-user operations.
3135 HILOG_ERROR("The formId: %{public}" PRId64
3136 " corresponds to a card that is not for the currently active user.",
3137 formId);
3138 continue;
3139 } else if (std::find(record.formUserUids.begin(),
3140 record.formUserUids.end(), uid) == record.formUserUids.end()) {
3141 // Checks for cross-host operations
3142 HILOG_ERROR("The formId:%{public}" PRId64 " owned by other formHost", formId);
3143 continue;
3144 } else {
3145 HILOG_DEBUG("The setup was sucessful, matchedFormIds: %{public}" PRId64 "", formId);
3146 hostOwnFormIds.push_back(formId);
3147 }
3148 }
3149 if (matchedFormIds.empty()) {
3150 HILOG_ERROR("All formIds is Invalid!");
3151 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3152 }
3153
3154 if (hostOwnFormIds.empty()) {
3155 HILOG_ERROR("All formIds was not setted by self!");
3156 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
3157 }
3158
3159 return FormRouterProxyMgr::GetInstance().SetFormRouterProxy(hostOwnFormIds, callerToken);
3160 }
3161
UnregisterFormRouterProxy(const std::vector<int64_t> & formIds)3162 ErrCode FormMgrAdapter::UnregisterFormRouterProxy(const std::vector<int64_t>& formIds)
3163 {
3164 HILOG_DEBUG("Called.");
3165 std::vector<int64_t> matchedFormIds {};
3166 std::vector<int64_t> hostOwnFormIds {};
3167 auto uid = IPCSkeleton::GetCallingUid();
3168 FormRecord record;
3169 for (int64_t formId : formIds) {
3170 if (formId <= 0) {
3171 HILOG_WARN("FormId %{public}" PRId64 " is less than 0", formId);
3172 continue;
3173 }
3174 auto matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3175 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3176 HILOG_ERROR("No matching formRecord was found for the formId: %{public}" PRId64 "", formId);
3177 continue;
3178 }
3179 matchedFormIds.push_back(formId);
3180
3181 if (record.providerUserId != FormUtil::GetCurrentAccountId()) {
3182 // Checks for cross-user operations.
3183 HILOG_ERROR("The formId: %{public}" PRId64
3184 " corresponds to a card that is not for the currently active user.",
3185 formId);
3186 continue;
3187 } else if (std::find(record.formUserUids.begin(),
3188 record.formUserUids.end(), uid) == record.formUserUids.end()) {
3189 // Checks for cross-host operations
3190 HILOG_ERROR("The formId:%{public}" PRId64 " owned by other formHost", formId);
3191 continue;
3192 } else {
3193 HILOG_DEBUG("The setup was sucessful, matchedFormIds: %{public}" PRId64 "", formId);
3194 hostOwnFormIds.push_back(formId);
3195 }
3196 }
3197 if (matchedFormIds.empty()) {
3198 HILOG_ERROR("All formIds is Invalid!");
3199 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3200 }
3201
3202 if (hostOwnFormIds.empty()) {
3203 HILOG_ERROR("All formIds was not setted by self!");
3204 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
3205 }
3206
3207 return FormRouterProxyMgr::GetInstance().RemoveFormRouterProxy(hostOwnFormIds);
3208 }
3209
SetDeathRecipient(const sptr<IRemoteObject> & callerToken,const sptr<IRemoteObject::DeathRecipient> & deathRecipient)3210 void FormMgrAdapter::SetDeathRecipient(const sptr<IRemoteObject> &callerToken,
3211 const sptr<IRemoteObject::DeathRecipient> &deathRecipient)
3212 {
3213 HILOG_DEBUG("called.");
3214 if (callerToken == nullptr || deathRecipient == nullptr) {
3215 HILOG_ERROR("The callerToken or the deathRecipient is empty");
3216 return;
3217 }
3218 std::lock_guard<std::mutex> lock(deathRecipientsMutex_);
3219 auto iter = deathRecipients_.find(callerToken);
3220 if (iter == deathRecipients_.end()) {
3221 deathRecipients_.emplace(callerToken, deathRecipient);
3222 callerToken->AddDeathRecipient(deathRecipient);
3223 } else {
3224 HILOG_DEBUG("The deathRecipient has been added.");
3225 }
3226 }
3227
CleanResource(const wptr<IRemoteObject> & remote)3228 void FormMgrAdapter::CleanResource(const wptr<IRemoteObject> &remote)
3229 {
3230 HILOG_DEBUG("called.");
3231
3232 // Clean the formObservers_.
3233 auto object = remote.promote();
3234 if (object == nullptr) {
3235 HILOG_ERROR("remote object is nullptr");
3236 return;
3237 }
3238 {
3239 std::lock_guard<std::mutex> lock(formObserversMutex_);
3240 for (auto it = formObservers_.begin(); it != formObservers_.end();) {
3241 auto &remoteObjects = it->second;
3242 for (auto iter = remoteObjects.begin(); iter != remoteObjects.end();) {
3243 if (*iter == object) {
3244 iter = remoteObjects.erase(iter);
3245 continue;
3246 }
3247 ++iter;
3248 }
3249 if (remoteObjects.empty()) {
3250 it = formObservers_.erase(it);
3251 continue;
3252 }
3253 ++it;
3254 }
3255 }
3256 std::lock_guard<std::mutex> deathLock(deathRecipientsMutex_);
3257 auto iter = deathRecipients_.find(object);
3258 if (iter != deathRecipients_.end()) {
3259 auto deathRecipient = iter->second;
3260 deathRecipients_.erase(iter);
3261 object->RemoveDeathRecipient(deathRecipient);
3262 }
3263 }
3264
OnRemoteDied(const wptr<IRemoteObject> & remote)3265 void FormMgrAdapter::ClientDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
3266 {
3267 HILOG_DEBUG("remote died");
3268 FormMgrAdapter::GetInstance().CleanResource(remote);
3269 }
3270
RegisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)3271 int32_t FormMgrAdapter::RegisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
3272 {
3273 HILOG_DEBUG("called.");
3274 if (interceptorCallback == nullptr) {
3275 HILOG_ERROR("interceptorCallback is null.");
3276 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3277 }
3278 auto interceptor = iface_cast<AppExecFwk::IFormPublishInterceptor>(interceptorCallback);
3279 if (interceptor == nullptr) {
3280 HILOG_ERROR("RegisterPublishFormInterceptor failed.");
3281 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3282 }
3283 formPublishInterceptor_ = interceptor;
3284 return ERR_OK;
3285 }
3286
UnregisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)3287 int32_t FormMgrAdapter::UnregisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
3288 {
3289 HILOG_DEBUG("called.");
3290 if (interceptorCallback == nullptr) {
3291 HILOG_ERROR("interceptorCallback is null.");
3292 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3293 }
3294 auto interceptor = iface_cast<AppExecFwk::IFormPublishInterceptor>(interceptorCallback);
3295 if (interceptor == nullptr) {
3296 HILOG_ERROR("UnregisterPublishFormInterceptor failed.");
3297 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3298 }
3299 if (formPublishInterceptor_ == interceptor) {
3300 HILOG_DEBUG("UnregisterPublishFormInterceptor success.");
3301 formPublishInterceptor_ = nullptr;
3302 return ERR_OK;
3303 }
3304 HILOG_ERROR("the param not equal to the current interceptor.");
3305 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3306 }
3307
RegisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)3308 ErrCode FormMgrAdapter::RegisterClickEventObserver(
3309 const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
3310 {
3311 HILOG_DEBUG("Called.");
3312 if (observer == nullptr) {
3313 HILOG_ERROR("Caller token is null.");
3314 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3315 }
3316 return FormObserverRecord::GetInstance().SetFormEventObserver(bundleName, formEventType, observer);
3317 }
3318
UnregisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)3319 ErrCode FormMgrAdapter::UnregisterClickEventObserver(
3320 const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
3321 {
3322 HILOG_DEBUG("Called.");
3323 if (observer == nullptr) {
3324 HILOG_ERROR("Caller token is null.");
3325 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3326 }
3327 return FormObserverRecord::GetInstance().RemoveFormEventObserver(bundleName, formEventType, observer);
3328 }
3329
NotifyFormClickEvent(int64_t formId,const std::string & formClickType)3330 void FormMgrAdapter::NotifyFormClickEvent(int64_t formId, const std::string &formClickType)
3331 {
3332 HILOG_DEBUG("Called.");
3333 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3334
3335 RunningFormInfo runningFormInfo;
3336 auto ref = FormDataMgr::GetInstance().GetRunningFormInfosByFormId(matchedFormId, runningFormInfo);
3337 if (ref != ERR_OK) {
3338 HILOG_ERROR("Get Running info error.");
3339 return;
3340 }
3341
3342 FormObserverRecord::GetInstance().HandleFormEvent(runningFormInfo.hostBundleName, formClickType, runningFormInfo);
3343 // The application layer can pass in an empty Bundlename,
3344 // Which represents listening to a certain event of all applications
3345 FormObserverRecord::GetInstance().HandleFormEvent(EMPTY_BUNDLE, formClickType, runningFormInfo);
3346 }
3347
GetValidFormUpdateDuration(const int64_t formId,int64_t & updateDuration) const3348 bool FormMgrAdapter::GetValidFormUpdateDuration(const int64_t formId, int64_t &updateDuration) const
3349 {
3350 HILOG_DEBUG("Called.");
3351 FormRecord formRecord;
3352 if (!FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
3353 HILOG_ERROR("Error, not exist such form:%{public}" PRId64 ".", formId);
3354 return false;
3355 }
3356
3357 ApplicationInfo appInfo;
3358 if (FormBmsHelper::GetInstance().GetApplicationInfo(formRecord.bundleName, FormUtil::GetCurrentAccountId(),
3359 appInfo) != ERR_OK) {
3360 HILOG_ERROR("Get app info failed.");
3361 return false;
3362 }
3363
3364 if (appInfo.apiTargetVersion < API_11) {
3365 HILOG_INFO("API version is lower than 11, uses local configuration.");
3366 updateDuration = formRecord.updateDuration;
3367 return true;
3368 }
3369 HILOG_INFO("Get form cloud update duration from cache.");
3370 int duration = FormDataMgr::GetInstance().GetFormCloudUpdateDuration(formRecord.bundleName);
3371 if (duration == 0) {
3372 HILOG_INFO("No valid cloud update duration, uses local configuration.");
3373 updateDuration = formRecord.updateDuration;
3374 return true;
3375 }
3376 int64_t cloudsDuration = duration * Constants::TIME_CONVERSION;
3377 updateDuration = std::max(formRecord.updateDuration, cloudsDuration);
3378 return true;
3379 }
3380
UpdateFormCloudUpdateDuration(const std::string & bundleName)3381 void FormMgrAdapter::UpdateFormCloudUpdateDuration(const std::string &bundleName)
3382 {
3383 HILOG_DEBUG("Called.");
3384 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
3385 if (iBundleMgr == nullptr) {
3386 HILOG_ERROR("Failed to get IBundleMgr.");
3387 FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3388 return;
3389 }
3390
3391 std::string additionalInfo;
3392 if (IN_PROCESS_CALL(iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo)) != ERR_OK) {
3393 HILOG_ERROR("Failed to get additionalInfo.");
3394 FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3395 return;
3396 }
3397
3398 if (additionalInfo.empty()) {
3399 HILOG_INFO("AdditionalInfo is empty.");
3400 FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3401 return;
3402 }
3403
3404 std::regex regex(R"(formUpdateLevel:(\d+))");
3405 std::smatch searchResult;
3406 std::string::const_iterator iterStart = additionalInfo.begin();
3407 std::string::const_iterator iterEnd = additionalInfo.end();
3408 std::vector<int> durationArray;
3409 while (std::regex_search(iterStart, iterEnd, searchResult, regex)) {
3410 iterStart = searchResult[0].second;
3411 if (searchResult[DATA_FIELD].str().length() > FORM_UPDATE_LEVEL_VALUE_MAX_LENGTH) {
3412 continue;
3413 }
3414 int val = std::stoi(searchResult[DATA_FIELD].str());
3415 if (val >= Constants::MIN_CONFIG_DURATION && val <= Constants::MAX_CONFIG_DURATION) {
3416 durationArray.emplace_back(val);
3417 }
3418 }
3419
3420 if (durationArray.empty()) {
3421 HILOG_INFO("No valid formUpdateLevel in additionalInfo.");
3422 FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3423 return;
3424 }
3425
3426 FormDataMgr::GetInstance().UpdateFormCloudUpdateDuration(bundleName, durationArray.back());
3427 }
3428
GetCallerType(std::string bundleName)3429 int32_t FormMgrAdapter::GetCallerType(std::string bundleName)
3430 {
3431 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
3432 if (iBundleMgr == nullptr) {
3433 HILOG_ERROR("fail, failed to get IBundleMgr.");
3434 return FormErmsCallerInfo::TYPE_INVALID;
3435 }
3436
3437 AppExecFwk::ApplicationInfo callerAppInfo;
3438 auto flag = AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO;
3439 auto userId = GetCurrentUserId(IPCSkeleton::GetCallingUid());
3440 bool getCallerResult = IN_PROCESS_CALL(iBundleMgr->GetApplicationInfo(bundleName, flag, userId, callerAppInfo));
3441 if (!getCallerResult) {
3442 HILOG_ERROR("Get callerAppInfo failed.");
3443 return FormErmsCallerInfo::TYPE_INVALID;
3444 }
3445
3446 switch (callerAppInfo.bundleType) {
3447 case AppExecFwk::BundleType::ATOMIC_SERVICE:
3448 return FormErmsCallerInfo::TYPE_ATOM_SERVICE;
3449 case AppExecFwk::BundleType::APP:
3450 return FormErmsCallerInfo::TYPE_HARMONY_APP;
3451 default:
3452 HILOG_WARN("the caller type is not harmony app or atom service: %{public}d", callerAppInfo.bundleType);
3453 break;
3454 }
3455 return FormErmsCallerInfo::TYPE_INVALID;
3456 }
3457
IsErmsSupportPublishForm(std::string bundleName,std::vector<Want> wants)3458 bool FormMgrAdapter::IsErmsSupportPublishForm(std::string bundleName, std::vector<Want> wants)
3459 {
3460 bool isSupport = true;
3461 std::string supportErms = OHOS::system::GetParameter(FORM_SUPPORT_ECOLOGICAL_RULEMGRSERVICE, "true");
3462 if (supportErms == "false") {
3463 HILOG_ERROR("fms not support Erms between applications.");
3464 return true;
3465 }
3466 FormErmsCallerInfo callerInfo;
3467 callerInfo.packageName = bundleName;
3468 callerInfo.uid = IPCSkeleton::GetCallingUid();
3469 callerInfo.pid = IPCSkeleton::GetCallingPid();
3470 callerInfo.callerAppType = GetCallerType(bundleName);
3471
3472 auto start = FormUtil::GetCurrentMicrosecond();
3473 int32_t ret = FormEcologicalRuleClient::GetInstance().IsSupportPublishForm(wants, callerInfo, isSupport);
3474 auto end = FormUtil::GetCurrentMicrosecond();
3475 HILOG_INFO("[ERMS-DFX] IsSupportPublishForm cost %{public}" PRId64 " micro seconds", (end - start));
3476 if (ret != ERR_OK) {
3477 HILOG_ERROR("call IsSupportPublishForm failed: %{public}d, default is support.", ret);
3478 return true;
3479 }
3480 return isSupport;
3481 }
3482
SetFormsRecyclable(const std::vector<int64_t> & formIds)3483 int32_t FormMgrAdapter::SetFormsRecyclable(const std::vector<int64_t> &formIds)
3484 {
3485 HILOG_DEBUG("called");
3486 FormRecord record;
3487 std::vector<int64_t> validFormIds;
3488 int callingUid = IPCSkeleton::GetCallingUid();
3489 for (int64_t formId : formIds) {
3490 if (formId <= 0) {
3491 HILOG_ERROR("form id is negative");
3492 continue;
3493 }
3494
3495 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3496 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3497 HILOG_WARN("form %{public}" PRId64 " not exist", formId);
3498 continue;
3499 }
3500 if (record.formTempFlag) {
3501 HILOG_WARN("form %{public}" PRId64 " is temp form", formId);
3502 continue;
3503 }
3504 if (!record.isDynamic) {
3505 HILOG_WARN("form %{public}" PRId64 " is static form", formId);
3506 continue;
3507 }
3508 if (record.uiSyntax != FormType::ETS) {
3509 HILOG_WARN("form %{public}" PRId64 " is not ETS form", formId);
3510 continue;
3511 }
3512 if (record.recycleStatus != RecycleStatus::NON_RECYCLABLE) {
3513 HILOG_WARN("form %{public}" PRId64 " is already RECYCLABLE or RECYCLED", formId);
3514 continue;
3515 }
3516 if (std::find(record.formUserUids.begin(), record.formUserUids.end(), callingUid)
3517 == record.formUserUids.end()) {
3518 HILOG_WARN("form %{public}" PRId64 " is not owned by %{public}d", formId, callingUid);
3519 continue;
3520 }
3521
3522 record.recycleStatus = RecycleStatus::RECYCLABLE;
3523 FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3524 validFormIds.emplace_back(matchedFormId);
3525 HILOG_INFO("set %{public}" PRId64 " recyclable", formId);
3526 }
3527
3528 if (validFormIds.empty()) {
3529 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3530 }
3531
3532 return ERR_OK;
3533 }
3534
RecycleForms(const std::vector<int64_t> & formIds,const Want & want)3535 int32_t FormMgrAdapter::RecycleForms(const std::vector<int64_t> &formIds, const Want &want)
3536 {
3537 HILOG_DEBUG("called");
3538 FormRecord record;
3539 std::vector<int64_t> validFormIds;
3540 int callingUid = IPCSkeleton::GetCallingUid();
3541 for (int64_t formId : formIds) {
3542 if (formId <= 0) {
3543 HILOG_ERROR("form id is negative");
3544 continue;
3545 }
3546
3547 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3548 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3549 HILOG_WARN("form %{public}" PRId64 " not exist", formId);
3550 continue;
3551 }
3552 if (record.formTempFlag) {
3553 HILOG_WARN("form %{public}" PRId64 " is temp form", formId);
3554 continue;
3555 }
3556 if (!record.isDynamic) {
3557 HILOG_WARN("form %{public}" PRId64 " is static form", formId);
3558 continue;
3559 }
3560 if (record.uiSyntax != FormType::ETS) {
3561 HILOG_WARN("form %{public}" PRId64 " is not ETS form", formId);
3562 continue;
3563 }
3564 if (record.recycleStatus == RecycleStatus::RECYCLED) {
3565 HILOG_WARN("form %{public}" PRId64 " is already RECYCLED", formId);
3566 continue;
3567 }
3568 if (std::find(record.formUserUids.begin(), record.formUserUids.end(), callingUid)
3569 == record.formUserUids.end()) {
3570 HILOG_WARN("form %{public}" PRId64 " is not owned by %{public}d", formId, callingUid);
3571 continue;
3572 }
3573
3574 record.recycleStatus = RecycleStatus::RECYCLABLE;
3575 FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3576 validFormIds.emplace_back(matchedFormId);
3577 HILOG_INFO("set %{public}" PRId64 " recyclable", formId);
3578 }
3579
3580 if (validFormIds.empty()) {
3581 HILOG_WARN("validFormIds is empty");
3582 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3583 }
3584
3585 FormDataMgr::GetInstance().RecycleForms(validFormIds, callingUid, want);
3586 return ERR_OK;
3587 }
3588
RecoverForms(const std::vector<int64_t> & formIds,const Want & want)3589 int32_t FormMgrAdapter::RecoverForms(const std::vector<int64_t> &formIds, const Want &want)
3590 {
3591 HILOG_DEBUG("called.");
3592 FormRecord record;
3593 std::vector<int64_t> validFormIds;
3594 int callingUid = IPCSkeleton::GetCallingUid();
3595 std::string bundleName;
3596 for (int64_t formId : formIds) {
3597 if (formId <= 0) {
3598 HILOG_ERROR("form id is negative");
3599 continue;
3600 }
3601
3602 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3603 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3604 HILOG_WARN("form %{public}" PRId64 " not exist", formId);
3605 continue;
3606 }
3607 if (record.recycleStatus == RecycleStatus::RECYCLABLE) {
3608 HILOG_WARN("form %{public}" PRId64 " is RECYCLABLE, set it to NON_RECYCLABLE", formId);
3609 FormTaskMgr::GetInstance().CancelDelayTask(std::make_pair((int64_t)TaskType::RECYCLE_FORM, formId));
3610 record.recycleStatus = RecycleStatus::NON_RECYCLABLE;
3611 FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3612 continue;
3613 }
3614 if (record.recycleStatus != RecycleStatus::RECYCLED) {
3615 HILOG_WARN("form %{public}" PRId64 " is not RECYCLED", formId);
3616 continue;
3617 }
3618 if (std::find(record.formUserUids.begin(), record.formUserUids.end(), callingUid)
3619 == record.formUserUids.end()) {
3620 HILOG_WARN("form %{public}" PRId64 " is not owned by %{public}d", formId, callingUid);
3621 continue;
3622 }
3623
3624 bundleName = record.bundleName;
3625 record.recycleStatus = RecycleStatus::NON_RECYCLABLE;
3626 FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3627 validFormIds.emplace_back(matchedFormId);
3628 HILOG_INFO("set %{public}" PRId64 " recyclable", formId);
3629 }
3630
3631 if (validFormIds.empty()) {
3632 HILOG_WARN("validFormIds is empty");
3633 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3634 }
3635
3636 FormRenderMgr::GetInstance().RecoverForms(validFormIds, bundleName, want.GetParams());
3637 return ERR_OK;
3638 }
3639 } // namespace AppExecFwk
3640 } // namespace OHOS
3641