1 /*
2 * Copyright (c) 2021-2022 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 "accesstoken_kit.h"
22 #include "authorization_result.h"
23 #include "hitrace_meter.h"
24 #include "connection_manager.h"
25 #include "dialog_request_callback_impl.h"
26 #include "hilog_wrapper.h"
27 #include "permission_list_state.h"
28 #include "remote_object_wrapper.h"
29 #include "request_constants.h"
30 #include "string_wrapper.h"
31 #include "want_params_wrapper.h"
32
33 using OHOS::Security::AccessToken::AccessTokenKit;
34 using OHOS::Security::AccessToken::PermissionListState;
35 using OHOS::Security::AccessToken::TypePermissionOper;
36
37 namespace OHOS {
38 namespace AbilityRuntime {
39 const size_t AbilityContext::CONTEXT_TYPE_ID(std::hash<const char*> {} ("AbilityContext"));
40 const std::string GRANT_ABILITY_BUNDLE_NAME = "com.ohos.permissionmanager";
41 const std::string GRANT_ABILITY_ABILITY_NAME = "com.ohos.permissionmanager.GrantAbility";
42 const std::string PERMISSION_KEY = "ohos.user.grant.permission";
43 const std::string STATE_KEY = "ohos.user.grant.permission.state";
44 const std::string TOKEN_KEY = "ohos.ability.params.token";
45 const std::string CALLBACK_KEY = "ohos.ability.params.callback";
46
47 std::mutex AbilityContextImpl::mutex_;
48 std::map<int, PermissionRequestTask> AbilityContextImpl::permissionRequestCallbacks;
49
50 struct RequestResult {
51 int32_t resultCode {0};
52 RequestDialogResultTask task;
53 };
54
GetDeviceType() const55 Global::Resource::DeviceType AbilityContextImpl::GetDeviceType() const
56 {
57 return (stageContext_ != nullptr) ? stageContext_->GetDeviceType() : Global::Resource::DeviceType::DEVICE_PHONE;
58 }
59
GetBaseDir() const60 std::string AbilityContextImpl::GetBaseDir() const
61 {
62 return stageContext_ ? stageContext_->GetBaseDir() : "";
63 }
64
GetBundleCodeDir()65 std::string AbilityContextImpl::GetBundleCodeDir()
66 {
67 return stageContext_ ? stageContext_->GetBundleCodeDir() : "";
68 }
69
GetCacheDir()70 std::string AbilityContextImpl::GetCacheDir()
71 {
72 return stageContext_ ? stageContext_->GetCacheDir() : "";
73 }
74
GetDatabaseDir()75 std::string AbilityContextImpl::GetDatabaseDir()
76 {
77 return stageContext_ ? stageContext_->GetDatabaseDir() : "";
78 }
79
GetPreferencesDir()80 std::string AbilityContextImpl::GetPreferencesDir()
81 {
82 return stageContext_ ? stageContext_->GetPreferencesDir() : "";
83 }
84
GetTempDir()85 std::string AbilityContextImpl::GetTempDir()
86 {
87 return stageContext_ ? stageContext_->GetTempDir() : "";
88 }
89
GetFilesDir()90 std::string AbilityContextImpl::GetFilesDir()
91 {
92 return stageContext_ ? stageContext_->GetFilesDir() : "";
93 }
94
GetDistributedFilesDir()95 std::string AbilityContextImpl::GetDistributedFilesDir()
96 {
97 return stageContext_ ? stageContext_->GetDistributedFilesDir() : "";
98 }
99
IsUpdatingConfigurations()100 bool AbilityContextImpl::IsUpdatingConfigurations()
101 {
102 return stageContext_ ? stageContext_->IsUpdatingConfigurations() : false;
103 }
104
PrintDrawnCompleted()105 bool AbilityContextImpl::PrintDrawnCompleted()
106 {
107 return stageContext_ ? stageContext_->PrintDrawnCompleted() : false;
108 }
109
SwitchArea(int mode)110 void AbilityContextImpl::SwitchArea(int mode)
111 {
112 HILOG_INFO("AbilityContextImpl::SwitchArea to %{public}d.", mode);
113 if (stageContext_ != nullptr) {
114 stageContext_->SwitchArea(mode);
115 }
116 }
117
GetArea()118 int AbilityContextImpl::GetArea()
119 {
120 HILOG_DEBUG("AbilityContextImpl::GetArea.");
121 if (stageContext_ == nullptr) {
122 HILOG_ERROR("AbilityContextImpl::stageContext is nullptr.");
123 return ContextImpl::EL_DEFAULT;
124 }
125 return stageContext_->GetArea();
126 }
127
StartAbility(const AAFwk::Want & want,int requestCode)128 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want &want, int requestCode)
129 {
130 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
131 HILOG_DEBUG("Start calling StartAbility.");
132 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode);
133 HILOG_INFO("AbilityContextImpl::StartAbility. End calling StartAbility. ret=%{public}d", err);
134 return err;
135 }
136
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,int requestCode)137 ErrCode AbilityContextImpl::StartAbilityWithAccount(const AAFwk::Want &want, int accountId, int requestCode)
138 {
139 HILOG_DEBUG("AbilityContextImpl::StartAbilityWithAccount. Start calling StartAbility.");
140 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
141 HILOG_INFO("AbilityContextImpl::StartAbilityWithAccount. End calling StartAbility. ret=%{public}d", err);
142 return err;
143 }
144
StartAbility(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode)145 ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions,
146 int requestCode)
147 {
148 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
149 HILOG_DEBUG("AbilityContextImpl::StartAbility. Start calling StartAbility.");
150 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
151 HILOG_INFO("AbilityContextImpl::StartAbility. End calling StartAbility. ret=%{public}d", err);
152 return err;
153 }
154
StartAbilityWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode)155 ErrCode AbilityContextImpl::StartAbilityWithAccount(
156 const AAFwk::Want &want, int accountId, const AAFwk::StartOptions &startOptions, int requestCode)
157 {
158 HILOG_INFO("%{public}s called, bundleName=%{public}s, abilityName=%{public}s, accountId=%{public}d",
159 __func__, want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
160 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
161 want, startOptions, token_, requestCode, accountId);
162 HILOG_INFO("AbilityContextImpl::StartAbilityWithAccount. End calling StartAbility. ret=%{public}d", err);
163 return err;
164 }
165
StartAbilityForResult(const AAFwk::Want & want,int requestCode,RuntimeTask && task)166 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want &want, int requestCode, RuntimeTask &&task)
167 {
168 HILOG_DEBUG("%{public}s. Start calling StartAbilityForResult.", __func__);
169 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
170 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode);
171 HILOG_INFO("%{public}s. End calling StartAbilityForResult. ret=%{public}d", __func__, err);
172 return err;
173 }
174
StartAbilityForResultWithAccount(const AAFwk::Want & want,const int accountId,int requestCode,RuntimeTask && task)175 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
176 const AAFwk::Want &want, const int accountId, int requestCode, RuntimeTask &&task)
177 {
178 HILOG_DEBUG("%{public}s called, accountId:%{private}d", __func__, accountId);
179 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
180 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId);
181 HILOG_INFO("%{public}s end. ret=%{public}d", __func__, err);
182 return err;
183 }
184
StartAbilityForResult(const AAFwk::Want & want,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)185 ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions,
186 int requestCode, RuntimeTask &&task)
187 {
188 HILOG_DEBUG("%{public}s. Start calling StartAbilityForResult.", __func__);
189 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
190 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode);
191 HILOG_INFO("%{public}s. End calling StartAbilityForResult. ret=%{public}d", __func__, err);
192 return err;
193 }
194
StartAbilityForResultWithAccount(const AAFwk::Want & want,int accountId,const AAFwk::StartOptions & startOptions,int requestCode,RuntimeTask && task)195 ErrCode AbilityContextImpl::StartAbilityForResultWithAccount(
196 const AAFwk::Want &want, int accountId, const AAFwk::StartOptions &startOptions,
197 int requestCode, RuntimeTask &&task)
198 {
199 HILOG_DEBUG("%{public}s. Start calling StartAbilityForResultWithAccount.", __func__);
200 resultCallbacks_.insert(make_pair(requestCode, std::move(task)));
201 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(
202 want, startOptions, token_, requestCode, accountId);
203 HILOG_INFO("%{public}s. End calling StartAbilityForResultWithAccount. ret=%{public}d", __func__, err);
204 return err;
205 }
206
StartServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)207 ErrCode AbilityContextImpl::StartServiceExtensionAbility(const AAFwk::Want &want, int32_t accountId)
208 {
209 HILOG_INFO("%{public}s begin. bundleName=%{public}s, abilityName=%{public}s, accountId=%{public}d",
210 __func__, want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
211 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
212 want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
213 if (err != ERR_OK) {
214 HILOG_ERROR("AbilityContextImpl::StartServiceExtensionAbility is failed %{public}d", err);
215 }
216 return err;
217 }
218
StopServiceExtensionAbility(const AAFwk::Want & want,int32_t accountId)219 ErrCode AbilityContextImpl::StopServiceExtensionAbility(const AAFwk::Want& want, int32_t accountId)
220 {
221 HILOG_INFO("%{public}s begin. bundleName=%{public}s, abilityName=%{public}s, accountId=%{public}d",
222 __func__, want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), accountId);
223 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StopExtensionAbility(
224 want, token_, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
225 if (err != ERR_OK) {
226 HILOG_ERROR("AbilityContextImpl::StopServiceExtensionAbility is failed %{public}d", err);
227 }
228 return err;
229 }
230
TerminateAbilityWithResult(const AAFwk::Want & want,int resultCode)231 ErrCode AbilityContextImpl::TerminateAbilityWithResult(const AAFwk::Want &want, int resultCode)
232 {
233 HILOG_DEBUG("%{public}s. Start calling TerminateAbilityWithResult.", __func__);
234 isTerminating_ = true;
235 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, resultCode, &want);
236 HILOG_INFO("%{public}s. End calling TerminateAbilityWithResult. ret=%{public}d", __func__, err);
237 return err;
238 }
239
OnAbilityResult(int requestCode,int resultCode,const AAFwk::Want & resultData)240 void AbilityContextImpl::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData)
241 {
242 HILOG_DEBUG("%{public}s. Start calling OnAbilityResult.", __func__);
243 auto callback = resultCallbacks_.find(requestCode);
244 if (callback != resultCallbacks_.end()) {
245 if (callback->second) {
246 callback->second(resultCode, resultData);
247 }
248 resultCallbacks_.erase(requestCode);
249 }
250 HILOG_INFO("%{public}s. End calling OnAbilityResult.", __func__);
251 }
252
ConnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)253 bool AbilityContextImpl::ConnectAbility(const AAFwk::Want &want, const sptr<AbilityConnectCallback> &connectCallback)
254 {
255 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
256 HILOG_DEBUG("ConnectAbility begin, name:%{public}s.", abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
257 ErrCode ret = ConnectionManager::GetInstance().ConnectAbility(token_, want, connectCallback);
258 HILOG_INFO("AbilityContextImpl::ConnectAbility ErrorCode = %{public}d", ret);
259 return ret == ERR_OK;
260 }
261
ConnectAbilityWithAccount(const AAFwk::Want & want,int accountId,const sptr<AbilityConnectCallback> & connectCallback)262 bool AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want &want, int accountId,
263 const sptr<AbilityConnectCallback> &connectCallback)
264 {
265 HILOG_DEBUG("%{public}s begin.", __func__);
266 ErrCode ret =
267 ConnectionManager::GetInstance().ConnectAbilityWithAccount(token_, want, accountId, connectCallback);
268 HILOG_INFO("AbilityContextImpl::ConnectAbility ErrorCode = %{public}d", ret);
269 return ret == ERR_OK;
270 }
271
DisconnectAbility(const AAFwk::Want & want,const sptr<AbilityConnectCallback> & connectCallback)272 void AbilityContextImpl::DisconnectAbility(const AAFwk::Want &want,
273 const sptr<AbilityConnectCallback> &connectCallback)
274 {
275 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
276 HILOG_DEBUG("DisconnectAbility begin, caller:%{public}s.",
277 abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
278 ErrCode ret =
279 ConnectionManager::GetInstance().DisconnectAbility(token_, want.GetElement(), connectCallback);
280 if (ret != ERR_OK) {
281 HILOG_ERROR("%{public}s end DisconnectAbility error, ret=%{public}d", __func__, ret);
282 }
283 }
284
GetBundleName() const285 std::string AbilityContextImpl::GetBundleName() const
286 {
287 return stageContext_ ? stageContext_->GetBundleName() : "";
288 }
289
GetApplicationInfo() const290 std::shared_ptr<AppExecFwk::ApplicationInfo> AbilityContextImpl::GetApplicationInfo() const
291 {
292 return stageContext_ ? stageContext_->GetApplicationInfo() : nullptr;
293 }
294
GetBundleCodePath() const295 std::string AbilityContextImpl::GetBundleCodePath() const
296 {
297 return stageContext_ ? stageContext_->GetBundleCodePath() : "";
298 }
299
GetHapModuleInfo() const300 std::shared_ptr<AppExecFwk::HapModuleInfo> AbilityContextImpl::GetHapModuleInfo() const
301 {
302 return stageContext_ ? stageContext_->GetHapModuleInfo() : nullptr;
303 }
304
GetResourceManager() const305 std::shared_ptr<Global::Resource::ResourceManager> AbilityContextImpl::GetResourceManager() const
306 {
307 return stageContext_ ? stageContext_->GetResourceManager() : nullptr;
308 }
309
CreateBundleContext(const std::string & bundleName)310 std::shared_ptr<Context> AbilityContextImpl::CreateBundleContext(const std::string &bundleName)
311 {
312 return stageContext_ ? stageContext_->CreateBundleContext(bundleName) : nullptr;
313 }
314
CreateModuleContext(const std::string & moduleName)315 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string &moduleName)
316 {
317 return stageContext_ ? stageContext_->CreateModuleContext(moduleName) : nullptr;
318 }
319
CreateModuleContext(const std::string & bundleName,const std::string & moduleName)320 std::shared_ptr<Context> AbilityContextImpl::CreateModuleContext(const std::string &bundleName,
321 const std::string &moduleName)
322 {
323 return stageContext_ ? stageContext_->CreateModuleContext(bundleName, moduleName) : nullptr;
324 }
325
SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> & abilityInfo)326 void AbilityContextImpl::SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo)
327 {
328 abilityInfo_ = abilityInfo;
329 }
330
GetAbilityInfo() const331 std::shared_ptr<AppExecFwk::AbilityInfo> AbilityContextImpl::GetAbilityInfo() const
332 {
333 return abilityInfo_;
334 }
335
SetStageContext(const std::shared_ptr<AbilityRuntime::Context> & stageContext)336 void AbilityContextImpl::SetStageContext(const std::shared_ptr<AbilityRuntime::Context> &stageContext)
337 {
338 stageContext_ = stageContext;
339 }
340
SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> & config)341 void AbilityContextImpl::SetConfiguration(const std::shared_ptr<AppExecFwk::Configuration> &config)
342 {
343 config_ = config;
344 }
345
GetConfiguration() const346 std::shared_ptr<AppExecFwk::Configuration> AbilityContextImpl::GetConfiguration() const
347 {
348 return config_;
349 }
350
MinimizeAbility(bool fromUser)351 void AbilityContextImpl::MinimizeAbility(bool fromUser)
352 {
353 HILOG_DEBUG("%{public}s begin.", __func__);
354 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(token_, fromUser);
355 if (err != ERR_OK) {
356 HILOG_ERROR("AbilityContext::MinimizeAbility is failed %{public}d", err);
357 }
358 }
359
TerminateSelf()360 ErrCode AbilityContextImpl::TerminateSelf()
361 {
362 HILOG_DEBUG("%{public}s begin.", __func__);
363 isTerminating_ = true;
364 AAFwk::Want resultWant;
365 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->TerminateAbility(token_, -1, &resultWant);
366 if (err != ERR_OK) {
367 HILOG_ERROR("AbilityContextImpl::TerminateSelf is failed %{public}d", err);
368 }
369 return err;
370 }
371
CloseAbility()372 ErrCode AbilityContextImpl::CloseAbility()
373 {
374 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
375 HILOG_DEBUG("%{public}s begin.", __func__);
376 isTerminating_ = true;
377 AAFwk::Want resultWant;
378 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->CloseAbility(token_, -1, &resultWant);
379 if (err != ERR_OK) {
380 HILOG_ERROR("CloseAbility failed: %{public}d", err);
381 }
382 return err;
383 }
384
GetToken()385 sptr<IRemoteObject> AbilityContextImpl::GetToken()
386 {
387 return token_;
388 }
389
RequestPermissionsFromUser(NativeEngine & engine,const std::vector<std::string> & permissions,int requestCode,PermissionRequestTask && task)390 void AbilityContextImpl::RequestPermissionsFromUser(NativeEngine& engine, const std::vector<std::string> &permissions,
391 int requestCode, PermissionRequestTask &&task)
392 {
393 HILOG_INFO("%{public}s called.", __func__);
394 if (permissions.empty()) {
395 HILOG_ERROR("%{public}s. The params are invalid.", __func__);
396 return;
397 }
398
399 std::vector<PermissionListState> permList;
400 for (const auto& permission : permissions) {
401 HILOG_DEBUG("%{public}s. permission: %{public}s.", __func__, permission.c_str());
402 PermissionListState permState;
403 permState.permissionName = permission;
404 permState.state = -1;
405 permList.emplace_back(permState);
406 }
407 HILOG_DEBUG("%{public}s. permList size: %{public}zu, permissions size: %{public}zu.",
408 __func__, permList.size(), permissions.size());
409
410 auto ret = AccessTokenKit::GetSelfPermissionsState(permList);
411 if (permList.size() != permissions.size()) {
412 HILOG_ERROR("%{public}s. Returned permList size: %{public}zu.", __func__, permList.size());
413 return;
414 }
415
416 std::vector<int> permissionsState;
417 for (const auto& permState : permList) {
418 HILOG_DEBUG("%{public}s. permissions: %{public}s. permissionsState: %{public}u",
419 __func__, permState.permissionName.c_str(), permState.state);
420 permissionsState.emplace_back(permState.state);
421 }
422 HILOG_DEBUG("%{public}s. permissions size: %{public}zu. permissionsState size: %{public}zu",
423 __func__, permissions.size(), permissionsState.size());
424
425 if (ret == TypePermissionOper::DYNAMIC_OPER) {
426 StartGrantExtension(engine, permissions, permissionsState, requestCode, std::move(task));
427 } else {
428 HILOG_DEBUG("%{public}s. No dynamic popup required.", __func__);
429 if (task) {
430 task(permissions, permissionsState);
431 }
432 }
433 }
434
StartGrantExtension(NativeEngine & engine,const std::vector<std::string> & permissions,const std::vector<int> & permissionsState,int requestCode,PermissionRequestTask && task)435 void AbilityContextImpl::StartGrantExtension(NativeEngine& engine, const std::vector<std::string>& permissions,
436 const std::vector<int>& permissionsState, int requestCode, PermissionRequestTask &&task)
437 {
438 AAFwk::Want want;
439 want.SetElementName(GRANT_ABILITY_BUNDLE_NAME, GRANT_ABILITY_ABILITY_NAME);
440 want.SetParam(PERMISSION_KEY, permissions);
441 want.SetParam(STATE_KEY, permissionsState);
442 want.SetParam(TOKEN_KEY, token_);
443
444 {
445 std::lock_guard<std::mutex> lock(mutex_);
446 permissionRequestCallbacks.insert(make_pair(requestCode, std::move(task)));
447 }
448 auto resultTask =
449 [&engine, requestCode](const std::vector<std::string> &permissions, const std::vector<int> &grantResults) {
450 auto retCB = new ResultCallback();
451 retCB->permissions_ = permissions;
452 retCB->grantResults_ = grantResults;
453 retCB->requestCode_ = requestCode;
454
455 auto loop = engine.GetUVLoop();
456 if (loop == nullptr) {
457 HILOG_ERROR("StartGrantExtension, fail to get uv loop.");
458 return;
459 }
460 auto work = new uv_work_t;
461 work->data = static_cast<void *>(retCB);
462 int rev = uv_queue_work(
463 loop,
464 work,
465 [](uv_work_t *work) {},
466 ResultCallbackJSThreadWorker);
467 if (rev != 0) {
468 if (retCB != nullptr) {
469 delete retCB;
470 retCB = nullptr;
471 }
472 if (work != nullptr) {
473 delete work;
474 work = nullptr;
475 }
476 }
477 };
478
479 sptr<IRemoteObject> remoteObject = new AuthorizationResult(std::move(resultTask));
480 want.SetParam(CALLBACK_KEY, remoteObject);
481
482 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, -1);
483 HILOG_DEBUG("%{public}s. End calling StartExtension. ret=%{public}d", __func__, err);
484 }
485
ResultCallbackJSThreadWorker(uv_work_t * work,int status)486 void AbilityContextImpl::ResultCallbackJSThreadWorker(uv_work_t* work, int status)
487 {
488 HILOG_DEBUG("ResultCallbackJSThreadWorker is called.");
489 if (work == nullptr) {
490 HILOG_ERROR("ResultCallbackJSThreadWorker, uv_queue_work input work is nullptr");
491 return;
492 }
493 ResultCallback* retCB = static_cast<ResultCallback *>(work->data);
494 if (retCB == nullptr) {
495 HILOG_ERROR("ResultCallbackJSThreadWorker, retCB is nullptr");
496 delete work;
497 work = nullptr;
498 return;
499 }
500
501 std::lock_guard<std::mutex> lock(mutex_);
502 auto requestCode = retCB->requestCode_;
503 auto iter = permissionRequestCallbacks.find(requestCode);
504 if (iter != permissionRequestCallbacks.end() && iter->second) {
505 auto task = iter->second;
506 if (task) {
507 HILOG_DEBUG("%{public}s. calling js task.", __func__);
508 task(retCB->permissions_, retCB->grantResults_);
509 }
510 permissionRequestCallbacks.erase(iter);
511 }
512
513 delete retCB;
514 retCB = nullptr;
515 delete work;
516 work = nullptr;
517 }
518
RestoreWindowStage(NativeEngine & engine,NativeValue * contentStorage)519 ErrCode AbilityContextImpl::RestoreWindowStage(NativeEngine& engine, NativeValue* contentStorage)
520 {
521 HILOG_INFO("%{public}s begin.", __func__);
522 contentStorage_ = std::unique_ptr<NativeReference>(engine.CreateReference(contentStorage, 1));
523 return ERR_OK;
524 }
525
StartAbilityByCall(const AAFwk::Want & want,const std::shared_ptr<CallerCallBack> & callback)526 ErrCode AbilityContextImpl::StartAbilityByCall(
527 const AAFwk::Want& want, const std::shared_ptr<CallerCallBack> &callback)
528 {
529 if (localCallContainer_ == nullptr) {
530 localCallContainer_ = new (std::nothrow) LocalCallContainer();
531 if (localCallContainer_ == nullptr) {
532 HILOG_ERROR("%{public}s failed, localCallContainer_ is nullptr.", __func__);
533 return ERR_INVALID_VALUE;
534 }
535 }
536 return localCallContainer_->StartAbilityByCallInner(want, callback, token_);
537 }
538
ReleaseCall(const std::shared_ptr<CallerCallBack> & callback)539 ErrCode AbilityContextImpl::ReleaseCall(const std::shared_ptr<CallerCallBack> &callback)
540 {
541 HILOG_DEBUG("AbilityContextImpl::Release begin.");
542 if (localCallContainer_ == nullptr) {
543 HILOG_ERROR("%{public}s failed, localCallContainer_ is nullptr.", __func__);
544 return ERR_INVALID_VALUE;
545 }
546 HILOG_DEBUG("AbilityContextImpl::Release end.");
547 return localCallContainer_->ReleaseCall(callback);
548 }
549
RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)550 void AbilityContextImpl::RegisterAbilityCallback(std::weak_ptr<AppExecFwk::IAbilityCallback> abilityCallback)
551 {
552 HILOG_INFO("%{public}s called.", __func__);
553 abilityCallback_ = abilityCallback;
554 }
555
GetMissionId(int32_t & missionId)556 ErrCode AbilityContextImpl::GetMissionId(int32_t &missionId)
557 {
558 HILOG_DEBUG("%{public}s begin.", __func__);
559 if (missionId_ != -1) {
560 missionId = missionId_;
561 return ERR_OK;
562 }
563
564 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token_, missionId);
565 if (err != ERR_OK) {
566 HILOG_ERROR("AbilityContextImpl::GetMissionId is failed %{public}d", err);
567 } else {
568 missionId_ = missionId;
569 HILOG_DEBUG("%{public}s success, missionId is %{public}d.", __func__, missionId_);
570 }
571 return err;
572 }
573
RequestDialogService(NativeEngine & engine,AAFwk::Want & want,RequestDialogResultTask && task)574 ErrCode AbilityContextImpl::RequestDialogService(NativeEngine &engine,
575 AAFwk::Want &want, RequestDialogResultTask &&task)
576 {
577 want.SetParam(RequestConstants::REQUEST_TOKEN_KEY, token_);
578
579 auto resultTask =
580 [&engine, outTask = std::move(task)](int32_t resultCode) {
581 auto retData = new RequestResult();
582 retData->resultCode = resultCode;
583 retData->task = std::move(outTask);
584
585 auto loop = engine.GetUVLoop();
586 if (loop == nullptr) {
587 HILOG_ERROR("RequestDialogService, fail to get uv loop.");
588 return;
589 }
590 auto work = new uv_work_t;
591 work->data = static_cast<void*>(retData);
592 int rev = uv_queue_work(
593 loop,
594 work,
595 [](uv_work_t* work) {},
596 RequestDialogResultJSThreadWorker);
597 if (rev != 0) {
598 if (retData != nullptr) {
599 delete retData;
600 retData = nullptr;
601 }
602 if (work != nullptr) {
603 delete work;
604 work = nullptr;
605 }
606 }
607 };
608
609 sptr<IRemoteObject> remoteObject = new DialogRequestCallbackImpl(std::move(resultTask));
610 want.SetParam(RequestConstants::REQUEST_CALLBACK_KEY, remoteObject);
611
612 auto err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, -1);
613 HILOG_DEBUG("RequestDialogService ret=%{public}d", static_cast<int32_t>(err));
614 return err;
615 }
616
RequestDialogResultJSThreadWorker(uv_work_t * work,int status)617 void AbilityContextImpl::RequestDialogResultJSThreadWorker(uv_work_t* work, int status)
618 {
619 HILOG_DEBUG("RequestDialogResultJSThreadWorker is called.");
620 if (work == nullptr) {
621 HILOG_ERROR("RequestDialogResultJSThreadWorker, uv_queue_work input work is nullptr");
622 return;
623 }
624 RequestResult* retCB = static_cast<RequestResult*>(work->data);
625 if (retCB == nullptr) {
626 HILOG_ERROR("RequestDialogResultJSThreadWorker, retCB is nullptr");
627 delete work;
628 work = nullptr;
629 return;
630 }
631
632 if (retCB->task) {
633 retCB->task(retCB->resultCode);
634 }
635
636 delete retCB;
637 retCB = nullptr;
638 delete work;
639 work = nullptr;
640 }
641
642 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const std::string & label)643 ErrCode AbilityContextImpl::SetMissionLabel(const std::string &label)
644 {
645 HILOG_INFO("%{public}s begin. label = %{public}s", __func__, label.c_str());
646 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionLabel(token_, label);
647 if (err != ERR_OK) {
648 HILOG_ERROR("AbilityContextImpl::SetMissionLabel is failed %{public}d", err);
649 } else {
650 HILOG_INFO("AbilityContextImpl::SetMissionLabel success.");
651 auto abilityCallback = abilityCallback_.lock();
652 if (abilityCallback) {
653 abilityCallback->SetMissionLabel(label);
654 }
655 }
656 return err;
657 }
658
SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> & icon)659 ErrCode AbilityContextImpl::SetMissionIcon(const std::shared_ptr<OHOS::Media::PixelMap> &icon)
660 {
661 HILOG_INFO("%{public}s begin.", __func__);
662 ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->SetMissionIcon(token_, icon);
663 if (err != ERR_OK) {
664 HILOG_ERROR("AbilityContextImpl::SetMissionIcon is failed %{public}d", err);
665 } else {
666 HILOG_INFO("AbilityContextImpl::SetMissionIcon success.");
667 auto abilityCallback = abilityCallback_.lock();
668 if (abilityCallback) {
669 abilityCallback->SetMissionIcon(icon);
670 }
671 }
672 return err;
673 }
674
GetCurrentWindowMode()675 int AbilityContextImpl::GetCurrentWindowMode()
676 {
677 HILOG_INFO("%{public}s called.", __func__);
678 auto abilityCallback = abilityCallback_.lock();
679 if (abilityCallback == nullptr) {
680 return AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED;
681 }
682 return abilityCallback->GetCurrentWindowMode();
683 }
684 #endif
685 } // namespace AbilityRuntime
686 } // namespace OHOS
687