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