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