• 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 "dialog_ui_extension_callback.h"
25 #include "hilog_wrapper.h"
26 #include "remote_object_wrapper.h"
27 #include "request_constants.h"
28 #include "scene_board_judgement.h"
29 #include "session/host/include/zidl/session_interface.h"
30 #include "session_info.h"
31 #include "string_wrapper.h"
32 #include "ui_content.h"
33 #include "want_params_wrapper.h"
34 
35 namespace OHOS {
36 namespace AbilityRuntime {
37 const size_t AbilityContext::CONTEXT_TYPE_ID(std::hash<const char*> {} ("AbilityContext"));
38 const std::string START_ABILITY_TYPE = "ABILITY_INNER_START_WITH_ACCOUNT";
39 const std::string UIEXTENSION_TARGET_TYPE_KEY = "ability.want.params.uiExtensionTargetType";
40 const std::string FLAG_AUTH_READ_URI_PERMISSION = "ability.want.params.uriPermissionFlag";
41 
42 struct RequestResult {
43     int32_t resultCode {0};
44     AAFwk::Want resultWant;
45     RequestDialogResultTask task;
46 };
47 
GetDeviceType() const48 Global::Resource::DeviceType AbilityContextImpl::GetDeviceType() const
49 {
50     return (stageContext_ != nullptr) ? stageContext_->GetDeviceType() : Global::Resource::DeviceType::DEVICE_PHONE;
51 }
52 
GetBaseDir() const53 std::string AbilityContextImpl::GetBaseDir() const
54 {
55     return stageContext_ ? stageContext_->GetBaseDir() : "";
56 }
57 
GetBundleCodeDir()58 std::string AbilityContextImpl::GetBundleCodeDir()
59 {
60     return stageContext_ ? stageContext_->GetBundleCodeDir() : "";
61 }
62 
GetCacheDir()63 std::string AbilityContextImpl::GetCacheDir()
64 {
65     return stageContext_ ? stageContext_->GetCacheDir() : "";
66 }
67 
GetDatabaseDir()68 std::string AbilityContextImpl::GetDatabaseDir()
69 {
70     return stageContext_ ? stageContext_->GetDatabaseDir() : "";
71 }
72 
GetSystemDatabaseDir(const std::string & groupId,bool checkExist,std::string & databaseDir)73 int32_t AbilityContextImpl::GetSystemDatabaseDir(const std::string &groupId, bool checkExist, std::string &databaseDir)
74 {
75     return stageContext_ ?
76         stageContext_->GetSystemDatabaseDir(groupId, checkExist, databaseDir) : ERR_INVALID_VALUE;
77 }
78 
GetPreferencesDir()79 std::string AbilityContextImpl::GetPreferencesDir()
80 {
81     return stageContext_ ? stageContext_->GetPreferencesDir() : "";
82 }
83 
GetSystemPreferencesDir(const std::string & groupId,bool checkExist,std::string & preferencesDir)84 int AbilityContextImpl::GetSystemPreferencesDir(const std::string &groupId, bool checkExist,
85     std::string &preferencesDir)
86 {
87     return stageContext_ ?
88         stageContext_->GetSystemPreferencesDir(groupId, checkExist, preferencesDir) : ERR_INVALID_VALUE;
89 }
90 
GetGroupDir(std::string groupId)91 std::string AbilityContextImpl::GetGroupDir(std::string groupId)
92 {
93     return stageContext_ ? stageContext_->GetGroupDir(groupId) : "";
94 }
95 
GetTempDir()96 std::string AbilityContextImpl::GetTempDir()
97 {
98     return stageContext_ ? stageContext_->GetTempDir() : "";
99 }
100 
GetResourceDir()101 std::string AbilityContextImpl::GetResourceDir()
102 {
103     return stageContext_ ? stageContext_->GetResourceDir() : "";
104 }
105 
GetFilesDir()106 std::string AbilityContextImpl::GetFilesDir()
107 {
108     return stageContext_ ? stageContext_->GetFilesDir() : "";
109 }
110 
GetDistributedFilesDir()111 std::string AbilityContextImpl::GetDistributedFilesDir()
112 {
113     return stageContext_ ? stageContext_->GetDistributedFilesDir() : "";
114 }
115 
IsUpdatingConfigurations()116 bool AbilityContextImpl::IsUpdatingConfigurations()
117 {
118     return stageContext_ ? stageContext_->IsUpdatingConfigurations() : false;
119 }
120 
PrintDrawnCompleted()121 bool AbilityContextImpl::PrintDrawnCompleted()
122 {
123     return stageContext_ ? stageContext_->PrintDrawnCompleted() : false;
124 }
125 
SwitchArea(int mode)126 void AbilityContextImpl::SwitchArea(int mode)
127 {
128     HILOG_DEBUG("mode:%{public}d.", mode);
129     if (stageContext_ != nullptr) {
130         stageContext_->SwitchArea(mode);
131     }
132 }
133 
GetArea()134 int AbilityContextImpl::GetArea()
135 {
136     HILOG_DEBUG("GetArea");
137     if (stageContext_ == nullptr) {
138         HILOG_ERROR("stageContext is nullptr.");
139         return ContextImpl::EL_DEFAULT;
140     }
141     return stageContext_->GetArea();
142 }
143 
StartAbility(const AAFwk::Want & want,int requestCode)144 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, int requestCode)
145 {
146     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
147     HILOG_DEBUG("StartAbility");
148     int32_t screenMode = want.GetIntParam(AAFwk::SCREEN_MODE_KEY, AAFwk::IDLE_SCREEN_MODE);
149     if (screenMode == AAFwk::HALF_SCREEN_MODE) {
150         auto uiContent = GetUIContent();
151         if (uiContent == nullptr) {
152             HILOG_ERROR("uiContent is nullptr");
153             return ERR_INVALID_VALUE;
154         }
155         Ace::ModalUIExtensionCallbacks callback;
156         Ace::ModalUIExtensionConfig config;
157         int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
158         if (sessionId == 0) {
159             HILOG_ERROR("CreateModalUIExtension failed");
160             return ERR_INVALID_VALUE;
161         }
162         return ERR_OK;
163     }
164     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode);
165     if (err != ERR_OK) {
166         HILOG_ERROR("StartAbility. 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     HILOG_DEBUG("StartAbilityAsCaller");
175     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want, token_, nullptr, requestCode);
176     if (err != ERR_OK) {
177         HILOG_ERROR("StartAbilityAsCaller. 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     HILOG_DEBUG("StartAbilityWithAccount");
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         HILOG_ERROR("StartAbilityWithAccount. 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     HILOG_DEBUG("StartAbility");
198     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
199     if (err != ERR_OK) {
200         HILOG_ERROR("StartAbility. 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     HILOG_DEBUG("StartAbilityAsCaller");
210     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want,
211         startOptions, token_, nullptr, requestCode);
212     if (err != ERR_OK) {
213         HILOG_ERROR("StartAbilityAsCaller. 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     HILOG_DEBUG("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         HILOG_ERROR("StartAbilityWithAccount. 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     HILOG_DEBUG("StartAbilityForResult");
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         HILOG_ERROR("StartAbilityForResult. 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     HILOG_DEBUG("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         HILOG_ERROR("StartAbilityForResultWithAccount. 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     HILOG_DEBUG("StartAbilityForResult");
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         HILOG_ERROR("StartAbilityForResult. 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     HILOG_DEBUG("StartAbilityForResultWithAccount");
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         HILOG_ERROR("StartAbilityForResultWithAccount. ret=%{public}d", err);
280         OnAbilityResultInner(requestCode, err, want);
281     }
282     return err;
283 }
284 
StartServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)285 ErrCode AbilityContextImpl::StartServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
286 {
287     HILOG_INFO("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::SERVICE);
291     if (err != ERR_OK) {
292         HILOG_ERROR("StartServiceExtensionAbility is failed %{public}d", err);
293     }
294     return err;
295 }
296 
StopServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)297 ErrCode AbilityContextImpl::StopServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
298 {
299     HILOG_INFO("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()->StopExtensionAbility(
302         want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
303     if (err != ERR_OK) {
304         HILOG_ERROR("StopServiceExtensionAbility is failed %{public}d", err);
305     }
306     return err;
307 }
308 
TerminateAbilityWithResult(const AAFwk::Want & want,int resultCode)309 ErrCode AbilityContextImpl::TerminateAbilityWithResult(const AAFwk::Want& want, int resultCode)
310 {
311     HILOG_INFO("TerminateAbilityWithResult");
312     isTerminating_ = true;
313 
314     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
315         auto sessionToken = GetSessionToken();
316         if (sessionToken == nullptr) {
317             return ERR_INVALID_VALUE;
318         }
319         sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
320         info->want = want;
321         info->resultCode = resultCode;
322         auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
323         auto err = ifaceSessionToken->TerminateSession(info);
324         HILOG_INFO("TerminateAbilityWithResult. ret=%{public}d", err);
325         return static_cast<int32_t>(err);
326     } else {
327         ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, resultCode, &want);
328         HILOG_INFO("TerminateAbilityWithResult. ret=%{public}d", err);
329         return err;
330     }
331 }
332 
SetWeakSessionToken(const wptr<IRemoteObject> & sessionToken)333 void AbilityContextImpl::SetWeakSessionToken(const wptr<IRemoteObject>& sessionToken)
334 {
335     std::lock_guard lock(sessionTokenMutex_);
336     HILOG_DEBUG("Start calling SetWeakSessionToken.");
337     sessionToken_ = sessionToken;
338 }
339 
GetSessionToken()340 sptr<IRemoteObject> AbilityContextImpl::GetSessionToken()
341 {
342     std::lock_guard lock(sessionTokenMutex_);
343     return sessionToken_.promote();
344 }
345 
OnAbilityResult(int requestCode,int resultCode,const AAFwk::Want & resultData)346 void AbilityContextImpl::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want& resultData)
347 {
348     HILOG_DEBUG("Start calling OnAbilityResult.");
349     auto callback = resultCallbacks_.find(requestCode);
350     if (callback != resultCallbacks_.end()) {
351         if (callback->second) {
352             callback->second(resultCode, resultData, false);
353         }
354         resultCallbacks_.erase(requestCode);
355     }
356     HILOG_INFO("OnAbilityResult");
357 }
358 
OnAbilityResultInner(int requestCode,int resultCode,const AAFwk::Want & resultData)359 void AbilityContextImpl::OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want& resultData)
360 {
361     HILOG_DEBUG("Start calling OnAbilityResult.");
362     auto callback = resultCallbacks_.find(requestCode);
363     if (callback != resultCallbacks_.end()) {
364         if (callback->second) {
365             callback->second(resultCode, resultData, true);
366         }
367         resultCallbacks_.erase(requestCode);
368     }
369     HILOG_INFO("OnAbilityResult");
370 }
371 
ConnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)372 ErrCode AbilityContextImpl::ConnectAbility(const AAFwk::Want& want, const sptr<AbilityConnectCallback>& connectCallback)
373 {
374     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
375     HILOG_DEBUG("ConnectAbility begin, name:%{public}s.", abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
376     ErrCode ret = ConnectionManager::GetInstance().ConnectAbility(token_, want, connectCallback);
377     if (ret != ERR_OK) {
378         HILOG_ERROR("ConnectAbility ret:%{public}d", ret);
379     }
380     return ret;
381 }
382 
ConnectAbilityWithAccount(const AAFwk::Want & want,int accountId,const sptr<AbilityConnectCallback> & connectCallback)383 ErrCode AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want& want, int accountId,
384     const sptr<AbilityConnectCallback>& connectCallback)
385 {
386     HILOG_DEBUG("ConnectAbilityWithAccount");
387     ErrCode ret =
388         ConnectionManager::GetInstance().ConnectAbilityWithAccount(token_, want, accountId, connectCallback);
389     if (ret != ERR_OK) {
390         HILOG_ERROR("ConnectAbilityWithAccount ret:%{public}d", ret);
391     }
392     return ret;
393 }
394 
DisconnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)395 void AbilityContextImpl::DisconnectAbility(const AAFwk::Want& want,
396     const sptr<AbilityConnectCallback>& connectCallback)
397 {
398     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
399     HILOG_DEBUG("DisconnectAbility begin, caller:%{public}s.",
400         abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
401     ErrCode ret =
402         ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback);
403     if (ret != ERR_OK) {
404         HILOG_ERROR("error, ret=%{public}d", ret);
405     }
406 }
407 
GetBundleName() const408 std::string AbilityContextImpl::GetBundleName() const
409 {
410     return stageContext_ ? stageContext_->GetBundleName() : "";
411 }
412 
GetApplicationInfo() const413 std::shared_ptr<AppExecFwk::ApplicationInfo> AbilityContextImpl::GetApplicationInfo() const
414 {
415     return stageContext_ ? stageContext_->GetApplicationInfo() : nullptr;
416 }
417 
GetBundleCodePath() const418 std::string AbilityContextImpl::GetBundleCodePath() const
419 {
420     return stageContext_ ? stageContext_->GetBundleCodePath() : "";
421 }
422 
GetHapModuleInfo() const423 std::shared_ptr<AppExecFwk::HapModuleInfo> AbilityContextImpl::GetHapModuleInfo() const
424 {
425     return stageContext_ ? stageContext_->GetHapModuleInfo() : nullptr;
426 }
427 
GetResourceManager() const428 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::GetResourceManager() const
429 {
430     return stageContext_ ? stageContext_->GetResourceManager() : nullptr;
431 }
432 
CreateBundleContext(const std::string & bundleName)433 std::shared_ptr<Context> AbilityContextImpl::CreateBundleContext(const std::string& bundleName)
434 {
435     return stageContext_ ? stageContext_->CreateBundleContext(bundleName) : nullptr;
436 }
437 
CreateModuleContext(const std::string & moduleName)438 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& moduleName)
439 {
440     return stageContext_ ? stageContext_->CreateModuleContext(moduleName) : nullptr;
441 }
442 
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)443 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& bundleName,
444     const std::string& moduleName)
445 {
446     return stageContext_ ? stageContext_->CreateModuleContext(bundleName, moduleName) : nullptr;
447 }
448 
CreateModuleResourceManager(const std::string & bundleName,const std::string & moduleName)449 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::CreateModuleResourceManager(
450     const std::string &bundleName, const std::string &moduleName)
451 {
452     return stageContext_ ? stageContext_->CreateModuleResourceManager(bundleName, moduleName) : nullptr;
453 }
454 
SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> & abilityInfo)455 void AbilityContextImpl::SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo>& abilityInfo)
456 {
457     abilityInfo_ = abilityInfo;
458 }
459 
GetAbilityInfo() const460 std::shared_ptr<AppExecFwk::AbilityInfo> AbilityContextImpl::GetAbilityInfo() const
461 {
462     return abilityInfo_;
463 }
464 
SetStageContext(const std::shared_ptr<AbilityRuntime::Context> & stageContext)465 void AbilityContextImpl::SetStageContext(const std::shared_ptr<AbilityRuntime::Context>& stageContext)
466 {
467     stageContext_ = stageContext;
468 }
469 
SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> & config)470 void AbilityContextImpl::SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& config)
471 {
472     config_ = config;
473 }
474 
GetConfiguration() const475 std::shared_ptr<AppExecFwk::Configuration> AbilityContextImpl::GetConfiguration() const
476 {
477     return config_;
478 }
479 
MinimizeAbility(bool fromUser)480 void AbilityContextImpl::MinimizeAbility(bool fromUser)
481 {
482     HILOG_DEBUG("call");
483     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(token_, fromUser);
484     if (err != ERR_OK) {
485         HILOG_ERROR("MinimizeAbility is failed %{public}d", err);
486     }
487 }
488 
OnBackPressedCallBack(bool & needMoveToBackground)489 ErrCode AbilityContextImpl::OnBackPressedCallBack(bool &needMoveToBackground)
490 {
491     HILOG_DEBUG("call");
492     auto abilityCallback = abilityCallback_.lock();
493     if (abilityCallback == nullptr) {
494         HILOG_ERROR("abilityCallback is nullptr.");
495         return ERR_INVALID_VALUE;
496     }
497     needMoveToBackground = abilityCallback->OnBackPress();
498     return ERR_OK;
499 }
500 
MoveAbilityToBackground()501 ErrCode AbilityContextImpl::MoveAbilityToBackground()
502 {
503     HILOG_DEBUG("call");
504     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveAbilityToBackground(token_);
505     if (err != ERR_OK) {
506         HILOG_ERROR("MoveAbilityToBackground failed: %{public}d", err);
507     }
508     return err;
509 }
510 
TerminateSelf()511 ErrCode AbilityContextImpl::TerminateSelf()
512 {
513     HILOG_INFO("TerminateSelf");
514     isTerminating_ = true;
515     auto sessionToken = GetSessionToken();
516     if (sessionToken == nullptr) {
517         HILOG_WARN("sessionToken is null");
518     }
519 
520     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionToken) {
521         HILOG_INFO("TerminateSelf. SCB");
522         AAFwk::Want resultWant;
523         sptr<AAFwk::SessionInfo> info = new AAFwk::SessionInfo();
524         info->want = resultWant;
525         info->resultCode = -1;
526         auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
527         auto err = ifaceSessionToken->TerminateSession(info);
528         return static_cast<int32_t>(err);
529     } else {
530         AAFwk::Want resultWant;
531         ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, -1, &resultWant);
532         if (err != ERR_OK) {
533             HILOG_ERROR("AbilityContextImpl::TerminateSelf is failed %{public}d", err);
534         }
535         return err;
536     }
537 }
538 
CloseAbility()539 ErrCode AbilityContextImpl::CloseAbility()
540 {
541     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
542     HILOG_DEBUG("CloseAbility");
543     isTerminating_ = true;
544     AAFwk::Want resultWant;
545     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->CloseAbility(token_, -1, &resultWant);
546     if (err != ERR_OK) {
547         HILOG_ERROR("CloseAbility failed: %{public}d", err);
548     }
549     return err;
550 }
551 
GetToken()552 sptr<IRemoteObject> AbilityContextImpl::GetToken()
553 {
554     return token_;
555 }
556 
RestoreWindowStage(napi_env env,napi_value contentStorage)557 ErrCode AbilityContextImpl::RestoreWindowStage(napi_env env, napi_value contentStorage)
558 {
559     HILOG_INFO("call");
560     napi_ref value = nullptr;
561     napi_create_reference(env, contentStorage, 1, &value);
562     contentStorage_ = std::unique_ptr<NativeReference>(reinterpret_cast<NativeReference*>(value));
563     return ERR_OK;
564 }
565 
StartAbilityByCall(const AAFwk::Want & want,const std::shared_ptr<CallerCallBack> & callback,int32_t accountId)566 ErrCode AbilityContextImpl::StartAbilityByCall(
567     const AAFwk::Want& want, const std::shared_ptr<CallerCallBack>& callback, int32_t accountId)
568 {
569     if (localCallContainer_ == nullptr) {
570         localCallContainer_ = std::make_shared<LocalCallContainer>();
571         if (localCallContainer_ == nullptr) {
572             HILOG_ERROR("localCallContainer_ is nullptr.");
573             return ERR_INVALID_VALUE;
574         }
575     }
576     return localCallContainer_->StartAbilityByCallInner(want, callback, token_, accountId);
577 }
578 
ReleaseCall(const std::shared_ptr<CallerCallBack> & callback)579 ErrCode AbilityContextImpl::ReleaseCall(const std::shared_ptr<CallerCallBack>& callback)
580 {
581     HILOG_DEBUG("Release begin.");
582     if (localCallContainer_ == nullptr) {
583         HILOG_ERROR("localCallContainer_ is nullptr.");
584         return ERR_INVALID_VALUE;
585     }
586     HILOG_DEBUG("Release end.");
587     return localCallContainer_->ReleaseCall(callback);
588 }
589 
ClearFailedCallConnection(const std::shared_ptr<CallerCallBack> & callback)590 void AbilityContextImpl::ClearFailedCallConnection(const std::shared_ptr<CallerCallBack>& callback)
591 {
592     HILOG_DEBUG("Clear begin.");
593     if (localCallContainer_ == nullptr) {
594         HILOG_ERROR("localCallContainer_ is nullptr.");
595         return;
596     }
597     localCallContainer_->ClearFailedCallConnection(callback);
598     HILOG_DEBUG("Clear end.");
599 }
600 
RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)601 void AbilityContextImpl::RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)
602 {
603     HILOG_DEBUG("call");
604     abilityCallback_ = abilityCallback;
605 }
606 
RequestDialogService(napi_env env,AAFwk::Want & want,RequestDialogResultTask && task)607 ErrCode AbilityContextImpl::RequestDialogService(napi_env env, AAFwk::Want &want, RequestDialogResultTask &&task)
608 {
609     want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
610     int32_t left;
611     int32_t top;
612     int32_t width;
613     int32_t height;
614     GetWindowRect(left, top, width, height);
615     want.SetParam(RequestConstants::WINDOW_RECTANGLE_LEFT_KEY, left);
616     want.SetParam(RequestConstants::WINDOW_RECTANGLE_TOP_KEY, top);
617     want.SetParam(RequestConstants::WINDOW_RECTANGLE_WIDTH_KEY, width);
618     want.SetParam(RequestConstants::WINDOW_RECTANGLE_HEIGHT_KEY, height);
619     auto resultTask =
620         [env, outTask = std::move(task)](int32_t resultCode, const AAFwk::Want &resultWant) {
621         auto retData = new RequestResult();
622         retData->resultCode = resultCode;
623         retData->resultWant = resultWant;
624         retData->task = std::move(outTask);
625 
626         uv_loop_s* loop = nullptr;
627         napi_get_uv_event_loop(env, &loop);
628         if (loop == nullptr) {
629             HILOG_ERROR("RequestDialogService, fail to get uv loop.");
630             return;
631         }
632         auto work = new uv_work_t;
633         work->data = static_cast<void*>(retData);
634         int rev = uv_queue_work_with_qos(
635             loop,
636             work,
637             [](uv_work_t* work) {},
638             RequestDialogResultJSThreadWorker,
639             uv_qos_user_initiated);
640         if (rev != 0) {
641             delete retData;
642             retData = nullptr;
643             if (work != nullptr) {
644                 delete work;
645                 work = nullptr;
646             }
647         }
648     };
649 
650     sptr<IRemoteObject> remoteObject = new DialogRequestCallbackImpl(std::move(resultTask));
651     want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
652 
653     auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
654     HILOG_DEBUG("RequestDialogService ret=%{public}d", static_cast<int32_t>(err));
655     return err;
656 }
657 
ReportDrawnCompleted()658 ErrCode AbilityContextImpl::ReportDrawnCompleted()
659 {
660     HILOG_DEBUG("called.");
661     return AAFwk::AbilityManagerClient::GetInstance()->ReportDrawnCompleted(token_);
662 }
663 
RequestDialogResultJSThreadWorker(uv_work_t * work,int status)664 void AbilityContextImpl::RequestDialogResultJSThreadWorker(uv_work_t* work, int status)
665 {
666     HILOG_DEBUG("RequestDialogResultJSThreadWorker");
667     if (work == nullptr) {
668         HILOG_ERROR("RequestDialogResultJSThreadWorker, uv_queue_work input work is nullptr");
669         return;
670     }
671     RequestResult* retCB = static_cast<RequestResult*>(work->data);
672     if (retCB == nullptr) {
673         HILOG_ERROR("RequestDialogResultJSThreadWorker, retCB is nullptr");
674         delete work;
675         work = nullptr;
676         return;
677     }
678 
679     if (retCB->task) {
680         retCB->task(retCB->resultCode, retCB->resultWant);
681     }
682 
683     delete retCB;
684     retCB = nullptr;
685     delete work;
686     work = nullptr;
687 }
688 
GetMissionId(int32_t & missionId)689 ErrCode AbilityContextImpl::GetMissionId(int32_t &missionId)
690 {
691     HILOG_DEBUG("GetMissionId");
692     if (missionId_ != -1) {
693         missionId = missionId_;
694         return ERR_OK;
695     }
696 
697     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token_, missionId);
698     if (err != ERR_OK) {
699         HILOG_ERROR("GetMissionId is failed %{public}d", err);
700     } else {
701         missionId_ = missionId;
702         HILOG_DEBUG("missionId is %{public}d.", missionId_);
703     }
704     return err;
705 }
706 
SetMissionContinueState(const AAFwk::ContinueState & state)707 ErrCode AbilityContextImpl::SetMissionContinueState(const AAFwk::ContinueState &state)
708 {
709     HILOG_DEBUG("SetMissionContinueState: %{public}d", state);
710     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionContinueState(token_, state);
711     if (err != ERR_OK) {
712         HILOG_ERROR("SetMissionContinueState failed: %{public}d", err);
713     }
714     return err;
715 }
716 
GetWindowRect(int32_t & left,int32_t & top,int32_t & width,int32_t & height)717 void AbilityContextImpl::GetWindowRect(int32_t &left, int32_t &top, int32_t &width, int32_t &height)
718 {
719     HILOG_DEBUG("call");
720     auto abilityCallback = abilityCallback_.lock();
721     if (abilityCallback) {
722         abilityCallback->GetWindowRect(left, top, width, height);
723     }
724 }
725 
726 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const std::string & label)727 ErrCode AbilityContextImpl::SetMissionLabel(const std::string& label)
728 {
729     HILOG_DEBUG("call label:%{public}s", label.c_str());
730     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionLabel(token_, label);
731     if (err != ERR_OK) {
732         HILOG_ERROR("SetMissionLabel is failed %{public}d", err);
733     } else {
734         auto abilityCallback = abilityCallback_.lock();
735         if (abilityCallback) {
736             abilityCallback->SetMissionLabel(label);
737         }
738     }
739     return err;
740 }
741 
SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> & icon)742 ErrCode AbilityContextImpl::SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap>& icon)
743 {
744     HILOG_DEBUG("call");
745     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionIcon(token_, icon);
746     if (err != ERR_OK) {
747         HILOG_ERROR("SetMissionIcon is failed %{public}d", err);
748     } else {
749         auto abilityCallback = abilityCallback_.lock();
750         if (abilityCallback) {
751             abilityCallback->SetMissionIcon(icon);
752         }
753     }
754     return err;
755 }
756 
GetCurrentWindowMode()757 int AbilityContextImpl::GetCurrentWindowMode()
758 {
759     auto abilityCallback = abilityCallback_.lock();
760     if (abilityCallback == nullptr) {
761         return AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED;
762     }
763     return abilityCallback->GetCurrentWindowMode();
764 }
765 
GetUIContent()766 Ace::UIContent* AbilityContextImpl::GetUIContent()
767 {
768     HILOG_DEBUG("call");
769     auto abilityCallback = abilityCallback_.lock();
770     if (abilityCallback == nullptr) {
771         return nullptr;
772     }
773 
774     return abilityCallback->GetUIContent();
775 }
776 
StartAbilityByType(const std::string & type,AAFwk::WantParams & wantParams,const std::shared_ptr<JsUIExtensionCallback> & uiExtensionCallbacks)777 ErrCode AbilityContextImpl::StartAbilityByType(const std::string &type,
778     AAFwk::WantParams &wantParams, const std::shared_ptr<JsUIExtensionCallback> &uiExtensionCallbacks)
779 {
780     HILOG_DEBUG("call");
781     auto uiContent = GetUIContent();
782     if (uiContent == nullptr) {
783         HILOG_ERROR("uiContent is nullptr");
784         return ERR_INVALID_VALUE;
785     }
786     wantParams.SetParam(UIEXTENSION_TARGET_TYPE_KEY, AAFwk::String::Box(type));
787     AAFwk::Want want;
788     want.SetParams(wantParams);
789     if (wantParams.HasParam(FLAG_AUTH_READ_URI_PERMISSION)) {
790         int32_t flag = wantParams.GetIntParam(FLAG_AUTH_READ_URI_PERMISSION, 0);
791         want.SetFlags(flag);
792         wantParams.Remove(FLAG_AUTH_READ_URI_PERMISSION);
793     }
794     Ace::ModalUIExtensionCallbacks callback;
795     callback.onError = std::bind(&JsUIExtensionCallback::OnError, uiExtensionCallbacks, std::placeholders::_1);
796     callback.onRelease = std::bind(&JsUIExtensionCallback::OnRelease, uiExtensionCallbacks, std::placeholders::_1);
797     Ace::ModalUIExtensionConfig config;
798     int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
799     if (sessionId == 0) {
800         HILOG_ERROR("CreateModalUIExtension is failed");
801         return ERR_INVALID_VALUE;
802     }
803     uiExtensionCallbacks->SetUIContent(uiContent);
804     uiExtensionCallbacks->SetSessionId(sessionId);
805     return ERR_OK;
806 }
807 
IsUIExtensionExist(const AAFwk::Want & want)808 bool AbilityContextImpl::IsUIExtensionExist(const AAFwk::Want &want)
809 {
810     HILOG_DEBUG("call");
811     std::lock_guard lock(uiExtensionMutex_);
812     for (const auto& iter : uiExtensionMap_) {
813         if (iter.second.GetElement().GetBundleName() == want.GetElement().GetBundleName() &&
814             iter.second.GetElement().GetModuleName() == want.GetElement().GetModuleName() &&
815             iter.second.GetElement().GetAbilityName() == want.GetElement().GetAbilityName()) {
816             return true;
817         }
818     }
819     return false;
820 }
821 
EraseUIExtension(int32_t sessionId)822 void AbilityContextImpl::EraseUIExtension(int32_t sessionId)
823 {
824     HILOG_DEBUG("call");
825     std::lock_guard lock(uiExtensionMutex_);
826     auto iter = uiExtensionMap_.find(sessionId);
827     if (iter != uiExtensionMap_.end()) {
828         uiExtensionMap_.erase(sessionId);
829     }
830 }
831 
CreateModalUIExtensionWithApp(const AAFwk::Want & want)832 ErrCode AbilityContextImpl::CreateModalUIExtensionWithApp(const AAFwk::Want &want)
833 {
834     HILOG_DEBUG("call");
835     auto uiContent = GetUIContent();
836     if (uiContent == nullptr) {
837         HILOG_ERROR("uiContent is nullptr");
838         return ERR_INVALID_VALUE;
839     }
840     if (IsUIExtensionExist(want)) {
841         HILOG_DEBUG("UIExtension is exist, not create again");
842         return ERR_OK;
843     }
844     auto abilityCallback = abilityCallback_.lock();
845     if (abilityCallback == nullptr) {
846         HILOG_ERROR("abilityCallback is nullptr");
847         return ERR_INVALID_VALUE;
848     }
849     auto disposedCallback = std::make_shared<DialogUIExtensionCallback>(abilityCallback);
850     Ace::ModalUIExtensionCallbacks callback;
851     callback.onError = std::bind(&DialogUIExtensionCallback::OnError, disposedCallback);
852     callback.onRelease = std::bind(&DialogUIExtensionCallback::OnRelease, disposedCallback);
853     callback.onDestroy = std::bind(&DialogUIExtensionCallback::OnDestroy, disposedCallback);
854     Ace::ModalUIExtensionConfig config;
855     int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
856     if (sessionId == 0) {
857         HILOG_ERROR("CreateModalUIExtension is failed");
858         return ERR_INVALID_VALUE;
859     }
860     disposedCallback->SetUIContent(uiContent);
861     disposedCallback->SetSessionId(sessionId);
862     {
863         std::lock_guard lock(uiExtensionMutex_);
864         uiExtensionMap_.emplace(sessionId, want);
865     }
866     return ERR_OK;
867 }
868 #endif
869 
RequestModalUIExtension(const AAFwk::Want & want)870 ErrCode AbilityContextImpl::RequestModalUIExtension(const AAFwk::Want& want)
871 {
872     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->RequestModalUIExtension(want);
873     if (err != ERR_OK) {
874         HILOG_ERROR("RequestModalUIExtension is failed %{public}d", err);
875     }
876     return err;
877 }
878 } // namespace AbilityRuntime
879 } // namespace OHOS
880