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