• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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