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