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