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