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