1 /*
2 * Copyright (c) 2022 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 #include "form_share_mgr.h"
16 #include "form_ams_helper.h"
17 #include "form_bms_helper.h"
18 #include "form_constants.h"
19 #include "form_data_mgr.h"
20 #include "form_event_handler.h"
21 #include "form_mgr_errors.h"
22 #include "form_host_interface.h"
23 #include "form_provider_interface.h"
24 #include "form_serial_queue.h"
25 #include "form_share_connection.h"
26 #include "form_supply_callback.h"
27 #include "form_util.h"
28 #include "in_process_call_wrapper.h"
29 #include "nlohmann/json.hpp"
30 #include "string_wrapper.h"
31
32 namespace OHOS {
33 namespace AppExecFwk {
34 namespace {
35 constexpr int64_t FORM_SHARE_INFO_DELAY_TIMER = 50000;
36 constexpr int64_t FORM_PACKAGE_FREE_INSTALL_TIMER = 40000;
37 constexpr const char* ACTION_SHARE_FORM = "action.form.share";
38 }
39
FormShareMgr()40 FormShareMgr::FormShareMgr()
41 {
42 HILOG_DEBUG("FormShareMgr is created");
43 };
44
~FormShareMgr()45 FormShareMgr::~FormShareMgr()
46 {
47 HILOG_DEBUG("FormShareMgr is destroyed");
48 if (eventHandler_ != nullptr) {
49 eventHandler_->UnregisterEventTimeoutObserver(shared_from_this());
50 }
51 };
52
ShareForm(int64_t formId,const std::string & deviceId,const sptr<IRemoteObject> & callerToken,int64_t requestCode)53 int32_t FormShareMgr::ShareForm(int64_t formId, const std::string &deviceId, const sptr<IRemoteObject> &callerToken,
54 int64_t requestCode)
55 {
56 HILOG_DEBUG("%{public}s called.", __func__);
57 FormRecord formRecord;
58 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
59 if (!isFormRecExist) {
60 HILOG_ERROR("form share info get formRecord failed.");
61 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
62 }
63
64 {
65 std::unique_lock<std::shared_mutex> guard(requestMapMutex_);
66 requestMap_.emplace(requestCode, callerToken);
67 }
68
69 sptr<FormShareConnection> formShareConnection = new (std::nothrow) FormShareConnection(
70 formId, formRecord.bundleName, formRecord.abilityName, deviceId, requestCode);
71 if (formShareConnection == nullptr) {
72 HILOG_ERROR("failed to create formShareConnection.");
73 return ERR_APPEXECFWK_FORM_COMMON_CODE;
74 }
75 Want want;
76 want.SetElementName(formRecord.bundleName, formRecord.abilityName);
77 want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
78 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formShareConnection);
79 if (errorCode != ERR_OK) {
80 HILOG_ERROR("ConnectServiceAbility failed.");
81 std::unique_lock<std::shared_mutex> guard(requestMapMutex_);
82 requestMap_.erase(requestCode);
83 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
84 }
85
86 return ERR_OK;
87 }
88
RecvFormShareInfoFromRemote(const FormShareInfo & info)89 int32_t FormShareMgr::RecvFormShareInfoFromRemote(const FormShareInfo &info)
90 {
91 HILOG_DEBUG("%{public}s called.", __func__);
92
93 if (serialQueue_ == nullptr) {
94 HILOG_ERROR("serialQueue_ is nullptr");
95 return ERR_APPEXECFWK_FORM_COMMON_CODE;
96 }
97
98 auto task = [info]() {
99 DelayedSingleton<FormShareMgr>::GetInstance()->HandleRecvFormShareInfoFromRemoteTask(info);
100 };
101 serialQueue_->ScheduleTask(0, task);
102
103 return ERR_OK;
104 }
105
HandleRecvFormShareInfoFromRemoteTask(const FormShareInfo & info)106 int32_t FormShareMgr::HandleRecvFormShareInfoFromRemoteTask(const FormShareInfo &info)
107 {
108 HILOG_DEBUG("%{public}s called.", __func__);
109
110 if (!CheckFormShareInfo(info)) {
111 HILOG_ERROR("form share info check failed.");
112 return ERR_APPEXECFWK_FORM_SHARE_INFO_CHECK_FAILED;
113 }
114
115 AbilityInfo abilityInfo;
116 ExtensionAbilityInfo extensionAbilityInfo;
117 int32_t userId = FormUtil::GetCurrentAccountId();
118 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(
119 ACTION_SHARE_FORM, userId, abilityInfo, extensionAbilityInfo)) {
120 HILOG_ERROR("get ability info by action failed.");
121 return ERR_APPEXECFWK_FORM_FORM_USER_NOT_EXIST;
122 }
123 if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
124 HILOG_ERROR("form user is not exist.");
125 return ERR_APPEXECFWK_FORM_FORM_USER_NOT_EXIST;
126 }
127
128 auto formShareInfoKey = MakeFormShareInfoKey(info);
129 {
130 std::unique_lock<std::shared_mutex> guard(shareInfoMapMutex_);
131 if (shareInfo_.find(formShareInfoKey) != shareInfo_.end()) {
132 HILOG_ERROR("form is sharing.");
133 return ERR_APPEXECFWK_FORM_SHARING;
134 }
135
136 shareInfo_.emplace(formShareInfoKey, info);
137 }
138 {
139 std::unique_lock<std::shared_mutex> guard(eventMapMutex_);
140 auto eventId = FormEventHandler::GetEventId();
141 eventMap_.emplace(eventId, formShareInfoKey);
142 if (eventHandler_ != nullptr) {
143 eventHandler_->ProcessEvent(MSG::FORM_SHARE_INFO_DELAY_MSG, eventId, FORM_SHARE_INFO_DELAY_TIMER);
144 }
145 }
146 auto ret = CheckFormPackage(info, formShareInfoKey);
147 if (ret == ERR_APPEXECFWK_FORM_FREE_INSTALLATION) {
148 return ERR_OK;
149 }
150 if (ret != ERR_OK) {
151 return ret;
152 }
153 StartFormUser(info);
154 return ERR_OK;
155 }
156
CheckFormPackage(const FormShareInfo & info,const std::string & formShareInfoKey)157 int32_t FormShareMgr::CheckFormPackage(const FormShareInfo &info, const std::string &formShareInfoKey)
158 {
159 if (IsExistFormPackage(info.bundleName, info.moduleName)) {
160 return ERR_OK;
161 }
162
163 if (serialQueue_ == nullptr) {
164 HILOG_ERROR("serialQueue_ is nullptr.");
165 return ERR_APPEXECFWK_FORM_COMMON_CODE;
166 }
167
168 if (eventHandler_ == nullptr) {
169 HILOG_ERROR("eventHandler_ is nullptr.");
170 return ERR_APPEXECFWK_FORM_COMMON_CODE;
171 }
172
173 std::shared_ptr<FormFreeInstallOperator> freeInstallOperator =
174 std::make_shared<FormFreeInstallOperator>(formShareInfoKey, serialQueue_);
175 auto eventId = FormEventHandler::GetEventId();
176 HILOG_DEBUG("free install operator send event, eventId:%{public}" PRId64 ", key: %{public}s",
177 eventId, formShareInfoKey.c_str());
178 eventHandler_->ProcessEvent(
179 MSG::FORM_PACKAGE_FREE_INSTALL_DELAY_MSG, eventId, FORM_PACKAGE_FREE_INSTALL_TIMER);
180
181 {
182 std::unique_lock<std::shared_mutex> guard(freeInstallMapMutex_);
183 freeInstallOperatorMap_.emplace(eventId, freeInstallOperator);
184 }
185
186 auto ret = freeInstallOperator->StartFreeInstall(info.bundleName, info.moduleName, info.abilityName);
187 if (ret != ERR_OK) {
188 HILOG_ERROR("free install failed.");
189 RemoveFormShareInfo(formShareInfoKey);
190 FinishFreeInstallTask(freeInstallOperator);
191 return ERR_APPEXECFWK_FORM_FREE_INSTALL_FAILED;
192 }
193 return ERR_APPEXECFWK_FORM_FREE_INSTALLATION;
194 }
195
CheckFormShareInfo(const FormShareInfo & info)196 bool FormShareMgr::CheckFormShareInfo(const FormShareInfo &info)
197 {
198 return !(info.bundleName.empty() ||
199 info.moduleName.empty() ||
200 info.abilityName.empty() ||
201 info.formName.empty() ||
202 info.deviceId.empty());
203 }
204
MakeFormShareInfoKey(const FormShareInfo & info)205 std::string FormShareMgr::MakeFormShareInfoKey(const FormShareInfo &info)
206 {
207 return (info.bundleName + info.moduleName + info.abilityName + info.formName);
208 }
209
MakeFormShareInfoKey(const Want & want)210 std::string FormShareMgr::MakeFormShareInfoKey(const Want &want)
211 {
212 std::string bundleName = want.GetElement().GetBundleName();
213 std::string abilityName = want.GetElement().GetAbilityName();
214 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
215 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
216 return (bundleName + moduleName + abilityName + formName);
217 }
218
StartFormUser(const FormShareInfo & info)219 void FormShareMgr::StartFormUser(const FormShareInfo &info)
220 {
221 HILOG_DEBUG("%{public}s called.", __func__);
222 AbilityInfo abilityInfo;
223 ExtensionAbilityInfo extensionAbilityInfo;
224 int32_t userId = FormUtil::GetCurrentAccountId();
225 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(
226 ACTION_SHARE_FORM, userId, abilityInfo, extensionAbilityInfo)) {
227 HILOG_ERROR("get ability info by action failed.");
228 return;
229 }
230
231 Want want;
232 if (!abilityInfo.name.empty()) {
233 want.SetElementName(abilityInfo.bundleName, abilityInfo.name);
234 } else if (!extensionAbilityInfo.name.empty()) {
235 want.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
236 } else {
237 HILOG_ERROR("form user is not exist.");
238 return;
239 }
240
241 want.SetAction(ACTION_SHARE_FORM);
242 want.SetParam(Constants::PARAM_BUNDLE_NAME_KEY, info.bundleName);
243 want.SetParam(Constants::PARAM_MODULE_NAME_KEY, info.moduleName);
244 want.SetParam(Constants::PARAM_ABILITY_NAME_KEY, info.abilityName);
245 want.SetParam(Constants::PARAM_FORM_NAME_KEY, info.formName);
246 want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, info.formTempFlag);
247 want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, info.dimensionId);
248
249 auto errorCode = FormAmsHelper::GetInstance().StartAbility(want, userId);
250 if (errorCode != ERR_OK) {
251 HILOG_ERROR("start ability failed.");
252 RemoveFormShareInfo(MakeFormShareInfoKey(info));
253 }
254 }
255
IsExistFormPackage(const std::string & bundleName,const std::string & moduleName)256 bool FormShareMgr::IsExistFormPackage(const std::string &bundleName, const std::string &moduleName)
257 {
258 HILOG_DEBUG("%{public}s called.", __func__);
259 BundleInfo bundleInfo;
260 auto userId = FormUtil::GetCurrentAccountId();
261 if (!FormBmsHelper::GetInstance().GetBundleInfo(bundleName, userId, bundleInfo)) {
262 HILOG_ERROR("get bundle info failed");
263 return false;
264 }
265
266 for (const auto &moduleInfo : bundleInfo.moduleNames) {
267 if (moduleInfo.compare(moduleName) == 0) {
268 HILOG_DEBUG("module name is exist, moduleName:%{public}s", moduleInfo.c_str());
269 return true;
270 }
271 }
272
273 HILOG_ERROR("module name is not exist, moduleName: %{public}s", moduleName.c_str());
274 return false;
275 }
276
RemoveFormShareInfo(const std::string & formShareInfoKey)277 void FormShareMgr::RemoveFormShareInfo(const std::string &formShareInfoKey)
278 {
279 HILOG_DEBUG("%{public}s called.", __func__);
280 {
281 std::unique_lock<std::shared_mutex> guard(eventMapMutex_);
282 int64_t eventId = 0;
283 for (auto iter = eventMap_.begin(); iter != eventMap_.end(); iter++) {
284 if (iter->second == formShareInfoKey) {
285 eventId = iter->first;
286 break;
287 }
288 }
289
290 if (eventId != 0) {
291 eventMap_.erase(eventId);
292 if (serialQueue_ != nullptr) {
293 serialQueue_->CancelDelayTask(std::make_pair(MSG::FORM_SHARE_INFO_DELAY_MSG, eventId));
294 }
295 }
296 }
297
298 {
299 std::unique_lock<std::shared_mutex> guard(shareInfoMapMutex_);
300 shareInfo_.erase(formShareInfoKey);
301 }
302 }
303
FinishFreeInstallTask(const std::shared_ptr<FormFreeInstallOperator> & freeInstallOperator)304 void FormShareMgr::FinishFreeInstallTask(const std::shared_ptr<FormFreeInstallOperator> &freeInstallOperator)
305 {
306 HILOG_DEBUG("%{public}s called.", __func__);
307 std::unique_lock<std::shared_mutex> guard(freeInstallMapMutex_);
308
309 int64_t eventId = 0;
310 for (auto iter = freeInstallOperatorMap_.begin(); iter != freeInstallOperatorMap_.end(); iter++) {
311 if (iter->second == freeInstallOperator) {
312 eventId = iter->first;
313 break;
314 }
315 }
316
317 if (eventId != 0) {
318 freeInstallOperatorMap_.erase(eventId);
319 if (serialQueue_ != nullptr) {
320 serialQueue_->CancelDelayTask(std::make_pair(MSG::FORM_PACKAGE_FREE_INSTALL_DELAY_MSG, eventId));
321 }
322 }
323 }
324
OnInstallFinished(const std::shared_ptr<FormFreeInstallOperator> & freeInstallOperator,int32_t resultCode,const std::string & formShareInfoKey)325 void FormShareMgr::OnInstallFinished(const std::shared_ptr<FormFreeInstallOperator> &freeInstallOperator,
326 int32_t resultCode, const std::string &formShareInfoKey)
327 {
328 HILOG_DEBUG("%{public}s called.", __func__);
329
330 FinishFreeInstallTask(freeInstallOperator);
331
332 if (resultCode != ERR_OK) {
333 HILOG_ERROR("free install failed.");
334 RemoveFormShareInfo(formShareInfoKey);
335 return;
336 }
337
338 FormShareInfo info;
339 {
340 std::shared_lock<std::shared_mutex> guard(shareInfoMapMutex_);
341 auto it = shareInfo_.find(formShareInfoKey);
342 if (it == shareInfo_.end()) {
343 HILOG_ERROR("form share info is not found.");
344 return;
345 }
346
347 it->second.isFreeInstall = true;
348 info = it->second;
349 }
350
351 StartFormUser(info);
352 }
353
HandleFormShareInfoTimeout(int64_t eventId)354 void FormShareMgr::HandleFormShareInfoTimeout(int64_t eventId)
355 {
356 HILOG_DEBUG("%{public}s called, eventId:%{public}" PRId64 "", __func__, eventId);
357
358 std::string formShareInfoKey;
359 {
360 std::unique_lock<std::shared_mutex> guard(eventMapMutex_);
361 auto it = eventMap_.find(eventId);
362 if (it == eventMap_.end()) {
363 HILOG_ERROR("event id is not find.");
364 return;
365 }
366 formShareInfoKey = it->second;
367 eventMap_.erase(eventId);
368 }
369 HILOG_DEBUG("form share info timeout, key: %{public}s", formShareInfoKey.c_str());
370
371 RemoveFormShareInfo(formShareInfoKey);
372 }
373
HandleFreeInstallTimeout(int64_t eventId)374 void FormShareMgr::HandleFreeInstallTimeout(int64_t eventId)
375 {
376 HILOG_DEBUG("%{public}s called, eventId:%{public}" PRId64 "", __func__, eventId);
377 std::unique_lock<std::shared_mutex> guard(freeInstallMapMutex_);
378 freeInstallOperatorMap_.erase(eventId);
379 }
380
AddProviderData(const Want & want,WantParams & wantParams)381 void FormShareMgr::AddProviderData(const Want &want, WantParams &wantParams)
382 {
383 HILOG_DEBUG("%{public}s called.", __func__);
384
385 auto formShareInfoKey = MakeFormShareInfoKey(want);
386 std::string deviceId;
387 std::string bundleName;
388 std::string moduleName;
389 bool isFreeInstall = false;
390 std::map<std::string, sptr<IInterface>> providerWantParams;
391 {
392 std::shared_lock<std::shared_mutex> guard(shareInfoMapMutex_);
393 auto it = shareInfo_.find(formShareInfoKey);
394 if (it == shareInfo_.end()) {
395 HILOG_DEBUG("No shared provider data.");
396 return;
397 }
398
399 providerWantParams = it->second.providerShareData.GetParams();
400 deviceId = it->second.deviceId;
401 bundleName = it->second.bundleName;
402 moduleName = it->second.moduleName;
403 isFreeInstall = it->second.isFreeInstall;
404 }
405
406 if (!wantParams.HasParam(Constants::PARAM_DEVICE_ID_KEY)) {
407 wantParams.SetParam(Constants::PARAM_DEVICE_ID_KEY, AAFwk::String::Box(deviceId));
408 }
409 for (auto iter = providerWantParams.begin(); iter != providerWantParams.end(); iter++) {
410 wantParams.SetParam(iter->first, iter->second);
411 }
412
413 if (isFreeInstall) {
414 FormBmsHelper::GetInstance().NotifyModuleNotRemovable(bundleName, moduleName);
415 HILOG_INFO("notify module not removable, bundleName: %{public}s, moduleName: %{public}s",
416 bundleName.c_str(), moduleName.c_str());
417 }
418
419 RemoveFormShareInfo(formShareInfoKey);
420 }
421
AcquireShareFormData(int64_t formId,const std::string & remoteDeviceId,const Want & want,const sptr<IRemoteObject> & remoteObject)422 void FormShareMgr::AcquireShareFormData(int64_t formId, const std::string &remoteDeviceId,
423 const Want &want, const sptr<IRemoteObject> &remoteObject)
424 {
425 HILOG_DEBUG("%{public}s called.", __func__);
426 int64_t requestCode = static_cast<int64_t>(want.GetLongParam(Constants::FORM_SHARE_REQUEST_CODE, 0));
427 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
428 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
429
430 if (formProviderProxy == nullptr) {
431 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
432 SendResponse(requestCode, ERR_APPEXECFWK_FORM_COMMON_CODE);
433 HILOG_ERROR("failed to get formProviderProxy.");
434 return;
435 }
436
437 int32_t error = formProviderProxy->AcquireShareFormData(formId, remoteDeviceId,
438 FormSupplyCallback::GetInstance(), requestCode);
439 if (error != ERR_OK) {
440 SendResponse(requestCode, error);
441 HILOG_ERROR("failed to get acquire provider form info.");
442 }
443
444 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
445 }
446
HandleProviderShareData(int64_t formId,const std::string & remoteDeviceId,const AAFwk::WantParams & wantParams,int64_t requestCode,const bool & result)447 void FormShareMgr::HandleProviderShareData(int64_t formId, const std::string &remoteDeviceId,
448 const AAFwk::WantParams &wantParams, int64_t requestCode, const bool &result)
449 {
450 HILOG_DEBUG("%{public}s called.", __func__);
451
452 FormRecord formRecord;
453 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
454 if (!isFormRecExist) {
455 HILOG_ERROR("form share info get formRecord failed.");
456 SendResponse(requestCode, ERR_APPEXECFWK_FORM_GET_INFO_FAILED);
457 return;
458 }
459
460 if (!result) {
461 HILOG_ERROR("Failed to parse shared data.");
462 SendResponse(requestCode, ERR_APPEXECFWK_FORM_COMMON_CODE);
463 return;
464 }
465
466 FormShareInfo formShareInfo;
467 formShareInfo.formId = formRecord.formId;
468 formShareInfo.formName = formRecord.formName;
469 formShareInfo.bundleName = formRecord.bundleName;
470 formShareInfo.moduleName = formRecord.moduleName;
471 formShareInfo.abilityName = formRecord.abilityName;
472 formShareInfo.formTempFlag = formRecord.formTempFlag;
473 formShareInfo.dimensionId = formRecord.specification;
474 formShareInfo.providerShareData = wantParams;
475
476 if (formDmsClient_ == nullptr) {
477 formDmsClient_ = std::make_shared<FormDistributedClient>();
478 }
479 int32_t retval = formDmsClient_->ShareForm(remoteDeviceId, formShareInfo);
480 if (retval != ERR_OK) {
481 HILOG_ERROR("failed to share form from DMS retval = %{public}d.", retval);
482 SendResponse(requestCode, ERR_APPEXECFWK_FORM_DISTRIBUTED_SCHEDULE_FAILED);
483 return;
484 }
485 SendResponse(requestCode, ERR_OK);
486 }
487
SendResponse(int64_t requestCode,int32_t result)488 void FormShareMgr::SendResponse(int64_t requestCode, int32_t result)
489 {
490 HILOG_DEBUG("FormMgrService SendResponse called, requestCode:%{public}" PRId64 " result:%{public}d",
491 requestCode, result);
492 std::unique_lock<std::shared_mutex> guard(requestMapMutex_);
493 auto iter = requestMap_.find(requestCode);
494 if (iter == requestMap_.end()) {
495 HILOG_DEBUG("No form shared request.");
496 return;
497 }
498
499 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(iter->second);
500 if (remoteFormHost == nullptr) {
501 HILOG_ERROR("failed to get form host proxy.");
502 return;
503 }
504 remoteFormHost->OnShareFormResponse(requestCode, result);
505 requestMap_.erase(requestCode);
506 }
507
IsShareForm(const Want & want)508 bool FormShareMgr::IsShareForm(const Want &want)
509 {
510 HILOG_DEBUG("%{public}s called.", __func__);
511 auto formShareInfoKey = MakeFormShareInfoKey(want);
512 HILOG_DEBUG("formShareInfoKey: %{public}s", formShareInfoKey.c_str());
513
514 std::shared_lock<std::shared_mutex> guard(shareInfoMapMutex_);
515 auto it = shareInfo_.find(formShareInfoKey);
516 if (it == shareInfo_.end()) {
517 HILOG_DEBUG("This form is not a shared form");
518 return false;
519 }
520 return true;
521 }
522
OnEventTimeoutResponse(int64_t msg,int64_t eventId)523 void FormShareMgr::OnEventTimeoutResponse(int64_t msg, int64_t eventId)
524 {
525 HILOG_DEBUG("%{public}s called.", __func__);
526 switch (msg) {
527 case MSG::FORM_SHARE_INFO_DELAY_MSG: {
528 HandleFormShareInfoTimeout(eventId);
529 break;
530 }
531 case MSG::FORM_PACKAGE_FREE_INSTALL_DELAY_MSG: {
532 HandleFreeInstallTimeout(eventId);
533 break;
534 }
535 default: {
536 break;
537 }
538 }
539 }
540 } // namespace AppExecFwk
541 } // namespace OHOS
542