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