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