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