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