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