• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ability_context_impl.h"
17 
18 #include <native_engine/native_engine.h>
19 
20 #include "ability_manager_client.h"
21 #include "hitrace_meter.h"
22 #include "connection_manager.h"
23 #include "dialog_request_callback_impl.h"
24 #include "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