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