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