• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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