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