• 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 "application_configuration_manager.h"
22 #include "configuration_convertor.h"
23 #include "bindable_sub_thread.h"
24 #include "connection_manager.h"
25 #include "dialog_request_callback_impl.h"
26 #include "dialog_ui_extension_callback.h"
27 #include "hilog_tag_wrapper.h"
28 #include "hitrace_meter.h"
29 #include "json_utils.h"
30 #include "remote_object_wrapper.h"
31 #include "request_constants.h"
32 #include "session_info.h"
33 #include "string_wrapper.h"
34 #ifdef SUPPORT_SCREEN
35 #include "session/host/include/zidl/session_interface.h"
36 #include "scene_board_judgement.h"
37 #include "ui_content.h"
38 #endif // SUPPORT_SCREEN
39 #include "want_params_wrapper.h"
40 
41 namespace OHOS {
42 namespace AbilityRuntime {
43 const size_t AbilityContext::CONTEXT_TYPE_ID(std::hash<const char*> {} ("AbilityContext"));
44 constexpr const char* START_ABILITY_TYPE = "ABILITY_INNER_START_WITH_ACCOUNT";
45 constexpr const char* UIEXTENSION_TARGET_TYPE_KEY = "ability.want.params.uiExtensionTargetType";
46 constexpr const char* FLAG_AUTH_READ_URI_PERMISSION = "ability.want.params.uriPermissionFlag";
47 constexpr const char* DISPOSED_PROHIBIT_BACK = "APPGALLERY_APP_DISPOSED_PROHIBIT_BACK";
48 constexpr const char* IS_WINDOWMODE_FOLLOWHOST = "ohos.uec.params.isWindowModeFollowHost";
49 constexpr const char* USE_GLOBAL_UICONTENT = "ohos.uec.params.useGlobalUIContent";
50 constexpr const int32_t ERR_NOT_SUPPORTED = -2;
51 const std::string JSON_KEY_ERR_MSG = "errMsg";
52 
53 struct RequestResult {
54     int32_t resultCode {0};
55     AAFwk::Want resultWant;
56     RequestDialogResultTask task;
57 };
58 
AbilityContextImpl()59 AbilityContextImpl::AbilityContextImpl()
60 {
61     subThreadObject_ = std::make_unique<BindableSubThread>();
62 }
63 
GetDeviceType() const64 Global::Resource::DeviceType AbilityContextImpl::GetDeviceType() const
65 {
66     return (stageContext_ != nullptr) ? stageContext_->GetDeviceType() : Global::Resource::DeviceType::DEVICE_PHONE;
67 }
68 
GetBaseDir() const69 std::string AbilityContextImpl::GetBaseDir() const
70 {
71     return stageContext_ ? stageContext_->GetBaseDir() : "";
72 }
73 
GetBundleCodeDir()74 std::string AbilityContextImpl::GetBundleCodeDir()
75 {
76     return stageContext_ ? stageContext_->GetBundleCodeDir() : "";
77 }
78 
GetCacheDir()79 std::string AbilityContextImpl::GetCacheDir()
80 {
81     return stageContext_ ? stageContext_->GetCacheDir() : "";
82 }
83 
GetDatabaseDir()84 std::string AbilityContextImpl::GetDatabaseDir()
85 {
86     return stageContext_ ? stageContext_->GetDatabaseDir() : "";
87 }
88 
GetSystemDatabaseDir(const std::string & groupId,bool checkExist,std::string & databaseDir)89 int32_t AbilityContextImpl::GetSystemDatabaseDir(const std::string &groupId, bool checkExist, std::string &databaseDir)
90 {
91     return stageContext_ ?
92         stageContext_->GetSystemDatabaseDir(groupId, checkExist, databaseDir) : ERR_INVALID_VALUE;
93 }
94 
GetPreferencesDir()95 std::string AbilityContextImpl::GetPreferencesDir()
96 {
97     return stageContext_ ? stageContext_->GetPreferencesDir() : "";
98 }
99 
GetSystemPreferencesDir(const std::string & groupId,bool checkExist,std::string & preferencesDir)100 int AbilityContextImpl::GetSystemPreferencesDir(const std::string &groupId, bool checkExist,
101     std::string &preferencesDir)
102 {
103     return stageContext_ ?
104         stageContext_->GetSystemPreferencesDir(groupId, checkExist, preferencesDir) : ERR_INVALID_VALUE;
105 }
106 
GetGroupDir(std::string groupId)107 std::string AbilityContextImpl::GetGroupDir(std::string groupId)
108 {
109     return stageContext_ ? stageContext_->GetGroupDir(groupId) : "";
110 }
111 
GetTempDir()112 std::string AbilityContextImpl::GetTempDir()
113 {
114     return stageContext_ ? stageContext_->GetTempDir() : "";
115 }
116 
GetResourceDir(const std::string & moduleName)117 std::string AbilityContextImpl::GetResourceDir(const std::string &moduleName)
118 {
119     return stageContext_ ? stageContext_->GetResourceDir(moduleName) : "";
120 }
121 
GetFilesDir()122 std::string AbilityContextImpl::GetFilesDir()
123 {
124     return stageContext_ ? stageContext_->GetFilesDir() : "";
125 }
126 
GetDistributedFilesDir()127 std::string AbilityContextImpl::GetDistributedFilesDir()
128 {
129     return stageContext_ ? stageContext_->GetDistributedFilesDir() : "";
130 }
131 
GetCloudFileDir()132 std::string AbilityContextImpl::GetCloudFileDir()
133 {
134     return stageContext_ ? stageContext_->GetCloudFileDir() : "";
135 }
136 
IsUpdatingConfigurations()137 bool AbilityContextImpl::IsUpdatingConfigurations()
138 {
139     return stageContext_ ? stageContext_->IsUpdatingConfigurations() : false;
140 }
141 
PrintDrawnCompleted()142 bool AbilityContextImpl::PrintDrawnCompleted()
143 {
144     return stageContext_ ? stageContext_->PrintDrawnCompleted() : false;
145 }
146 
SwitchArea(int mode)147 void AbilityContextImpl::SwitchArea(int mode)
148 {
149     TAG_LOGD(AAFwkTag::CONTEXT, "mode:%{public}d", mode);
150     if (stageContext_ != nullptr) {
151         stageContext_->SwitchArea(mode);
152     }
153 }
154 
GetArea()155 int AbilityContextImpl::GetArea()
156 {
157     TAG_LOGD(AAFwkTag::CONTEXT, "called");
158     if (stageContext_ == nullptr) {
159         TAG_LOGE(AAFwkTag::CONTEXT, "null stageContext");
160         return ContextImpl::EL_DEFAULT;
161     }
162     return stageContext_->GetArea();
163 }
164 
GetProcessName()165 std::string AbilityContextImpl::GetProcessName()
166 {
167     return stageContext_ ? stageContext_->GetProcessName() : "";
168 }
169 
StartAbility(const AAFwk::Want & want,int requestCode)170 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, int requestCode)
171 {
172     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
173     TAG_LOGD(AAFwkTag::CONTEXT, "called");
174     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode);
175     if (err != ERR_OK) {
176         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
177     }
178     return err;
179 }
180 
StartAbilityAsCaller(const AAFwk::Want & want,int requestCode)181 ErrCode AbilityContextImpl::StartAbilityAsCaller(const AAFwk::Want &want, int requestCode)
182 {
183     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
184     TAG_LOGD(AAFwkTag::CONTEXT, "called");
185     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want, token_, nullptr, requestCode);
186     if (err != ERR_OK) {
187         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
188     }
189     return err;
190 }
191 
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,int requestCode)192 ErrCode AbilityContextImpl::StartAbilityWithAccount(const AAFwk::Want& want, int accountId, int requestCode)
193 {
194     TAG_LOGD(AAFwkTag::CONTEXT, "called");
195     (const_cast<Want &>(want)).SetParam(START_ABILITY_TYPE, true);
196     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
197     if (err != ERR_OK) {
198         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
199     }
200     return err;
201 }
202 
StartAbility(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode)203 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, const AAFwk::StartOptions& startOptions,
204     int requestCode)
205 {
206     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
207     TAG_LOGD(AAFwkTag::CONTEXT, "called");
208     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
209     if (err != ERR_OK) {
210         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
211     }
212     return err;
213 }
214 
StartAbilityAsCaller(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode)215 ErrCode AbilityContextImpl::StartAbilityAsCaller(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions,
216     int requestCode)
217 {
218     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
219     TAG_LOGD(AAFwkTag::CONTEXT, "called");
220     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbilityAsCaller(want,
221         startOptions, token_, nullptr, requestCode);
222     if (err != ERR_OK) {
223         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
224     }
225     return err;
226 }
227 
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode)228 ErrCode AbilityContextImpl::StartAbilityWithAccount(
229     const AAFwk::Want& want, int accountId, const AAFwk::StartOptions& startOptions, int requestCode)
230 {
231     TAG_LOGD(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
232         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
233     (const_cast<Want &>(want)).SetParam(START_ABILITY_TYPE, true);
234     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
235         want, startOptions, token_, requestCode, accountId);
236     if (err != ERR_OK) {
237         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
238     }
239     return err;
240 }
241 
StartAbilityForResult(const AAFwk::Want & want,int requestCode,RuntimeTask && task)242 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, int requestCode, RuntimeTask&& task)
243 {
244     TAG_LOGD(AAFwkTag::CONTEXT, "called");
245     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
246     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, -1);
247     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
248         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
249         OnAbilityResultInner(requestCode, err, want);
250     }
251     return err;
252 }
253 
StartAbilityForResultWithAccount(const AAFwk::Want & want,const int accountId,int requestCode,RuntimeTask && task)254 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
255     const AAFwk::Want& want, const int accountId, int requestCode, RuntimeTask&& task)
256 {
257     TAG_LOGD(AAFwkTag::CONTEXT, "accountId:%{private}d", accountId);
258     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
259     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
260     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
261         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
262         OnAbilityResultInner(requestCode, err, want);
263     }
264     return err;
265 }
266 
StartAbilityForResult(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)267 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, const AAFwk::StartOptions& startOptions,
268     int requestCode, RuntimeTask&& task)
269 {
270     TAG_LOGD(AAFwkTag::CONTEXT, "called");
271     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
272     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
273     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
274         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
275         OnAbilityResultInner(requestCode, err, want);
276         if (!startOptions.requestId_.empty()) {
277             nlohmann::json jsonObject = nlohmann::json {
278                 { JSON_KEY_ERR_MSG, "Failed to call startAbilityForResult" },
279             };
280             OnRequestFailure(startOptions.requestId_, want.GetElement(), jsonObject.dump());
281         }
282     }
283     return err;
284 }
285 
StartAbilityForResultWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)286 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
287     const AAFwk::Want& want, int accountId, const AAFwk::StartOptions& startOptions,
288     int requestCode, RuntimeTask&& task)
289 {
290     TAG_LOGD(AAFwkTag::CONTEXT, "called");
291     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
292     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
293         want, startOptions, token_, requestCode, accountId);
294     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
295         TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err);
296         OnAbilityResultInner(requestCode, err, want);
297         if (!startOptions.requestId_.empty()) {
298             nlohmann::json jsonObject = nlohmann::json {
299                 { JSON_KEY_ERR_MSG, "Failed to call startAbilityForResultWithAccount" },
300             };
301             OnRequestFailure(startOptions.requestId_, want.GetElement(), jsonObject.dump());
302         }
303     }
304     return err;
305 }
306 
StartUIServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)307 ErrCode AbilityContextImpl::StartUIServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
308 {
309     TAG_LOGD(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
310         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
311     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
312         want, token_, accountId, AppExecFwk::ExtensionAbilityType::UI_SERVICE);
313     if (err != ERR_OK) {
314         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
315     }
316     return err;
317 }
318 
StartServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)319 ErrCode AbilityContextImpl::StartServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
320 {
321     TAG_LOGI(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
322         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
323     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
324         want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
325     if (err != ERR_OK) {
326         TAG_LOGE(AAFwkTag::CONTEXT, "failed:%{public}d", err);
327     }
328     return err;
329 }
330 
StopServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)331 ErrCode AbilityContextImpl::StopServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
332 {
333     TAG_LOGD(AAFwkTag::CONTEXT, "name:%{public}s %{public}s, accountId=%{public}d",
334         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
335     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StopExtensionAbility(
336         want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
337     if (err != ERR_OK) {
338         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
339     }
340     return err;
341 }
342 
TerminateAbilityWithResult(const AAFwk::Want & want,int resultCode)343 ErrCode AbilityContextImpl::TerminateAbilityWithResult(const AAFwk::Want& want, int resultCode)
344 {
345     isTerminating_.store(true);
346     if (isHook_ && hookOff_) {
347         TAG_LOGW(AAFwkTag::CONTEXT, "is hook and hook off, skip TerminateSession");
348         return ERR_OK;
349     }
350     auto sessionToken = GetSessionToken();
351     if (sessionToken == nullptr) {
352         TAG_LOGW(AAFwkTag::CONTEXT, "withResult null sessionToken");
353     }
354 #ifdef SUPPORT_SCREEN
355     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionToken) {
356         sptr<AAFwk::SessionInfo> info = sptr<AAFwk::SessionInfo>::MakeSptr();
357         info->want = want;
358         info->resultCode = resultCode;
359         auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
360         TAG_LOGI(AAFwkTag::CONTEXT, "scb call, TerminateAbilityWithResult");
361         ErrCode ret = static_cast<int32_t>(ifaceSessionToken->TerminateSession(info));
362         if (ret != ERR_OK) {
363             TAG_LOGE(AAFwkTag::CONTEXT, "scb call, TerminateAbilityWithResult err: %{public}d", ret);
364         }
365         return ret;
366     } else {
367         ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, resultCode, &want);
368         TAG_LOGI(AAFwkTag::CONTEXT, "ret=%{public}d", err);
369         return err;
370     }
371 #else
372     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, resultCode, &want);
373     TAG_LOGI(AAFwkTag::CONTEXT, "ret=%{public}d", err);
374     return err;
375 #endif
376 }
377 
BackToCallerAbilityWithResult(const AAFwk::Want & want,int resultCode,int64_t requestCode)378 ErrCode AbilityContextImpl::BackToCallerAbilityWithResult(const AAFwk::Want& want, int resultCode, int64_t requestCode)
379 {
380     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->BackToCallerAbilityWithResult(
381         token_, resultCode, &want, requestCode);
382     TAG_LOGI(AAFwkTag::CONTEXT, "ret:%{public}d", err);
383     return static_cast<int32_t>(err);
384 }
385 
SetWeakSessionToken(const wptr<IRemoteObject> & sessionToken)386 void AbilityContextImpl::SetWeakSessionToken(const wptr<IRemoteObject>& sessionToken)
387 {
388     std::lock_guard lock(sessionTokenMutex_);
389     TAG_LOGD(AAFwkTag::CONTEXT, "called");
390     sessionToken_ = sessionToken;
391 }
392 
GetSessionToken()393 sptr<IRemoteObject> AbilityContextImpl::GetSessionToken()
394 {
395     std::lock_guard lock(sessionTokenMutex_);
396     TAG_LOGD(AAFwkTag::CONTEXT, "called");
397     return sessionToken_.promote();
398 }
399 
SetAbilityRecordId(int32_t abilityRecordId)400 void AbilityContextImpl::SetAbilityRecordId(int32_t abilityRecordId)
401 {
402     TAG_LOGD(AAFwkTag::CONTEXT, "abilityRecordId: %{public}d", abilityRecordId);
403     abilityRecordId_ = abilityRecordId;
404 }
405 
GetAbilityRecordId()406 int32_t AbilityContextImpl::GetAbilityRecordId()
407 {
408     return abilityRecordId_;
409 }
410 
OnAbilityResult(int requestCode,int resultCode,const AAFwk::Want & resultData)411 void AbilityContextImpl::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want& resultData)
412 {
413     TAG_LOGD(AAFwkTag::CONTEXT, "called");
414     auto callback = resultCallbacks_.find(requestCode);
415     if (callback != resultCallbacks_.end()) {
416         if (callback->second) {
417             callback->second(resultCode, resultData, false);
418         }
419         resultCallbacks_.erase(requestCode);
420     }
421 }
422 
OnAbilityResultInner(int requestCode,int resultCode,const AAFwk::Want & resultData)423 void AbilityContextImpl::OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want& resultData)
424 {
425     TAG_LOGD(AAFwkTag::CONTEXT, "called");
426     auto callback = resultCallbacks_.find(requestCode);
427     if (callback != resultCallbacks_.end()) {
428         if (callback->second) {
429             callback->second(resultCode, resultData, true);
430         }
431         resultCallbacks_.erase(requestCode);
432     }
433 }
434 
ConnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)435 ErrCode AbilityContextImpl::ConnectAbility(const AAFwk::Want& want, const sptr<AbilityConnectCallback>& connectCallback)
436 {
437     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
438     TAG_LOGI(AAFwkTag::CONTEXT, "caller:%{public}s, target:%{public}s",
439         abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str(), want.GetElement().GetAbilityName().c_str());
440     ErrCode ret = ConnectionManager::GetInstance().ConnectAbility(token_, want, connectCallback);
441     if (ret != ERR_OK) {
442         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", ret);
443     }
444     return ret;
445 }
446 
ConnectAbilityWithAccount(const AAFwk::Want & want,int accountId,const sptr<AbilityConnectCallback> & connectCallback)447 ErrCode AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want& want, int accountId,
448     const sptr<AbilityConnectCallback>& connectCallback)
449 {
450     TAG_LOGD(AAFwkTag::CONTEXT, "called");
451     ErrCode ret =
452         ConnectionManager::GetInstance().ConnectAbilityWithAccount(token_, want, accountId, connectCallback);
453     if (ret != ERR_OK) {
454         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", ret);
455     }
456     return ret;
457 }
458 
ConnectUIServiceExtensionAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)459 ErrCode AbilityContextImpl::ConnectUIServiceExtensionAbility(const AAFwk::Want& want,
460     const sptr<AbilityConnectCallback>& connectCallback)
461 {
462     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
463     TAG_LOGD(AAFwkTag::CONTEXT,
464         "called, name:%{public}s", abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
465     ErrCode ret = ConnectionManager::GetInstance().ConnectUIServiceExtensionAbility(token_, want, connectCallback);
466     if (ret != ERR_OK) {
467         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", ret);
468     }
469     return ret;
470 }
471 
DisconnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback,int32_t accountId)472 void AbilityContextImpl::DisconnectAbility(const AAFwk::Want& want,
473     const sptr<AbilityConnectCallback>& connectCallback, int32_t accountId)
474 {
475     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
476     TAG_LOGI(AAFwkTag::CONTEXT, "DisconnectAbility, caller:%{public}s, target:%{public}s",
477         abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str(), want.GetElement().GetAbilityName().c_str());
478     ErrCode ret =
479         ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback, accountId);
480     if (ret != ERR_OK) {
481         TAG_LOGE(AAFwkTag::CONTEXT, "error %{public}d", ret);
482     }
483 }
484 
GetBundleName() const485 std::string AbilityContextImpl::GetBundleName() const
486 {
487     return stageContext_ ? stageContext_->GetBundleName() : "";
488 }
489 
GetApplicationInfo() const490 std::shared_ptr<AppExecFwk::ApplicationInfo> AbilityContextImpl::GetApplicationInfo() const
491 {
492     return stageContext_ ? stageContext_->GetApplicationInfo() : nullptr;
493 }
494 
GetBundleCodePath() const495 std::string AbilityContextImpl::GetBundleCodePath() const
496 {
497     return stageContext_ ? stageContext_->GetBundleCodePath() : "";
498 }
499 
GetHapModuleInfo() const500 std::shared_ptr<AppExecFwk::HapModuleInfo> AbilityContextImpl::GetHapModuleInfo() const
501 {
502     return stageContext_ ? stageContext_->GetHapModuleInfo() : nullptr;
503 }
504 
GetResourceManager() const505 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::GetResourceManager() const
506 {
507     if (abilityResourceMgr_) {
508         return abilityResourceMgr_;
509     }
510     return stageContext_ ? stageContext_->GetResourceManager() : nullptr;
511 }
512 
SetAbilityResourceManager(std::shared_ptr<Global::Resource::ResourceManager> abilityResourceMgr)513 void AbilityContextImpl::SetAbilityResourceManager(
514     std::shared_ptr<Global::Resource::ResourceManager> abilityResourceMgr)
515 {
516     abilityResourceMgr_ = abilityResourceMgr;
517 }
518 
RegisterAbilityConfigUpdateCallback(AbilityConfigUpdateCallback abilityConfigUpdateCallback)519 void AbilityContextImpl::RegisterAbilityConfigUpdateCallback(
520     AbilityConfigUpdateCallback abilityConfigUpdateCallback)
521 {
522     abilityConfigUpdateCallback_ = abilityConfigUpdateCallback;
523 }
524 
GetAbilityConfiguration() const525 std::shared_ptr<AppExecFwk::Configuration> AbilityContextImpl::GetAbilityConfiguration() const
526 {
527     return abilityConfiguration_;
528 }
529 
SetAbilityConfiguration(const AppExecFwk::Configuration & config)530 void AbilityContextImpl::SetAbilityConfiguration(const AppExecFwk::Configuration &config)
531 {
532     if (!abilityConfiguration_) {
533         abilityConfiguration_ = std::make_shared<AppExecFwk::Configuration>(config);
534         TAG_LOGI(AAFwkTag::CONTEXT, "abilityConfiguration: %{public}s", abilityConfiguration_->GetName().c_str());
535         return;
536     }
537     std::vector<std::string> changeKeyV;
538     abilityConfiguration_->CompareDifferent(changeKeyV, config);
539     if (!changeKeyV.empty()) {
540         abilityConfiguration_->Merge(changeKeyV, config);
541     }
542     TAG_LOGI(AAFwkTag::CONTEXT, "abilityConfiguration: %{public}s", abilityConfiguration_->GetName().c_str());
543 }
544 
SetAbilityColorMode(int32_t colorMode)545 void AbilityContextImpl::SetAbilityColorMode(int32_t colorMode)
546 {
547     TAG_LOGI(AAFwkTag::CONTEXT, "SetAbilityColorMode colorMode: %{public}d", colorMode);
548     if (colorMode < -1 || colorMode > 1) {
549         TAG_LOGE(AAFwkTag::CONTEXT, "colorMode error");
550         return;
551     }
552     AppExecFwk::Configuration config;
553 
554     config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, AppExecFwk::GetColorModeStr(colorMode));
555     config.AddItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP,
556         AppExecFwk::ConfigurationInner::IS_SET_BY_APP);
557     if (!abilityConfigUpdateCallback_) {
558         TAG_LOGE(AAFwkTag::CONTEXT, "abilityConfigUpdateCallback_ nullptr");
559         return;
560     }
561     abilityConfigUpdateCallback_(config);
562 }
563 
CreateBundleContext(const std::string & bundleName)564 std::shared_ptr<Context> AbilityContextImpl::CreateBundleContext(const std::string& bundleName)
565 {
566     return stageContext_ ? stageContext_->CreateBundleContext(bundleName) : nullptr;
567 }
568 
CreateModuleContext(const std::string & moduleName)569 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& moduleName)
570 {
571     return stageContext_ ? stageContext_->CreateModuleContext(moduleName) : nullptr;
572 }
573 
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)574 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string& bundleName,
575     const std::string& moduleName)
576 {
577     return stageContext_ ? stageContext_->CreateModuleContext(bundleName, moduleName) : nullptr;
578 }
579 
CreateModuleResourceManager(const std::string & bundleName,const std::string & moduleName)580 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::CreateModuleResourceManager(
581     const std::string &bundleName, const std::string &moduleName)
582 {
583     return stageContext_ ? stageContext_->CreateModuleResourceManager(bundleName, moduleName) : nullptr;
584 }
585 
CreateSystemHspModuleResourceManager(const std::string & bundleName,const std::string & moduleName,std::shared_ptr<Global::Resource::ResourceManager> & resourceManager)586 int32_t AbilityContextImpl::CreateSystemHspModuleResourceManager(const std::string &bundleName,
587     const std::string &moduleName, std::shared_ptr<Global::Resource::ResourceManager> &resourceManager)
588 {
589     return stageContext_ ? stageContext_->CreateSystemHspModuleResourceManager(bundleName, moduleName, resourceManager)
590         : ERR_INVALID_VALUE;
591 }
592 
SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> & abilityInfo)593 void AbilityContextImpl::SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo>& abilityInfo)
594 {
595     abilityInfo_ = abilityInfo;
596 }
597 
GetAbilityInfo() const598 std::shared_ptr<AppExecFwk::AbilityInfo> AbilityContextImpl::GetAbilityInfo() const
599 {
600     return abilityInfo_;
601 }
602 
SetStageContext(const std::shared_ptr<AbilityRuntime::Context> & stageContext)603 void AbilityContextImpl::SetStageContext(const std::shared_ptr<AbilityRuntime::Context>& stageContext)
604 {
605     stageContext_ = stageContext;
606 }
607 
SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> & config)608 void AbilityContextImpl::SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& config)
609 {
610     config_ = config;
611 }
612 
GetConfiguration() const613 std::shared_ptr<AppExecFwk::Configuration> AbilityContextImpl::GetConfiguration() const
614 {
615     return config_;
616 }
617 
MinimizeAbility(bool fromUser)618 void AbilityContextImpl::MinimizeAbility(bool fromUser)
619 {
620     TAG_LOGD(AAFwkTag::CONTEXT, "called");
621     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(token_, fromUser);
622     if (err != ERR_OK) {
623         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
624     }
625 }
626 
OnBackPressedCallBack(bool & needMoveToBackground)627 ErrCode AbilityContextImpl::OnBackPressedCallBack(bool &needMoveToBackground)
628 {
629     TAG_LOGD(AAFwkTag::CONTEXT, "call");
630     auto abilityCallback = abilityCallback_.lock();
631     if (abilityCallback == nullptr) {
632         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
633         return ERR_INVALID_VALUE;
634     }
635 #ifdef SUPPORT_SCREEN
636     needMoveToBackground = abilityCallback->OnBackPress();
637 #endif
638     return ERR_OK;
639 }
640 
MoveAbilityToBackground()641 ErrCode AbilityContextImpl::MoveAbilityToBackground()
642 {
643     TAG_LOGD(AAFwkTag::CONTEXT, "called");
644     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveAbilityToBackground(token_);
645     if (err != ERR_OK) {
646         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
647     }
648     return err;
649 }
650 
MoveUIAbilityToBackground()651 ErrCode AbilityContextImpl::MoveUIAbilityToBackground()
652 {
653     TAG_LOGD(AAFwkTag::CONTEXT, "call");
654     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MoveUIAbilityToBackground(token_);
655     if (err != ERR_OK) {
656         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
657     }
658     return err;
659 }
660 
TerminateSelf()661 ErrCode AbilityContextImpl::TerminateSelf()
662 {
663     TAG_LOGI(AAFwkTag::CONTEXT, "called");
664     isTerminating_.store(true);
665     auto sessionToken = GetSessionToken();
666     if (sessionToken == nullptr) {
667         TAG_LOGW(AAFwkTag::CONTEXT, "null sessionToken");
668     }
669     if (isHook_ && hookOff_) {
670         TAG_LOGW(AAFwkTag::CONTEXT, "is hook and hook off, skip TerminateSession");
671         return ERR_OK;
672     }
673 #ifdef SUPPORT_SCREEN
674     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionToken) {
675         TAG_LOGI(AAFwkTag::CONTEXT, "scb call, TerminateSelf: %{public}s",
676             abilityInfo_ ? abilityInfo_->name.c_str() : "");
677         AAFwk::Want resultWant;
678         sptr<AAFwk::SessionInfo> info = sptr<AAFwk::SessionInfo>::MakeSptr();
679         info->want = resultWant;
680         info->resultCode = -1;
681         auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
682         ErrCode ret = static_cast<int32_t>(ifaceSessionToken->TerminateSession(info));
683         if (ret != ERR_OK) {
684             TAG_LOGE(AAFwkTag::CONTEXT, "scb call, TerminateSelf err: %{public}d", ret);
685         }
686         return ret;
687     } else {
688         AAFwk::Want resultWant;
689         ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, -1, &resultWant);
690         if (err != ERR_OK) {
691             TAG_LOGE(AAFwkTag::CONTEXT, "failed:%{public}d", err);
692         }
693         return err;
694     }
695 #else
696     AAFwk::Want resultWant;
697     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, -1, &resultWant);
698     if (err != ERR_OK) {
699         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
700     }
701     return err;
702 #endif
703 }
704 
CloseAbility()705 ErrCode AbilityContextImpl::CloseAbility()
706 {
707     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
708     TAG_LOGD(AAFwkTag::CONTEXT, "called");
709     isTerminating_.store(true);
710     AAFwk::Want resultWant;
711     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->CloseAbility(token_, -1, &resultWant);
712     if (err != ERR_OK) {
713         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
714     }
715     return err;
716 }
717 
GetToken()718 sptr<IRemoteObject> AbilityContextImpl::GetToken()
719 {
720     return token_;
721 }
722 
RestoreWindowStage(napi_env env,napi_value contentStorage)723 ErrCode AbilityContextImpl::RestoreWindowStage(napi_env env, napi_value contentStorage)
724 {
725     TAG_LOGD(AAFwkTag::CONTEXT, "called");
726     if (isHook_) {
727         TAG_LOGD(AAFwkTag::CONTEXT, "RestoreWindowStage is hook module");
728         return ERR_NOT_SUPPORTED;
729     }
730     napi_ref value = nullptr;
731     napi_create_reference(env, contentStorage, 1, &value);
732     contentStorage_ = std::unique_ptr<NativeReference>(reinterpret_cast<NativeReference*>(value));
733     return ERR_OK;
734 }
735 
StartAbilityByCall(const AAFwk::Want & want,const std::shared_ptr<CallerCallBack> & callback,int32_t accountId)736 ErrCode AbilityContextImpl::StartAbilityByCall(
737     const AAFwk::Want& want, const std::shared_ptr<CallerCallBack>& callback, int32_t accountId)
738 {
739     if (localCallContainer_ == nullptr) {
740         localCallContainer_ = std::make_shared<LocalCallContainer>();
741         if (localCallContainer_ == nullptr) {
742             TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
743             return ERR_INVALID_VALUE;
744         }
745     }
746     return localCallContainer_->StartAbilityByCallInner(want, callback, token_, accountId);
747 }
748 
ReleaseCall(const std::shared_ptr<CallerCallBack> & callback)749 ErrCode AbilityContextImpl::ReleaseCall(const std::shared_ptr<CallerCallBack>& callback)
750 {
751     TAG_LOGD(AAFwkTag::CONTEXT, "called");
752     if (localCallContainer_ == nullptr) {
753         TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
754         return ERR_INVALID_VALUE;
755     }
756     return localCallContainer_->ReleaseCall(callback);
757 }
758 
ClearFailedCallConnection(const std::shared_ptr<CallerCallBack> & callback)759 void AbilityContextImpl::ClearFailedCallConnection(const std::shared_ptr<CallerCallBack>& callback)
760 {
761     TAG_LOGD(AAFwkTag::CONTEXT, "called");
762     if (localCallContainer_ == nullptr) {
763         TAG_LOGE(AAFwkTag::CONTEXT, "null localCallContainer_");
764         return;
765     }
766     localCallContainer_->ClearFailedCallConnection(callback);
767 }
768 
RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)769 void AbilityContextImpl::RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)
770 {
771     TAG_LOGD(AAFwkTag::CONTEXT, "called");
772     abilityCallback_ = abilityCallback;
773 }
774 
SetWindowRectangleParams(AAFwk::Want & want)775 void AbilityContextImpl::SetWindowRectangleParams(AAFwk::Want &want)
776 {
777     want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
778 #ifdef SUPPORT_SCREEN
779     int32_t left;
780     int32_t top;
781     int32_t width;
782     int32_t height;
783     GetWindowRect(left, top, width, height);
784     want.SetParam(RequestConstants::WINDOW_RECTANGLE_LEFT_KEY, left);
785     want.SetParam(RequestConstants::WINDOW_RECTANGLE_TOP_KEY, top);
786     want.SetParam(RequestConstants::WINDOW_RECTANGLE_WIDTH_KEY, width);
787     want.SetParam(RequestConstants::WINDOW_RECTANGLE_HEIGHT_KEY, height);
788 #endif // SUPPORT_SCREEN
789 }
790 
RequestDialogService(napi_env env,AAFwk::Want & want,RequestDialogResultTask && task)791 ErrCode AbilityContextImpl::RequestDialogService(napi_env env, AAFwk::Want &want, RequestDialogResultTask &&task)
792 {
793     SetWindowRectangleParams(want);
794     auto resultTask =
795         [env, outTask = std::move(task)](int32_t resultCode, const AAFwk::Want &resultWant) {
796         auto retData = new (std::nothrow) RequestResult();
797         if (retData == nullptr) {
798             TAG_LOGE(AAFwkTag::CONTEXT, "null retData");
799             return;
800         }
801         retData->resultCode = resultCode;
802         retData->resultWant = resultWant;
803         retData->task = std::move(outTask);
804 
805         uv_loop_s* loop = nullptr;
806         napi_get_uv_event_loop(env, &loop);
807         if (loop == nullptr) {
808             TAG_LOGE(AAFwkTag::CONTEXT, "null loop");
809             return;
810         }
811         auto work = new (std::nothrow) uv_work_t;
812         if (work == nullptr) {
813             TAG_LOGE(AAFwkTag::CONTEXT, "null work");
814             return;
815         }
816         work->data = static_cast<void*>(retData);
817         int rev = uv_queue_work_with_qos(
818             loop,
819             work,
820             [](uv_work_t* work) {},
821             RequestDialogResultJSThreadWorker,
822             uv_qos_user_initiated);
823         if (rev != 0) {
824             delete retData;
825             retData = nullptr;
826             if (work != nullptr) {
827                 delete work;
828                 work = nullptr;
829             }
830         }
831     };
832 
833     sptr<IRemoteObject> remoteObject = sptr<DialogRequestCallbackImpl>::MakeSptr(std::move(resultTask));
834     want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
835 
836     auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
837     TAG_LOGD(AAFwkTag::CONTEXT, "ret=%{public}d", static_cast<int32_t>(err));
838     return err;
839 }
840 
RequestDialogService(AAFwk::Want & want,RequestDialogResultTask && task)841 ErrCode AbilityContextImpl::RequestDialogService(AAFwk::Want &want, RequestDialogResultTask &&task)
842 {
843     SetWindowRectangleParams(want);
844     sptr<IRemoteObject> remoteObject = sptr<DialogRequestCallbackImpl>::MakeSptr(std::move(task));
845     want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
846 
847     auto err = AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService(want, token_);
848     TAG_LOGD(AAFwkTag::CONTEXT, "ret=%{public}d", static_cast<int32_t>(err));
849     return err;
850 }
851 
ReportDrawnCompleted()852 ErrCode AbilityContextImpl::ReportDrawnCompleted()
853 {
854     TAG_LOGD(AAFwkTag::CONTEXT, "called");
855     return AAFwk::AbilityManagerClient::GetInstance()->ReportDrawnCompleted(token_);
856 }
857 
RequestDialogResultJSThreadWorker(uv_work_t * work,int status)858 void AbilityContextImpl::RequestDialogResultJSThreadWorker(uv_work_t* work, int status)
859 {
860     TAG_LOGD(AAFwkTag::CONTEXT, "called");
861     if (work == nullptr) {
862         TAG_LOGE(AAFwkTag::CONTEXT, "null work");
863         return;
864     }
865     if (work->data == nullptr) {
866         TAG_LOGE(AAFwkTag::CONTEXT, "null work data");
867         delete work;
868         work = nullptr;
869         return;
870     }
871     RequestResult* retCB = static_cast<RequestResult*>(work->data);
872     if (retCB == nullptr) {
873         TAG_LOGE(AAFwkTag::CONTEXT, "null retCB");
874         delete work;
875         work = nullptr;
876         return;
877     }
878 
879     if (retCB->task) {
880         retCB->task(retCB->resultCode, retCB->resultWant);
881     }
882 
883     delete retCB;
884     retCB = nullptr;
885     delete work;
886     work = nullptr;
887 }
888 
GetMissionId(int32_t & missionId)889 ErrCode AbilityContextImpl::GetMissionId(int32_t &missionId)
890 {
891     TAG_LOGD(AAFwkTag::CONTEXT, "called");
892     if (missionId_ != -1) {
893         missionId = missionId_;
894         return ERR_OK;
895     }
896 
897     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token_, missionId);
898     if (err != ERR_OK) {
899         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
900     } else {
901         missionId_ = missionId;
902         TAG_LOGD(AAFwkTag::CONTEXT, "missionId: %{public}d", missionId_);
903     }
904     return err;
905 }
906 
SetMissionContinueState(const AAFwk::ContinueState & state)907 ErrCode AbilityContextImpl::SetMissionContinueState(const AAFwk::ContinueState &state)
908 {
909     TAG_LOGI(AAFwkTag::CONTEXT, "called, state: %{public}d", state);
910     if (isHook_) {
911         TAG_LOGD(AAFwkTag::CONTEXT, "SetMissionContinueState is hook module");
912         return ERR_NOT_SUPPORTED;
913     }
914     auto sessionToken = GetSessionToken();
915     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionContinueState(token_, state, sessionToken);
916     if (err != ERR_OK) {
917         TAG_LOGE(AAFwkTag::CONTEXT, "failed: %{public}d", err);
918         return err;
919     }
920     auto abilityCallback = abilityCallback_.lock();
921     if (abilityCallback) {
922         abilityCallback->SetContinueState(static_cast<int32_t>(state));
923         TAG_LOGI(AAFwkTag::CONTEXT, "SetContinueState, state: %{public}d.", state);
924     }
925     return ERR_OK;
926 }
927 
InsertResultCallbackTask(int requestCode,RuntimeTask && task)928 void AbilityContextImpl::InsertResultCallbackTask(int requestCode, RuntimeTask &&task)
929 {
930     TAG_LOGD(AAFwkTag::CONTEXT, "called");
931     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
932 }
933 
RemoveResultCallbackTask(int requestCode)934 void AbilityContextImpl::RemoveResultCallbackTask(int requestCode)
935 {
936     TAG_LOGD(AAFwkTag::CONTEXT, "call");
937     resultCallbacks_.erase(requestCode);
938 }
939 
940 #ifdef SUPPORT_SCREEN
GetWindowRect(int32_t & left,int32_t & top,int32_t & width,int32_t & height)941 void AbilityContextImpl::GetWindowRect(int32_t &left, int32_t &top, int32_t &width, int32_t &height)
942 {
943     TAG_LOGD(AAFwkTag::CONTEXT, "call");
944     auto abilityCallback = abilityCallback_.lock();
945     if (abilityCallback) {
946         abilityCallback->GetWindowRect(left, top, width, height);
947     }
948 }
949 #endif // SUPPORT_SCREEN
RegisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)950 void AbilityContextImpl::RegisterAbilityLifecycleObserver(
951     const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
952 {
953     TAG_LOGD(AAFwkTag::CONTEXT, "called");
954     auto abilityCallback = abilityCallback_.lock();
955     if (abilityCallback == nullptr) {
956         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
957         return;
958     }
959     abilityCallback->RegisterAbilityLifecycleObserver(observer);
960 }
961 
UnregisterAbilityLifecycleObserver(const std::shared_ptr<AppExecFwk::ILifecycleObserver> & observer)962 void AbilityContextImpl::UnregisterAbilityLifecycleObserver(
963     const std::shared_ptr<AppExecFwk::ILifecycleObserver> &observer)
964 {
965     TAG_LOGD(AAFwkTag::CONTEXT, "call");
966     auto abilityCallback = abilityCallback_.lock();
967     if (abilityCallback == nullptr) {
968         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
969         return;
970     }
971     abilityCallback->UnregisterAbilityLifecycleObserver(observer);
972 }
973 
974 #ifdef SUPPORT_SCREEN
SetMissionLabel(const std::string & label)975 ErrCode AbilityContextImpl::SetMissionLabel(const std::string& label)
976 {
977     TAG_LOGD(AAFwkTag::CONTEXT, "label:%{public}s", label.c_str());
978     if (isHook_) {
979         TAG_LOGD(AAFwkTag::CONTEXT, "SetMissionLabel is hook module");
980         return ERR_NOT_SUPPORTED;
981     }
982     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionLabel(token_, label);
983     if (err != ERR_OK) {
984         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
985     } else {
986         auto abilityCallback = abilityCallback_.lock();
987         if (abilityCallback) {
988             abilityCallback->SetMissionLabel(label);
989         }
990     }
991     return err;
992 }
993 
SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> & icon)994 ErrCode AbilityContextImpl::SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap>& icon)
995 {
996     TAG_LOGD(AAFwkTag::CONTEXT, "call");
997     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionIcon(token_, icon);
998     if (err != ERR_OK) {
999         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
1000     } else {
1001         auto abilityCallback = abilityCallback_.lock();
1002         if (abilityCallback) {
1003             abilityCallback->SetMissionIcon(icon);
1004         }
1005     }
1006     return err;
1007 }
1008 
SetAbilityInstanceInfo(const std::string & label,std::shared_ptr<OHOS::Media::PixelMap> icon)1009 ErrCode AbilityContextImpl::SetAbilityInstanceInfo(const std::string& label,
1010     std::shared_ptr<OHOS::Media::PixelMap> icon)
1011 {
1012     TAG_LOGD(AAFwkTag::CONTEXT, "call");
1013     if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
1014         auto ifaceSession = iface_cast<Rosen::ISession>(GetSessionToken());
1015         if (ifaceSession == nullptr) {
1016             TAG_LOGW(AAFwkTag::CONTEXT, "null ifaceSession");
1017             return ERR_INVALID_VALUE;
1018         }
1019 
1020         TAG_LOGI(AAFwkTag::CONTEXT, "SetSessionLabelAndIcon");
1021         auto errCode = ifaceSession->SetSessionLabelAndIcon(label, icon);
1022         if (errCode != Rosen::WSError::WS_OK) {
1023             TAG_LOGE(AAFwkTag::CONTEXT, "SetSessionLabelAndIcon err: %{public}d", static_cast<int32_t>(errCode));
1024         } else {
1025             auto abilityCallback = abilityCallback_.lock();
1026             if (abilityCallback) {
1027                 abilityCallback->SetMissionLabel(label);
1028                 abilityCallback->SetMissionIcon(icon);
1029             }
1030         }
1031         if (errCode == Rosen::WSError::WS_ERROR_INVALID_PERMISSION) {
1032             return AAFwk::CHECK_PERMISSION_FAILED;
1033         } else if (errCode == Rosen::WSError::WS_ERROR_SET_SESSION_LABEL_FAILED) {
1034             return AAFwk::INVALID_PARAMETERS_ERR;
1035         } else if (errCode == Rosen::WSError::WS_ERROR_DEVICE_NOT_SUPPORT) {
1036             return AAFwk::ERR_CAPABILITY_NOT_SUPPORT;
1037         }
1038 
1039         return static_cast<int32_t>(errCode);
1040     }
1041     return AAFwk::ERR_CAPABILITY_NOT_SUPPORT;
1042 }
1043 
GetCurrentWindowMode()1044 int AbilityContextImpl::GetCurrentWindowMode()
1045 {
1046     auto abilityCallback = abilityCallback_.lock();
1047     if (abilityCallback == nullptr) {
1048         return AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED;
1049     }
1050     return abilityCallback->GetCurrentWindowMode();
1051 }
1052 
GetUIContent()1053 Ace::UIContent* AbilityContextImpl::GetUIContent()
1054 {
1055     TAG_LOGD(AAFwkTag::CONTEXT, "call");
1056     auto abilityCallback = abilityCallback_.lock();
1057     if (abilityCallback == nullptr) {
1058         return nullptr;
1059     }
1060 
1061     return abilityCallback->GetUIContent();
1062 }
1063 
StartAbilityByType(const std::string & type,AAFwk::WantParams & wantParams,const std::shared_ptr<JsUIExtensionCallback> & uiExtensionCallbacks)1064 ErrCode AbilityContextImpl::StartAbilityByType(const std::string &type,
1065     AAFwk::WantParams &wantParams, const std::shared_ptr<JsUIExtensionCallback> &uiExtensionCallbacks)
1066 {
1067     TAG_LOGD(AAFwkTag::CONTEXT, "call");
1068     auto uiContent = GetUIContent();
1069     if (uiContent == nullptr) {
1070         TAG_LOGE(AAFwkTag::CONTEXT, "null uiContent");
1071         return ERR_INVALID_VALUE;
1072     }
1073     wantParams.SetParam(UIEXTENSION_TARGET_TYPE_KEY, AAFwk::String::Box(type));
1074     AAFwk::Want want;
1075     want.SetParams(wantParams);
1076     if (wantParams.HasParam(FLAG_AUTH_READ_URI_PERMISSION)) {
1077         int32_t flag = wantParams.GetIntParam(FLAG_AUTH_READ_URI_PERMISSION, 0);
1078         want.SetFlags(flag);
1079         wantParams.Remove(FLAG_AUTH_READ_URI_PERMISSION);
1080     }
1081     Ace::ModalUIExtensionCallbacks callback;
1082     callback.onError = [uiExtensionCallbacks](int32_t arg, const std::string &str1, const std::string &str2) {
1083         uiExtensionCallbacks->OnError(arg);
1084     };
1085     callback.onRelease = [uiExtensionCallbacks](int32_t arg) {
1086         uiExtensionCallbacks->OnRelease(arg);
1087     };
1088     callback.onResult = [uiExtensionCallbacks](int32_t arg1, const OHOS::AAFwk::Want arg2) {
1089         uiExtensionCallbacks->OnResult(arg1, arg2);
1090     };
1091 
1092     Ace::ModalUIExtensionConfig config;
1093     int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
1094     if (sessionId == 0) {
1095         TAG_LOGE(AAFwkTag::CONTEXT, "createModalUIExtension failed");
1096         return ERR_INVALID_VALUE;
1097     }
1098     uiExtensionCallbacks->SetUIContent(uiContent);
1099     uiExtensionCallbacks->SetSessionId(sessionId);
1100     return ERR_OK;
1101 }
1102 
IsUIExtensionExist(const AAFwk::Want & want)1103 bool AbilityContextImpl::IsUIExtensionExist(const AAFwk::Want &want)
1104 {
1105     TAG_LOGD(AAFwkTag::CONTEXT, "call");
1106     std::lock_guard lock(uiExtensionMutex_);
1107     for (const auto& iter : uiExtensionMap_) {
1108         if (iter.second.GetElement().GetBundleName() == want.GetElement().GetBundleName() &&
1109             iter.second.GetElement().GetModuleName() == want.GetElement().GetModuleName() &&
1110             iter.second.GetElement().GetAbilityName() == want.GetElement().GetAbilityName()) {
1111             return true;
1112         }
1113     }
1114     return false;
1115 }
1116 
EraseUIExtension(int32_t sessionId)1117 void AbilityContextImpl::EraseUIExtension(int32_t sessionId)
1118 {
1119     TAG_LOGD(AAFwkTag::CONTEXT, "call");
1120     std::lock_guard lock(uiExtensionMutex_);
1121     auto iter = uiExtensionMap_.find(sessionId);
1122     if (iter != uiExtensionMap_.end()) {
1123         uiExtensionMap_.erase(sessionId);
1124     }
1125 }
1126 
CreateModalUIExtensionWithApp(const AAFwk::Want & want)1127 ErrCode AbilityContextImpl::CreateModalUIExtensionWithApp(const AAFwk::Want &want)
1128 {
1129     TAG_LOGD(AAFwkTag::CONTEXT, "call");
1130     auto uiContent = GetUIContent();
1131     if (uiContent == nullptr) {
1132         TAG_LOGE(AAFwkTag::CONTEXT, "null uiContent");
1133         return ERR_INVALID_VALUE;
1134     }
1135     if (IsUIExtensionExist(want) && !want.GetBoolParam(USE_GLOBAL_UICONTENT, false)) {
1136         TAG_LOGD(AAFwkTag::CONTEXT, "exist uIExtension");
1137         return ERR_OK;
1138     }
1139     auto abilityCallback = abilityCallback_.lock();
1140     if (abilityCallback == nullptr) {
1141         TAG_LOGE(AAFwkTag::CONTEXT, "null abilityCallback");
1142         return ERR_INVALID_VALUE;
1143     }
1144     auto disposedCallback = std::make_shared<DialogUIExtensionCallback>(abilityCallback);
1145     Ace::ModalUIExtensionCallbacks callback;
1146     callback.onError = [disposedCallback](int32_t arg1, const std::string &str1, const std::string &str2) {
1147         disposedCallback->OnError();
1148     };
1149     callback.onRelease = [disposedCallback](int32_t arg1) {
1150         disposedCallback->OnRelease();
1151     };
1152     callback.onDestroy = [disposedCallback]() {
1153         disposedCallback->OnDestroy();
1154     };
1155     Ace::ModalUIExtensionConfig config;
1156     config.prohibitedRemoveByRouter = true;
1157     if (want.GetBoolParam(DISPOSED_PROHIBIT_BACK, false)) {
1158         config.isProhibitBack = true;
1159     }
1160     if (want.HasParameter(IS_WINDOWMODE_FOLLOWHOST)) {
1161         config.isWindowModeFollowHost = want.GetBoolParam(IS_WINDOWMODE_FOLLOWHOST, false);
1162     }
1163     int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
1164     if (sessionId == 0) {
1165         TAG_LOGE(AAFwkTag::CONTEXT, "failed");
1166         return ERR_INVALID_VALUE;
1167     }
1168     disposedCallback->SetUIContent(uiContent);
1169     disposedCallback->SetSessionId(sessionId);
1170     {
1171         std::lock_guard lock(uiExtensionMutex_);
1172         uiExtensionMap_.emplace(sessionId, want);
1173     }
1174     return ERR_OK;
1175 }
1176 #endif
1177 
RequestModalUIExtension(const AAFwk::Want & want)1178 ErrCode AbilityContextImpl::RequestModalUIExtension(const AAFwk::Want& want)
1179 {
1180     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->RequestModalUIExtension(want);
1181     if (err != ERR_OK) {
1182         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
1183     }
1184     return err;
1185 }
1186 
ChangeAbilityVisibility(bool isShow)1187 ErrCode AbilityContextImpl::ChangeAbilityVisibility(bool isShow)
1188 {
1189     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->ChangeAbilityVisibility(token_, isShow);
1190     if (err != ERR_OK) {
1191         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
1192     }
1193     return err;
1194 }
1195 
AddFreeInstallObserver(const sptr<IFreeInstallObserver> & observer)1196 ErrCode AbilityContextImpl::AddFreeInstallObserver(const sptr<IFreeInstallObserver> &observer)
1197 {
1198     ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->AddFreeInstallObserver(token_, observer);
1199     if (ret != ERR_OK) {
1200         TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret: %{public}d", ret);
1201     }
1202     return ret;
1203 }
1204 
OpenAtomicService(AAFwk::Want & want,const AAFwk::StartOptions & options,int requestCode,RuntimeTask && task)1205 ErrCode AbilityContextImpl::OpenAtomicService(AAFwk::Want& want, const AAFwk::StartOptions &options, int requestCode,
1206     RuntimeTask &&task)
1207 {
1208     TAG_LOGD(AAFwkTag::CONTEXT, "called");
1209     resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
1210     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->OpenAtomicService(want, options, token_, requestCode, -1);
1211     if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) {
1212         TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret=%{public}d", err);
1213         OnAbilityResultInner(requestCode, err, want);
1214         if (!options.requestId_.empty()) {
1215             nlohmann::json jsonObject = nlohmann::json {
1216                 { JSON_KEY_ERR_MSG, "failed to call openAtomicService" },
1217             };
1218             OnRequestFailure(options.requestId_, want.GetElement(), jsonObject.dump());
1219         }
1220     }
1221     return err;
1222 }
1223 
SetRestoreEnabled(bool enabled)1224 void AbilityContextImpl::SetRestoreEnabled(bool enabled)
1225 {
1226     if (isHook_) {
1227         TAG_LOGD(AAFwkTag::CONTEXT, "SetRestoreEnabled is hook module");
1228         return;
1229     }
1230     restoreEnabled_.store(enabled);
1231 }
1232 
GetRestoreEnabled()1233 bool AbilityContextImpl::GetRestoreEnabled()
1234 {
1235     return restoreEnabled_.load();
1236 }
1237 
OpenLink(const AAFwk::Want & want,int requestCode)1238 ErrCode AbilityContextImpl::OpenLink(const AAFwk::Want& want, int requestCode)
1239 {
1240     TAG_LOGD(AAFwkTag::CONTEXT, "called");
1241     return AAFwk::AbilityManagerClient::GetInstance()->OpenLink(want, token_, -1, requestCode);
1242 }
1243 
GetWant()1244 std::shared_ptr<AAFwk::Want> AbilityContextImpl::GetWant()
1245 {
1246     auto abilityCallback = abilityCallback_.lock();
1247     if (abilityCallback == nullptr) {
1248         TAG_LOGW(AAFwkTag::CONTEXT, "null abilityCallback");
1249         return nullptr;
1250     }
1251     return abilityCallback->GetWant();
1252 }
1253 
CreateAreaModeContext(int areaMode)1254 std::shared_ptr<Context> AbilityContextImpl::CreateAreaModeContext(int areaMode)
1255 {
1256     return stageContext_ ? stageContext_->CreateAreaModeContext(areaMode) : nullptr;
1257 }
1258 
1259 #ifdef SUPPORT_GRAPHICS
CreateDisplayContext(uint64_t displayId)1260 std::shared_ptr<Context> AbilityContextImpl::CreateDisplayContext(uint64_t displayId)
1261 {
1262     return stageContext_ ? stageContext_->CreateDisplayContext(displayId) : nullptr;
1263 }
1264 #endif
1265 
RevokeDelegator()1266 ErrCode AbilityContextImpl::RevokeDelegator()
1267 {
1268     if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
1269         TAG_LOGE(AAFwkTag::CONTEXT, "capability not support");
1270         return AAFwk::ERR_CAPABILITY_NOT_SUPPORT;
1271     }
1272     if (!IsHook() || GetHookOff()) {
1273         TAG_LOGE(AAFwkTag::CONTEXT, "repeated called");
1274         return AAFwk::ERR_NOT_HOOK;
1275     }
1276     TAG_LOGI(AAFwkTag::CONTEXT, "RevokeDelegator called");
1277     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->RevokeDelegator(token_);
1278     if (err != ERR_OK) {
1279         TAG_LOGE(AAFwkTag::CONTEXT, "RevokeDelegator is failed:%{public}d", err);
1280         return err;
1281     }
1282     auto sessionToken = GetSessionToken();
1283     if (sessionToken == nullptr) {
1284         TAG_LOGW(AAFwkTag::CONTEXT, "null sessionToken");
1285         return ERR_INVALID_VALUE;
1286     }
1287     auto ifaceSessionToken = iface_cast<Rosen::ISession>(sessionToken);
1288     if (ifaceSessionToken == nullptr) {
1289         TAG_LOGW(AAFwkTag::CONTEXT, "null ifaceSessionToken");
1290         return ERR_INVALID_VALUE;
1291     }
1292     err = static_cast<int32_t>(ifaceSessionToken->NotifyDisableDelegatorChange());
1293     if (err != ERR_OK) {
1294         TAG_LOGE(AAFwkTag::CONTEXT, "scb call, revokeDelegator err: %{public}d", err);
1295         return AAFwk::ERR_FROM_WINDOW;
1296     }
1297     auto abilityCallback = abilityCallback_.lock();
1298     if (abilityCallback == nullptr) {
1299         TAG_LOGW(AAFwkTag::CONTEXT, "null abilityCallback");
1300         return ERR_INVALID_VALUE;
1301     }
1302     abilityCallback->NotifyWindowDestroy();
1303     SetHookOff(true);
1304     return ERR_OK;
1305 }
1306 
AddCompletionHandler(const std::string & requestId,OnRequestResult onRequestSucc,OnRequestResult onRequestFail)1307 ErrCode AbilityContextImpl::AddCompletionHandler(const std::string &requestId, OnRequestResult onRequestSucc,
1308     OnRequestResult onRequestFail)
1309 {
1310     if (onRequestSucc == nullptr || onRequestFail == nullptr) {
1311         TAG_LOGE(AAFwkTag::CONTEXT, "either func is null");
1312         return ERR_INVALID_VALUE;
1313     }
1314     std::lock_guard lock(onRequestResultMutex_);
1315     for (auto iter = onRequestResults_.begin(); iter != onRequestResults_.end(); iter++) {
1316         if ((*iter)->requestId_ == requestId) {
1317             TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s already exists", requestId.c_str());
1318             return ERR_OK;
1319         }
1320     }
1321     onRequestResults_.emplace_back(std::make_shared<OnRequestResultElement>(requestId, onRequestSucc, onRequestFail));
1322     return ERR_OK;
1323 }
1324 
OnRequestSuccess(const std::string & requestId,const AppExecFwk::ElementName & element,const std::string & message)1325 void AbilityContextImpl::OnRequestSuccess(const std::string &requestId, const AppExecFwk::ElementName &element,
1326     const std::string &message)
1327 {
1328     std::shared_ptr<OnRequestResultElement> result = nullptr;
1329     {
1330         std::lock_guard lock(onRequestResultMutex_);
1331         for (auto iter = onRequestResults_.begin(); iter != onRequestResults_.end(); iter++) {
1332             if ((*iter)->requestId_ == requestId) {
1333                 result = *iter;
1334                 onRequestResults_.erase(iter);
1335                 break;
1336             }
1337         }
1338     }
1339     if (result != nullptr) {
1340         TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s, call onRequestSuccess", requestId.c_str());
1341         result->onRequestSuccess_(element, message);
1342         return;
1343     }
1344     std::shared_ptr<OnAtomicRequestResult> atomicResult = nullptr;
1345     {
1346         std::lock_guard lock(onAtomicRequestResultMutex_);
1347         for (auto iter = onAtomicRequestResults_.begin(); iter != onAtomicRequestResults_.end(); iter++) {
1348             if ((*iter)->requestId_ == requestId) {
1349                 atomicResult = *iter;
1350                 onAtomicRequestResults_.erase(iter);
1351                 break;
1352             }
1353         }
1354     }
1355     if (atomicResult != nullptr) {
1356         TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s, call onRequestSuccess", requestId.c_str());
1357         atomicResult->onRequestSuccess_(atomicResult->appId_);
1358         return;
1359     }
1360 
1361     TAG_LOGE(AAFwkTag::CONTEXT, "requestId=%{public}s not exist", requestId.c_str());
1362 }
1363 
OnRequestFailure(const std::string & requestId,const AppExecFwk::ElementName & element,const std::string & message,int32_t resultCode)1364 void AbilityContextImpl::OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element,
1365     const std::string &message, int32_t resultCode)
1366 {
1367     std::shared_ptr<OnRequestResultElement> result = nullptr;
1368     {
1369         std::lock_guard lock(onRequestResultMutex_);
1370         for (auto iter = onRequestResults_.begin(); iter != onRequestResults_.end(); iter++) {
1371             if ((*iter)->requestId_ == requestId) {
1372                 result = *iter;
1373                 onRequestResults_.erase(iter);
1374                 break;
1375             }
1376         }
1377     }
1378     if (result != nullptr) {
1379         TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s, call onRequestFailure", requestId.c_str());
1380         result->onRequestFailure_(element, message);
1381         return;
1382     }
1383     std::shared_ptr<OnAtomicRequestResult> atomicResult = nullptr;
1384     {
1385         std::lock_guard lock(onAtomicRequestResultMutex_);
1386         for (auto iter = onAtomicRequestResults_.begin(); iter != onAtomicRequestResults_.end(); iter++) {
1387             if ((*iter)->requestId_ == requestId) {
1388                 atomicResult = *iter;
1389                 onAtomicRequestResults_.erase(iter);
1390                 break;
1391             }
1392         }
1393     }
1394     if (atomicResult != nullptr) {
1395         TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s, call onRequestFailure", requestId.c_str());
1396         int32_t failureCode = 0;
1397         std::string failureMessage;
1398         GetFailureInfoByMessage(message, failureCode, failureMessage, resultCode);
1399         atomicResult->onRequestFailure_(atomicResult->appId_, failureCode, failureMessage);
1400         return;
1401     }
1402 
1403     TAG_LOGE(AAFwkTag::CONTEXT, "requestId=%{public}s not exist", requestId.c_str());
1404 }
1405 
StartExtensionAbilityWithExtensionType(const AAFwk::Want & want,AppExecFwk::ExtensionAbilityType extensionType)1406 ErrCode AbilityContextImpl::StartExtensionAbilityWithExtensionType(const AAFwk::Want &want,
1407     AppExecFwk::ExtensionAbilityType extensionType)
1408 {
1409     TAG_LOGI(AAFwkTag::CONTEXT, "StartExtensionAbilityWithExtensionType, name:%{public}s %{public}s",
1410         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
1411     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
1412         want, token_, DEFAULT_INVAL_VALUE, extensionType);
1413     if (err != ERR_OK) {
1414         TAG_LOGE(AAFwkTag::CONTEXT, "failed:%{public}d", err);
1415     }
1416     return err;
1417 }
1418 
1419 
StopExtensionAbilityWithExtensionType(const AAFwk::Want & want,AppExecFwk::ExtensionAbilityType extensionType)1420 ErrCode AbilityContextImpl::StopExtensionAbilityWithExtensionType(const AAFwk::Want& want,
1421     AppExecFwk::ExtensionAbilityType extensionType)
1422 {
1423     TAG_LOGD(AAFwkTag::CONTEXT, "StopExtensionAbilityWithExtensionType, name:%{public}s %{public}s",
1424         want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
1425     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StopExtensionAbility(
1426         want, token_, DEFAULT_INVAL_VALUE, extensionType);
1427     if (err != ERR_OK) {
1428         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err);
1429     }
1430     return err;
1431 }
1432 
ConnectExtensionAbilityWithExtensionType(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback,AppExecFwk::ExtensionAbilityType extensionType)1433 ErrCode AbilityContextImpl::ConnectExtensionAbilityWithExtensionType(const AAFwk::Want& want,
1434     const sptr<AbilityConnectCallback>& connectCallback, AppExecFwk::ExtensionAbilityType extensionType)
1435 {
1436     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1437     TAG_LOGI(AAFwkTag::CONTEXT, "ConnectExtensionAbilityWithExtensionType, caller:%{public}s, target:%{public}s",
1438         abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str(), want.GetElement().GetAbilityName().c_str());
1439     ErrCode ret = ConnectionManager::GetInstance()
1440         .ConnectExtensionAbilityWithExtensionType(token_, want, connectCallback, extensionType);
1441     if (ret != ERR_OK) {
1442         TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", ret);
1443     }
1444     return ret;
1445 }
1446 
SetOnNewWantSkipScenarios(int32_t scenarios)1447 ErrCode AbilityContextImpl::SetOnNewWantSkipScenarios(int32_t scenarios)
1448 {
1449     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1450     return AAFwk::AbilityManagerClient::GetInstance()->SetOnNewWantSkipScenarios(token_, scenarios);
1451 }
1452 
AddCompletionHandlerForAtomicService(const std::string & requestId,OnAtomicRequestSuccess onRequestSucc,OnAtomicRequestFailure onRequestFail,const std::string & appId)1453 ErrCode AbilityContextImpl::AddCompletionHandlerForAtomicService(const std::string &requestId,
1454     OnAtomicRequestSuccess onRequestSucc, OnAtomicRequestFailure onRequestFail, const std::string &appId)
1455 {
1456     if (onRequestSucc == nullptr || onRequestFail == nullptr) {
1457         TAG_LOGE(AAFwkTag::CONTEXT, "either func is null");
1458         return ERR_INVALID_VALUE;
1459     }
1460     std::lock_guard lock(onAtomicRequestResultMutex_);
1461     for (auto iter = onAtomicRequestResults_.begin(); iter != onAtomicRequestResults_.end(); iter++) {
1462         if ((*iter)->requestId_ == requestId) {
1463             TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s already exists", requestId.c_str());
1464             return ERR_OK;
1465         }
1466     }
1467     onAtomicRequestResults_.emplace_back(std::make_shared<OnAtomicRequestResult>(
1468         requestId, appId, onRequestSucc, onRequestFail));
1469     return ERR_OK;
1470 }
1471 
GetFailureInfoByMessage(const std::string & message,int32_t & failureCode,std::string & failureMessage,int32_t resultCode)1472 void AbilityContextImpl::GetFailureInfoByMessage(
1473     const std::string &message, int32_t &failureCode, std::string &failureMessage, int32_t resultCode)
1474 {
1475     if (resultCode == USER_CANCEL) {
1476         failureCode = static_cast<int32_t>(FailureCode::FAILURE_CODE_USER_CANCEL);
1477         failureMessage = "The user canceled this startup";
1478     } else if (message.find("User refused redirection") != std::string::npos) {
1479         failureCode = static_cast<int32_t>(FailureCode::FAILURE_CODE_USER_REFUSE);
1480         failureMessage = "User refused redirection";
1481     } else {
1482         failureCode = static_cast<int32_t>(FailureCode::FAILURE_CODE_SYSTEM_MALFUNCTION);
1483         failureMessage = "A system error occurred";
1484     }
1485 }
1486 } // namespace AbilityRuntime
1487 } // namespace OHOS
1488