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
StartUIServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)275 ErrCode AbilityContextImpl::StartUIServiceExtensionAbility(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::UI_SERVICE);
281 if (err != ERR_OK) {
282 TAG_LOGE(AAFwkTag::CONTEXT, "StartUIServiceExtension is failed %{public}d", err);
283 }
284 return err;
285 }
286
StartServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)287 ErrCode AbilityContextImpl::StartServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
288 {
289 TAG_LOGI(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()->StartExtensionAbility(
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
StopServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)299 ErrCode AbilityContextImpl::StopServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
300 {
301 TAG_LOGD(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
302 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
303 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StopExtensionAbility(
304 want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
305 if (err != ERR_OK) {
306 TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
307 }
308 return err;
309 }
310
TerminateAbilityWithResult(const AAFwk::Want & want,int resultCode)311 ErrCode AbilityContextImpl::TerminateAbilityWithResult(const AAFwk::Want& want, int resultCode)
312 {
313 isTerminating_.store(true);
314 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
315 auto sessionToken = GetSessionToken();
316 if (sessionToken == nullptr) {
317 return ERR_INVALID_VALUE;
318 }
319 sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
320 info->want = want;
321 info->resultCode = resultCode;
322 auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
323 TAG_LOGI(AAFwkTag::CONTEXT, "scb call, TerminateAbilityWithResult");
324 ErrCode ret = static_cast<int32_t>(ifaceSessionToken->TerminateSession(info));
325 if (ret != ERR_OK) {
326 TAG_LOGE(AAFwkTag::CONTEXT, "scb call, TerminateAbilityWithResult err: %{public}d", ret);
327 }
328 return ret;
329 } else {
330 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, resultCode, &want);
331 TAG_LOGI(AAFwkTag::CONTEXT, "ret=%{public}d", err);
332 return err;
333 }
334 }
335
BackToCallerAbilityWithResult(const AAFwk::Want & want,int resultCode,int64_t requestCode)336 ErrCode AbilityContextImpl::BackToCallerAbilityWithResult(const AAFwk::Want& want, int resultCode, int64_t requestCode)
337 {
338 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->BackToCallerAbilityWithResult(
339 token_, resultCode, &want, requestCode);
340 TAG_LOGI(AAFwkTag::CONTEXT, "ret:%{public}d", err);
341 return static_cast<int32_t>(err);
342 }
343
SetWeakSessionToken(const wptr<IRemoteObject> & sessionToken)344 void AbilityContextImpl::SetWeakSessionToken(const wptr<IRemoteObject>& sessionToken)
345 {
346 std::lock_guard lock(sessionTokenMutex_);
347 TAG_LOGD(AAFwkTag::CONTEXT, "called");
348 sessionToken_ = sessionToken;
349 }
350
GetSessionToken()351 sptr<IRemoteObject> AbilityContextImpl::GetSessionToken()
352 {
353 std::lock_guard lock(sessionTokenMutex_);
354 TAG_LOGD(AAFwkTag::CONTEXT, "called");
355 return sessionToken_.promote();
356 }
357
SetAbilityRecordId(int32_t abilityRecordId)358 void AbilityContextImpl::SetAbilityRecordId(int32_t abilityRecordId)
359 {
360 TAG_LOGD(AAFwkTag::CONTEXT, "abilityRecordId: %{public}d", abilityRecordId);
361 abilityRecordId_ = abilityRecordId;
362 }
363
GetAbilityRecordId()364 int32_t AbilityContextImpl::GetAbilityRecordId()
365 {
366 return abilityRecordId_;
367 }
368
OnAbilityResult(int requestCode,int resultCode,const AAFwk::Want & resultData)369 void AbilityContextImpl::OnAbilityResult(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, false);
376 }
377 resultCallbacks_.erase(requestCode);
378 }
379 }
380
OnAbilityResultInner(int requestCode,int resultCode,const AAFwk::Want & resultData)381 void AbilityContextImpl::OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want& resultData)
382 {
383 TAG_LOGD(AAFwkTag::CONTEXT, "called");
384 auto callback = resultCallbacks_.find(requestCode);
385 if (callback != resultCallbacks_.end()) {
386 if (callback->second) {
387 callback->second(resultCode, resultData, true);
388 }
389 resultCallbacks_.erase(requestCode);
390 }
391 }
392
ConnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)393 ErrCode AbilityContextImpl::ConnectAbility(const AAFwk::Want& want, const sptr<AbilityConnectCallback>& connectCallback)
394 {
395 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
396 TAG_LOGI(AAFwkTag::CONTEXT,
397 "ConnectAbility called, caller:%{public}s, target:%{public}s",
398 abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str(), want.GetElement().GetAbilityName().c_str());
399 ErrCode ret = ConnectionManager::GetInstance().ConnectAbility(token_, want, connectCallback);
400 if (ret != ERR_OK) {
401 TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret:%{public}d", ret);
402 }
403 return ret;
404 }
405
ConnectAbilityWithAccount(const AAFwk::Want & want,int accountId,const sptr<AbilityConnectCallback> & connectCallback)406 ErrCode AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want& want, int accountId,
407 const sptr<AbilityConnectCallback>& connectCallback)
408 {
409 TAG_LOGD(AAFwkTag::CONTEXT, "called");
410 ErrCode ret =
411 ConnectionManager::GetInstance().ConnectAbilityWithAccount(token_, want, accountId, connectCallback);
412 if (ret != ERR_OK) {
413 TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret:%{public}d", ret);
414 }
415 return ret;
416 }
417
ConnectUIServiceExtensionAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)418 ErrCode AbilityContextImpl::ConnectUIServiceExtensionAbility(const AAFwk::Want& want,
419 const sptr<AbilityConnectCallback>& connectCallback)
420 {
421 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
422 TAG_LOGD(AAFwkTag::CONTEXT,
423 "called, name:%{public}s", abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
424 ErrCode ret = ConnectionManager::GetInstance().ConnectUIServiceExtensionAbility(token_, want, connectCallback);
425 if (ret != ERR_OK) {
426 TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret:%{public}d", ret);
427 }
428 return ret;
429 }
430
DisconnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback,int32_t accountId)431 void AbilityContextImpl::DisconnectAbility(const AAFwk::Want& want,
432 const sptr<AbilityConnectCallback>& connectCallback, int32_t accountId)
433 {
434 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
435 TAG_LOGI(AAFwkTag::CONTEXT, "DisconnectAbility called, caller:%{public}s, target:%{public}s",
436 abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str(), want.GetElement().GetAbilityName().c_str());
437 ErrCode ret =
438 ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback, accountId);
439 if (ret != ERR_OK) {
440 TAG_LOGE(AAFwkTag::CONTEXT, "error, ret=%{public}d", ret);
441 }
442 }
443
GetBundleName() const444 std::string AbilityContextImpl::GetBundleName() const
445 {
446 return stageContext_ ? stageContext_->GetBundleName() : "";
447 }
448
GetApplicationInfo() const449 std::shared_ptr<AppExecFwk::ApplicationInfo> AbilityContextImpl::GetApplicationInfo() const
450 {
451 return stageContext_ ? stageContext_->GetApplicationInfo() : nullptr;
452 }
453
GetBundleCodePath() const454 std::string AbilityContextImpl::GetBundleCodePath() const
455 {
456 return stageContext_ ? stageContext_->GetBundleCodePath() : "";
457 }
458
GetHapModuleInfo() const459 std::shared_ptr<AppExecFwk::HapModuleInfo> AbilityContextImpl::GetHapModuleInfo() const
460 {
461 return stageContext_ ? stageContext_->GetHapModuleInfo() : nullptr;
462 }
463
GetResourceManager() const464 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::GetResourceManager() const
465 {
466 return stageContext_ ? stageContext_->GetResourceManager() : nullptr;
467 }
468
CreateBundleContext(const std::string & bundleName)469 std::shared_ptr<Context> AbilityContextImpl::CreateBundleContext(const std::string& bundleName)
470 {
471 return stageContext_ ? stageContext_->CreateBundleContext(bundleName) : nullptr;
472 }
473
CreateModuleContext(const std::string & moduleName)474 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& moduleName)
475 {
476 return stageContext_ ? stageContext_->CreateModuleContext(moduleName) : nullptr;
477 }
478
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)479 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& bundleName,
480 const std::string& moduleName)
481 {
482 return stageContext_ ? stageContext_->CreateModuleContext(bundleName, moduleName) : nullptr;
483 }
484
CreateModuleResourceManager(const std::string & bundleName,const std::string & moduleName)485 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::CreateModuleResourceManager(
486 const std::string &bundleName, const std::string &moduleName)
487 {
488 return stageContext_ ? stageContext_->CreateModuleResourceManager(bundleName, moduleName) : nullptr;
489 }
490
CreateSystemHspModuleResourceManager(const std::string & bundleName,const std::string & moduleName,std::shared_ptr<Global::Resource::ResourceManager> & resourceManager)491 int32_t AbilityContextImpl::CreateSystemHspModuleResourceManager(const std::string &bundleName,
492 const std::string &moduleName, std::shared_ptr<Global::Resource::ResourceManager> &resourceManager)
493 {
494 return stageContext_ ? stageContext_->CreateSystemHspModuleResourceManager(bundleName, moduleName, resourceManager)
495 : ERR_INVALID_VALUE;
496 }
497
SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> & abilityInfo)498 void AbilityContextImpl::SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo>& abilityInfo)
499 {
500 abilityInfo_ = abilityInfo;
501 }
502
GetAbilityInfo() const503 std::shared_ptr<AppExecFwk::AbilityInfo> AbilityContextImpl::GetAbilityInfo() const
504 {
505 return abilityInfo_;
506 }
507
SetStageContext(const std::shared_ptr<AbilityRuntime::Context> & stageContext)508 void AbilityContextImpl::SetStageContext(const std::shared_ptr<AbilityRuntime::Context>& stageContext)
509 {
510 stageContext_ = stageContext;
511 }
512
SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> & config)513 void AbilityContextImpl::SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& config)
514 {
515 config_ = config;
516 }
517
GetConfiguration() const518 std::shared_ptr<AppExecFwk::Configuration> AbilityContextImpl::GetConfiguration() const
519 {
520 return config_;
521 }
522
MinimizeAbility(bool fromUser)523 void AbilityContextImpl::MinimizeAbility(bool fromUser)
524 {
525 TAG_LOGD(AAFwkTag::CONTEXT, "called");
526 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(token_, fromUser);
527 if (err != ERR_OK) {
528 TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
529 }
530 }
531
OnBackPressedCallBack(bool & needMoveToBackground)532 ErrCode AbilityContextImpl::OnBackPressedCallBack(bool &needMoveToBackground)
533 {
534 TAG_LOGD(AAFwkTag::CONTEXT, "call");
535 auto abilityCallback = abilityCallback_.lock();
536 if (abilityCallback == nullptr) {
537 TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
538 return ERR_INVALID_VALUE;
539 }
540 needMoveToBackground = abilityCallback->OnBackPress();
541 return ERR_OK;
542 }
543
MoveAbilityToBackground()544 ErrCode AbilityContextImpl::MoveAbilityToBackground()
545 {
546 TAG_LOGD(AAFwkTag::CONTEXT, "called");
547 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveAbilityToBackground(token_);
548 if (err != ERR_OK) {
549 TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
550 }
551 return err;
552 }
553
MoveUIAbilityToBackground()554 ErrCode AbilityContextImpl::MoveUIAbilityToBackground()
555 {
556 TAG_LOGD(AAFwkTag::CONTEXT, "call");
557 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveUIAbilityToBackground(token_);
558 if (err != ERR_OK) {
559 TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
560 }
561 return err;
562 }
563
TerminateSelf()564 ErrCode AbilityContextImpl::TerminateSelf()
565 {
566 TAG_LOGI(AAFwkTag::CONTEXT, "called");
567 isTerminating_.store(true);
568 auto sessionToken = GetSessionToken();
569 if (sessionToken == nullptr) {
570 TAG_LOGW(AAFwkTag::CONTEXT, "null sessionToken");
571 }
572
573 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionToken) {
574 TAG_LOGI(AAFwkTag::CONTEXT, "scb call, TerminateSelf: %{public}s",
575 abilityInfo_ ? abilityInfo_->name.c_str() : "");
576 AAFwk::Want resultWant;
577 sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
578 info->want = resultWant;
579 info->resultCode = -1;
580 auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
581 ErrCode ret = static_cast<int32_t>(ifaceSessionToken->TerminateSession(info));
582 if (ret != ERR_OK) {
583 TAG_LOGE(AAFwkTag::CONTEXT, "scb call, TerminateSelf err: %{public}d", ret);
584 }
585 return ret;
586 } else {
587 AAFwk::Want resultWant;
588 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, -1, &resultWant);
589 if (err != ERR_OK) {
590 TAG_LOGE(AAFwkTag::CONTEXT, "terminateSelf failed %{public}d", err);
591 }
592 return err;
593 }
594 }
595
CloseAbility()596 ErrCode AbilityContextImpl::CloseAbility()
597 {
598 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
599 TAG_LOGD(AAFwkTag::CONTEXT, "called");
600 isTerminating_.store(true);
601 AAFwk::Want resultWant;
602 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->CloseAbility(token_, -1, &resultWant);
603 if (err != ERR_OK) {
604 TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
605 }
606 return err;
607 }
608
GetToken()609 sptr<IRemoteObject> AbilityContextImpl::GetToken()
610 {
611 return token_;
612 }
613
RestoreWindowStage(napi_env env,napi_value contentStorage)614 ErrCode AbilityContextImpl::RestoreWindowStage(napi_env env, napi_value contentStorage)
615 {
616 TAG_LOGD(AAFwkTag::CONTEXT, "called");
617 napi_ref value = nullptr;
618 napi_create_reference(env, contentStorage, 1, &value);
619 contentStorage_ = std::unique_ptr<NativeReference>(reinterpret_cast<NativeReference*>(value));
620 return ERR_OK;
621 }
622
StartAbilityByCall(const AAFwk::Want & want,const std::shared_ptr<CallerCallBack> & callback,int32_t accountId)623 ErrCode AbilityContextImpl::StartAbilityByCall(
624 const AAFwk::Want& want, const std::shared_ptr<CallerCallBack>& callback, int32_t accountId)
625 {
626 if (localCallContainer_ == nullptr) {
627 localCallContainer_ = std::make_shared<LocalCallContainer>();
628 if (localCallContainer_ == nullptr) {
629 TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
630 return ERR_INVALID_VALUE;
631 }
632 }
633 return localCallContainer_->StartAbilityByCallInner(want, callback, token_, accountId);
634 }
635
ReleaseCall(const std::shared_ptr<CallerCallBack> & callback)636 ErrCode AbilityContextImpl::ReleaseCall(const std::shared_ptr<CallerCallBack>& callback)
637 {
638 TAG_LOGD(AAFwkTag::CONTEXT, "called");
639 if (localCallContainer_ == nullptr) {
640 TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
641 return ERR_INVALID_VALUE;
642 }
643 return localCallContainer_->ReleaseCall(callback);
644 }
645
ClearFailedCallConnection(const std::shared_ptr<CallerCallBack> & callback)646 void AbilityContextImpl::ClearFailedCallConnection(const std::shared_ptr<CallerCallBack>& callback)
647 {
648 TAG_LOGD(AAFwkTag::CONTEXT, "called");
649 if (localCallContainer_ == nullptr) {
650 TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
651 return;
652 }
653 localCallContainer_->ClearFailedCallConnection(callback);
654 }
655
RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)656 void AbilityContextImpl::RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)
657 {
658 TAG_LOGD(AAFwkTag::CONTEXT, "called");
659 abilityCallback_ = abilityCallback;
660 }
661
RequestDialogService(napi_env env,AAFwk::Want & want,RequestDialogResultTask && task)662 ErrCode AbilityContextImpl::RequestDialogService(napi_env env, AAFwk::Want &want, RequestDialogResultTask &&task)
663 {
664 want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
665 int32_t left;
666 int32_t top;
667 int32_t width;
668 int32_t height;
669 GetWindowRect(left, top, width, height);
670 want.SetParam(RequestConstants::WINDOW_RECTANGLE_LEFT_KEY, left);
671 want.SetParam(RequestConstants::WINDOW_RECTANGLE_TOP_KEY, top);
672 want.SetParam(RequestConstants::WINDOW_RECTANGLE_WIDTH_KEY, width);
673 want.SetParam(RequestConstants::WINDOW_RECTANGLE_HEIGHT_KEY, height);
674 auto resultTask =
675 [env, outTask = std::move(task)](int32_t resultCode, const AAFwk::Want &resultWant) {
676 auto retData = new RequestResult();
677 retData->resultCode = resultCode;
678 retData->resultWant = resultWant;
679 retData->task = std::move(outTask);
680
681 uv_loop_s* loop = nullptr;
682 napi_get_uv_event_loop(env, &loop);
683 if (loop == nullptr) {
684 TAG_LOGE(AAFwkTag::CONTEXT, "null uv loop");
685 return;
686 }
687 auto work = new uv_work_t;
688 work->data = static_cast<void*>(retData);
689 int rev = uv_queue_work_with_qos(
690 loop,
691 work,
692 [](uv_work_t* work) {},
693 RequestDialogResultJSThreadWorker,
694 uv_qos_user_initiated);
695 if (rev != 0) {
696 delete retData;
697 retData = nullptr;
698 if (work != nullptr) {
699 delete work;
700 work = nullptr;
701 }
702 }
703 };
704
705 sptr<IRemoteObject> remoteObject = new DialogRequestCallbackImpl(std::move(resultTask));
706 want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
707
708 auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
709 TAG_LOGD(AAFwkTag::CONTEXT, "ret=%{public}d", static_cast<int32_t>(err));
710 return err;
711 }
712
RequestDialogService(AAFwk::Want & want,RequestDialogResultTask && task)713 ErrCode AbilityContextImpl::RequestDialogService(AAFwk::Want &want, RequestDialogResultTask &&task)
714 {
715 want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
716 int32_t left;
717 int32_t top;
718 int32_t width;
719 int32_t height;
720 GetWindowRect(left, top, width, height);
721 want.SetParam(RequestConstants::WINDOW_RECTANGLE_LEFT_KEY, left);
722 want.SetParam(RequestConstants::WINDOW_RECTANGLE_TOP_KEY, top);
723 want.SetParam(RequestConstants::WINDOW_RECTANGLE_WIDTH_KEY, width);
724 want.SetParam(RequestConstants::WINDOW_RECTANGLE_HEIGHT_KEY, height);
725
726 sptr<IRemoteObject> remoteObject = new DialogRequestCallbackImpl(std::move(task));
727 want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
728
729 auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
730 TAG_LOGD(AAFwkTag::CONTEXT, "ret=%{public}d", static_cast<int32_t>(err));
731 return err;
732 }
733
ReportDrawnCompleted()734 ErrCode AbilityContextImpl::ReportDrawnCompleted()
735 {
736 TAG_LOGD(AAFwkTag::CONTEXT, "called");
737 return AAFwk::AbilityManagerClient::GetInstance()->ReportDrawnCompleted(token_);
738 }
739
RequestDialogResultJSThreadWorker(uv_work_t * work,int status)740 void AbilityContextImpl::RequestDialogResultJSThreadWorker(uv_work_t* work, int status)
741 {
742 TAG_LOGD(AAFwkTag::CONTEXT, "called");
743 if (work == nullptr) {
744 TAG_LOGE(AAFwkTag::CONTEXT, "null work");
745 return;
746 }
747 RequestResult* retCB = static_cast<RequestResult*>(work->data);
748 if (retCB == nullptr) {
749 TAG_LOGE(AAFwkTag::CONTEXT, "null retCB");
750 delete work;
751 work = nullptr;
752 return;
753 }
754
755 if (retCB->task) {
756 retCB->task(retCB->resultCode, retCB->resultWant);
757 }
758
759 delete retCB;
760 retCB = nullptr;
761 delete work;
762 work = nullptr;
763 }
764
GetMissionId(int32_t & missionId)765 ErrCode AbilityContextImpl::GetMissionId(int32_t &missionId)
766 {
767 TAG_LOGD(AAFwkTag::CONTEXT, "called");
768 if (missionId_ != -1) {
769 missionId = missionId_;
770 return ERR_OK;
771 }
772
773 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token_, missionId);
774 if (err != ERR_OK) {
775 TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
776 } else {
777 missionId_ = missionId;
778 TAG_LOGD(AAFwkTag::CONTEXT, "missionId: %{public}d", missionId_);
779 }
780 return err;
781 }
782
SetMissionContinueState(const AAFwk::ContinueState & state)783 ErrCode AbilityContextImpl::SetMissionContinueState(const AAFwk::ContinueState &state)
784 {
785 TAG_LOGI(AAFwkTag::CONTEXT, "called, stage: %{public}d", state);
786 auto sessionToken = GetSessionToken();
787 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionContinueState(token_, state, sessionToken);
788 if (err != ERR_OK) {
789 TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
790 }
791 return err;
792 }
793
InsertResultCallbackTask(int requestCode,RuntimeTask && task)794 void AbilityContextImpl::InsertResultCallbackTask(int requestCode, RuntimeTask &&task)
795 {
796 TAG_LOGD(AAFwkTag::CONTEXT, "called");
797 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
798 }
799
RemoveResultCallbackTask(int requestCode)800 void AbilityContextImpl::RemoveResultCallbackTask(int requestCode)
801 {
802 TAG_LOGD(AAFwkTag::CONTEXT, "call");
803 resultCallbacks_.erase(requestCode);
804 }
805
GetWindowRect(int32_t & left,int32_t & top,int32_t & width,int32_t & height)806 void AbilityContextImpl::GetWindowRect(int32_t &left, int32_t &top, int32_t &width, int32_t &height)
807 {
808 TAG_LOGD(AAFwkTag::CONTEXT, "call");
809 auto abilityCallback = abilityCallback_.lock();
810 if (abilityCallback) {
811 abilityCallback->GetWindowRect(left, top, width, height);
812 }
813 }
814
RegisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)815 void AbilityContextImpl::RegisterAbilityLifecycleObserver(
816 const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
817 {
818 TAG_LOGD(AAFwkTag::CONTEXT, "called");
819 auto abilityCallback = abilityCallback_.lock();
820 if (abilityCallback == nullptr) {
821 TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback, register failed");
822 return;
823 }
824 abilityCallback->RegisterAbilityLifecycleObserver(observer);
825 }
826
UnregisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)827 void AbilityContextImpl::UnregisterAbilityLifecycleObserver(
828 const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
829 {
830 TAG_LOGD(AAFwkTag::CONTEXT, "call");
831 auto abilityCallback = abilityCallback_.lock();
832 if (abilityCallback == nullptr) {
833 TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback, unregister failed");
834 return;
835 }
836 abilityCallback->UnregisterAbilityLifecycleObserver(observer);
837 }
838
839 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const std::string & label)840 ErrCode AbilityContextImpl::SetMissionLabel(const std::string& label)
841 {
842 TAG_LOGD(AAFwkTag::CONTEXT, "label:%{public}s", label.c_str());
843 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionLabel(token_, label);
844 if (err != ERR_OK) {
845 TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
846 } else {
847 auto abilityCallback = abilityCallback_.lock();
848 if (abilityCallback) {
849 abilityCallback->SetMissionLabel(label);
850 }
851 }
852 return err;
853 }
854
SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> & icon)855 ErrCode AbilityContextImpl::SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap>& icon)
856 {
857 TAG_LOGD(AAFwkTag::CONTEXT, "call");
858 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionIcon(token_, icon);
859 if (err != ERR_OK) {
860 TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
861 } else {
862 auto abilityCallback = abilityCallback_.lock();
863 if (abilityCallback) {
864 abilityCallback->SetMissionIcon(icon);
865 }
866 }
867 return err;
868 }
869
GetCurrentWindowMode()870 int AbilityContextImpl::GetCurrentWindowMode()
871 {
872 auto abilityCallback = abilityCallback_.lock();
873 if (abilityCallback == nullptr) {
874 return AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED;
875 }
876 return abilityCallback->GetCurrentWindowMode();
877 }
878
GetUIContent()879 Ace::UIContent* AbilityContextImpl::GetUIContent()
880 {
881 TAG_LOGD(AAFwkTag::CONTEXT, "call");
882 auto abilityCallback = abilityCallback_.lock();
883 if (abilityCallback == nullptr) {
884 return nullptr;
885 }
886
887 return abilityCallback->GetUIContent();
888 }
889
StartAbilityByType(const std::string & type,AAFwk::WantParams & wantParams,const std::shared_ptr<JsUIExtensionCallback> & uiExtensionCallbacks)890 ErrCode AbilityContextImpl::StartAbilityByType(const std::string &type,
891 AAFwk::WantParams &wantParams, const std::shared_ptr<JsUIExtensionCallback> &uiExtensionCallbacks)
892 {
893 TAG_LOGD(AAFwkTag::CONTEXT, "call");
894 auto uiContent = GetUIContent();
895 if (uiContent == nullptr) {
896 TAG_LOGE(AAFwkTag::CONTEXT, "null uiContent");
897 return ERR_INVALID_VALUE;
898 }
899 wantParams.SetParam(UIEXTENSION_TARGET_TYPE_KEY, AAFwk::String::Box(type));
900 AAFwk::Want want;
901 want.SetParams(wantParams);
902 if (wantParams.HasParam(FLAG_AUTH_READ_URI_PERMISSION)) {
903 int32_t flag = wantParams.GetIntParam(FLAG_AUTH_READ_URI_PERMISSION, 0);
904 want.SetFlags(flag);
905 wantParams.Remove(FLAG_AUTH_READ_URI_PERMISSION);
906 }
907 Ace::ModalUIExtensionCallbacks callback;
908 callback.onError = [uiExtensionCallbacks](int32_t arg, const std::string &str1, const std::string &str2) {
909 uiExtensionCallbacks->OnError(arg);
910 };
911 callback.onRelease = [uiExtensionCallbacks](int32_t arg) {
912 uiExtensionCallbacks->OnRelease(arg);
913 };
914 callback.onResult = [uiExtensionCallbacks](int32_t arg1, const OHOS::AAFwk::Want arg2) {
915 uiExtensionCallbacks->OnResult(arg1, arg2);
916 };
917
918 Ace::ModalUIExtensionConfig config;
919 int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
920 if (sessionId == 0) {
921 TAG_LOGE(AAFwkTag::CONTEXT, "createModalUIExtension failed");
922 return ERR_INVALID_VALUE;
923 }
924 uiExtensionCallbacks->SetUIContent(uiContent);
925 uiExtensionCallbacks->SetSessionId(sessionId);
926 return ERR_OK;
927 }
928
IsUIExtensionExist(const AAFwk::Want & want)929 bool AbilityContextImpl::IsUIExtensionExist(const AAFwk::Want &want)
930 {
931 TAG_LOGD(AAFwkTag::CONTEXT, "call");
932 std::lock_guard lock(uiExtensionMutex_);
933 for (const auto& iter : uiExtensionMap_) {
934 if (iter.second.GetElement().GetBundleName() == want.GetElement().GetBundleName() &&
935 iter.second.GetElement().GetModuleName() == want.GetElement().GetModuleName() &&
936 iter.second.GetElement().GetAbilityName() == want.GetElement().GetAbilityName()) {
937 return true;
938 }
939 }
940 return false;
941 }
942
EraseUIExtension(int32_t sessionId)943 void AbilityContextImpl::EraseUIExtension(int32_t sessionId)
944 {
945 TAG_LOGD(AAFwkTag::CONTEXT, "call");
946 std::lock_guard lock(uiExtensionMutex_);
947 auto iter = uiExtensionMap_.find(sessionId);
948 if (iter != uiExtensionMap_.end()) {
949 uiExtensionMap_.erase(sessionId);
950 }
951 }
952
CreateModalUIExtensionWithApp(const AAFwk::Want & want)953 ErrCode AbilityContextImpl::CreateModalUIExtensionWithApp(const AAFwk::Want &want)
954 {
955 TAG_LOGD(AAFwkTag::CONTEXT, "call");
956 auto uiContent = GetUIContent();
957 if (uiContent == nullptr) {
958 TAG_LOGE(AAFwkTag::CONTEXT, "null uiContent");
959 return ERR_INVALID_VALUE;
960 }
961 if (IsUIExtensionExist(want)) {
962 TAG_LOGD(AAFwkTag::CONTEXT, "exist uIExtension");
963 return ERR_OK;
964 }
965 auto abilityCallback = abilityCallback_.lock();
966 if (abilityCallback == nullptr) {
967 TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
968 return ERR_INVALID_VALUE;
969 }
970 auto disposedCallback = std::make_shared<DialogUIExtensionCallback>(abilityCallback);
971 Ace::ModalUIExtensionCallbacks callback;
972 callback.onError = [disposedCallback](int32_t arg1, const std::string &str1, const std::string &str2) {
973 disposedCallback->OnError();
974 };
975 callback.onRelease = [disposedCallback](int32_t arg1) {
976 disposedCallback->OnRelease();
977 };
978 callback.onDestroy = [disposedCallback]() {
979 disposedCallback->OnDestroy();
980 };
981 Ace::ModalUIExtensionConfig config;
982 config.prohibitedRemoveByRouter = true;
983 if (want.GetBoolParam(DISPOSED_PROHIBIT_BACK, false)) {
984 config.isProhibitBack = true;
985 }
986 int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
987 if (sessionId == 0) {
988 TAG_LOGE(AAFwkTag::CONTEXT, "failed");
989 return ERR_INVALID_VALUE;
990 }
991 disposedCallback->SetUIContent(uiContent);
992 disposedCallback->SetSessionId(sessionId);
993 {
994 std::lock_guard lock(uiExtensionMutex_);
995 uiExtensionMap_.emplace(sessionId, want);
996 }
997 return ERR_OK;
998 }
999 #endif
1000
RequestModalUIExtension(const AAFwk::Want & want)1001 ErrCode AbilityContextImpl::RequestModalUIExtension(const AAFwk::Want& want)
1002 {
1003 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->RequestModalUIExtension(want);
1004 if (err != ERR_OK) {
1005 TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
1006 }
1007 return err;
1008 }
1009
ChangeAbilityVisibility(bool isShow)1010 ErrCode AbilityContextImpl::ChangeAbilityVisibility(bool isShow)
1011 {
1012 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->ChangeAbilityVisibility(token_, isShow);
1013 if (err != ERR_OK) {
1014 TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
1015 }
1016 return err;
1017 }
1018
AddFreeInstallObserver(const sptr<IFreeInstallObserver> & observer)1019 ErrCode AbilityContextImpl::AddFreeInstallObserver(const sptr<IFreeInstallObserver> &observer)
1020 {
1021 ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->AddFreeInstallObserver(token_, observer);
1022 if (ret != ERR_OK) {
1023 TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret: %{public}d", ret);
1024 }
1025 return ret;
1026 }
1027
OpenAtomicService(AAFwk::Want & want,const AAFwk::StartOptions & options,int requestCode,RuntimeTask && task)1028 ErrCode AbilityContextImpl::OpenAtomicService(AAFwk::Want& want, const AAFwk::StartOptions &options, int requestCode,
1029 RuntimeTask &&task)
1030 {
1031 TAG_LOGD(AAFwkTag::CONTEXT, "called");
1032 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
1033 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->OpenAtomicService(want, options, token_, requestCode, -1);
1034 if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
1035 TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret=%{public}d", err);
1036 OnAbilityResultInner(requestCode, err, want);
1037 }
1038 return err;
1039 }
1040
SetRestoreEnabled(bool enabled)1041 void AbilityContextImpl::SetRestoreEnabled(bool enabled)
1042 {
1043 restoreEnabled_.store(enabled);
1044 }
1045
GetRestoreEnabled()1046 bool AbilityContextImpl::GetRestoreEnabled()
1047 {
1048 return restoreEnabled_.load();
1049 }
1050
OpenLink(const AAFwk::Want & want,int requestCode)1051 ErrCode AbilityContextImpl::OpenLink(const AAFwk::Want& want, int requestCode)
1052 {
1053 TAG_LOGD(AAFwkTag::CONTEXT, "called");
1054 return AAFwk::AbilityManagerClient::GetInstance()->OpenLink(want, token_, -1, requestCode);
1055 }
1056
GetWant()1057 std::shared_ptr<AAFwk::Want> AbilityContextImpl::GetWant()
1058 {
1059 auto abilityCallback = abilityCallback_.lock();
1060 if (abilityCallback == nullptr) {
1061 TAG_LOGW(AAFwkTag::CONTEXT, "abilityCallback is nullptr.");
1062 return nullptr;
1063 }
1064 return abilityCallback->GetWant();
1065 }
1066 } // namespace AbilityRuntime
1067 } // namespace OHOS
1068