• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 "ability_context_impl.h"
17 
18 #include <native_engine/native_engine.h>
19 
20 #include "ability_manager_client.h"
21 #include "hitrace_meter.h"
22 #include "connection_manager.h"
23 #include "dialog_request_callback_impl.h"
24 #include "dialog_ui_extension_callback.h"
25 #include "hilog_tag_wrapper.h"
26 #include "remote_object_wrapper.h"
27 #include "request_constants.h"
28 #include "scene_board_judgement.h"
29 #include "session/host/include/zidl/session_interface.h"
30 #include "session_info.h"
31 #include "string_wrapper.h"
32 #include "ui_content.h"
33 #include "want_params_wrapper.h"
34 
35 namespace OHOS {
36 namespace AbilityRuntime {
37 const size_t AbilityContext::CONTEXT_TYPE_ID(std::hash<const char*> {} ("AbilityContext"));
38 constexpr const char* START_ABILITY_TYPE = "ABILITY_INNER_START_WITH_ACCOUNT";
39 constexpr const char* UIEXTENSION_TARGET_TYPE_KEY = "ability.want.params.uiExtensionTargetType";
40 constexpr const char* FLAG_AUTH_READ_URI_PERMISSION = "ability.want.params.uriPermissionFlag";
41 constexpr const char* DISPOSED_PROHIBIT_BACK = "APPGALLERY_APP_DISPOSED_PROHIBIT_BACK";
42 
43 struct RequestResult {
44     int32_t resultCode {0};
45     AAFwk::Want resultWant;
46     RequestDialogResultTask task;
47 };
48 
GetDeviceType() const49 Global::Resource::DeviceType AbilityContextImpl::GetDeviceType() const
50 {
51     return (stageContext_ != nullptr) ? stageContext_->GetDeviceType() : Global::Resource::DeviceType::DEVICE_PHONE;
52 }
53 
GetBaseDir() const54 std::string AbilityContextImpl::GetBaseDir() const
55 {
56     return stageContext_ ? stageContext_->GetBaseDir() : "";
57 }
58 
GetBundleCodeDir()59 std::string AbilityContextImpl::GetBundleCodeDir()
60 {
61     return stageContext_ ? stageContext_->GetBundleCodeDir() : "";
62 }
63 
GetCacheDir()64 std::string AbilityContextImpl::GetCacheDir()
65 {
66     return stageContext_ ? stageContext_->GetCacheDir() : "";
67 }
68 
GetDatabaseDir()69 std::string AbilityContextImpl::GetDatabaseDir()
70 {
71     return stageContext_ ? stageContext_->GetDatabaseDir() : "";
72 }
73 
GetSystemDatabaseDir(const std::string & groupId,bool checkExist,std::string & databaseDir)74 int32_t AbilityContextImpl::GetSystemDatabaseDir(const std::string &groupId, bool checkExist, std::string &databaseDir)
75 {
76     return stageContext_ ?
77         stageContext_->GetSystemDatabaseDir(groupId, checkExist, databaseDir) : ERR_INVALID_VALUE;
78 }
79 
GetPreferencesDir()80 std::string AbilityContextImpl::GetPreferencesDir()
81 {
82     return stageContext_ ? stageContext_->GetPreferencesDir() : "";
83 }
84 
GetSystemPreferencesDir(const std::string & groupId,bool checkExist,std::string & preferencesDir)85 int AbilityContextImpl::GetSystemPreferencesDir(const std::string &groupId, bool checkExist,
86     std::string &preferencesDir)
87 {
88     return stageContext_ ?
89         stageContext_->GetSystemPreferencesDir(groupId, checkExist, preferencesDir) : ERR_INVALID_VALUE;
90 }
91 
GetGroupDir(std::string groupId)92 std::string AbilityContextImpl::GetGroupDir(std::string groupId)
93 {
94     return stageContext_ ? stageContext_->GetGroupDir(groupId) : "";
95 }
96 
GetTempDir()97 std::string AbilityContextImpl::GetTempDir()
98 {
99     return stageContext_ ? stageContext_->GetTempDir() : "";
100 }
101 
GetResourceDir()102 std::string AbilityContextImpl::GetResourceDir()
103 {
104     return stageContext_ ? stageContext_->GetResourceDir() : "";
105 }
106 
GetFilesDir()107 std::string AbilityContextImpl::GetFilesDir()
108 {
109     return stageContext_ ? stageContext_->GetFilesDir() : "";
110 }
111 
GetDistributedFilesDir()112 std::string AbilityContextImpl::GetDistributedFilesDir()
113 {
114     return stageContext_ ? stageContext_->GetDistributedFilesDir() : "";
115 }
116 
GetCloudFileDir()117 std::string AbilityContextImpl::GetCloudFileDir()
118 {
119     return stageContext_ ? stageContext_->GetCloudFileDir() : "";
120 }
121 
IsUpdatingConfigurations()122 bool AbilityContextImpl::IsUpdatingConfigurations()
123 {
124     return stageContext_ ? stageContext_->IsUpdatingConfigurations() : false;
125 }
126 
PrintDrawnCompleted()127 bool AbilityContextImpl::PrintDrawnCompleted()
128 {
129     return stageContext_ ? stageContext_->PrintDrawnCompleted() : false;
130 }
131 
SwitchArea(int mode)132 void AbilityContextImpl::SwitchArea(int mode)
133 {
134     TAG_LOGD(AAFwkTag::CONTEXT, "mode:%{public}d", mode);
135     if (stageContext_ != nullptr) {
136         stageContext_->SwitchArea(mode);
137     }
138 }
139 
GetArea()140 int AbilityContextImpl::GetArea()
141 {
142     TAG_LOGD(AAFwkTag::CONTEXT, "called");
143     if (stageContext_ == nullptr) {
144         TAG_LOGE(AAFwkTag::CONTEXT, "null stageContext");
145         return ContextImpl::EL_DEFAULT;
146     }
147     return stageContext_->GetArea();
148 }
149 
StartAbility(const AAFwk::Want & want,int requestCode)150 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, int requestCode)
151 {
152     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
153     TAG_LOGD(AAFwkTag::CONTEXT, "called");
154     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode);
155     if (err != ERR_OK) {
156         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
157     }
158     return err;
159 }
160 
StartAbilityAsCaller(const AAFwk::Want & want,int requestCode)161 ErrCode AbilityContextImpl::StartAbilityAsCaller(const AAFwk::Want &want, int requestCode)
162 {
163     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
164     TAG_LOGD(AAFwkTag::CONTEXT, "called");
165     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want, token_, nullptr, requestCode);
166     if (err != ERR_OK) {
167         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
168     }
169     return err;
170 }
171 
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,int requestCode)172 ErrCode AbilityContextImpl::StartAbilityWithAccount(const AAFwk::Want& want, int accountId, int requestCode)
173 {
174     TAG_LOGD(AAFwkTag::CONTEXT, "called");
175     (const_cast<Want &>(want)).SetParam(START_ABILITY_TYPE, true);
176     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
177     if (err != ERR_OK) {
178         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
179     }
180     return err;
181 }
182 
StartAbility(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode)183 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, const AAFwk::StartOptions& startOptions,
184     int requestCode)
185 {
186     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
187     TAG_LOGD(AAFwkTag::CONTEXT, "called");
188     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
189     if (err != ERR_OK) {
190         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
191     }
192     return err;
193 }
194 
StartAbilityAsCaller(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode)195 ErrCode AbilityContextImpl::StartAbilityAsCaller(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions,
196     int requestCode)
197 {
198     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
199     TAG_LOGD(AAFwkTag::CONTEXT, "called");
200     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want,
201         startOptions, token_, nullptr, requestCode);
202     if (err != ERR_OK) {
203         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
204     }
205     return err;
206 }
207 
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode)208 ErrCode AbilityContextImpl::StartAbilityWithAccount(
209     const AAFwk::Want& want, int accountId, const AAFwk::StartOptions& startOptions, int requestCode)
210 {
211     TAG_LOGD(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
212         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
213     (const_cast<Want &>(want)).SetParam(START_ABILITY_TYPE, true);
214     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
215         want, startOptions, token_, requestCode, accountId);
216     if (err != ERR_OK) {
217         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
218     }
219     return err;
220 }
221 
StartAbilityForResult(const AAFwk::Want & want,int requestCode,RuntimeTask && task)222 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, int requestCode, RuntimeTask&& task)
223 {
224     TAG_LOGD(AAFwkTag::CONTEXT, "called");
225     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
226     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, -1);
227     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
228         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
229         OnAbilityResultInner(requestCode, err, want);
230     }
231     return err;
232 }
233 
StartAbilityForResultWithAccount(const AAFwk::Want & want,const int accountId,int requestCode,RuntimeTask && task)234 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
235     const AAFwk::Want& want, const int accountId, int requestCode, RuntimeTask&& task)
236 {
237     TAG_LOGD(AAFwkTag::CONTEXT, "accountId:%{private}d", accountId);
238     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
239     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
240     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
241         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
242         OnAbilityResultInner(requestCode, err, want);
243     }
244     return err;
245 }
246 
StartAbilityForResult(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)247 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, const AAFwk::StartOptions& startOptions,
248     int requestCode, RuntimeTask&& task)
249 {
250     TAG_LOGD(AAFwkTag::CONTEXT, "called");
251     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
252     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
253     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
254         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
255         OnAbilityResultInner(requestCode, err, want);
256     }
257     return err;
258 }
259 
StartAbilityForResultWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)260 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
261     const AAFwk::Want& want, int accountId, const AAFwk::StartOptions& startOptions,
262     int requestCode, RuntimeTask&& task)
263 {
264     TAG_LOGD(AAFwkTag::CONTEXT, "called");
265     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
266     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
267         want, startOptions, token_, requestCode, accountId);
268     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
269         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
270         OnAbilityResultInner(requestCode, err, want);
271     }
272     return err;
273 }
274 
StartServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)275 ErrCode AbilityContextImpl::StartServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
276 {
277     TAG_LOGI(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
278         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
279     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
280         want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
281     if (err != ERR_OK) {
282         TAG_LOGE(AAFwkTag::CONTEXT, "failed:%{public}d", err);
283     }
284     return err;
285 }
286 
StopServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)287 ErrCode AbilityContextImpl::StopServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
288 {
289     TAG_LOGD(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
290         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
291     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StopExtensionAbility(
292         want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
293     if (err != ERR_OK) {
294         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
295     }
296     return err;
297 }
298 
TerminateAbilityWithResult(const AAFwk::Want & want,int resultCode)299 ErrCode AbilityContextImpl::TerminateAbilityWithResult(const AAFwk::Want& want, int resultCode)
300 {
301     isTerminating_.store(true);
302     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
303         auto sessionToken = GetSessionToken();
304         if (sessionToken == nullptr) {
305             return ERR_INVALID_VALUE;
306         }
307         sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
308         info->want = want;
309         info->resultCode = resultCode;
310         auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
311         TAG_LOGI(AAFwkTag::CONTEXT, "scb call, TerminateAbilityWithResult");
312         ErrCode ret = static_cast<int32_t>(ifaceSessionToken->TerminateSession(info));
313         if (ret != ERR_OK) {
314             TAG_LOGE(AAFwkTag::CONTEXT, "scb call, TerminateAbilityWithResult err: %{public}d", ret);
315         }
316         return ret;
317     } else {
318         ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, resultCode, &want);
319         TAG_LOGI(AAFwkTag::CONTEXT, "ret=%{public}d", err);
320         return err;
321     }
322 }
323 
BackToCallerAbilityWithResult(const AAFwk::Want & want,int resultCode,int64_t requestCode)324 ErrCode AbilityContextImpl::BackToCallerAbilityWithResult(const AAFwk::Want& want, int resultCode, int64_t requestCode)
325 {
326     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->BackToCallerAbilityWithResult(
327         token_, resultCode, &want, requestCode);
328     TAG_LOGI(AAFwkTag::CONTEXT, "ret:%{public}d", err);
329     return static_cast<int32_t>(err);
330 }
331 
SetWeakSessionToken(const wptr<IRemoteObject> & sessionToken)332 void AbilityContextImpl::SetWeakSessionToken(const wptr<IRemoteObject>& sessionToken)
333 {
334     std::lock_guard lock(sessionTokenMutex_);
335     TAG_LOGD(AAFwkTag::CONTEXT, "called");
336     sessionToken_ = sessionToken;
337 }
338 
GetSessionToken()339 sptr<IRemoteObject> AbilityContextImpl::GetSessionToken()
340 {
341     std::lock_guard lock(sessionTokenMutex_);
342     TAG_LOGD(AAFwkTag::CONTEXT, "called");
343     return sessionToken_.promote();
344 }
345 
SetAbilityRecordId(int32_t abilityRecordId)346 void AbilityContextImpl::SetAbilityRecordId(int32_t abilityRecordId)
347 {
348     TAG_LOGD(AAFwkTag::CONTEXT, "abilityRecordId: %{public}d", abilityRecordId);
349     abilityRecordId_ = abilityRecordId;
350 }
351 
GetAbilityRecordId()352 int32_t AbilityContextImpl::GetAbilityRecordId()
353 {
354     return abilityRecordId_;
355 }
356 
OnAbilityResult(int requestCode,int resultCode,const AAFwk::Want & resultData)357 void AbilityContextImpl::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want& resultData)
358 {
359     TAG_LOGD(AAFwkTag::CONTEXT, "called");
360     auto callback = resultCallbacks_.find(requestCode);
361     if (callback != resultCallbacks_.end()) {
362         if (callback->second) {
363             callback->second(resultCode, resultData, false);
364         }
365         resultCallbacks_.erase(requestCode);
366     }
367 }
368 
OnAbilityResultInner(int requestCode,int resultCode,const AAFwk::Want & resultData)369 void AbilityContextImpl::OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want& resultData)
370 {
371     TAG_LOGD(AAFwkTag::CONTEXT, "called");
372     auto callback = resultCallbacks_.find(requestCode);
373     if (callback != resultCallbacks_.end()) {
374         if (callback->second) {
375             callback->second(resultCode, resultData, true);
376         }
377         resultCallbacks_.erase(requestCode);
378     }
379 }
380 
ConnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)381 ErrCode AbilityContextImpl::ConnectAbility(const AAFwk::Want& want, const sptr<AbilityConnectCallback>& connectCallback)
382 {
383     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
384     TAG_LOGI(AAFwkTag::CONTEXT,
385         "ConnectAbility called, caller:%{public}s, target:%{public}s",
386         abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str(), want.GetElement().GetAbilityName().c_str());
387     ErrCode ret = ConnectionManager::GetInstance().ConnectAbility(token_, want, connectCallback);
388     if (ret != ERR_OK) {
389         TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret:%{public}d", ret);
390     }
391     return ret;
392 }
393 
ConnectAbilityWithAccount(const AAFwk::Want & want,int accountId,const sptr<AbilityConnectCallback> & connectCallback)394 ErrCode AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want& want, int accountId,
395     const sptr<AbilityConnectCallback>& connectCallback)
396 {
397     TAG_LOGD(AAFwkTag::CONTEXT, "called");
398     ErrCode ret =
399         ConnectionManager::GetInstance().ConnectAbilityWithAccount(token_, want, accountId, connectCallback);
400     if (ret != ERR_OK) {
401         TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret:%{public}d", ret);
402     }
403     return ret;
404 }
405 
DisconnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback,int32_t accountId)406 void AbilityContextImpl::DisconnectAbility(const AAFwk::Want& want,
407     const sptr<AbilityConnectCallback>& connectCallback, int32_t accountId)
408 {
409     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
410     TAG_LOGI(AAFwkTag::CONTEXT, "DisconnectAbility called, caller:%{public}s, target:%{public}s",
411         abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str(), want.GetElement().GetAbilityName().c_str());
412     ErrCode ret =
413         ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback, accountId);
414     if (ret != ERR_OK) {
415         TAG_LOGE(AAFwkTag::CONTEXT, "error, ret=%{public}d", ret);
416     }
417 }
418 
GetBundleName() const419 std::string AbilityContextImpl::GetBundleName() const
420 {
421     return stageContext_ ? stageContext_->GetBundleName() : "";
422 }
423 
GetApplicationInfo() const424 std::shared_ptr<AppExecFwk::ApplicationInfo> AbilityContextImpl::GetApplicationInfo() const
425 {
426     return stageContext_ ? stageContext_->GetApplicationInfo() : nullptr;
427 }
428 
GetBundleCodePath() const429 std::string AbilityContextImpl::GetBundleCodePath() const
430 {
431     return stageContext_ ? stageContext_->GetBundleCodePath() : "";
432 }
433 
GetHapModuleInfo() const434 std::shared_ptr<AppExecFwk::HapModuleInfo> AbilityContextImpl::GetHapModuleInfo() const
435 {
436     return stageContext_ ? stageContext_->GetHapModuleInfo() : nullptr;
437 }
438 
GetResourceManager() const439 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::GetResourceManager() const
440 {
441     return stageContext_ ? stageContext_->GetResourceManager() : nullptr;
442 }
443 
CreateBundleContext(const std::string & bundleName)444 std::shared_ptr<Context> AbilityContextImpl::CreateBundleContext(const std::string& bundleName)
445 {
446     return stageContext_ ? stageContext_->CreateBundleContext(bundleName) : nullptr;
447 }
448 
CreateModuleContext(const std::string & moduleName)449 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& moduleName)
450 {
451     return stageContext_ ? stageContext_->CreateModuleContext(moduleName) : nullptr;
452 }
453 
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)454 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& bundleName,
455     const std::string& moduleName)
456 {
457     return stageContext_ ? stageContext_->CreateModuleContext(bundleName, moduleName) : nullptr;
458 }
459 
CreateModuleResourceManager(const std::string & bundleName,const std::string & moduleName)460 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::CreateModuleResourceManager(
461     const std::string &bundleName, const std::string &moduleName)
462 {
463     return stageContext_ ? stageContext_->CreateModuleResourceManager(bundleName, moduleName) : nullptr;
464 }
465 
CreateSystemHspModuleResourceManager(const std::string & bundleName,const std::string & moduleName,std::shared_ptr<Global::Resource::ResourceManager> & resourceManager)466 int32_t AbilityContextImpl::CreateSystemHspModuleResourceManager(const std::string &bundleName,
467     const std::string &moduleName, std::shared_ptr<Global::Resource::ResourceManager> &resourceManager)
468 {
469     return stageContext_ ? stageContext_->CreateSystemHspModuleResourceManager(bundleName, moduleName, resourceManager)
470         : ERR_INVALID_VALUE;
471 }
472 
SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> & abilityInfo)473 void AbilityContextImpl::SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo>& abilityInfo)
474 {
475     abilityInfo_ = abilityInfo;
476 }
477 
GetAbilityInfo() const478 std::shared_ptr<AppExecFwk::AbilityInfo> AbilityContextImpl::GetAbilityInfo() const
479 {
480     return abilityInfo_;
481 }
482 
SetStageContext(const std::shared_ptr<AbilityRuntime::Context> & stageContext)483 void AbilityContextImpl::SetStageContext(const std::shared_ptr<AbilityRuntime::Context>& stageContext)
484 {
485     stageContext_ = stageContext;
486 }
487 
SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> & config)488 void AbilityContextImpl::SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& config)
489 {
490     config_ = config;
491 }
492 
GetConfiguration() const493 std::shared_ptr<AppExecFwk::Configuration> AbilityContextImpl::GetConfiguration() const
494 {
495     return config_;
496 }
497 
MinimizeAbility(bool fromUser)498 void AbilityContextImpl::MinimizeAbility(bool fromUser)
499 {
500     TAG_LOGD(AAFwkTag::CONTEXT, "called");
501     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(token_, fromUser);
502     if (err != ERR_OK) {
503         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
504     }
505 }
506 
OnBackPressedCallBack(bool & needMoveToBackground)507 ErrCode AbilityContextImpl::OnBackPressedCallBack(bool &needMoveToBackground)
508 {
509     TAG_LOGD(AAFwkTag::CONTEXT, "call");
510     auto abilityCallback = abilityCallback_.lock();
511     if (abilityCallback == nullptr) {
512         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
513         return ERR_INVALID_VALUE;
514     }
515     needMoveToBackground = abilityCallback->OnBackPress();
516     return ERR_OK;
517 }
518 
MoveAbilityToBackground()519 ErrCode AbilityContextImpl::MoveAbilityToBackground()
520 {
521     TAG_LOGD(AAFwkTag::CONTEXT, "called");
522     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveAbilityToBackground(token_);
523     if (err != ERR_OK) {
524         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
525     }
526     return err;
527 }
528 
MoveUIAbilityToBackground()529 ErrCode AbilityContextImpl::MoveUIAbilityToBackground()
530 {
531     TAG_LOGD(AAFwkTag::CONTEXT, "call");
532     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveUIAbilityToBackground(token_);
533     if (err != ERR_OK) {
534         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
535     }
536     return err;
537 }
538 
TerminateSelf()539 ErrCode AbilityContextImpl::TerminateSelf()
540 {
541     TAG_LOGI(AAFwkTag::CONTEXT, "called");
542     isTerminating_.store(true);
543     auto sessionToken = GetSessionToken();
544     if (sessionToken == nullptr) {
545         TAG_LOGW(AAFwkTag::CONTEXT, "null sessionToken");
546     }
547 
548     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionToken) {
549         TAG_LOGI(AAFwkTag::CONTEXT, "scb call, TerminateSelf: %{public}s",
550             abilityInfo_ ? abilityInfo_->name.c_str() : "");
551         AAFwk::Want resultWant;
552         sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
553         info->want = resultWant;
554         info->resultCode = -1;
555         auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
556         ErrCode ret = static_cast<int32_t>(ifaceSessionToken->TerminateSession(info));
557         if (ret != ERR_OK) {
558             TAG_LOGE(AAFwkTag::CONTEXT, "scb call, TerminateSelf err: %{public}d", ret);
559         }
560         return ret;
561     } else {
562         AAFwk::Want resultWant;
563         ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, -1, &resultWant);
564         if (err != ERR_OK) {
565             TAG_LOGE(AAFwkTag::CONTEXT, "terminateSelf failed %{public}d", err);
566         }
567         return err;
568     }
569 }
570 
CloseAbility()571 ErrCode AbilityContextImpl::CloseAbility()
572 {
573     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
574     TAG_LOGD(AAFwkTag::CONTEXT, "called");
575     isTerminating_.store(true);
576     AAFwk::Want resultWant;
577     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->CloseAbility(token_, -1, &resultWant);
578     if (err != ERR_OK) {
579         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
580     }
581     return err;
582 }
583 
GetToken()584 sptr<IRemoteObject> AbilityContextImpl::GetToken()
585 {
586     return token_;
587 }
588 
RestoreWindowStage(napi_env env,napi_value contentStorage)589 ErrCode AbilityContextImpl::RestoreWindowStage(napi_env env, napi_value contentStorage)
590 {
591     TAG_LOGD(AAFwkTag::CONTEXT, "called");
592     napi_ref value = nullptr;
593     napi_create_reference(env, contentStorage, 1, &value);
594     contentStorage_ = std::unique_ptr<NativeReference>(reinterpret_cast<NativeReference*>(value));
595     return ERR_OK;
596 }
597 
StartAbilityByCall(const AAFwk::Want & want,const std::shared_ptr<CallerCallBack> & callback,int32_t accountId)598 ErrCode AbilityContextImpl::StartAbilityByCall(
599     const AAFwk::Want& want, const std::shared_ptr<CallerCallBack>& callback, int32_t accountId)
600 {
601     if (localCallContainer_ == nullptr) {
602         localCallContainer_ = std::make_shared<LocalCallContainer>();
603         if (localCallContainer_ == nullptr) {
604             TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
605             return ERR_INVALID_VALUE;
606         }
607     }
608     return localCallContainer_->StartAbilityByCallInner(want, callback, token_, accountId);
609 }
610 
ReleaseCall(const std::shared_ptr<CallerCallBack> & callback)611 ErrCode AbilityContextImpl::ReleaseCall(const std::shared_ptr<CallerCallBack>& callback)
612 {
613     TAG_LOGD(AAFwkTag::CONTEXT, "called");
614     if (localCallContainer_ == nullptr) {
615         TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
616         return ERR_INVALID_VALUE;
617     }
618     return localCallContainer_->ReleaseCall(callback);
619 }
620 
ClearFailedCallConnection(const std::shared_ptr<CallerCallBack> & callback)621 void AbilityContextImpl::ClearFailedCallConnection(const std::shared_ptr<CallerCallBack>& callback)
622 {
623     TAG_LOGD(AAFwkTag::CONTEXT, "called");
624     if (localCallContainer_ == nullptr) {
625         TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
626         return;
627     }
628     localCallContainer_->ClearFailedCallConnection(callback);
629 }
630 
RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)631 void AbilityContextImpl::RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)
632 {
633     TAG_LOGD(AAFwkTag::CONTEXT, "called");
634     abilityCallback_ = abilityCallback;
635 }
636 
RequestDialogService(napi_env env,AAFwk::Want & want,RequestDialogResultTask && task)637 ErrCode AbilityContextImpl::RequestDialogService(napi_env env, AAFwk::Want &want, RequestDialogResultTask &&task)
638 {
639     want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
640     int32_t left;
641     int32_t top;
642     int32_t width;
643     int32_t height;
644     GetWindowRect(left, top, width, height);
645     want.SetParam(RequestConstants::WINDOW_RECTANGLE_LEFT_KEY, left);
646     want.SetParam(RequestConstants::WINDOW_RECTANGLE_TOP_KEY, top);
647     want.SetParam(RequestConstants::WINDOW_RECTANGLE_WIDTH_KEY, width);
648     want.SetParam(RequestConstants::WINDOW_RECTANGLE_HEIGHT_KEY, height);
649     auto resultTask =
650         [env, outTask = std::move(task)](int32_t resultCode, const AAFwk::Want &resultWant) {
651         auto retData = new RequestResult();
652         retData->resultCode = resultCode;
653         retData->resultWant = resultWant;
654         retData->task = std::move(outTask);
655 
656         uv_loop_s* loop = nullptr;
657         napi_get_uv_event_loop(env, &loop);
658         if (loop == nullptr) {
659             TAG_LOGE(AAFwkTag::CONTEXT, "null uv loop");
660             return;
661         }
662         auto work = new uv_work_t;
663         work->data = static_cast<void*>(retData);
664         int rev = uv_queue_work_with_qos(
665             loop,
666             work,
667             [](uv_work_t* work) {},
668             RequestDialogResultJSThreadWorker,
669             uv_qos_user_initiated);
670         if (rev != 0) {
671             delete retData;
672             retData = nullptr;
673             if (work != nullptr) {
674                 delete work;
675                 work = nullptr;
676             }
677         }
678     };
679 
680     sptr<IRemoteObject> remoteObject = new DialogRequestCallbackImpl(std::move(resultTask));
681     want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
682 
683     auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
684     TAG_LOGD(AAFwkTag::CONTEXT, "ret=%{public}d", static_cast<int32_t>(err));
685     return err;
686 }
687 
RequestDialogService(AAFwk::Want & want,RequestDialogResultTask && task)688 ErrCode AbilityContextImpl::RequestDialogService(AAFwk::Want &want, RequestDialogResultTask &&task)
689 {
690     want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
691     int32_t left;
692     int32_t top;
693     int32_t width;
694     int32_t height;
695     GetWindowRect(left, top, width, height);
696     want.SetParam(RequestConstants::WINDOW_RECTANGLE_LEFT_KEY, left);
697     want.SetParam(RequestConstants::WINDOW_RECTANGLE_TOP_KEY, top);
698     want.SetParam(RequestConstants::WINDOW_RECTANGLE_WIDTH_KEY, width);
699     want.SetParam(RequestConstants::WINDOW_RECTANGLE_HEIGHT_KEY, height);
700 
701     sptr<IRemoteObject> remoteObject = new DialogRequestCallbackImpl(std::move(task));
702     want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
703 
704     auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
705     TAG_LOGD(AAFwkTag::CONTEXT, "ret=%{public}d", static_cast<int32_t>(err));
706     return err;
707 }
708 
ReportDrawnCompleted()709 ErrCode AbilityContextImpl::ReportDrawnCompleted()
710 {
711     TAG_LOGD(AAFwkTag::CONTEXT, "called");
712     return AAFwk::AbilityManagerClient::GetInstance()->ReportDrawnCompleted(token_);
713 }
714 
RequestDialogResultJSThreadWorker(uv_work_t * work,int status)715 void AbilityContextImpl::RequestDialogResultJSThreadWorker(uv_work_t* work, int status)
716 {
717     TAG_LOGD(AAFwkTag::CONTEXT, "called");
718     if (work == nullptr) {
719         TAG_LOGE(AAFwkTag::CONTEXT, "null work");
720         return;
721     }
722     RequestResult* retCB = static_cast<RequestResult*>(work->data);
723     if (retCB == nullptr) {
724         TAG_LOGE(AAFwkTag::CONTEXT, "null retCB");
725         delete work;
726         work = nullptr;
727         return;
728     }
729 
730     if (retCB->task) {
731         retCB->task(retCB->resultCode, retCB->resultWant);
732     }
733 
734     delete retCB;
735     retCB = nullptr;
736     delete work;
737     work = nullptr;
738 }
739 
GetMissionId(int32_t & missionId)740 ErrCode AbilityContextImpl::GetMissionId(int32_t &missionId)
741 {
742     TAG_LOGD(AAFwkTag::CONTEXT, "called");
743     if (missionId_ != -1) {
744         missionId = missionId_;
745         return ERR_OK;
746     }
747 
748     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token_, missionId);
749     if (err != ERR_OK) {
750         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
751     } else {
752         missionId_ = missionId;
753         TAG_LOGD(AAFwkTag::CONTEXT, "missionId: %{public}d", missionId_);
754     }
755     return err;
756 }
757 
SetMissionContinueState(const AAFwk::ContinueState & state)758 ErrCode AbilityContextImpl::SetMissionContinueState(const AAFwk::ContinueState &state)
759 {
760     TAG_LOGI(AAFwkTag::CONTEXT, "called, stage: %{public}d", state);
761     auto sessionToken = GetSessionToken();
762     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionContinueState(token_, state, sessionToken);
763     if (err != ERR_OK) {
764         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
765     }
766     return err;
767 }
768 
InsertResultCallbackTask(int requestCode,RuntimeTask && task)769 void AbilityContextImpl::InsertResultCallbackTask(int requestCode, RuntimeTask &&task)
770 {
771     TAG_LOGD(AAFwkTag::CONTEXT, "called");
772     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
773 }
774 
RemoveResultCallbackTask(int requestCode)775 void AbilityContextImpl::RemoveResultCallbackTask(int requestCode)
776 {
777     TAG_LOGD(AAFwkTag::CONTEXT, "call");
778     resultCallbacks_.erase(requestCode);
779 }
780 
GetWindowRect(int32_t & left,int32_t & top,int32_t & width,int32_t & height)781 void AbilityContextImpl::GetWindowRect(int32_t &left, int32_t &top, int32_t &width, int32_t &height)
782 {
783     TAG_LOGD(AAFwkTag::CONTEXT, "call");
784     auto abilityCallback = abilityCallback_.lock();
785     if (abilityCallback) {
786         abilityCallback->GetWindowRect(left, top, width, height);
787     }
788 }
789 
RegisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)790 void AbilityContextImpl::RegisterAbilityLifecycleObserver(
791     const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
792 {
793     TAG_LOGD(AAFwkTag::CONTEXT, "called");
794     auto abilityCallback = abilityCallback_.lock();
795     if (abilityCallback == nullptr) {
796         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback, register failed");
797         return;
798     }
799     abilityCallback->RegisterAbilityLifecycleObserver(observer);
800 }
801 
UnregisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)802 void AbilityContextImpl::UnregisterAbilityLifecycleObserver(
803     const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
804 {
805     TAG_LOGD(AAFwkTag::CONTEXT, "call");
806     auto abilityCallback = abilityCallback_.lock();
807     if (abilityCallback == nullptr) {
808         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback, unregister failed");
809         return;
810     }
811     abilityCallback->UnregisterAbilityLifecycleObserver(observer);
812 }
813 
814 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const std::string & label)815 ErrCode AbilityContextImpl::SetMissionLabel(const std::string& label)
816 {
817     TAG_LOGD(AAFwkTag::CONTEXT, "label:%{public}s", label.c_str());
818     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionLabel(token_, label);
819     if (err != ERR_OK) {
820         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
821     } else {
822         auto abilityCallback = abilityCallback_.lock();
823         if (abilityCallback) {
824             abilityCallback->SetMissionLabel(label);
825         }
826     }
827     return err;
828 }
829 
SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> & icon)830 ErrCode AbilityContextImpl::SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap>& icon)
831 {
832     TAG_LOGD(AAFwkTag::CONTEXT, "call");
833     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionIcon(token_, icon);
834     if (err != ERR_OK) {
835         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
836     } else {
837         auto abilityCallback = abilityCallback_.lock();
838         if (abilityCallback) {
839             abilityCallback->SetMissionIcon(icon);
840         }
841     }
842     return err;
843 }
844 
GetCurrentWindowMode()845 int AbilityContextImpl::GetCurrentWindowMode()
846 {
847     auto abilityCallback = abilityCallback_.lock();
848     if (abilityCallback == nullptr) {
849         return AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED;
850     }
851     return abilityCallback->GetCurrentWindowMode();
852 }
853 
GetUIContent()854 Ace::UIContent* AbilityContextImpl::GetUIContent()
855 {
856     TAG_LOGD(AAFwkTag::CONTEXT, "call");
857     auto abilityCallback = abilityCallback_.lock();
858     if (abilityCallback == nullptr) {
859         return nullptr;
860     }
861 
862     return abilityCallback->GetUIContent();
863 }
864 
StartAbilityByType(const std::string & type,AAFwk::WantParams & wantParams,const std::shared_ptr<JsUIExtensionCallback> & uiExtensionCallbacks)865 ErrCode AbilityContextImpl::StartAbilityByType(const std::string &type,
866     AAFwk::WantParams &wantParams, const std::shared_ptr<JsUIExtensionCallback> &uiExtensionCallbacks)
867 {
868     TAG_LOGD(AAFwkTag::CONTEXT, "call");
869     auto uiContent = GetUIContent();
870     if (uiContent == nullptr) {
871         TAG_LOGE(AAFwkTag::CONTEXT, "null uiContent");
872         return ERR_INVALID_VALUE;
873     }
874     wantParams.SetParam(UIEXTENSION_TARGET_TYPE_KEY, AAFwk::String::Box(type));
875     AAFwk::Want want;
876     want.SetParams(wantParams);
877     if (wantParams.HasParam(FLAG_AUTH_READ_URI_PERMISSION)) {
878         int32_t flag = wantParams.GetIntParam(FLAG_AUTH_READ_URI_PERMISSION, 0);
879         want.SetFlags(flag);
880         wantParams.Remove(FLAG_AUTH_READ_URI_PERMISSION);
881     }
882     Ace::ModalUIExtensionCallbacks callback;
883     callback.onError = [uiExtensionCallbacks](int32_t arg, const std::string &str1, const std::string &str2) {
884         uiExtensionCallbacks->OnError(arg);
885     };
886     callback.onRelease = [uiExtensionCallbacks](int32_t arg) {
887         uiExtensionCallbacks->OnRelease(arg);
888     };
889     callback.onResult = [uiExtensionCallbacks](int32_t arg1, const OHOS::AAFwk::Want arg2) {
890         uiExtensionCallbacks->OnResult(arg1, arg2);
891     };
892 
893     Ace::ModalUIExtensionConfig config;
894     int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
895     if (sessionId == 0) {
896         TAG_LOGE(AAFwkTag::CONTEXT, "createModalUIExtension failed");
897         return ERR_INVALID_VALUE;
898     }
899     uiExtensionCallbacks->SetUIContent(uiContent);
900     uiExtensionCallbacks->SetSessionId(sessionId);
901     return ERR_OK;
902 }
903 
IsUIExtensionExist(const AAFwk::Want & want)904 bool AbilityContextImpl::IsUIExtensionExist(const AAFwk::Want &want)
905 {
906     TAG_LOGD(AAFwkTag::CONTEXT, "call");
907     std::lock_guard lock(uiExtensionMutex_);
908     for (const auto& iter : uiExtensionMap_) {
909         if (iter.second.GetElement().GetBundleName() == want.GetElement().GetBundleName() &&
910             iter.second.GetElement().GetModuleName() == want.GetElement().GetModuleName() &&
911             iter.second.GetElement().GetAbilityName() == want.GetElement().GetAbilityName()) {
912             return true;
913         }
914     }
915     return false;
916 }
917 
EraseUIExtension(int32_t sessionId)918 void AbilityContextImpl::EraseUIExtension(int32_t sessionId)
919 {
920     TAG_LOGD(AAFwkTag::CONTEXT, "call");
921     std::lock_guard lock(uiExtensionMutex_);
922     auto iter = uiExtensionMap_.find(sessionId);
923     if (iter != uiExtensionMap_.end()) {
924         uiExtensionMap_.erase(sessionId);
925     }
926 }
927 
CreateModalUIExtensionWithApp(const AAFwk::Want & want)928 ErrCode AbilityContextImpl::CreateModalUIExtensionWithApp(const AAFwk::Want &want)
929 {
930     TAG_LOGD(AAFwkTag::CONTEXT, "call");
931     auto uiContent = GetUIContent();
932     if (uiContent == nullptr) {
933         TAG_LOGE(AAFwkTag::CONTEXT, "null uiContent");
934         return ERR_INVALID_VALUE;
935     }
936     if (IsUIExtensionExist(want)) {
937         TAG_LOGD(AAFwkTag::CONTEXT, "exist uIExtension");
938         return ERR_OK;
939     }
940     auto abilityCallback = abilityCallback_.lock();
941     if (abilityCallback == nullptr) {
942         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
943         return ERR_INVALID_VALUE;
944     }
945     auto disposedCallback = std::make_shared<DialogUIExtensionCallback>(abilityCallback);
946     Ace::ModalUIExtensionCallbacks callback;
947     callback.onError = [disposedCallback](int32_t arg1, const std::string &str1, const std::string &str2) {
948         disposedCallback->OnError();
949     };
950     callback.onRelease = [disposedCallback](int32_t arg1) {
951         disposedCallback->OnRelease();
952     };
953     callback.onDestroy = [disposedCallback]() {
954         disposedCallback->OnDestroy();
955     };
956     Ace::ModalUIExtensionConfig config;
957     config.prohibitedRemoveByRouter = true;
958     if (want.GetBoolParam(DISPOSED_PROHIBIT_BACK, false)) {
959         config.isProhibitBack = true;
960     }
961     int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
962     if (sessionId == 0) {
963         TAG_LOGE(AAFwkTag::CONTEXT, "failed");
964         return ERR_INVALID_VALUE;
965     }
966     disposedCallback->SetUIContent(uiContent);
967     disposedCallback->SetSessionId(sessionId);
968     {
969         std::lock_guard lock(uiExtensionMutex_);
970         uiExtensionMap_.emplace(sessionId, want);
971     }
972     return ERR_OK;
973 }
974 #endif
975 
RequestModalUIExtension(const AAFwk::Want & want)976 ErrCode AbilityContextImpl::RequestModalUIExtension(const AAFwk::Want& want)
977 {
978     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->RequestModalUIExtension(want);
979     if (err != ERR_OK) {
980         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
981     }
982     return err;
983 }
984 
ChangeAbilityVisibility(bool isShow)985 ErrCode AbilityContextImpl::ChangeAbilityVisibility(bool isShow)
986 {
987     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->ChangeAbilityVisibility(token_, isShow);
988     if (err != ERR_OK) {
989         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
990     }
991     return err;
992 }
993 
AddFreeInstallObserver(const sptr<IFreeInstallObserver> & observer)994 ErrCode AbilityContextImpl::AddFreeInstallObserver(const sptr<IFreeInstallObserver> &observer)
995 {
996     ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->AddFreeInstallObserver(token_, observer);
997     if (ret != ERR_OK) {
998         TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret: %{public}d", ret);
999     }
1000     return ret;
1001 }
1002 
OpenAtomicService(AAFwk::Want & want,const AAFwk::StartOptions & options,int requestCode,RuntimeTask && task)1003 ErrCode AbilityContextImpl::OpenAtomicService(AAFwk::Want& want, const AAFwk::StartOptions &options, int requestCode,
1004     RuntimeTask &&task)
1005 {
1006     TAG_LOGD(AAFwkTag::CONTEXT, "called");
1007     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
1008     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->OpenAtomicService(want, options, token_, requestCode, -1);
1009     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
1010         TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret=%{public}d", err);
1011         OnAbilityResultInner(requestCode, err, want);
1012     }
1013     return err;
1014 }
1015 
OpenLink(const AAFwk::Want & want,int requestCode)1016 ErrCode AbilityContextImpl::OpenLink(const AAFwk::Want& want, int requestCode)
1017 {
1018     TAG_LOGD(AAFwkTag::CONTEXT, "called");
1019     return AAFwk::AbilityManagerClient::GetInstance()->OpenLink(want, token_, -1, requestCode);
1020 }
1021 
GetWant()1022 std::shared_ptr<AAFwk::Want> AbilityContextImpl::GetWant()
1023 {
1024     auto abilityCallback = abilityCallback_.lock();
1025     if (abilityCallback == nullptr) {
1026         TAG_LOGW(AAFwkTag::CONTEXT, "abilityCallback is nullptr.");
1027         return nullptr;
1028     }
1029     return abilityCallback->GetWant();
1030 }
1031 } // namespace AbilityRuntime
1032 } // namespace OHOS
1033