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