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