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