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