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_service.h"
17
18 #include <chrono>
19 #include <ctime>
20 #include <iomanip>
21 #include <sstream>
22
23 #include "accesstoken_kit.h"
24 #include "bundle_common_event.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "fms_log_wrapper.h"
28 #include "form_ams_helper.h"
29 #include "form_bms_helper.h"
30 #include "form_bundle_forbid_mgr.h"
31 #include "form_cache_mgr.h"
32 #include "form_constants.h"
33 #include "form_data_mgr.h"
34 #include "form_data_proxy_mgr.h"
35 #include "form_db_cache.h"
36 #include "form_event_handler.h"
37 #include "form_event_report.h"
38 #include "form_info_mgr.h"
39 #include "form_mgr_adapter.h"
40 #include "form_mgr_errors.h"
41 #include "form_serial_queue.h"
42 #include "form_share_mgr.h"
43 #include "form_task_mgr.h"
44 #include "form_timer_mgr.h"
45 #include "form_trust_mgr.h"
46 #include "form_util.h"
47 #include "form_xml_parser.h"
48 #include "running_form_info.h"
49 #include "in_process_call_wrapper.h"
50 #include "ipc_skeleton.h"
51 #include "iservice_registry.h"
52 #include "mem_status_listener.h"
53 #include "os_account_manager.h"
54 #include "permission_constants.h"
55 #include "permission_verification.h"
56 #include "system_ability_definition.h"
57 #include "tokenid_kit.h"
58 #include "hisysevent.h"
59 #include "xcollie/watchdog.h"
60 #include "xcollie/xcollie.h"
61 #include "xcollie/xcollie_define.h"
62 #include "net_conn_callback_stub.h"
63 #include "net_conn_client.h"
64 #include "net_handle.h"
65 #include "form_bundle_lock_mgr.h"
66 #include "form_exempt_lock_mgr.h"
67 #include "string_wrapper.h"
68 #include "int_wrapper.h"
69 #include "want_params_wrapper.h"
70 #ifdef MEM_MGR_ENABLE
71 #include "mem_mgr_client.h"
72 #endif
73 #include "form_report.h"
74
75 #ifdef RES_SCHEDULE_ENABLE
76 #include "form_systemload_listener.h"
77 #include "res_sched_client.h"
78 #include "res_type.h"
79 #endif // RES_SCHEDULE_ENABLE
80
81 namespace OHOS {
82 namespace AppExecFwk {
83 namespace {
84 const int32_t MAIN_USER_ID = 100;
85 constexpr int MILLISECOND_WIDTH = 3;
86 constexpr char MILLISECOND_FILLCHAR = '0';
87 const int32_t API_TIME_OUT = 5;
88 const int32_t API_TIME_OUT_30S = 30;
89 const int32_t CONDITION_NETWORK = 1;
90 const long FORM_DISCON_NETWORK_CHECK_TIME = 600000; // ms
91 #ifdef RES_SCHEDULE_ENABLE
92 constexpr int32_t SYSTEMLOADLEVEL_TIMERSTOP_THRESHOLD =
93 static_cast<int32_t>(ResourceSchedule::ResType::SystemloadLevel::OVERHEATED);
94 #endif // RES_SCHEDULE_ENABLE
95 }
96 using namespace std::chrono;
97 using namespace OHOS::NetManagerStandard;
98
99 const bool REGISTER_RESULT =
100 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<FormMgrService>::GetInstance().get());
101
102 const std::string NAME_FORM_MGR_SERVICE = "FormMgrService";
103
104 const std::string FORM_MGR_SERVICE_QUEUE = "FormMgrServiceQueue";
105
106 constexpr int32_t FORM_DUMP_ARGC_MAX = 2;
107
108 constexpr int32_t FORM_CON_NET_MAX = 100;
109
110 const std::string FORM_DUMP_HELP = "options list:\n"
111 " -h, --help list available commands\n"
112 " -b, --bundle-form-info query all form infos from bundle, Un-added form info will also be dumped\n"
113 " -v, --visible query form visible infos from args like bundleName_userId_instIndex\n"
114 " -s, --storage query form storage info\n"
115 " -t, --temp query temporary form info\n"
116 " -n <bundle-name> query form info by a bundle name\n"
117 " -i <form-id> query form info by a form ID\n"
118 " -r --running query running form info\n"
119 " -a --apps-blocked query blocked app name list\n";
120
121 const std::map<std::string, FormMgrService::DumpKey> FormMgrService::dumpKeyMap_ = {
122 {"-h", FormMgrService::DumpKey::KEY_DUMP_HELP},
123 {"--help", FormMgrService::DumpKey::KEY_DUMP_HELP},
124 {"-b", FormMgrService::DumpKey::KEY_DUMP_STATIC}, // *****
125 {"--bundle-form-info", FormMgrService::DumpKey::KEY_DUMP_STATIC},
126 {"-v", FormMgrService::DumpKey::KEY_DUMP_VISIBLE},
127 {"--visible", FormMgrService::DumpKey::KEY_DUMP_VISIBLE},
128 {"-s", FormMgrService::DumpKey::KEY_DUMP_STORAGE},
129 {"--storage", FormMgrService::DumpKey::KEY_DUMP_STORAGE},
130 {"-t", FormMgrService::DumpKey::KEY_DUMP_TEMPORARY},
131 {"--temp", FormMgrService::DumpKey::KEY_DUMP_TEMPORARY},
132 {"-n", FormMgrService::DumpKey::KEY_DUMP_BY_BUNDLE_NAME},
133 {"-i", FormMgrService::DumpKey::KEY_DUMP_BY_FORM_ID},
134 {"-r", FormMgrService::DumpKey::KEY_DUMP_RUNNING},
135 {"--running", FormMgrService::DumpKey::KEY_DUMP_RUNNING},
136 {"-a", FormMgrService::DumpKey::KEY_DUMP_BLOCKED_APPS},
137 {"--apps-blocked", FormMgrService::DumpKey::KEY_DUMP_BLOCKED_APPS},
138 };
139
FormMgrService()140 FormMgrService::FormMgrService()
141 : SystemAbility(FORM_MGR_SERVICE_ID, true),
142 state_(ServiceRunningState::STATE_NOT_START),
143 serialQueue_(nullptr)
144 {
145 HILOG_INFO("call");
146 }
147
~FormMgrService()148 FormMgrService::~FormMgrService()
149 {
150 HILOG_INFO("call");
151 if (formSysEventReceiver_ != nullptr) {
152 EventFwk::CommonEventManager::UnSubscribeCommonEvent(formSysEventReceiver_);
153 formSysEventReceiver_ = nullptr;
154 FormBmsHelper::GetInstance().UnregisterBundleEventCallback();
155 }
156 #ifdef MEM_MGR_ENABLE
157 if (memStatusListener_ != nullptr) {
158 Memory::MemMgrClient::GetInstance().UnsubscribeAppState(*memStatusListener_);
159 }
160 #endif
161 }
162
163 /**
164 * @brief Check form manager service ready.
165 * @return Return true if form manager service Ready; return false otherwise.
166 */
167
CheckFMSReady()168 bool FormMgrService::CheckFMSReady()
169 {
170 if (state_ != ServiceRunningState::STATE_RUNNING) {
171 return false;
172 }
173
174 int32_t userId = FormUtil::GetCurrentAccountId();
175 if (userId == Constants::ANY_USERID) {
176 HILOG_ERROR("empty account");
177 return false;
178 }
179 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_CheckFMSReady",
180 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
181 bool result = FormInfoMgr::GetInstance().HasReloadedFormInfos();
182 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
183 return result;
184 }
185
IsSystemAppForm(const std::string & bundleName)186 bool FormMgrService::IsSystemAppForm(const std::string &bundleName)
187 {
188 HILOG_DEBUG("check %{public}s is system form.", bundleName.c_str());
189
190 std::vector<FormRecord> formRecords;
191 FormDataMgr::GetInstance().GetFormRecord(bundleName, formRecords);
192 if (formRecords.empty()) {
193 return false;
194 }
195 return formRecords.front().isSystemApp;
196 }
197
198 /**
199 * @brief Add form with want, send want to form manager service.
200 * @param formId The Id of the forms to add.
201 * @param want The want of the form to add.
202 * @param callerToken Caller ability token.
203 * @param formInfo Form info.
204 * @return Returns ERR_OK on success, others on failure.
205 */
AddForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo)206 int FormMgrService::AddForm(const int64_t formId, const Want &want,
207 const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo)
208 {
209 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
210 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
211 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
212
213 ErrCode ret = CheckFormPermission();
214 if (ret != ERR_OK) {
215 HILOG_ERROR("add form permission denied");
216 return ret;
217 }
218 ReportAddFormEvent(formId, want);
219 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_AddForm",
220 API_TIME_OUT_30S, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
221 ret = FormMgrAdapter::GetInstance().AddForm(formId, want, callerToken, formInfo);
222 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
223 return ret;
224 }
225
226 /**
227 * @brief Add form with want, send want to form manager service.
228 * @param want The want of the form to add.
229 * @param runningFormInfo Running form info.
230 * @return Returns ERR_OK on success, others on failure.
231 */
CreateForm(const Want & want,RunningFormInfo & runningFormInfo)232 int FormMgrService::CreateForm(const Want &want, RunningFormInfo &runningFormInfo)
233 {
234 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
235 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
236 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
237
238 ErrCode ret = CheckFormPermission();
239 if (ret != ERR_OK) {
240 HILOG_ERROR("create form permission denied");
241 return ret;
242 }
243 ReportAddFormEvent(0, want);
244 return FormMgrAdapter::GetInstance().CreateForm(want, runningFormInfo);
245 }
246
ReportAddFormEvent(const int64_t formId,const Want & want)247 void FormMgrService::ReportAddFormEvent(const int64_t formId, const Want &want)
248 {
249 FormEventInfo eventInfo;
250 eventInfo.formId = formId;
251 eventInfo.bundleName = want.GetElement().GetBundleName();
252 eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
253 eventInfo.abilityName = want.GetElement().GetAbilityName();
254 int ret = FormBmsHelper::GetInstance().GetCallerBundleName(eventInfo.hostBundleName);
255 if (ret != ERR_OK || eventInfo.hostBundleName.empty()) {
256 HILOG_ERROR("cannot get host bundle name by uid");
257 }
258 FormEventReport::SendFormEvent(FormEventName::ADD_FORM, HiSysEventType::BEHAVIOR, eventInfo);
259 }
260
261 /**
262 * @brief Delete forms with formIds, send formIds to form manager service.
263 * @param formId The Id of the forms to delete.
264 * @param callerToken Caller ability token.
265 * @return Returns ERR_OK on success, others on failure.
266 */
DeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)267 int FormMgrService::DeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
268 {
269 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
270 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
271 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
272
273 ErrCode ret = CheckFormPermission();
274 if (ret != ERR_OK) {
275 HILOG_ERROR("delete form permission denied");
276 return ret;
277 }
278 FormEventInfo eventInfo;
279 eventInfo.formId = formId;
280 std::vector<FormHostRecord> formHostRecords;
281 FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
282 if (formHostRecords.size() != 0) {
283 eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
284 }
285 FormEventReport::SendSecondFormEvent(FormEventName::DELETE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
286 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_DeleteForm",
287 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
288 ret = FormMgrAdapter::GetInstance().DeleteForm(formId, callerToken);
289 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
290 return ret;
291 }
292
293 /**
294 * @brief Stop rendering form.
295 * @param formId The Id of the forms to delete.
296 * @param compId The compId of the forms to delete.
297 * @return Returns ERR_OK on success, others on failure.
298 */
StopRenderingForm(const int64_t formId,const std::string & compId)299 int FormMgrService::StopRenderingForm(const int64_t formId, const std::string &compId)
300 {
301 ErrCode ret = CheckFormPermission();
302 if (ret != ERR_OK) {
303 HILOG_ERROR("delete form permission denied");
304 return ret;
305 }
306
307 ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
308 if (ret != ERR_OK) {
309 HILOG_ERROR("invalid formId or not under currentActiveUser");
310 return ret;
311 }
312 return FormMgrAdapter::GetInstance().StopRenderingForm(formId, compId);
313 }
314
315 /**
316 * @brief Release forms with formIds, send formIds to form manager service.
317 * @param formId The Id of the forms to release.
318 * @param callerToken Caller ability token.
319 * @param delCache Delete Cache or not.
320 * @return Returns ERR_OK on success, others on failure.
321 */
ReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const bool delCache)322 int FormMgrService::ReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const bool delCache)
323 {
324 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
325 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
326 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
327
328 ErrCode ret = CheckFormPermission();
329 if (ret != ERR_OK) {
330 HILOG_ERROR("release form permission denied");
331 return ret;
332 }
333 FormEventInfo eventInfo;
334 eventInfo.formId = formId;
335 FormEventReport::SendSecondFormEvent(FormEventName::RELEASE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
336
337 return FormMgrAdapter::GetInstance().ReleaseForm(formId, callerToken, delCache);
338 }
339
340 /**
341 * @brief Update form with formId, send formId to form manager service.
342 * @param formId The Id of the form to update.
343 * @param formBindingData Form binding data.
344 * @return Returns ERR_OK on success, others on failure.
345 */
UpdateForm(const int64_t formId,const FormProviderData & formBindingData)346 int FormMgrService::UpdateForm(const int64_t formId, const FormProviderData &formBindingData)
347 {
348 HILOG_DEBUG("call");
349 auto callingUid = IPCSkeleton::GetCallingUid();
350 return FormMgrAdapter::GetInstance().UpdateForm(formId, callingUid, formBindingData);
351 }
352
353 /**
354 * @brief Request form with formId and want, send formId and want to form manager service.
355 * @param formId The Id of the form to update.
356 * @param callerToken Caller ability token.
357 * @param want The want of the form to add.
358 * @return Returns ERR_OK on success, others on failure.
359 */
RequestForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const Want & want)360 int FormMgrService::RequestForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const Want &want)
361 {
362 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
363 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
364 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
365 ErrCode ret = CheckFormPermission();
366 if (ret != ERR_OK) {
367 HILOG_ERROR("request form permission denied");
368 return ret;
369 }
370 FormEventInfo eventInfo;
371 eventInfo.formId = formId;
372 eventInfo.bundleName = want.GetElement().GetBundleName();
373 eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
374 eventInfo.abilityName = want.GetElement().GetAbilityName();
375 FormEventReport::SendSecondFormEvent(FormEventName::REQUEST_FORM, HiSysEventType::BEHAVIOR, eventInfo);
376
377 return FormMgrAdapter::GetInstance().RequestForm(formId, callerToken, want);
378 }
379
380 /**
381 * @brief set next refresh time.
382 * @param formId The id of the form.
383 * @param nextTime next refresh time.
384 * @return Returns ERR_OK on success, others on failure.
385 */
SetNextRefreshTime(const int64_t formId,const int64_t nextTime)386 int FormMgrService::SetNextRefreshTime(const int64_t formId, const int64_t nextTime)
387 {
388 HILOG_DEBUG("call");
389 FormEventInfo eventInfo;
390 eventInfo.formId = formId;
391 FormEventReport::SendSecondFormEvent(
392 FormEventName::SET_NEXT_REFRESH_TIME_FORM, HiSysEventType::BEHAVIOR, eventInfo);
393
394 return FormMgrAdapter::GetInstance().SetNextRefreshTime(formId, nextTime);
395 }
396
ReleaseRenderer(int64_t formId,const std::string & compId)397 int FormMgrService::ReleaseRenderer(int64_t formId, const std::string &compId)
398 {
399 HILOG_DEBUG("call");
400 ErrCode ret = CheckFormPermission();
401 if (ret != ERR_OK) {
402 HILOG_ERROR("request form permission denied");
403 return ret;
404 }
405 return FormMgrAdapter::GetInstance().ReleaseRenderer(formId, compId);
406 }
407
RequestPublishForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId)408 ErrCode FormMgrService::RequestPublishForm(Want &want, bool withFormBindingData,
409 std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId)
410 {
411 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
412 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
413 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
414 bool isFormAgent = want.GetBoolParam(Constants::IS_FORM_AGENT, false);
415 HILOG_INFO("isFormAgent:%{public}d", isFormAgent);
416 if (isFormAgent) {
417 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_AGENT_REQUIRE_FORM);
418 if (ret != ERR_OK) {
419 HILOG_ERROR("request form permission denied");
420 return ret;
421 }
422 } else {
423 if (!CheckCallerIsSystemApp()) {
424 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
425 }
426
427 if (!CheckAcrossLocalAccountsPermission()) {
428 HILOG_ERROR("Across local accounts permission failed");
429 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
430 }
431 }
432 return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData, formId);
433 }
434
SetPublishFormResult(const int64_t formId,Constants::PublishFormResult & errorCodeInfo)435 ErrCode FormMgrService::SetPublishFormResult(const int64_t formId, Constants::PublishFormResult &errorCodeInfo)
436 {
437 HILOG_INFO("call");
438 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_REQUIRE_FORM);
439 if (ret != ERR_OK) {
440 HILOG_ERROR("request form permission denied");
441 return ret;
442 }
443 return FormMgrAdapter::GetInstance().SetPublishFormResult(formId, errorCodeInfo);
444 }
445
AcquireAddFormResult(const int64_t formId)446 ErrCode FormMgrService::AcquireAddFormResult(const int64_t formId)
447 {
448 HILOG_INFO("call");
449 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_AGENT_REQUIRE_FORM);
450 if (ret != ERR_OK) {
451 HILOG_ERROR("request form permission denied");
452 return ret;
453 }
454 return FormMgrAdapter::GetInstance().AcquireAddFormResult(formId);
455 }
456
457 /**
458 * @brief Form visible/invisible notify, send formIds to form manager service.
459 * @param formIds The Id list of the forms to notify.
460 * @param callerToken Caller ability token.
461 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
462 * @return Returns ERR_OK on success, others on failure.
463 */
NotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,const int32_t formVisibleType)464 int FormMgrService::NotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
465 const sptr<IRemoteObject> &callerToken, const int32_t formVisibleType)
466 {
467 HILOG_DEBUG("call");
468
469 ErrCode ret = CheckFormPermission();
470 if (ret != ERR_OK) {
471 HILOG_ERROR("event notify visible permission denied");
472 return ret;
473 }
474 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_NotifyWhetherVisibleForms",
475 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
476 ret = FormMgrAdapter::GetInstance().NotifyWhetherVisibleForms(formIds, callerToken, formVisibleType);
477 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
478 return ret;
479 }
480
481 /**
482 * @brief Query whether has visible form by tokenId.
483 * @param tokenId Unique identification of application.
484 * @return Returns true if has visible form, false otherwise.
485 */
HasFormVisible(const uint32_t tokenId)486 bool FormMgrService::HasFormVisible(const uint32_t tokenId)
487 {
488 HILOG_DEBUG("call");
489
490 if (!FormUtil::IsSACall()) {
491 HILOG_ERROR("query form visible with tokenid not a SACall");
492 return false;
493 }
494 return FormMgrAdapter::GetInstance().HasFormVisible(tokenId);
495 }
496
497 /**
498 * @brief temp form to normal form.
499 * @param formId The Id of the form.
500 * @param callerToken Caller ability token.
501 * @return Returns ERR_OK on success, others on failure.
502 */
CastTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)503 int FormMgrService::CastTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
504 {
505 HILOG_DEBUG("call");
506
507 ErrCode ret = CheckFormPermission();
508 if (ret != ERR_OK) {
509 HILOG_ERROR("cast temp form permission denied");
510 return ret;
511 }
512 ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
513 if (ret != ERR_OK) {
514 HILOG_ERROR("invalid formId or not under currentActiveUser");
515 return ret;
516 }
517 FormEventInfo eventInfo;
518 eventInfo.formId = formId;
519 FormEventReport::SendSecondFormEvent(FormEventName::CASTTEMP_FORM, HiSysEventType::BEHAVIOR, eventInfo);
520
521 return FormMgrAdapter::GetInstance().CastTempForm(formId, callerToken);
522 }
523
524 /**
525 * @brief lifecycle update.
526 * @param formIds formIds of host client.
527 * @param callerToken Caller ability token.
528 * @param updateType update type,enable or disable.
529 * @return Returns true on success, false on failure.
530 */
LifecycleUpdate(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool updateType)531 int FormMgrService::LifecycleUpdate(const std::vector<int64_t> &formIds,
532 const sptr<IRemoteObject> &callerToken, bool updateType)
533 {
534 HILOG_INFO("updateType:%{public}d", updateType);
535
536 ErrCode ret = CheckFormPermission();
537 if (ret != ERR_OK) {
538 HILOG_ERROR("delete form permission denied");
539 return ret;
540 }
541
542 if (updateType) {
543 return FormMgrAdapter::GetInstance().EnableUpdateForm(formIds, callerToken);
544 } else {
545 return FormMgrAdapter::GetInstance().DisableUpdateForm(formIds, callerToken);
546 }
547 }
548 /**
549 * @brief Dump all of form storage infos.
550 * @param formInfos All of form storage infos.
551 * @return Returns ERR_OK on success, others on failure.
552 */
DumpStorageFormInfos(std::string & formInfos)553 int FormMgrService::DumpStorageFormInfos(std::string &formInfos)
554 {
555 if (!CheckCallerIsSystemApp()) {
556 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
557 }
558 return FormMgrAdapter::GetInstance().DumpStorageFormInfos(formInfos);
559 }
560 /**
561 * @brief Dump form info by a bundle name.
562 * @param bundleName The bundle name of form provider.
563 * @param formInfos Form infos.
564 * @return Returns ERR_OK on success, others on failure.
565 */
DumpFormInfoByBundleName(const std::string & bundleName,std::string & formInfos)566 int FormMgrService::DumpFormInfoByBundleName(const std::string &bundleName, std::string &formInfos)
567 {
568 if (!CheckCallerIsSystemApp()) {
569 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
570 }
571 return FormMgrAdapter::GetInstance().DumpFormInfoByBundleName(bundleName, formInfos);
572 }
573 /**
574 * @brief Dump form info by a bundle name.
575 * @param formId The id of the form.
576 * @param formInfo Form info.
577 * @return Returns ERR_OK on success, others on failure.
578 */
DumpFormInfoByFormId(const std::int64_t formId,std::string & formInfo)579 int FormMgrService::DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo)
580 {
581 if (!CheckCallerIsSystemApp()) {
582 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
583 }
584 return FormMgrAdapter::GetInstance().DumpFormInfoByFormId(formId, formInfo);
585 }
586 /**
587 * @brief Dump form timer by form id.
588 * @param formId The id of the form.
589 * @param formInfo Form info.
590 * @return Returns ERR_OK on success, others on failure.
591 */
DumpFormTimerByFormId(const std::int64_t formId,std::string & isTimingService)592 int FormMgrService::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService)
593 {
594 if (!CheckCallerIsSystemApp()) {
595 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
596 }
597 return FormMgrAdapter::GetInstance().DumpFormTimerByFormId(formId, isTimingService);
598 }
599
600 /**
601 * @brief Process js message event.
602 * @param formId Indicates the unique id of form.
603 * @param want information passed to supplier.
604 * @param callerToken Caller ability token.
605 * @return Returns true if execute success, false otherwise.
606 */
MessageEvent(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)607 int FormMgrService::MessageEvent(const int64_t formId, const Want &want, const sptr<IRemoteObject> &callerToken)
608 {
609 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
610 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
611 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
612 ErrCode ret = CheckFormPermission();
613 if (ret != ERR_OK) {
614 HILOG_ERROR("request form permission denied");
615 return ret;
616 }
617 ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
618 if (ret != ERR_OK) {
619 HILOG_ERROR("invalid formId or not under currentActiveUser");
620 return ret;
621 }
622 FormEventInfo eventInfo;
623 eventInfo.bundleName = want.GetElement().GetBundleName();
624 eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
625 eventInfo.abilityName = want.GetElement().GetAbilityName();
626 std::vector<FormHostRecord> formHostRecords;
627 FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
628 if (formHostRecords.size() != 0) {
629 eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
630 }
631 FormReport::GetInstance().SetDurationStartTime(formId, FormUtil::GetCurrentSteadyClockMillseconds());
632 FormEventReport::SendFormEvent(FormEventName::MESSAGE_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
633 return FormMgrAdapter::GetInstance().MessageEvent(formId, want, callerToken);
634 }
635
636 /**
637 * @brief Process js router event.
638 * @param formId Indicates the unique id of form.
639 * @param want the want of the ability to start.
640 * @param callerToken Caller ability token.
641 * @return Returns true if execute success, false otherwise.
642 */
RouterEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)643 int FormMgrService::RouterEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
644 {
645 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
646 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
647 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
648 ErrCode ret = CheckFormPermission();
649 if (ret != ERR_OK) {
650 HILOG_ERROR("request form permission denied");
651 return ret;
652 }
653 ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
654 if (ret != ERR_OK) {
655 HILOG_ERROR("invalid formId or not under currentActiveUser");
656 return ret;
657 }
658 FormEventInfo eventInfo;
659 eventInfo.formId = formId;
660 eventInfo.bundleName = want.GetElement().GetBundleName();
661 eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
662 eventInfo.abilityName = want.GetElement().GetAbilityName();
663 std::vector<FormHostRecord> formHostRecords;
664 FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
665 if (formHostRecords.size() != 0) {
666 eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
667 }
668 FormEventReport::SendFormEvent(FormEventName::ROUTE_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
669 return FormMgrAdapter::GetInstance().RouterEvent(formId, want, callerToken);
670 }
671
672 /**
673 * @brief Process Background event.
674 * @param formId Indicates the unique id of form.
675 * @param want the want of the ability to start.
676 * @param callerToken Caller ability token.
677 * @return Returns true if execute success, false otherwise.
678 */
BackgroundEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)679 int FormMgrService::BackgroundEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
680 {
681 HILOG_INFO("begin:%{public}s,publish:%{public}s,end:%{public}s, onKvDataServiceAddTime:%{public}s",
682 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
683 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
684 ErrCode ret = CheckFormPermission();
685 if (ret != ERR_OK) {
686 HILOG_ERROR("request form permission denied");
687 return ret;
688 }
689 ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
690 if (ret != ERR_OK) {
691 HILOG_ERROR("the formId is not under currentActiveUser or invalid");
692 return ret;
693 }
694 FormEventInfo eventInfo;
695 eventInfo.formId = formId;
696 eventInfo.bundleName = want.GetElement().GetBundleName();
697 eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
698 eventInfo.abilityName = want.GetElement().GetAbilityName();
699 FormEventReport::SendSecondFormEvent(FormEventName::BACKGROUND_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
700 return FormMgrAdapter::GetInstance().BackgroundEvent(formId, want, callerToken);
701 }
702
703 /**
704 * @brief Start event for the form manager service.
705 */
OnStart()706 void FormMgrService::OnStart()
707 {
708 if (state_ == ServiceRunningState::STATE_RUNNING) {
709 HILOG_WARN("start service failed since it's running");
710 return;
711 }
712
713 onStartBeginTime_ = GetCurrentDateTime();
714 HILOG_INFO("start,time:%{public}s", onStartBeginTime_.c_str());
715 ErrCode errCode = Init();
716 if (errCode != ERR_OK) {
717 HILOG_ERROR("init failed,errCode:%{public}08x", errCode);
718 return;
719 }
720
721 state_ = ServiceRunningState::STATE_RUNNING;
722 // listener for FormDataProxyMgr
723 AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
724
725 #ifdef MEM_MGR_ENABLE
726 AddSystemAbilityListener(MEMORY_MANAGER_SA_ID);
727 #endif // MEM_MGR_ENABLE
728
729 #ifdef RES_SCHEDULE_ENABLE
730 AddSystemAbilityListener(RES_SCHED_SYS_ABILITY_ID);
731 #endif // RES_SCHEDULE_ENABLE
732 onStartEndTime_ = GetCurrentDateTime();
733 HILOG_INFO("success,time:%{public}s,onKvDataServiceAddTime:%{public}s",
734 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
735 }
736 /**
737 * @brief Stop event for the form manager service.
738 */
OnStop()739 void FormMgrService::OnStop()
740 {
741 HILOG_INFO("stop");
742
743 state_ = ServiceRunningState::STATE_NOT_START;
744
745 if (serialQueue_) {
746 serialQueue_.reset();
747 }
748
749 if (handler_) {
750 handler_.reset();
751 }
752 FormAmsHelper::GetInstance().UnRegisterConfigurationObserver();
753 }
754
ReadFormConfigXML()755 ErrCode FormMgrService::ReadFormConfigXML()
756 {
757 FormXMLParser parser;
758 int32_t ret = parser.Parse();
759 if (ret != ERR_OK) {
760 HILOG_WARN("parse form config failed, use the default vaule");
761 return ret;
762 }
763 const std::map<std::string, int32_t> &configMap = parser.GetConfigMap();
764 FormDataMgr::GetInstance().SetConfigMap(configMap);
765 return ERR_OK;
766 }
767
768
SubscribeSysEventReceiver()769 void FormMgrService::SubscribeSysEventReceiver()
770 {
771 if (formSysEventReceiver_ == nullptr) {
772 EventFwk::MatchingSkills matchingSkills;
773 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_ABILITY_UPDATED);
774 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_DATA_CLEARED);
775 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED);
776 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED);
777 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SECOND_MOUNTED);
778 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED);
779 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED);
780 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
781 // init TimerReceiver
782 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
783 subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
784 formSysEventReceiver_ = std::make_shared<FormSysEventReceiver>(subscribeInfo);
785 formSysEventReceiver_->SetSerialQueue(serialQueue_);
786 EventFwk::CommonEventManager::SubscribeCommonEvent(formSysEventReceiver_);
787 }
788 }
789
790 class NetConnCallbackObserver : public NetManagerStandard::NetConnCallbackStub {
791 public:
792 explicit NetConnCallbackObserver(FormMgrService &fmservice);
793 ~NetConnCallbackObserver() override = default;
794 int32_t NetAvailable(sptr<NetManagerStandard::NetHandle> &netHandle) override;
795 int32_t NetCapabilitiesChange(sptr<NetManagerStandard::NetHandle> &netHandle,
796 const sptr<NetManagerStandard::NetAllCapabilities> &netAllCap) override;
797 int32_t NetConnectionPropertiesChange(sptr<NetManagerStandard::NetHandle> &netHandle,
798 const sptr<NetManagerStandard::NetLinkInfo> &info) override;
799 int32_t NetLost(sptr<NetManagerStandard::NetHandle> &netHandle) override;
800 int32_t NetUnavailable() override;
801 int32_t NetBlockStatusChange(sptr<NetManagerStandard::NetHandle> &netHandle, bool blocked) override;
802
803 private:
804 FormMgrService &fmservice_;
805 };
806
NetConnCallbackObserver(FormMgrService & fmservice)807 NetConnCallbackObserver::NetConnCallbackObserver(FormMgrService &fmservice):fmservice_(fmservice)
808 {
809 }
810
NetAvailable(sptr<NetManagerStandard::NetHandle> & netHandle)811 int32_t NetConnCallbackObserver::NetAvailable(sptr<NetManagerStandard::NetHandle> &netHandle)
812 {
813 HILOG_INFO("OnNetworkAvailable");
814 this->fmservice_.SetNetConnect();
815 return ERR_OK;
816 }
817
NetUnavailable()818 int32_t NetConnCallbackObserver::NetUnavailable()
819 {
820 HILOG_DEBUG("OnNetworkUnavailable");
821 return ERR_OK;
822 }
823
NetCapabilitiesChange(sptr<NetHandle> & netHandle,const sptr<NetAllCapabilities> & netAllCap)824 int32_t NetConnCallbackObserver::NetCapabilitiesChange(sptr<NetHandle> &netHandle,
825 const sptr<NetAllCapabilities> &netAllCap)
826 {
827 HILOG_DEBUG("OnNetCapabilitiesChange");
828
829 return ERR_OK;
830 }
831
NetConnectionPropertiesChange(sptr<NetHandle> & netHandle,const sptr<NetLinkInfo> & info)832 int32_t NetConnCallbackObserver::NetConnectionPropertiesChange(sptr<NetHandle> &netHandle,
833 const sptr<NetLinkInfo> &info)
834 {
835 HILOG_DEBUG("OnNetConnectionPropertiesChange");
836 return ERR_OK;
837 }
838
NetLost(sptr<NetHandle> & netHandle)839 int32_t NetConnCallbackObserver::NetLost(sptr<NetHandle> &netHandle)
840 {
841 HILOG_INFO("OnNetLost");
842 this->fmservice_.SetDisConnectTypeTime();
843 return ERR_OK;
844 }
845
NetBlockStatusChange(sptr<NetHandle> & netHandle,bool blocked)846 int32_t NetConnCallbackObserver::NetBlockStatusChange(sptr<NetHandle> &netHandle, bool blocked)
847 {
848 HILOG_DEBUG("OnNetBlockStatusChange");
849 return ERR_OK;
850 }
851
852
SubscribeNetConn()853 void FormMgrService::SubscribeNetConn()
854 {
855 HILOG_INFO("Register SubscribeNetConn begin");
856 sptr<NetConnCallbackObserver> defaultNetworkCallback_ = new (std::nothrow) NetConnCallbackObserver(*this);
857 if (defaultNetworkCallback_ == nullptr) {
858 HILOG_ERROR("new operator error.observer is nullptr");
859 return ;
860 }
861 int result = NetConnClient::GetInstance().RegisterNetConnCallback(defaultNetworkCallback_);
862 if (result == ERR_OK) {
863 HILOG_INFO("Register defaultNetworkCallback_ successful");
864 std::list<sptr<NetHandle>> netList;
865 NetConnClient::GetInstance().GetAllNets(netList);
866 if (netList.size() > 0) {
867 SetNetConnect();
868 }
869 } else {
870 HILOG_ERROR("Register defaultNetworkCallback_ failed, netConTime:%{public}d", netConTime);
871 netConTime++;
872 if (netConTime > FORM_CON_NET_MAX) {
873 HILOG_ERROR("Register defaultNetworkCallback_ failed 10 time");
874 return;
875 }
876 FormTaskMgr::GetInstance().PostConnectNetWork();
877 }
878 }
879
880 /**
881 * @brief initialization of form manager service.
882 */
Init()883 ErrCode FormMgrService::Init()
884 {
885 HILOG_INFO("call");
886 serialQueue_ = std::make_shared<FormSerialQueue>(FORM_MGR_SERVICE_QUEUE.c_str());
887 if (serialQueue_ == nullptr) {
888 HILOG_ERROR("Init failed,null serialQueue_");
889 return ERR_INVALID_OPERATION;
890 }
891
892 handler_ = std::make_shared<FormEventHandler>(serialQueue_);
893 if (handler_ == nullptr) {
894 HILOG_ERROR("init failed.null handler_");
895 return ERR_INVALID_OPERATION;
896 }
897 FormTaskMgr::GetInstance().SetSerialQueue(serialQueue_);
898 FormAmsHelper::GetInstance().SetSerialQueue(serialQueue_);
899 /* Publish service maybe failed, so we need call this function at the last,
900 * so it can't affect the TDD test program */
901 if (!Publish(DelayedSingleton<FormMgrService>::GetInstance().get())) {
902 FormEventReport::SendFormFailedEvent(FormEventName::INIT_FMS_FAILED, HiSysEventType::FAULT,
903 static_cast<int64_t>(InitFmsFiledErrorType::PUBLISH_SER_FAILED));
904 HILOG_ERROR("FormMgrService::Init Publish failed");
905 return ERR_INVALID_OPERATION;
906 }
907 onStartPublishTime_ = GetCurrentDateTime();
908 HILOG_INFO("FMS onStart publish done, time:%{public}s", onStartPublishTime_.c_str());
909
910 SubscribeSysEventReceiver();
911 #ifdef MEM_MGR_ENABLE
912 memStatusListener_ = std::make_shared<MemStatusListener>();
913 Memory::MemMgrClient::GetInstance().SubscribeAppState(*memStatusListener_);
914 #endif
915
916 FormInfoMgr::GetInstance().Start();
917 FormDbCache::GetInstance().Start();
918 FormTimerMgr::GetInstance(); // Init FormTimerMgr
919 FormCacheMgr::GetInstance().Start();
920
921 formSysEventReceiver_->InitFormInfosAndRegister();
922
923 // read param form form_config.xml.
924 if (ReadFormConfigXML() != ERR_OK) {
925 HILOG_WARN("parse form config failed, use the default vaule");
926 }
927 FormMgrAdapter::GetInstance().Init();
928 FormAmsHelper::GetInstance().RegisterConfigurationObserver();
929 SubscribeNetConn();
930 return ERR_OK;
931 }
932
CheckFormPermission(const std::string & permission)933 ErrCode FormMgrService::CheckFormPermission(const std::string &permission)
934 {
935 HILOG_DEBUG("call");
936
937 if (FormUtil::IsSACall()) {
938 return ERR_OK;
939 }
940
941 // check if system app
942 if (!CheckCallerIsSystemApp()) {
943 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
944 }
945
946 auto isCallingPerm = FormUtil::VerifyCallingPermission(permission);
947 if (!isCallingPerm) {
948 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
949 }
950
951 // checks whether the current user is inactive
952 if (!CheckAcrossLocalAccountsPermission()) {
953 HILOG_ERROR("Across local accounts permission failed");
954 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
955 }
956
957 HILOG_DEBUG("Permission verification ok");
958 return ERR_OK;
959 }
960
961 /**
962 * @brief Delete the invalid forms.
963 * @param formIds Indicates the ID of the valid forms.
964 * @param callerToken Caller ability token.
965 * @param numFormsDeleted Returns the number of the deleted forms.
966 * @return Returns ERR_OK on success, others on failure.
967 */
DeleteInvalidForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,int32_t & numFormsDeleted)968 int FormMgrService::DeleteInvalidForms(const std::vector<int64_t> &formIds,
969 const sptr<IRemoteObject> &callerToken, int32_t &numFormsDeleted)
970 {
971 HILOG_DEBUG("call");
972 ErrCode ret = CheckFormPermission();
973 if (ret != ERR_OK) {
974 HILOG_ERROR("delete form permission denied");
975 return ret;
976 }
977 FormEventInfo eventInfo;
978 FormEventReport::SendFormEvent(FormEventName::DELETE_INVALID_FORM, HiSysEventType::BEHAVIOR, eventInfo);
979 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_DeleteInvalidForms",
980 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
981 ret = FormMgrAdapter::GetInstance().DeleteInvalidForms(formIds, callerToken, numFormsDeleted);
982 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
983 return ret;
984 }
985
986 /**
987 * @brief Acquire form state info by passing a set of parameters (using Want) to the form provider.
988 * @param want Indicates a set of parameters to be transparently passed to the form provider.
989 * @param callerToken Caller ability token.
990 * @param stateInfo Returns the form's state info of the specify.
991 * @return Returns ERR_OK on success, others on failure.
992 */
AcquireFormState(const Want & want,const sptr<IRemoteObject> & callerToken,FormStateInfo & stateInfo)993 int FormMgrService::AcquireFormState(const Want &want,
994 const sptr<IRemoteObject> &callerToken, FormStateInfo &stateInfo)
995 {
996 HILOG_DEBUG("call");
997 ErrCode ret = CheckFormPermission();
998 if (ret != ERR_OK) {
999 HILOG_ERROR("acquire form state permission denied");
1000 return ret;
1001 }
1002 FormEventInfo eventInfo;
1003 eventInfo.bundleName = want.GetElement().GetBundleName();
1004 eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
1005 eventInfo.abilityName = want.GetElement().GetAbilityName();
1006 FormEventReport::SendFormEvent(FormEventName::ACQUIREFORMSTATE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
1007 return FormMgrAdapter::GetInstance().AcquireFormState(want, callerToken, stateInfo);
1008 }
1009
1010 /**
1011 * @brief Register form router event proxy.
1012 * @param formIds Indicates the ID of the forms.
1013 * @param callerToken Host client.
1014 * @return Returns ERR_OK on success, others on failure.
1015 */
RegisterFormRouterProxy(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken)1016 int FormMgrService::RegisterFormRouterProxy(const std::vector<int64_t> &formIds,
1017 const sptr<IRemoteObject> &callerToken)
1018 {
1019 HILOG_DEBUG("call");
1020 ErrCode ret = CheckFormPermission();
1021 if (ret != ERR_OK) {
1022 HILOG_ERROR("register form router proxy permission denied");
1023 return ret;
1024 }
1025 return FormMgrAdapter::GetInstance().RegisterFormRouterProxy(formIds, callerToken);
1026 }
1027
1028 /**
1029 * @brief Unregister form router event proxy.
1030 * @param formIds Indicates the ID of the forms.
1031 * @return Returns ERR_OK on success, others on failure.
1032 */
UnregisterFormRouterProxy(const std::vector<int64_t> & formIds)1033 int FormMgrService::UnregisterFormRouterProxy(const std::vector<int64_t> &formIds)
1034 {
1035 HILOG_DEBUG("call");
1036 ErrCode ret = CheckFormPermission();
1037 if (ret != ERR_OK) {
1038 HILOG_ERROR("unregister form router proxy permission denied");
1039 return ret;
1040 }
1041 return FormMgrAdapter::GetInstance().UnregisterFormRouterProxy(formIds);
1042 }
1043
1044 /**
1045 * @brief Notify the form is visible or not.
1046 * @param formIds Indicates the ID of the forms.
1047 * @param isVisible Visible or not.
1048 * @param callerToken Host client.
1049 * @return Returns ERR_OK on success, others on failure.
1050 */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)1051 int FormMgrService::NotifyFormsVisible(const std::vector<int64_t> &formIds,
1052 bool isVisible, const sptr<IRemoteObject> &callerToken)
1053 {
1054 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1055 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1056 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1057 ErrCode ret = CheckFormPermission();
1058 if (ret != ERR_OK) {
1059 HILOG_ERROR("notify form visible permission denied");
1060 return ret;
1061 }
1062 return FormMgrAdapter::GetInstance().NotifyFormsVisible(formIds, isVisible, callerToken);
1063 }
1064
NotifyFormsPrivacyProtected(const std::vector<int64_t> & formIds,bool isProtected,const sptr<IRemoteObject> & callerToken)1065 int FormMgrService::NotifyFormsPrivacyProtected(const std::vector<int64_t> &formIds, bool isProtected,
1066 const sptr<IRemoteObject> &callerToken)
1067 {
1068 HILOG_DEBUG("call");
1069 ErrCode ret = CheckFormPermission();
1070 if (ret != ERR_OK) {
1071 HILOG_ERROR("notify form is privacy protected permission denied");
1072 return ret;
1073 }
1074 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1075 }
1076
1077 /**
1078 * @brief Notify the form is enable to be updated or not.
1079 * @param formIds Indicates the ID of the forms.
1080 * @param isEnableUpdate enable update or not.
1081 * @param callerToken Host client.
1082 * @return Returns ERR_OK on success, others on failure.
1083 */
NotifyFormsEnableUpdate(const std::vector<int64_t> & formIds,bool isEnableUpdate,const sptr<IRemoteObject> & callerToken)1084 int FormMgrService::NotifyFormsEnableUpdate(const std::vector<int64_t> &formIds,
1085 bool isEnableUpdate, const sptr<IRemoteObject> &callerToken)
1086 {
1087 HILOG_DEBUG("call");
1088 ErrCode ret = CheckFormPermission();
1089 if (ret != ERR_OK) {
1090 HILOG_ERROR("notify form enable update permission denied");
1091 return ret;
1092 }
1093 return FormMgrAdapter::GetInstance().NotifyFormsEnableUpdate(formIds, isEnableUpdate, callerToken);
1094 }
1095
1096 /**
1097 * @brief Get All FormsInfo.
1098 * @param formInfos Return the form information of all forms provided.
1099 * @return Returns ERR_OK on success, others on failure.
1100 */
GetAllFormsInfo(std::vector<FormInfo> & formInfos)1101 int FormMgrService::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
1102 {
1103 HILOG_DEBUG("call");
1104 if (!CheckCallerIsSystemApp()) {
1105 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1106 }
1107 if (!CheckAcrossLocalAccountsPermission()) {
1108 HILOG_ERROR("Across local accounts permission failed");
1109 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1110 }
1111 return FormMgrAdapter::GetInstance().GetAllFormsInfo(formInfos);
1112 }
1113
1114 /**
1115 * @brief Get forms info by bundle name.
1116 * @param bundleName Application name.
1117 * @param formInfos Return the form information of the specify application name.
1118 * @return Returns ERR_OK on success, others on failure.
1119 */
GetFormsInfoByApp(std::string & bundleName,std::vector<FormInfo> & formInfos)1120 int FormMgrService::GetFormsInfoByApp(std::string &bundleName, std::vector<FormInfo> &formInfos)
1121 {
1122 HILOG_DEBUG("call");
1123 if (!CheckCallerIsSystemApp()) {
1124 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1125 }
1126 if (!CheckAcrossLocalAccountsPermission()) {
1127 HILOG_ERROR("Across local accounts permission failed");
1128 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1129 }
1130 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_GetFormsInfoByApp",
1131 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1132 ErrCode ret = FormMgrAdapter::GetInstance().GetFormsInfoByApp(bundleName, formInfos);
1133 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1134 return ret;
1135 }
1136
1137 /**
1138 * @brief Get forms info by bundle name and module name.
1139 * @param bundleName bundle name.
1140 * @param moduleName Module name of hap.
1141 * @param formInfos Return the forms information of the specify bundle name and module name.
1142 * @return Returns ERR_OK on success, others on failure.
1143 */
GetFormsInfoByModule(std::string & bundleName,std::string & moduleName,std::vector<FormInfo> & formInfos)1144 int FormMgrService::GetFormsInfoByModule(std::string &bundleName, std::string &moduleName,
1145 std::vector<FormInfo> &formInfos)
1146 {
1147 HILOG_DEBUG("call");
1148 if (!CheckCallerIsSystemApp()) {
1149 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1150 }
1151 if (!CheckAcrossLocalAccountsPermission()) {
1152 HILOG_ERROR("Across local accounts permission failed");
1153 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1154 }
1155 return FormMgrAdapter::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
1156 }
1157
GetFormsInfoByFilter(const FormInfoFilter & filter,std::vector<FormInfo> & formInfos)1158 int FormMgrService::GetFormsInfoByFilter(const FormInfoFilter &filter, std::vector<FormInfo> &formInfos)
1159 {
1160 HILOG_DEBUG("call");
1161 if (!CheckCallerIsSystemApp()) {
1162 HILOG_ERROR("Need system authority");
1163 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1164 }
1165 if (!CheckAcrossLocalAccountsPermission()) {
1166 HILOG_ERROR("Across local accounts permission failed");
1167 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1168 }
1169 return FormMgrAdapter::GetInstance().GetFormsInfoByFilter(filter, formInfos);
1170 }
1171
GetFormsInfo(const FormInfoFilter & filter,std::vector<FormInfo> & formInfos)1172 int32_t FormMgrService::GetFormsInfo(const FormInfoFilter &filter, std::vector<FormInfo> &formInfos)
1173 {
1174 HILOG_DEBUG("call");
1175 std::string callerBundleName;
1176 ErrCode ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName);
1177 if (ret != ERR_OK) {
1178 HILOG_ERROR("get host bundle name failed");
1179 return ret;
1180 }
1181 // retrieve moduleName from filter.
1182 std::string moduleName = filter.moduleName;
1183 if (moduleName.empty()) {
1184 // fulfill formInfos, the process should be the same as GetFormsInfoByApp.
1185 HILOG_INFO("flows to GetFormsInfoByAPP");
1186 return FormMgrAdapter::GetInstance().GetFormsInfoByApp(callerBundleName, formInfos);
1187 }
1188 HILOG_INFO("flows to GetFormsInfoByModule");
1189 return FormMgrAdapter::GetInstance().GetFormsInfoByModule(callerBundleName, moduleName, formInfos);
1190 }
1191
GetPublishedFormInfoById(const int64_t formId,RunningFormInfo & formInfo)1192 int32_t FormMgrService::GetPublishedFormInfoById(const int64_t formId, RunningFormInfo &formInfo)
1193 {
1194 HILOG_DEBUG("call");
1195 std::string callerBundleName;
1196 ErrCode ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName);
1197 if (ret != ERR_OK) {
1198 HILOG_ERROR("get host bundle name failed");
1199 return ret;
1200 }
1201 HILOG_INFO("flows to GetPublishedFormInfoById");
1202 return FormDataMgr::GetInstance().GetPublishedFormInfoById(callerBundleName, formInfo, formId);
1203 }
1204
GetPublishedFormInfos(std::vector<RunningFormInfo> & formInfos)1205 int32_t FormMgrService::GetPublishedFormInfos(std::vector<RunningFormInfo> &formInfos)
1206 {
1207 HILOG_DEBUG("call");
1208 std::string callerBundleName;
1209 ErrCode ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName);
1210 if (ret != ERR_OK) {
1211 HILOG_ERROR("get host bundle name failed");
1212 return ret;
1213 }
1214 HILOG_INFO("flows to GetPublishedFormInfos");
1215 return FormDataMgr::GetInstance().GetPublishedFormInfos(callerBundleName, formInfos);
1216 }
1217
AcquireFormData(int64_t formId,int64_t requestCode,const sptr<IRemoteObject> & callerToken,AAFwk::WantParams & formData)1218 int32_t FormMgrService::AcquireFormData(int64_t formId, int64_t requestCode, const sptr<IRemoteObject> &callerToken,
1219 AAFwk::WantParams &formData)
1220 {
1221 HILOG_DEBUG("call");
1222 if (formId <= 0) {
1223 HILOG_ERROR("invalid formId");
1224 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1225 }
1226
1227 if (callerToken == nullptr) {
1228 HILOG_ERROR("null callerToken");
1229 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1230 }
1231
1232 if (requestCode <= 0) {
1233 HILOG_ERROR("invalid requestCode");
1234 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1235 }
1236
1237 ErrCode ret = CheckFormPermission();
1238 if (ret != ERR_OK) {
1239 HILOG_ERROR("request form permission denied");
1240 return ret;
1241 }
1242 return FormMgrAdapter::GetInstance().AcquireFormData(formId, requestCode, callerToken, formData);
1243 }
1244
IsRequestPublishFormSupported()1245 bool FormMgrService::IsRequestPublishFormSupported()
1246 {
1247 HILOG_DEBUG("call");
1248 if (!CheckCallerIsSystemApp()) {
1249 return false;
1250 }
1251 return FormMgrAdapter::GetInstance().IsRequestPublishFormSupported();
1252 }
1253
StartAbility(const Want & want,const sptr<IRemoteObject> & callerToken)1254 int32_t FormMgrService::StartAbility(const Want &want, const sptr<IRemoteObject> &callerToken)
1255 {
1256 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1257 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1258 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1259 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_START_ABILITIES_FROM_BACKGROUND);
1260 if (ret != ERR_OK) {
1261 HILOG_ERROR("start ability check permission denied");
1262 return ret;
1263 }
1264 // check abilityName and uri to void implicit want.
1265 if (want.GetElement().GetAbilityName().empty() && want.GetUriString().empty()) {
1266 HILOG_ERROR("empty AbilityName and uri");
1267 return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
1268 }
1269 sptr<AAFwk::IAbilityManager> ams = FormAmsHelper::GetInstance().GetAbilityManager();
1270 if (ams == nullptr) {
1271 HILOG_ERROR("fail get abilityMgr");
1272 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1273 }
1274 return ams->StartAbility(want, callerToken, -1, -1);
1275 }
1276
StartAbilityByFms(const Want & want)1277 int32_t FormMgrService::StartAbilityByFms(const Want &want)
1278 {
1279 HILOG_INFO("call");
1280 return FormMgrAdapter::GetInstance().StartAbilityByFms(want);
1281 }
1282
InitFormShareMgrSerialQueue()1283 void FormMgrService::InitFormShareMgrSerialQueue()
1284 {
1285 DelayedSingleton<FormShareMgr>::GetInstance()->SetSerialQueue(serialQueue_);
1286 DelayedSingleton<FormShareMgr>::GetInstance()->SetEventHandler(handler_);
1287 }
1288
ShareForm(int64_t formId,const std::string & deviceId,const sptr<IRemoteObject> & callerToken,int64_t requestCode)1289 int32_t FormMgrService::ShareForm(int64_t formId, const std::string &deviceId, const sptr<IRemoteObject> &callerToken,
1290 int64_t requestCode)
1291 {
1292 HILOG_DEBUG("FormMgrService ShareForm call deviceId :%{public}s, formId:%{public}" PRId64 "",
1293 deviceId.c_str(), formId);
1294 if (formId <= 0) {
1295 HILOG_ERROR("invalid formId");
1296 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1297 }
1298
1299 if (deviceId.empty()) {
1300 HILOG_ERROR("empty deviceId");
1301 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1302 }
1303
1304 if (callerToken == nullptr) {
1305 HILOG_ERROR("null callerToken");
1306 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1307 }
1308
1309 if (requestCode <= 0) {
1310 HILOG_ERROR("invalid requestCode");
1311 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1312 }
1313
1314 auto ret = CheckFormPermission();
1315 if (ret != ERR_OK) {
1316 HILOG_ERROR("share form permission denied");
1317 return ret;
1318 }
1319
1320 ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
1321 if (ret != ERR_OK) {
1322 HILOG_ERROR("invalid formId or not under currentActiveUser");
1323 return ret;
1324 }
1325
1326 InitFormShareMgrSerialQueue();
1327
1328 return DelayedSingleton<FormShareMgr>::GetInstance()->ShareForm(formId, deviceId, callerToken, requestCode);
1329 }
1330
RecvFormShareInfoFromRemote(const FormShareInfo & info)1331 int32_t FormMgrService::RecvFormShareInfoFromRemote(const FormShareInfo &info)
1332 {
1333 HILOG_DEBUG("call");
1334 if (!FormUtil::IsSACall()) {
1335 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1336 }
1337
1338 InitFormShareMgrSerialQueue();
1339
1340 return DelayedSingleton<FormShareMgr>::GetInstance()->RecvFormShareInfoFromRemote(info);
1341 }
1342
Dump(int fd,const std::vector<std::u16string> & args)1343 int FormMgrService::Dump(int fd, const std::vector<std::u16string> &args)
1344 {
1345 if (!CheckFMSReady()) {
1346 HILOG_ERROR("fms not ready");
1347 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1348 }
1349
1350 std::string result;
1351 Dump(args, result);
1352 int ret = dprintf(fd, "%s\n", result.c_str());
1353 if (ret < 0) {
1354 HILOG_ERROR("format dprintf error");
1355 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1356 }
1357 return ERR_OK;
1358 }
1359
Dump(const std::vector<std::u16string> & args,std::string & result)1360 void FormMgrService::Dump(const std::vector<std::u16string> &args, std::string &result)
1361 {
1362 DumpKey key;
1363 std::string value;
1364 if (!ParseOption(args, key, value, result)) {
1365 result.append('\n' + FORM_DUMP_HELP);
1366 return;
1367 }
1368
1369 switch (key) {
1370 case DumpKey::KEY_DUMP_HELP:
1371 return HiDumpHelp(value, result);
1372 case DumpKey::KEY_DUMP_STATIC:
1373 return HiDumpStaticBundleFormInfos(value, result);
1374 case DumpKey::KEY_DUMP_STORAGE:
1375 return HiDumpStorageFormInfos(value, result);
1376 case DumpKey::KEY_DUMP_VISIBLE:
1377 return HiDumpHasFormVisible(value, result);
1378 case DumpKey::KEY_DUMP_TEMPORARY:
1379 return HiDumpTemporaryFormInfos(value, result);
1380 case DumpKey::KEY_DUMP_BY_BUNDLE_NAME:
1381 return HiDumpFormInfoByBundleName(value, result);
1382 case DumpKey::KEY_DUMP_BY_FORM_ID:
1383 return HiDumpFormInfoByFormId(value, result);
1384 case DumpKey::KEY_DUMP_RUNNING:
1385 return HiDumpFormRunningFormInfos(value, result);
1386 case DumpKey::KEY_DUMP_BLOCKED_APPS:
1387 return HiDumpFormBlockedApps(value, result);
1388 default:
1389 result = "error: unknow function.";
1390 return;
1391 }
1392 }
1393
RegisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)1394 int32_t FormMgrService::RegisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
1395 {
1396 HILOG_DEBUG("call");
1397 sptr<IBundleMgr> bundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1398 if (bundleMgr == nullptr) {
1399 HILOG_ERROR("error to get bundleMgr");
1400 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1401 }
1402 // check if system app
1403 auto callingUid = IPCSkeleton::GetCallingUid();
1404 auto isSystemApp = bundleMgr->CheckIsSystemAppByUid(callingUid);
1405 if (!isSystemApp) {
1406 HILOG_ERROR("no permission");
1407 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1408 }
1409 return FormMgrAdapter::GetInstance().RegisterPublishFormInterceptor(interceptorCallback);
1410 }
1411
UnregisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)1412 int32_t FormMgrService::UnregisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
1413 {
1414 HILOG_DEBUG("call");
1415 sptr<IBundleMgr> bundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1416 if (bundleMgr == nullptr) {
1417 HILOG_ERROR("fail get bundleMgr");
1418 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1419 }
1420 // check if system app
1421 auto callingUid = IPCSkeleton::GetCallingUid();
1422 auto isSystemApp = bundleMgr->CheckIsSystemAppByUid(callingUid);
1423 if (!isSystemApp) {
1424 HILOG_ERROR("permission denied");
1425 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1426 }
1427 return FormMgrAdapter::GetInstance().UnregisterPublishFormInterceptor(interceptorCallback);
1428 }
1429
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1430 void FormMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
1431 {
1432 #ifdef RES_SCHEDULE_ENABLE
1433 if (systemAbilityId == RES_SCHED_SYS_ABILITY_ID) {
1434 auto formSystemloadLevelCb = [this](int32_t level) { this->OnSystemloadLevel(level); };
1435 sptr<FormSystemloadListener> formSystemloadListener
1436 = new (std::nothrow) FormSystemloadListener(formSystemloadLevelCb);
1437 ResourceSchedule::ResSchedClient::GetInstance().RegisterSystemloadNotifier(formSystemloadListener);
1438 HILOG_INFO("RegisterSystemloadNotifier for Systemloadlevel change");
1439 return;
1440 }
1441 #endif // RES_SCHEDULE_ENABLE
1442
1443 #ifdef MEM_MGR_ENABLE
1444 if (systemAbilityId == MEMORY_MANAGER_SA_ID) {
1445 HILOG_INFO("MEMORY_MANAGER_SA start,SubscribeAppState");
1446 Memory::MemMgrClient::GetInstance().SubscribeAppState(*memStatusListener_);
1447 return;
1448 }
1449 #endif // MEM_MGR_ENABLE
1450
1451 if (systemAbilityId != DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID) {
1452 return;
1453 }
1454 onKvDataServiceAddTime_ = GetCurrentDateTime();
1455 FormDataProxyMgr::GetInstance().RetryFailureSubscribes();
1456 HILOG_INFO("FMS KV data service add time:%{public}s", onKvDataServiceAddTime_.c_str());
1457 }
1458
ParseOption(const std::vector<std::u16string> & args,DumpKey & key,std::string & value,std::string & result)1459 bool FormMgrService::ParseOption(const std::vector<std::u16string> &args, DumpKey &key, std::string &value,
1460 std::string &result)
1461 {
1462 auto size = args.size();
1463 if (size == 0) {
1464 result = "error: must contain arguments.";
1465 return false;
1466 }
1467
1468 if (size > FORM_DUMP_ARGC_MAX) {
1469 result = "error: arguments numer out of limit.";
1470 return false;
1471 }
1472
1473 std::string optionKey = Str16ToStr8(args[0]);
1474 auto iter = dumpKeyMap_.find(optionKey);
1475 if (iter == dumpKeyMap_.end()) {
1476 result = "error: unknown option.";
1477 return false;
1478 }
1479
1480 key = iter->second;
1481
1482 if (args.size() == FORM_DUMP_ARGC_MAX) {
1483 value = Str16ToStr8(args[1]);
1484 }
1485
1486 return true;
1487 }
1488
HiDumpFormRunningFormInfos(const std::string & args,std::string & result)1489 void FormMgrService::HiDumpFormRunningFormInfos([[maybe_unused]]const std::string &args, std::string &result)
1490 {
1491 HILOG_DEBUG("call");
1492 if (!CheckCallerIsSystemApp()) {
1493 return;
1494 }
1495 FormMgrAdapter::GetInstance().DumpFormRunningFormInfos(result);
1496 }
1497
HiDumpHelp(const std::string & args,std::string & result)1498 void FormMgrService::HiDumpHelp([[maybe_unused]] const std::string &args, std::string &result)
1499 {
1500 result = FORM_DUMP_HELP;
1501 }
1502
HiDumpStorageFormInfos(const std::string & args,std::string & result)1503 void FormMgrService::HiDumpStorageFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1504 {
1505 DumpStorageFormInfos(result);
1506 }
1507
HiDumpTemporaryFormInfos(const std::string & args,std::string & result)1508 void FormMgrService::HiDumpTemporaryFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1509 {
1510 if (!CheckCallerIsSystemApp()) {
1511 return;
1512 }
1513 FormMgrAdapter::GetInstance().DumpTemporaryFormInfos(result);
1514 }
1515
HiDumpStaticBundleFormInfos(const std::string & args,std::string & result)1516 void FormMgrService::HiDumpStaticBundleFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1517 {
1518 if (!CheckCallerIsSystemApp()) {
1519 return;
1520 }
1521 FormMgrAdapter::GetInstance().DumpStaticBundleFormInfos(result);
1522 }
1523
HiDumpFormInfoByBundleName(const std::string & args,std::string & result)1524 void FormMgrService::HiDumpFormInfoByBundleName(const std::string &args, std::string &result)
1525 {
1526 if (args.empty()) {
1527 result = "error: request a bundle name.";
1528 return;
1529 }
1530 DumpFormInfoByBundleName(args, result);
1531 }
1532
HiDumpHasFormVisible(const std::string & args,std::string & result)1533 void FormMgrService::HiDumpHasFormVisible(const std::string &args, std::string &result)
1534 {
1535 if (args.empty()) {
1536 result = "error:request bundle info like bundleName_userId_instIndex.";
1537 }
1538 FormMgrAdapter::GetInstance().DumpHasFormVisible(args, result);
1539 }
1540
HiDumpFormBlockedApps(const std::string & args,std::string & result)1541 void FormMgrService::HiDumpFormBlockedApps([[maybe_unused]] const std::string &args, std::string &result)
1542 {
1543 if (!CheckCallerIsSystemApp()) {
1544 return;
1545 }
1546 FormTrustMgr::GetInstance().GetUntrustAppNameList(result);
1547 }
1548
HiDumpFormInfoByFormId(const std::string & args,std::string & result)1549 void FormMgrService::HiDumpFormInfoByFormId(const std::string &args, std::string &result)
1550 {
1551 if (args.empty()) {
1552 result = "error: request a form ID.";
1553 return;
1554 }
1555 int64_t formId = atoll(args.c_str());
1556 if (formId == 0) {
1557 result = "error: form ID is invalid.";
1558 return;
1559 }
1560 DumpFormInfoByFormId(formId, result);
1561 }
1562
CheckCallerIsSystemApp() const1563 bool FormMgrService::CheckCallerIsSystemApp() const
1564 {
1565 auto callerTokenID = IPCSkeleton::GetCallingFullTokenID();
1566 if (!FormUtil::IsSACall() && !Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(callerTokenID)) {
1567 HILOG_ERROR("The caller not system-app,can't use system-api");
1568 return false;
1569 }
1570 return true;
1571 }
1572
GetCurrentDateTime()1573 std::string FormMgrService::GetCurrentDateTime()
1574 {
1575 auto cTimeNow = std::chrono::system_clock::now();
1576 auto microPart = std::chrono::duration_cast<std::chrono::milliseconds>(
1577 cTimeNow.time_since_epoch()).count() % 1000;
1578 std::time_t t1 = std::chrono::system_clock::to_time_t(cTimeNow);
1579 char buf[32];
1580 std::tm t2;
1581 localtime_r(&t1, &t2);
1582 (void)strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S.", &t2);
1583 std::stringstream ss;
1584 ss << buf << std::setw(MILLISECOND_WIDTH) << std::setfill(MILLISECOND_FILLCHAR) << microPart;
1585 return ss.str();
1586 }
1587
CheckAcrossLocalAccountsPermission() const1588 bool FormMgrService::CheckAcrossLocalAccountsPermission() const
1589 {
1590 // checks whether the current user is inactive
1591 int callingUid = IPCSkeleton::GetCallingUid();
1592 int32_t userId = callingUid / Constants::CALLING_UID_TRANSFORM_DIVISOR;
1593 int32_t currentActiveUserId = FormUtil::GetCurrentAccountId();
1594 if (userId != currentActiveUserId) {
1595 HILOG_INFO("currentActiveUserId:%{public}d, userId:%{public}d", currentActiveUserId, userId);
1596 bool isCallingPermAccount =
1597 FormUtil::VerifyCallingPermission(AppExecFwk::Constants::PERMISSION_INTERACT_ACROSS_LOCAL_ACCOUNTS);
1598 if (!isCallingPermAccount) {
1599 HILOG_ERROR("Across local accounts permission failed");
1600 return false;
1601 }
1602 }
1603 return true;
1604 }
1605
RegisterFormAddObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)1606 ErrCode FormMgrService::RegisterFormAddObserverByBundle(const std::string bundleName,
1607 const sptr<IRemoteObject> &callerToken)
1608 {
1609 HILOG_DEBUG("call");
1610 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1611 if (ret != ERR_OK) {
1612 HILOG_ERROR("register form add observer permission denied");
1613 return ret;
1614 }
1615 return FormMgrAdapter::GetInstance().RegisterFormAddObserverByBundle(bundleName, callerToken);
1616 }
1617
RegisterFormRemoveObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)1618 ErrCode FormMgrService::RegisterFormRemoveObserverByBundle(const std::string bundleName,
1619 const sptr<IRemoteObject> &callerToken)
1620 {
1621 HILOG_DEBUG("call");
1622 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1623 if (ret != ERR_OK) {
1624 HILOG_ERROR("register form remove observer permission denied");
1625 return ret;
1626 }
1627 return FormMgrAdapter::GetInstance().RegisterFormRemoveObserverByBundle(bundleName, callerToken);
1628 }
1629
GetFormsCount(bool isTempFormFlag,int32_t & formCount)1630 int32_t FormMgrService::GetFormsCount(bool isTempFormFlag, int32_t &formCount)
1631 {
1632 HILOG_DEBUG("call");
1633 return FormMgrAdapter::GetInstance().GetFormsCount(isTempFormFlag, formCount);
1634 }
1635
GetHostFormsCount(std::string & bundleName,int32_t & formCount)1636 int32_t FormMgrService::GetHostFormsCount(std::string &bundleName, int32_t &formCount)
1637 {
1638 HILOG_DEBUG("call");
1639 return FormMgrAdapter::GetInstance().GetHostFormsCount(bundleName, formCount);
1640 }
1641
GetRunningFormInfos(bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)1642 ErrCode FormMgrService::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
1643 {
1644 HILOG_DEBUG("call");
1645 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1646 if (ret != ERR_OK) {
1647 HILOG_ERROR("get running form infos permission denied");
1648 return ret;
1649 }
1650 return FormMgrAdapter::GetInstance().GetRunningFormInfos(isUnusedIncluded, runningFormInfos);
1651 }
1652
GetRunningFormInfosByBundleName(const std::string & bundleName,bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)1653 ErrCode FormMgrService::GetRunningFormInfosByBundleName(
1654 const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
1655 {
1656 HILOG_DEBUG("call");
1657 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1658 if (ret != ERR_OK) {
1659 HILOG_ERROR("get running form infos by bundle name permission denied");
1660 return ret;
1661 }
1662 return FormMgrAdapter::GetInstance().GetRunningFormInfosByBundleName(
1663 bundleName, isUnusedIncluded, runningFormInfos);
1664 }
1665
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)1666 ErrCode FormMgrService::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
1667 std::vector<FormInstance> &formInstances)
1668 {
1669 HILOG_DEBUG("call");
1670 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1671 if (ret != ERR_OK) {
1672 HILOG_ERROR("get form instances by filter permission denied");
1673 return ret;
1674 }
1675 return FormMgrAdapter::GetInstance().GetFormInstancesByFilter(formInstancesFilter, formInstances);
1676 }
1677
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)1678 ErrCode FormMgrService::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
1679 {
1680 HILOG_DEBUG("call");
1681 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1682 if (ret != ERR_OK) {
1683 HILOG_ERROR("get form instance by id permission denied");
1684 return ret;
1685 }
1686 return FormMgrAdapter::GetInstance().GetFormInstanceById(formId, formInstance);
1687 }
1688
GetFormInstanceById(const int64_t formId,bool isUnusedIncluded,FormInstance & formInstance)1689 ErrCode FormMgrService::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
1690 {
1691 HILOG_DEBUG("call");
1692 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1693 if (ret != ERR_OK) {
1694 HILOG_ERROR("get form instance by id permission denied");
1695 return ret;
1696 }
1697 return FormMgrAdapter::GetInstance().GetFormInstanceById(formId, isUnusedIncluded, formInstance);
1698 }
1699
RegisterAddObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)1700 ErrCode FormMgrService::RegisterAddObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
1701 {
1702 HILOG_DEBUG("call");
1703 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1704 if (ret != ERR_OK) {
1705 HILOG_ERROR("register notifyVisible or notifyInVisible observer permission denied");
1706 return ret;
1707 }
1708 return FormMgrAdapter::GetInstance().RegisterAddObserver(bundleName, callerToken);
1709 }
1710
RegisterRemoveObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)1711 ErrCode FormMgrService::RegisterRemoveObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
1712 {
1713 HILOG_DEBUG("call");
1714 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1715 if (ret != ERR_OK) {
1716 HILOG_ERROR("unregister notifyVisible or notifyInVisible observer permission denied");
1717 return ret;
1718 }
1719 return FormMgrAdapter::GetInstance().RegisterRemoveObserver(bundleName, callerToken);
1720 }
1721
UpdateProxyForm(int64_t formId,const FormProviderData & formBindingData,const std::vector<FormDataProxy> & formDataProxies)1722 ErrCode FormMgrService::UpdateProxyForm(int64_t formId, const FormProviderData &formBindingData,
1723 const std::vector<FormDataProxy> &formDataProxies)
1724 {
1725 HILOG_DEBUG("call");
1726 auto callingUid = IPCSkeleton::GetCallingUid();
1727 return FormMgrAdapter::GetInstance().UpdateForm(formId, callingUid, formBindingData, formDataProxies);
1728 }
1729
RequestPublishProxyForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId,const std::vector<FormDataProxy> & formDataProxies)1730 ErrCode FormMgrService::RequestPublishProxyForm(Want &want, bool withFormBindingData,
1731 std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId,
1732 const std::vector<FormDataProxy> &formDataProxies)
1733 {
1734 HILOG_DEBUG("call");
1735 if (!CheckCallerIsSystemApp()) {
1736 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1737 }
1738
1739 if (!CheckAcrossLocalAccountsPermission()) {
1740 HILOG_ERROR("Across local accounts permission failed");
1741 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1742 }
1743 return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData, formId,
1744 formDataProxies);
1745 }
1746
RegisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)1747 ErrCode FormMgrService::RegisterClickEventObserver(
1748 const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
1749 {
1750 HILOG_DEBUG("call");
1751 if (observer == nullptr) {
1752 HILOG_ERROR("empty callerTokenParameter");
1753 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1754 }
1755 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1756 if (ret != ERR_OK) {
1757 HILOG_ERROR("register form add observer permission denied");
1758 return ret;
1759 }
1760 return FormMgrAdapter::GetInstance().RegisterClickEventObserver(bundleName, formEventType, observer);
1761 }
1762
UnregisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)1763 ErrCode FormMgrService::UnregisterClickEventObserver(
1764 const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
1765 {
1766 HILOG_DEBUG("call");
1767 if (observer == nullptr) {
1768 HILOG_ERROR("empty callerTokenParameter");
1769 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1770 }
1771 ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1772 if (ret != ERR_OK) {
1773 HILOG_ERROR("register form add observer permission denied");
1774 return ret;
1775 }
1776 return FormMgrAdapter::GetInstance().UnregisterClickEventObserver(bundleName, formEventType, observer);
1777 }
1778
SetFormsRecyclable(const std::vector<int64_t> & formIds)1779 int32_t FormMgrService::SetFormsRecyclable(const std::vector<int64_t> &formIds)
1780 {
1781 HILOG_DEBUG("call");
1782 ErrCode ret = CheckFormPermission();
1783 if (ret != ERR_OK) {
1784 HILOG_ERROR("set forms recyclable permission denied");
1785 return ret;
1786 }
1787 return FormMgrAdapter::GetInstance().SetFormsRecyclable(formIds);
1788 }
1789
RecycleForms(const std::vector<int64_t> & formIds,const Want & want)1790 int32_t FormMgrService::RecycleForms(const std::vector<int64_t> &formIds, const Want &want)
1791 {
1792 HILOG_DEBUG("call");
1793 ErrCode ret = CheckFormPermission();
1794 if (ret != ERR_OK) {
1795 HILOG_ERROR("recycle forms permission denied");
1796 return ret;
1797 }
1798 return FormMgrAdapter::GetInstance().RecycleForms(formIds, want);
1799 }
1800
RecoverForms(const std::vector<int64_t> & formIds,const Want & want)1801 int32_t FormMgrService::RecoverForms(const std::vector<int64_t> &formIds, const Want &want)
1802 {
1803 HILOG_DEBUG("call");
1804 ErrCode ret = CheckFormPermission();
1805 if (ret != ERR_OK) {
1806 HILOG_ERROR("recover forms permission denied");
1807 return ret;
1808 }
1809 return FormMgrAdapter::GetInstance().RecoverForms(formIds, want);
1810 }
1811
UpdateFormLocation(const int64_t & formId,const int32_t & formLocation)1812 ErrCode FormMgrService::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation)
1813 {
1814 HILOG_DEBUG("call");
1815 ErrCode ret = CheckFormPermission();
1816 if (ret != ERR_OK) {
1817 HILOG_ERROR("update formLocation form infos permission denied");
1818 return ret;
1819 }
1820 return FormMgrAdapter::GetInstance().UpdateFormLocation(formId, formLocation);
1821 }
1822
BatchRefreshForms(const int32_t formRefreshType)1823 ErrCode FormMgrService::BatchRefreshForms(const int32_t formRefreshType)
1824 {
1825 HILOG_DEBUG("call");
1826 ErrCode ret = CheckFormPermission();
1827 if (ret != ERR_OK) {
1828 HILOG_ERROR("batch update forms permission denied");
1829 return ret;
1830 }
1831 return FormMgrAdapter::GetInstance().BatchRefreshForms(formRefreshType);
1832 }
1833
RequestPublishFormWithSnapshot(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId)1834 ErrCode FormMgrService::RequestPublishFormWithSnapshot(Want &want, bool withFormBindingData,
1835 std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId)
1836 {
1837 HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1838 onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1839 onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1840 if (!CheckCallerIsSystemApp()) {
1841 want.SetAction(Constants::FORM_PAGE_ACTION);
1842 want.SetParam(Constants::PARAM_PAGE_ROUTER_SERVICE_CODE,
1843 Constants::PAGE_ROUTER_SERVICE_CODE_FORM_MANAGE);
1844 const std::string key = Constants::PARMA_REQUEST_METHOD;
1845 const std::string value = Constants::OPEN_FORM_MANAGE_VIEW;
1846 want.SetParam(key, value);
1847 return FormMgrAdapter::GetInstance().StartAbilityByFms(want);
1848 }
1849 return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData,
1850 formId, {}, false);
1851 }
1852
1853 #ifdef RES_SCHEDULE_ENABLE
OnSystemloadLevel(int32_t level)1854 void FormMgrService::OnSystemloadLevel(int32_t level)
1855 {
1856 if (level >= SYSTEMLOADLEVEL_TIMERSTOP_THRESHOLD) {
1857 FormMgrAdapter::GetInstance().SetTimerTaskNeeded(false);
1858 } else {
1859 FormMgrAdapter::GetInstance().SetTimerTaskNeeded(true);
1860 }
1861 }
1862 #endif // RES_SCHEDULE_ENABLE
1863
EnableForms(const std::string bundleName,const bool enable)1864 int32_t FormMgrService::EnableForms(const std::string bundleName, const bool enable)
1865 {
1866 ErrCode ret = CheckFormPermission();
1867 if (ret != ERR_OK) {
1868 HILOG_ERROR("disable forms permission denied");
1869 return ret;
1870 }
1871 return FormMgrAdapter::GetInstance().EnableForms(bundleName, enable);
1872 }
1873
IsFormBundleForbidden(const std::string & bundleName)1874 bool FormMgrService::IsFormBundleForbidden(const std::string &bundleName)
1875 {
1876 HILOG_DEBUG("call");
1877 if (!CheckCallerIsSystemApp()) {
1878 return true;
1879 }
1880 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_IsFormBundleForbidden",
1881 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1882 bool result = FormBundleForbidMgr::GetInstance().IsBundleForbidden(bundleName);
1883 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1884 return result;
1885 }
1886
LockForms(const std::vector<FormLockInfo> & formLockInfos,LockChangeType type)1887 int32_t FormMgrService::LockForms(const std::vector<FormLockInfo> &formLockInfos, LockChangeType type)
1888 {
1889 ErrCode ret = CheckFormPermission();
1890 if (ret != ERR_OK) {
1891 HILOG_ERROR("lock forms permission denied");
1892 return ret;
1893 }
1894
1895 int32_t retErrCode = ERR_OK;
1896 for (const auto &info : formLockInfos) {
1897 if (type == LockChangeType::SWITCH_CHANGE) {
1898 ret = FormMgrAdapter::GetInstance().SwitchLockForms(info.bundleName, info.userId, info.lock);
1899 if (ret != ERR_OK) {
1900 HILOG_ERROR("SwitchLockForms failed, bundleName: %{public}s, userId: %{public}d, "
1901 "lock: %{public}d, ret: %{public}d", info.bundleName.c_str(), info.userId, info.lock, ret);
1902 retErrCode = ret;
1903 }
1904 } else {
1905 ret = FormMgrAdapter::GetInstance().ProtectLockForms(info.bundleName, info.userId, info.lock);
1906 if (ret != ERR_OK) {
1907 HILOG_ERROR("ProtectLockForms failed, bundleName: %{public}s, userId: %{public}d, "
1908 "protect: %{public}d, ret: %{public}d", info.bundleName.c_str(), info.userId, info.lock, ret);
1909 retErrCode = ret;
1910 }
1911 }
1912 }
1913 return retErrCode;
1914 }
1915
IsFormBundleProtected(const std::string & bundleName,int64_t formId)1916 bool FormMgrService::IsFormBundleProtected(const std::string &bundleName, int64_t formId)
1917 {
1918 HILOG_DEBUG("call");
1919 if (!CheckCallerIsSystemApp()) {
1920 return true;
1921 }
1922 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_IsFormBundleProtected",
1923 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1924 bool result = FormBundleLockMgr::GetInstance().IsBundleProtect(bundleName, formId);
1925 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1926 return result;
1927 }
1928
IsFormBundleExempt(int64_t formId)1929 bool FormMgrService::IsFormBundleExempt(int64_t formId)
1930 {
1931 HILOG_DEBUG("call");
1932 if (!CheckCallerIsSystemApp()) {
1933 return true;
1934 }
1935 int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_IsFormBundleExempt",
1936 API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1937 bool result = FormExemptLockMgr::GetInstance().IsExemptLock(formId);
1938 HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1939 return result;
1940 }
1941
NotifyFormLocked(const int64_t & formId,bool isLocked)1942 int32_t FormMgrService::NotifyFormLocked(const int64_t &formId, bool isLocked)
1943 {
1944 HILOG_DEBUG("call");
1945 ErrCode ret = CheckFormPermission();
1946 if (ret != ERR_OK) {
1947 HILOG_ERROR("disable forms permission denied");
1948 return ret;
1949 }
1950 return FormMgrAdapter::GetInstance().NotifyFormLocked(formId, isLocked);
1951 }
1952
UpdateFormSize(const int64_t & formId,float width,float height,float borderWidth)1953 ErrCode FormMgrService::UpdateFormSize(const int64_t &formId, float width, float height, float borderWidth)
1954 {
1955 HILOG_DEBUG("call");
1956 ErrCode ret = CheckFormPermission();
1957 if (ret != ERR_OK) {
1958 HILOG_ERROR("update formSize permission denied");
1959 return ret;
1960 }
1961 return FormMgrAdapter::GetInstance().UpdateFormSize(formId, width, height, borderWidth);
1962 }
1963
SetNetConnect()1964 void FormMgrService::SetNetConnect()
1965 {
1966 int64_t currentTime = FormUtil::GetCurrentMillisecond();
1967 if ((currentTime - lastNetLostTime_) >= FORM_DISCON_NETWORK_CHECK_TIME) {
1968 FormMgrAdapter::GetInstance().UpdateFormByCondition(CONDITION_NETWORK);
1969 }
1970 }
1971
SetDisConnectTypeTime()1972 void FormMgrService::SetDisConnectTypeTime()
1973 {
1974 lastNetLostTime_ = FormUtil::GetCurrentMillisecond();
1975 }
1976
OpenFormEditAbility(const std::string & abilityName,const int64_t & formId,bool isMainPage)1977 ErrCode FormMgrService::OpenFormEditAbility(const std::string &abilityName, const int64_t &formId, bool isMainPage)
1978 {
1979 int uid = IPCSkeleton::GetCallingUid();
1980 std::string callerName;
1981 ErrCode ret = FormBmsHelper::GetInstance().GetBundleNameByUid(uid, callerName);
1982 if (ret != ERR_OK) {
1983 HILOG_ERROR("Get bundleName by uid failed");
1984 return ret;
1985 }
1986
1987 RunningFormInfo runningFormInfo;
1988 ret = FormDataMgr::GetInstance().GetRunningFormInfosByFormId(formId, runningFormInfo);
1989 if (ret != ERR_OK) {
1990 HILOG_ERROR("Get running form info by id failed");
1991 return ret;
1992 }
1993
1994 if (runningFormInfo.bundleName != callerName) {
1995 HILOG_ERROR("check bundleName fialed");
1996 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1997 }
1998
1999 if (runningFormInfo.formVisiblity != FormVisibilityType::VISIBLE) {
2000 HILOG_ERROR("check form visibility fialed");
2001 return ERR_APPEXECFWK_FORM_NOT_TRUST;
2002 }
2003
2004 WantParams wantarams;
2005 if (isMainPage) {
2006 WantParams formInfoParam;
2007 formInfoParam.SetParam("bundleName", String::Box(runningFormInfo.bundleName));
2008 formInfoParam.SetParam("abilityName", String::Box(runningFormInfo.abilityName));
2009 formInfoParam.SetParam("moduleName", String::Box(runningFormInfo.moduleName));
2010 formInfoParam.SetParam("cardDimension", Integer::Box(runningFormInfo.dimension));
2011 formInfoParam.SetParam("cardName", String::Box(runningFormInfo.formName));
2012 formInfoParam.SetParam("cardId", String::Box(std::to_string(formId)));
2013 formInfoParam.SetParam("formConfigAbility", String::Box(abilityName));
2014 wantarams.SetParam("formInfo", WantParamWrapper::Box(formInfoParam));
2015 wantarams.SetParam(Constants::PARMA_REQUEST_METHOD, String::Box(Constants::PARMA_OPEN_FORM_EDIT_VIEW));
2016 } else {
2017 wantarams.SetParam(Constants::PARMA_REQUEST_METHOD, String::Box(Constants::PARMA_OPEN_FORM_EDIT_SEC_PAGE_VIEW));
2018 wantarams.SetParam(Constants::PARAM_SEC_PAGE_ABILITY_NAME, String::Box(abilityName));
2019 }
2020 wantarams.SetParam(Constants::PARAM_PAGE_ROUTER_SERVICE_CODE,
2021 Integer::Box(Constants::PAGE_ROUTER_SERVICE_CODE_FORM_EDIT));
2022
2023 Want want;
2024 want.SetAction(Constants::FORM_PAGE_ACTION);
2025 want.SetElementName(callerName, abilityName);
2026 want.SetParams(wantarams);
2027 return FormMgrAdapter::GetInstance().StartAbilityByFms(want);
2028 }
2029 } // namespace AppExecFwk
2030 } // namespace OHOS
2031