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 "hilog_wrapper.h"
25 #include "remote_object_wrapper.h"
26 #include "request_constants.h"
27 #include "scene_board_judgement.h"
28 #include "session/host/include/zidl/session_interface.h"
29 #include "session_info.h"
30 #include "string_wrapper.h"
31 #include "want_params_wrapper.h"
32
33 namespace OHOS {
34 namespace AbilityRuntime {
35 const size_t AbilityContext::CONTEXT_TYPE_ID(std::hash<const char*> {} ("AbilityContext"));
36
37 struct RequestResult {
38 int32_t resultCode {0};
39 AAFwk::Want resultWant;
40 RequestDialogResultTask task;
41 };
42
GetDeviceType() const43 Global::Resource::DeviceType AbilityContextImpl::GetDeviceType() const
44 {
45 return (stageContext_ != nullptr) ? stageContext_->GetDeviceType() : Global::Resource::DeviceType::DEVICE_PHONE;
46 }
47
GetBaseDir() const48 std::string AbilityContextImpl::GetBaseDir() const
49 {
50 return stageContext_ ? stageContext_->GetBaseDir() : "";
51 }
52
GetBundleCodeDir()53 std::string AbilityContextImpl::GetBundleCodeDir()
54 {
55 return stageContext_ ? stageContext_->GetBundleCodeDir() : "";
56 }
57
GetCacheDir()58 std::string AbilityContextImpl::GetCacheDir()
59 {
60 return stageContext_ ? stageContext_->GetCacheDir() : "";
61 }
62
GetDatabaseDir()63 std::string AbilityContextImpl::GetDatabaseDir()
64 {
65 return stageContext_ ? stageContext_->GetDatabaseDir() : "";
66 }
67
GetSystemDatabaseDir(const std::string & groupId,bool checkExist,std::string & databaseDir)68 int32_t AbilityContextImpl::GetSystemDatabaseDir(const std::string &groupId, bool checkExist, std::string &databaseDir)
69 {
70 return stageContext_ ?
71 stageContext_->GetSystemDatabaseDir(groupId, checkExist, databaseDir) : ERR_INVALID_VALUE;
72 }
73
GetPreferencesDir()74 std::string AbilityContextImpl::GetPreferencesDir()
75 {
76 return stageContext_ ? stageContext_->GetPreferencesDir() : "";
77 }
78
GetSystemPreferencesDir(const std::string & groupId,bool checkExist,std::string & preferencesDir)79 int AbilityContextImpl::GetSystemPreferencesDir(const std::string &groupId, bool checkExist,
80 std::string &preferencesDir)
81 {
82 return stageContext_ ?
83 stageContext_->GetSystemPreferencesDir(groupId, checkExist, preferencesDir) : ERR_INVALID_VALUE;
84 }
85
GetGroupDir(std::string groupId)86 std::string AbilityContextImpl::GetGroupDir(std::string groupId)
87 {
88 return stageContext_ ? stageContext_->GetGroupDir(groupId) : "";
89 }
90
GetTempDir()91 std::string AbilityContextImpl::GetTempDir()
92 {
93 return stageContext_ ? stageContext_->GetTempDir() : "";
94 }
95
GetFilesDir()96 std::string AbilityContextImpl::GetFilesDir()
97 {
98 return stageContext_ ? stageContext_->GetFilesDir() : "";
99 }
100
GetDistributedFilesDir()101 std::string AbilityContextImpl::GetDistributedFilesDir()
102 {
103 return stageContext_ ? stageContext_->GetDistributedFilesDir() : "";
104 }
105
IsUpdatingConfigurations()106 bool AbilityContextImpl::IsUpdatingConfigurations()
107 {
108 return stageContext_ ? stageContext_->IsUpdatingConfigurations() : false;
109 }
110
PrintDrawnCompleted()111 bool AbilityContextImpl::PrintDrawnCompleted()
112 {
113 return stageContext_ ? stageContext_->PrintDrawnCompleted() : false;
114 }
115
SwitchArea(int mode)116 void AbilityContextImpl::SwitchArea(int mode)
117 {
118 HILOG_INFO("mode:%{public}d.", mode);
119 if (stageContext_ != nullptr) {
120 stageContext_->SwitchArea(mode);
121 }
122 }
123
GetArea()124 int AbilityContextImpl::GetArea()
125 {
126 HILOG_DEBUG("GetArea");
127 if (stageContext_ == nullptr) {
128 HILOG_ERROR("stageContext is nullptr.");
129 return ContextImpl::EL_DEFAULT;
130 }
131 return stageContext_->GetArea();
132 }
133
StartAbility(const AAFwk::Want & want,int requestCode)134 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, int requestCode)
135 {
136 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
137 HILOG_DEBUG("StartAbility");
138 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode);
139 if (err != ERR_OK) {
140 HILOG_ERROR("StartAbility. ret=%{public}d", err);
141 }
142 return err;
143 }
144
StartAbilityAsCaller(const AAFwk::Want & want,int requestCode)145 ErrCode AbilityContextImpl::StartAbilityAsCaller(const AAFwk::Want &want, int requestCode)
146 {
147 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
148 HILOG_DEBUG("StartAbilityAsCaller");
149 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want, token_, requestCode);
150 if (err != ERR_OK) {
151 HILOG_ERROR("StartAbilityAsCaller. ret=%{public}d", err);
152 }
153 return err;
154 }
155
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,int requestCode)156 ErrCode AbilityContextImpl::StartAbilityWithAccount(const AAFwk::Want& want, int accountId, int requestCode)
157 {
158 HILOG_DEBUG("StartAbilityWithAccount");
159 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
160 if (err != ERR_OK) {
161 HILOG_ERROR("StartAbilityWithAccount. ret=%{public}d", err);
162 }
163 return err;
164 }
165
StartAbility(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode)166 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, const AAFwk::StartOptions& startOptions,
167 int requestCode)
168 {
169 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
170 HILOG_DEBUG("StartAbility");
171 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
172 if (err != ERR_OK) {
173 HILOG_ERROR("StartAbility. ret=%{public}d", err);
174 }
175 return err;
176 }
177
StartAbilityAsCaller(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode)178 ErrCode AbilityContextImpl::StartAbilityAsCaller(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions,
179 int requestCode)
180 {
181 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
182 HILOG_DEBUG("StartAbilityAsCaller");
183 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want,
184 startOptions, token_, requestCode);
185 if (err != ERR_OK) {
186 HILOG_ERROR("StartAbilityAsCaller. ret=%{public}d", err);
187 }
188 return err;
189 }
190
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode)191 ErrCode AbilityContextImpl::StartAbilityWithAccount(
192 const AAFwk::Want& want, int accountId, const AAFwk::StartOptions& startOptions, int requestCode)
193 {
194 HILOG_DEBUG("name:%{public}s %{public}s, accountId=%{public}d",
195 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
196 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
197 want, startOptions, token_, requestCode, accountId);
198 if (err != ERR_OK) {
199 HILOG_ERROR("StartAbilityWithAccount. ret=%{public}d", err);
200 }
201 return err;
202 }
203
StartAbilityForResult(const AAFwk::Want & want,int requestCode,RuntimeTask && task)204 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, int requestCode, RuntimeTask&& task)
205 {
206 HILOG_DEBUG("StartAbilityForResult");
207 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
208 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode);
209 if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
210 HILOG_ERROR("StartAbilityForResult. ret=%{public}d", err);
211 OnAbilityResultInner(requestCode, err, want);
212 }
213 return err;
214 }
215
StartAbilityForResultWithAccount(const AAFwk::Want & want,const int accountId,int requestCode,RuntimeTask && task)216 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
217 const AAFwk::Want& want, const int accountId, int requestCode, RuntimeTask&& task)
218 {
219 HILOG_DEBUG("accountId:%{private}d", accountId);
220 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
221 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
222 if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
223 HILOG_ERROR("StartAbilityForResultWithAccount. ret=%{public}d", err);
224 OnAbilityResultInner(requestCode, err, want);
225 }
226 return err;
227 }
228
StartAbilityForResult(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)229 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, const AAFwk::StartOptions& startOptions,
230 int requestCode, RuntimeTask&& task)
231 {
232 HILOG_DEBUG("StartAbilityForResult");
233 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
234 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
235 if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
236 HILOG_ERROR("StartAbilityForResult. ret=%{public}d", err);
237 OnAbilityResultInner(requestCode, err, want);
238 }
239 return err;
240 }
241
StartAbilityForResultWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)242 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
243 const AAFwk::Want& want, int accountId, const AAFwk::StartOptions& startOptions,
244 int requestCode, RuntimeTask&& task)
245 {
246 HILOG_DEBUG("StartAbilityForResultWithAccount");
247 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
248 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
249 want, startOptions, token_, requestCode, accountId);
250 if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
251 HILOG_ERROR("StartAbilityForResultWithAccount. ret=%{public}d", err);
252 OnAbilityResultInner(requestCode, err, want);
253 }
254 return err;
255 }
256
StartServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)257 ErrCode AbilityContextImpl::StartServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
258 {
259 HILOG_INFO("name:%{public}s %{public}s, accountId=%{public}d",
260 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
261 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
262 want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
263 if (err != ERR_OK) {
264 HILOG_ERROR("StartServiceExtensionAbility is failed %{public}d", err);
265 }
266 return err;
267 }
268
StopServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)269 ErrCode AbilityContextImpl::StopServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
270 {
271 HILOG_INFO("name:%{public}s %{public}s, accountId=%{public}d",
272 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
273 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StopExtensionAbility(
274 want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
275 if (err != ERR_OK) {
276 HILOG_ERROR("StopServiceExtensionAbility is failed %{public}d", err);
277 }
278 return err;
279 }
280
TerminateAbilityWithResult(const AAFwk::Want & want,int resultCode)281 ErrCode AbilityContextImpl::TerminateAbilityWithResult(const AAFwk::Want& want, int resultCode)
282 {
283 HILOG_DEBUG("TerminateAbilityWithResult");
284 isTerminating_ = true;
285
286 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
287 auto sessionToken = sessionToken_.promote();
288 if (sessionToken == nullptr) {
289 return ERR_INVALID_VALUE;
290 }
291 sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
292 info->want = want;
293 info->resultCode = resultCode;
294 auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
295 auto err = ifaceSessionToken->TerminateSession(info);
296 HILOG_INFO("TerminateAbilityWithResult. ret=%{public}d", err);
297 return static_cast<int32_t>(err);
298 } else {
299 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, resultCode, &want);
300 HILOG_INFO("TerminateAbilityWithResult. ret=%{public}d", err);
301 return err;
302 }
303 }
304
SetWeakSessionToken(const wptr<IRemoteObject> & sessionToken)305 void AbilityContextImpl::SetWeakSessionToken(const wptr<IRemoteObject>& sessionToken)
306 {
307 HILOG_DEBUG("Start calling SetWeakSessionToken.");
308 sessionToken_ = sessionToken;
309 }
310
OnAbilityResult(int requestCode,int resultCode,const AAFwk::Want & resultData)311 void AbilityContextImpl::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want& resultData)
312 {
313 HILOG_DEBUG("Start calling OnAbilityResult.");
314 auto callback = resultCallbacks_.find(requestCode);
315 if (callback != resultCallbacks_.end()) {
316 if (callback->second) {
317 callback->second(resultCode, resultData, false);
318 }
319 resultCallbacks_.erase(requestCode);
320 }
321 HILOG_INFO("OnAbilityResult");
322 }
323
OnAbilityResultInner(int requestCode,int resultCode,const AAFwk::Want & resultData)324 void AbilityContextImpl::OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want& resultData)
325 {
326 HILOG_DEBUG("Start calling OnAbilityResult.");
327 auto callback = resultCallbacks_.find(requestCode);
328 if (callback != resultCallbacks_.end()) {
329 if (callback->second) {
330 callback->second(resultCode, resultData, true);
331 }
332 resultCallbacks_.erase(requestCode);
333 }
334 HILOG_INFO("OnAbilityResult");
335 }
336
ConnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)337 ErrCode AbilityContextImpl::ConnectAbility(const AAFwk::Want& want, const sptr<AbilityConnectCallback>& connectCallback)
338 {
339 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
340 HILOG_DEBUG("ConnectAbility begin, name:%{public}s.", abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
341 ErrCode ret = ConnectionManager::GetInstance().ConnectAbility(token_, want, connectCallback);
342 if (ret != ERR_OK) {
343 HILOG_ERROR("ConnectAbility ret:%{public}d", ret);
344 }
345 return ret;
346 }
347
ConnectAbilityWithAccount(const AAFwk::Want & want,int accountId,const sptr<AbilityConnectCallback> & connectCallback)348 ErrCode AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want& want, int accountId,
349 const sptr<AbilityConnectCallback>& connectCallback)
350 {
351 HILOG_DEBUG("ConnectAbilityWithAccount");
352 ErrCode ret =
353 ConnectionManager::GetInstance().ConnectAbilityWithAccount(token_, want, accountId, connectCallback);
354 if (ret != ERR_OK) {
355 HILOG_ERROR("ConnectAbilityWithAccount ret:%{public}d", ret);
356 }
357 return ret;
358 }
359
DisconnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)360 void AbilityContextImpl::DisconnectAbility(const AAFwk::Want& want,
361 const sptr<AbilityConnectCallback>& connectCallback)
362 {
363 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
364 HILOG_DEBUG("DisconnectAbility begin, caller:%{public}s.",
365 abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
366 ErrCode ret =
367 ConnectionManager::GetInstance().DisconnectAbility(token_, want.GetElement(), connectCallback);
368 if (ret != ERR_OK) {
369 HILOG_ERROR("error, ret=%{public}d", ret);
370 }
371 }
372
GetBundleName() const373 std::string AbilityContextImpl::GetBundleName() const
374 {
375 return stageContext_ ? stageContext_->GetBundleName() : "";
376 }
377
GetApplicationInfo() const378 std::shared_ptr<AppExecFwk::ApplicationInfo> AbilityContextImpl::GetApplicationInfo() const
379 {
380 return stageContext_ ? stageContext_->GetApplicationInfo() : nullptr;
381 }
382
GetBundleCodePath() const383 std::string AbilityContextImpl::GetBundleCodePath() const
384 {
385 return stageContext_ ? stageContext_->GetBundleCodePath() : "";
386 }
387
GetHapModuleInfo() const388 std::shared_ptr<AppExecFwk::HapModuleInfo> AbilityContextImpl::GetHapModuleInfo() const
389 {
390 return stageContext_ ? stageContext_->GetHapModuleInfo() : nullptr;
391 }
392
GetResourceManager() const393 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::GetResourceManager() const
394 {
395 return stageContext_ ? stageContext_->GetResourceManager() : nullptr;
396 }
397
CreateBundleContext(const std::string & bundleName)398 std::shared_ptr<Context> AbilityContextImpl::CreateBundleContext(const std::string& bundleName)
399 {
400 return stageContext_ ? stageContext_->CreateBundleContext(bundleName) : nullptr;
401 }
402
CreateModuleContext(const std::string & moduleName)403 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& moduleName)
404 {
405 return stageContext_ ? stageContext_->CreateModuleContext(moduleName) : nullptr;
406 }
407
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)408 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& bundleName,
409 const std::string& moduleName)
410 {
411 return stageContext_ ? stageContext_->CreateModuleContext(bundleName, moduleName) : nullptr;
412 }
413
SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> & abilityInfo)414 void AbilityContextImpl::SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo>& abilityInfo)
415 {
416 abilityInfo_ = abilityInfo;
417 }
418
GetAbilityInfo() const419 std::shared_ptr<AppExecFwk::AbilityInfo> AbilityContextImpl::GetAbilityInfo() const
420 {
421 return abilityInfo_;
422 }
423
SetStageContext(const std::shared_ptr<AbilityRuntime::Context> & stageContext)424 void AbilityContextImpl::SetStageContext(const std::shared_ptr<AbilityRuntime::Context>& stageContext)
425 {
426 stageContext_ = stageContext;
427 }
428
SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> & config)429 void AbilityContextImpl::SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& config)
430 {
431 config_ = config;
432 }
433
GetConfiguration() const434 std::shared_ptr<AppExecFwk::Configuration> AbilityContextImpl::GetConfiguration() const
435 {
436 return config_;
437 }
438
MinimizeAbility(bool fromUser)439 void AbilityContextImpl::MinimizeAbility(bool fromUser)
440 {
441 HILOG_DEBUG("call");
442 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(token_, fromUser);
443 if (err != ERR_OK) {
444 HILOG_ERROR("MinimizeAbility is failed %{public}d", err);
445 }
446 }
447
OnBackPressedCallBack(bool & needMoveToBackground)448 ErrCode AbilityContextImpl::OnBackPressedCallBack(bool &needMoveToBackground)
449 {
450 HILOG_DEBUG("call");
451 auto abilityCallback = abilityCallback_.lock();
452 if (abilityCallback == nullptr) {
453 HILOG_ERROR("abilityCallback is nullptr.");
454 return ERR_INVALID_VALUE;
455 }
456 needMoveToBackground = abilityCallback->OnBackPress();
457 return ERR_OK;
458 }
459
MoveAbilityToBackground()460 ErrCode AbilityContextImpl::MoveAbilityToBackground()
461 {
462 HILOG_DEBUG("call");
463 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveAbilityToBackground(token_);
464 if (err != ERR_OK) {
465 HILOG_ERROR("MoveAbilityToBackground failed: %{public}d", err);
466 }
467 return err;
468 }
469
TerminateSelf()470 ErrCode AbilityContextImpl::TerminateSelf()
471 {
472 HILOG_DEBUG("TerminateSelf");
473 isTerminating_ = true;
474
475 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
476 auto sessionToken = sessionToken_.promote();
477 if (sessionToken == nullptr) {
478 return ERR_INVALID_VALUE;
479 }
480 HILOG_INFO("TerminateSelf. SCB");
481 AAFwk::Want resultWant;
482 sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
483 info->want = resultWant;
484 info->resultCode = -1;
485 auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
486 auto err = ifaceSessionToken->TerminateSession(info);
487 return static_cast<int32_t>(err);
488 } else {
489 AAFwk::Want resultWant;
490 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, -1, &resultWant);
491 if (err != ERR_OK) {
492 HILOG_ERROR("AbilityContextImpl::TerminateSelf is failed %{public}d", err);
493 }
494 return err;
495 }
496 }
497
CloseAbility()498 ErrCode AbilityContextImpl::CloseAbility()
499 {
500 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
501 HILOG_DEBUG("CloseAbility");
502 isTerminating_ = true;
503 AAFwk::Want resultWant;
504 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->CloseAbility(token_, -1, &resultWant);
505 if (err != ERR_OK) {
506 HILOG_ERROR("CloseAbility failed: %{public}d", err);
507 }
508 return err;
509 }
510
GetToken()511 sptr<IRemoteObject> AbilityContextImpl::GetToken()
512 {
513 return token_;
514 }
515
RestoreWindowStage(NativeEngine & engine,NativeValue * contentStorage)516 ErrCode AbilityContextImpl::RestoreWindowStage(NativeEngine& engine, NativeValue* contentStorage)
517 {
518 HILOG_INFO("call");
519 contentStorage_ = std::unique_ptr<NativeReference>(engine.CreateReference(contentStorage, 1));
520 return ERR_OK;
521 }
522
StartAbilityByCall(const AAFwk::Want & want,const std::shared_ptr<CallerCallBack> & callback,int32_t accountId)523 ErrCode AbilityContextImpl::StartAbilityByCall(
524 const AAFwk::Want& want, const std::shared_ptr<CallerCallBack>& callback, int32_t accountId)
525 {
526 if (localCallContainer_ == nullptr) {
527 localCallContainer_ = std::make_shared<LocalCallContainer>();
528 if (localCallContainer_ == nullptr) {
529 HILOG_ERROR("localCallContainer_ is nullptr.");
530 return ERR_INVALID_VALUE;
531 }
532 }
533 return localCallContainer_->StartAbilityByCallInner(want, callback, token_, accountId);
534 }
535
ReleaseCall(const std::shared_ptr<CallerCallBack> & callback)536 ErrCode AbilityContextImpl::ReleaseCall(const std::shared_ptr<CallerCallBack>& callback)
537 {
538 HILOG_DEBUG("Release begin.");
539 if (localCallContainer_ == nullptr) {
540 HILOG_ERROR("localCallContainer_ is nullptr.");
541 return ERR_INVALID_VALUE;
542 }
543 HILOG_DEBUG("Release end.");
544 return localCallContainer_->ReleaseCall(callback);
545 }
546
ClearFailedCallConnection(const std::shared_ptr<CallerCallBack> & callback)547 void AbilityContextImpl::ClearFailedCallConnection(const std::shared_ptr<CallerCallBack>& callback)
548 {
549 HILOG_DEBUG("Clear begin.");
550 if (localCallContainer_ == nullptr) {
551 HILOG_ERROR("localCallContainer_ is nullptr.");
552 return;
553 }
554 localCallContainer_->ClearFailedCallConnection(callback);
555 HILOG_DEBUG("Clear end.");
556 }
557
RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)558 void AbilityContextImpl::RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)
559 {
560 HILOG_INFO("call");
561 abilityCallback_ = abilityCallback;
562 }
563
RequestDialogService(NativeEngine & engine,AAFwk::Want & want,RequestDialogResultTask && task)564 ErrCode AbilityContextImpl::RequestDialogService(NativeEngine &engine,
565 AAFwk::Want &want, RequestDialogResultTask &&task)
566 {
567 want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
568 int32_t left, top, width, height;
569 GetWindowRect(left, top, width, height);
570 want.SetParam(RequestConstants::WINDOW_RECTANGLE_LEFT_KEY, left);
571 want.SetParam(RequestConstants::WINDOW_RECTANGLE_TOP_KEY, top);
572 want.SetParam(RequestConstants::WINDOW_RECTANGLE_WIDTH_KEY, width);
573 want.SetParam(RequestConstants::WINDOW_RECTANGLE_HEIGHT_KEY, height);
574 auto resultTask =
575 [&engine, outTask = std::move(task)](int32_t resultCode, const AAFwk::Want &resultWant) {
576 auto retData = new RequestResult();
577 retData->resultCode = resultCode;
578 retData->resultWant = resultWant;
579 retData->task = std::move(outTask);
580
581 auto loop = engine.GetUVLoop();
582 if (loop == nullptr) {
583 HILOG_ERROR("RequestDialogService, fail to get uv loop.");
584 return;
585 }
586 auto work = new uv_work_t;
587 work->data = static_cast<void*>(retData);
588 int rev = uv_queue_work_with_qos(
589 loop,
590 work,
591 [](uv_work_t* work) {},
592 RequestDialogResultJSThreadWorker,
593 uv_qos_user_initiated);
594 if (rev != 0) {
595 delete retData;
596 retData = nullptr;
597 if (work != nullptr) {
598 delete work;
599 work = nullptr;
600 }
601 }
602 };
603
604 sptr<IRemoteObject> remoteObject = new DialogRequestCallbackImpl(std::move(resultTask));
605 want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
606
607 auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
608 HILOG_DEBUG("RequestDialogService ret=%{public}d", static_cast<int32_t>(err));
609 return err;
610 }
611
ReportDrawnCompleted()612 ErrCode AbilityContextImpl::ReportDrawnCompleted()
613 {
614 HILOG_DEBUG("called.");
615 return AAFwk::AbilityManagerClient::GetInstance()->ReportDrawnCompleted(token_);
616 }
617
RequestDialogResultJSThreadWorker(uv_work_t * work,int status)618 void AbilityContextImpl::RequestDialogResultJSThreadWorker(uv_work_t* work, int status)
619 {
620 HILOG_DEBUG("RequestDialogResultJSThreadWorker");
621 if (work == nullptr) {
622 HILOG_ERROR("RequestDialogResultJSThreadWorker, uv_queue_work input work is nullptr");
623 return;
624 }
625 RequestResult* retCB = static_cast<RequestResult*>(work->data);
626 if (retCB == nullptr) {
627 HILOG_ERROR("RequestDialogResultJSThreadWorker, retCB is nullptr");
628 delete work;
629 work = nullptr;
630 return;
631 }
632
633 if (retCB->task) {
634 retCB->task(retCB->resultCode, retCB->resultWant);
635 }
636
637 delete retCB;
638 retCB = nullptr;
639 delete work;
640 work = nullptr;
641 }
642
GetMissionId(int32_t & missionId)643 ErrCode AbilityContextImpl::GetMissionId(int32_t &missionId)
644 {
645 HILOG_DEBUG("GetMissionId");
646 if (missionId_ != -1) {
647 missionId = missionId_;
648 return ERR_OK;
649 }
650
651 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token_, missionId);
652 if (err != ERR_OK) {
653 HILOG_ERROR("GetMissionId is failed %{public}d", err);
654 } else {
655 missionId_ = missionId;
656 HILOG_DEBUG("missionId is %{public}d.", missionId_);
657 }
658 return err;
659 }
660
SetMissionContinueState(const AAFwk::ContinueState & state)661 ErrCode AbilityContextImpl::SetMissionContinueState(const AAFwk::ContinueState &state)
662 {
663 HILOG_DEBUG("SetMissionContinueState: %{public}d", state);
664 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionContinueState(token_, state);
665 if (err != ERR_OK) {
666 HILOG_ERROR("SetMissionContinueState failed: %{public}d", err);
667 }
668 return err;
669 }
670
GetWindowRect(int32_t & left,int32_t & top,int32_t & width,int32_t & height)671 void AbilityContextImpl::GetWindowRect(int32_t &left, int32_t &top, int32_t &width, int32_t &height)
672 {
673 HILOG_DEBUG("call");
674 auto abilityCallback = abilityCallback_.lock();
675 if (abilityCallback) {
676 abilityCallback->GetWindowRect(left, top, width, height);
677 }
678 }
679
680 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const std::string & label)681 ErrCode AbilityContextImpl::SetMissionLabel(const std::string& label)
682 {
683 HILOG_DEBUG("call label:%{public}s", label.c_str());
684 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionLabel(token_, label);
685 if (err != ERR_OK) {
686 HILOG_ERROR("SetMissionLabel is failed %{public}d", err);
687 } else {
688 auto abilityCallback = abilityCallback_.lock();
689 if (abilityCallback) {
690 abilityCallback->SetMissionLabel(label);
691 }
692 }
693 return err;
694 }
695
SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> & icon)696 ErrCode AbilityContextImpl::SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap>& icon)
697 {
698 HILOG_DEBUG("call");
699 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionIcon(token_, icon);
700 if (err != ERR_OK) {
701 HILOG_ERROR("SetMissionIcon is failed %{public}d", err);
702 } else {
703 auto abilityCallback = abilityCallback_.lock();
704 if (abilityCallback) {
705 abilityCallback->SetMissionIcon(icon);
706 }
707 }
708 return err;
709 }
710
GetCurrentWindowMode()711 int AbilityContextImpl::GetCurrentWindowMode()
712 {
713 auto abilityCallback = abilityCallback_.lock();
714 if (abilityCallback == nullptr) {
715 return AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED;
716 }
717 return abilityCallback->GetCurrentWindowMode();
718 }
719
GetUIContent()720 Ace::UIContent* AbilityContextImpl::GetUIContent()
721 {
722 HILOG_DEBUG("call");
723 auto abilityCallback = abilityCallback_.lock();
724 if (abilityCallback == nullptr) {
725 return nullptr;
726 }
727
728 return abilityCallback->GetUIContent();
729 }
730 #endif
731 } // namespace AbilityRuntime
732 } // namespace OHOS
733