1 /*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "fa_ability_thread.h"
17
18 #include <chrono>
19 #include <functional>
20 #include <thread>
21
22 #include "ability_context_impl.h"
23 #include "ability_impl.h"
24 #include "ability_impl_factory.h"
25 #include "ability_loader.h"
26 #include "abs_shared_result_set.h"
27 #include "application_impl.h"
28 #include "context_deal.h"
29 #include "data_ability_predicates.h"
30 #include "dataobs_mgr_client.h"
31 #ifdef WITH_DLP
32 #include "dlp_file_kits.h"
33 #endif // WITH_DLP
34 #include "freeze_util.h"
35 #include "hilog_tag_wrapper.h"
36 #include "hitrace_meter.h"
37 #include "ohos_application.h"
38 #ifdef SUPPORT_GRAPHICS
39 #include "page_ability_impl.h"
40 #endif
41 #include "time_util.h"
42 #include "ui_extension_utils.h"
43 #include "values_bucket.h"
44
45 namespace OHOS {
46 using AbilityRuntime::FreezeUtil;
47 namespace AbilityRuntime {
48 using namespace std::chrono_literals;
49 using AbilityManagerClient = OHOS::AAFwk::AbilityManagerClient;
50 using DataObsMgrClient = OHOS::AAFwk::DataObsMgrClient;
51 namespace {
52 constexpr static char ACE_SERVICE_ABILITY_NAME[] = "AceServiceAbility";
53 constexpr static char ACE_DATA_ABILITY_NAME[] = "AceDataAbility";
54 #ifdef SUPPORT_GRAPHICS
55 constexpr static char ABILITY_NAME[] = "Ability";
56 constexpr static char ACE_ABILITY_NAME[] = "AceAbility";
57 constexpr static char ACE_FORM_ABILITY_NAME[] = "AceFormAbility";
58 constexpr static char FORM_EXTENSION[] = "FormExtension";
59 constexpr static char UI_EXTENSION[] = "UIExtensionAbility";
60 constexpr static char CUSTOM_EXTENSION[] = "ExtensionAbility";
61 constexpr static char MEDIA_CONTROL_EXTENSION[] = "MediaControlExtensionAbility";
62 constexpr static char USER_AUTH_EXTENSION[] = "UserAuthExtensionAbility";
63 constexpr static char ACTION_EXTENSION[] = "ActionExtensionAbility";
64 constexpr static char SHARE_EXTENSION[] = "ShareExtensionAbility";
65 #endif
66 constexpr static char BASE_SERVICE_EXTENSION[] = "ServiceExtension";
67 constexpr static char BASE_DRIVER_EXTENSION[] = "DriverExtension";
68 constexpr static char STATIC_SUBSCRIBER_EXTENSION[] = "StaticSubscriberExtension";
69 constexpr static char DATA_SHARE_EXT_ABILITY[] = "DataShareExtAbility";
70 constexpr static char WORK_SCHEDULER_EXTENSION[] = "WorkSchedulerExtension";
71 constexpr static char ACCESSIBILITY_EXTENSION[] = "AccessibilityExtension";
72 constexpr static char WALLPAPER_EXTENSION[] = "WallpaperExtension";
73 constexpr static char FILEACCESS_EXT_ABILITY[] = "FileAccessExtension";
74 constexpr static char ENTERPRISE_ADMIN_EXTENSION[] = "EnterpriseAdminExtension";
75 constexpr static char INPUTMETHOD_EXTENSION[] = "InputMethodExtensionAbility";
76 constexpr static char APP_ACCOUNT_AUTHORIZATION_EXTENSION[] = "AppAccountAuthorizationExtension";
77 #ifdef WITH_DLP
78 constexpr static char DLP_PARAMS_SANDBOX[] = "ohos.dlp.params.sandbox";
79 #endif // WITH_DLP
80 const int32_t PREPARE_TO_TERMINATE_TIMEOUT_MILLISECONDS = 3000;
81 }
82
FAAbilityThread()83 FAAbilityThread::FAAbilityThread() : abilityImpl_(nullptr), currentAbility_(nullptr) {}
84
~FAAbilityThread()85 FAAbilityThread::~FAAbilityThread()
86 {
87 if (isExtension_) {
88 if (currentExtension_) {
89 currentExtension_.reset();
90 }
91 } else {
92 if (currentAbility_) {
93 currentAbility_->DetachBaseContext();
94 currentAbility_.reset();
95 }
96 }
97
98 DelayedSingleton<AppExecFwk::AbilityImplFactory>::DestroyInstance();
99 }
100
CreateAbilityName(const std::shared_ptr<AppExecFwk::AbilityLocalRecord> & abilityRecord,const std::shared_ptr<AppExecFwk::OHOSApplication> & application)101 std::string FAAbilityThread::CreateAbilityName(const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
102 const std::shared_ptr<AppExecFwk::OHOSApplication> &application)
103 {
104 std::string abilityName;
105 if (abilityRecord == nullptr || application == nullptr) {
106 TAG_LOGE(AAFwkTag::FA, "abilityRecord or application is nullptr");
107 return abilityName;
108 }
109
110 std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo = abilityRecord->GetAbilityInfo();
111 if (abilityInfo == nullptr) {
112 TAG_LOGE(AAFwkTag::FA, "null abilityInfo");
113 return abilityName;
114 }
115
116 if (abilityInfo->isNativeAbility) {
117 TAG_LOGD(AAFwkTag::FA, "AbilityInfo name is %{public}s", abilityInfo->name.c_str());
118 return abilityInfo->name;
119 }
120 #ifdef SUPPORT_GRAPHICS
121 if (abilityInfo->type == AppExecFwk::AbilityType::PAGE) {
122 if (abilityInfo->isStageBasedModel) {
123 abilityName = ABILITY_NAME;
124 } else {
125 abilityName = ACE_ABILITY_NAME;
126 }
127 } else if (abilityInfo->type == AppExecFwk::AbilityType::SERVICE) {
128 #else
129 if (abilityInfo->type == AppExecFwk::AbilityType::SERVICE) {
130 #endif
131 #ifdef SUPPORT_GRAPHICS
132 if (abilityInfo->formEnabled == true) {
133 abilityName = ACE_FORM_ABILITY_NAME;
134 } else {
135 #endif
136 abilityName = ACE_SERVICE_ABILITY_NAME;
137 #ifdef SUPPORT_GRAPHICS
138 }
139 #endif
140 } else if (abilityInfo->type == AppExecFwk::AbilityType::DATA) {
141 abilityName = ACE_DATA_ABILITY_NAME;
142 } else if (abilityInfo->type == AppExecFwk::AbilityType::EXTENSION) {
143 CreateExtensionAbilityName(application, abilityInfo, abilityName);
144 } else {
145 abilityName = abilityInfo->name;
146 }
147
148 TAG_LOGD(AAFwkTag::FA, "ability name is %{public}s", abilityName.c_str());
149 return abilityName;
150 }
151
152 void FAAbilityThread::CreateExtensionAbilityName(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
153 const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo, std::string &abilityName)
154 {
155 application->GetExtensionNameByType(static_cast<int32_t>(abilityInfo->extensionAbilityType), abilityName);
156 if (abilityName.length() > 0) {
157 TAG_LOGD(AAFwkTag::FA, "extension name: %{public}s", abilityName.c_str());
158 return;
159 }
160 abilityName = BASE_SERVICE_EXTENSION;
161 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::STATICSUBSCRIBER) {
162 abilityName = STATIC_SUBSCRIBER_EXTENSION;
163 }
164 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::DRIVER) {
165 abilityName = BASE_DRIVER_EXTENSION;
166 }
167 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::DATASHARE) {
168 abilityName = DATA_SHARE_EXT_ABILITY;
169 }
170 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::WORK_SCHEDULER) {
171 abilityName = WORK_SCHEDULER_EXTENSION;
172 }
173 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::ACCESSIBILITY) {
174 abilityName = ACCESSIBILITY_EXTENSION;
175 }
176 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::WALLPAPER) {
177 abilityName = WALLPAPER_EXTENSION;
178 }
179 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION) {
180 abilityName = FILEACCESS_EXT_ABILITY;
181 }
182 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::ENTERPRISE_ADMIN) {
183 abilityName = ENTERPRISE_ADMIN_EXTENSION;
184 }
185 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::INPUTMETHOD) {
186 abilityName = INPUTMETHOD_EXTENSION;
187 }
188 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION) {
189 abilityName = APP_ACCOUNT_AUTHORIZATION_EXTENSION;
190 }
191 CreateExtensionAbilityNameSupportGraphics(abilityInfo, abilityName);
192 TAG_LOGD(AAFwkTag::FA, "extension abilityName: %{public}s", abilityName.c_str());
193 }
194
195 void FAAbilityThread::CreateExtensionAbilityNameSupportGraphics(
196 const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo,
197 std::string &abilityName)
198 {
199 #ifdef SUPPORT_GRAPHICS
200 if (abilityInfo->formEnabled || abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::FORM) {
201 abilityName = FORM_EXTENSION;
202 }
203 #endif
204 if (AAFwk::UIExtensionUtils::IsUIExtension(abilityInfo->extensionAbilityType)) {
205 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::SHARE) {
206 abilityName = SHARE_EXTENSION;
207 } else if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::ACTION) {
208 abilityName = ACTION_EXTENSION;
209 } else {
210 abilityName = UI_EXTENSION;
211 }
212 }
213 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::SYSDIALOG_USERAUTH) {
214 abilityName = USER_AUTH_EXTENSION;
215 }
216 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::SYSPICKER_MEDIACONTROL) {
217 abilityName = MEDIA_CONTROL_EXTENSION;
218 }
219 if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::UNSPECIFIED &&
220 abilityInfo->type == AppExecFwk::AbilityType::EXTENSION) {
221 abilityName = abilityInfo->extensionTypeName + CUSTOM_EXTENSION;
222 }
223 }
224
225 std::shared_ptr<AppExecFwk::ContextDeal> FAAbilityThread::CreateAndInitContextDeal(
226 const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
227 const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
228 const std::shared_ptr<AppExecFwk::AbilityContext> &abilityObject)
229 {
230 TAG_LOGD(AAFwkTag::FA, "begin");
231 std::shared_ptr<AppExecFwk::ContextDeal> contextDeal = nullptr;
232 if ((application == nullptr) || (abilityRecord == nullptr) || (abilityObject == nullptr)) {
233 TAG_LOGE(AAFwkTag::FA, "application or abilityRecord or abilityObject is nullptr");
234 return contextDeal;
235 }
236
237 contextDeal = std::make_shared<AppExecFwk::ContextDeal>();
238 contextDeal->SetAbilityInfo(abilityRecord->GetAbilityInfo());
239 contextDeal->SetApplicationInfo(application->GetApplicationInfo());
240 abilityObject->SetProcessInfo(application->GetProcessInfo());
241
242 std::shared_ptr<AppExecFwk::Context> tmpContext = application->GetApplicationContext();
243 contextDeal->SetApplicationContext(tmpContext);
244
245 contextDeal->SetBundleCodePath(abilityRecord->GetAbilityInfo()->codePath);
246 contextDeal->SetContext(abilityObject);
247 return contextDeal;
248 }
249
250 void FAAbilityThread::Attach(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
251 const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
252 const std::shared_ptr<AppExecFwk::EventRunner> &mainRunner, const std::shared_ptr<Context> &stageContext)
253 {
254 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
255 if ((application == nullptr) || (abilityRecord == nullptr) || (mainRunner == nullptr)) {
256 TAG_LOGE(AAFwkTag::FA, "application or abilityRecord or mainRunner is nullptr");
257 return;
258 }
259 InitExtensionFlag(abilityRecord);
260 if (isExtension_) {
261 AttachExtension(application, abilityRecord, mainRunner);
262 TAG_LOGD(AAFwkTag::FA, "Execute AttachExtension");
263 return;
264 }
265
266 // 1.new AbilityHandler
267 std::string abilityName = CreateAbilityName(abilityRecord, application);
268 if (abilityName.empty()) {
269 TAG_LOGE(AAFwkTag::FA, "abilityName is empty");
270 return;
271 }
272 TAG_LOGD(AAFwkTag::FA, "begin ability: %{public}s", abilityRecord->GetAbilityInfo()->name.c_str());
273 abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(mainRunner);
274 if (abilityHandler_ == nullptr) {
275 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
276 return;
277 }
278
279 // 2.new ability
280 auto ability = AppExecFwk::AbilityLoader::GetInstance().GetAbilityByName(abilityName);
281 if (ability == nullptr) {
282 TAG_LOGE(AAFwkTag::FA, "null ability");
283 return;
284 }
285 currentAbility_.reset(ability);
286 token_ = abilityRecord->GetToken();
287 abilityRecord->SetEventHandler(abilityHandler_);
288 abilityRecord->SetEventRunner(mainRunner);
289 abilityRecord->SetAbilityThread(this);
290 std::shared_ptr<AppExecFwk::AbilityContext> abilityObject = currentAbility_;
291 std::shared_ptr<AppExecFwk::ContextDeal> contextDeal =
292 CreateAndInitContextDeal(application, abilityRecord, abilityObject);
293 ability->AttachBaseContext(contextDeal);
294 // new hap requires
295 ability->AttachAbilityContext(
296 BuildAbilityContext(abilityRecord->GetAbilityInfo(), application, token_, stageContext));
297
298 AttachInner(application, abilityRecord, stageContext);
299 }
300
301 void FAAbilityThread::AttachInner(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
302 const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
303 const std::shared_ptr<Context> &stageContext)
304 {
305 // 3.new abilityImpl
306 abilityImpl_ = DelayedSingleton<AppExecFwk::AbilityImplFactory>::GetInstance()->MakeAbilityImplObject(
307 abilityRecord->GetAbilityInfo());
308 if (abilityImpl_ == nullptr) {
309 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
310 return;
311 }
312 abilityImpl_->Init(application, abilityRecord, currentAbility_, abilityHandler_, token_);
313 // 4. ability attach : ipc
314 TAG_LOGD(AAFwkTag::FA, "attach ability");
315 FreezeUtil::LifecycleFlow flow = { token_, FreezeUtil::TimeoutState::LOAD };
316 std::string entry = "AbilityThread::Attach; the load lifecycle.";
317 FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
318 ErrCode err = AbilityManagerClient::GetInstance()->AttachAbilityThread(this, token_);
319 if (err != ERR_OK) {
320 TAG_LOGE(AAFwkTag::FA, "err = %{public}d", err);
321 return;
322 }
323 FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
324 FreezeUtil::GetInstance().DeleteAppLifecycleEvent(0);
325 }
326
327 void FAAbilityThread::AttachExtension(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
328 const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
329 const std::shared_ptr<AppExecFwk::EventRunner> &mainRunner)
330 {
331 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
332 if ((application == nullptr) || (abilityRecord == nullptr) || (mainRunner == nullptr)) {
333 TAG_LOGE(AAFwkTag::FA, "application or abilityRecord or mainRunner is nullptr");
334 return;
335 }
336
337 // 1.new AbilityHandler
338 std::string abilityName = CreateAbilityName(abilityRecord, application);
339 if (abilityName.empty()) {
340 TAG_LOGE(AAFwkTag::FA, "empty abilityName");
341 return;
342 }
343 TAG_LOGD(AAFwkTag::FA, "extension: %{public}s", abilityRecord->GetAbilityInfo()->name.c_str());
344 abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(mainRunner);
345 if (abilityHandler_ == nullptr) {
346 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
347 return;
348 }
349
350 // 2.new ability
351 auto extension = AppExecFwk::AbilityLoader::GetInstance().GetExtensionByName(abilityName);
352 if (extension == nullptr) {
353 TAG_LOGE(AAFwkTag::FA, "extension is nullptr");
354 return;
355 }
356
357 currentExtension_.reset(extension);
358 token_ = abilityRecord->GetToken();
359 abilityRecord->SetEventHandler(abilityHandler_);
360 abilityRecord->SetEventRunner(mainRunner);
361 abilityRecord->SetAbilityThread(this);
362 extensionImpl_ = std::make_shared<ExtensionImpl>();
363 if (extensionImpl_ == nullptr) {
364 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
365 return;
366 }
367 // 3.new init
368 extensionImpl_->Init(application, abilityRecord, currentExtension_, abilityHandler_, token_);
369 // 4.ipc attach init
370 ErrCode err = AbilityManagerClient::GetInstance()->AttachAbilityThread(this, token_);
371 if (err != ERR_OK) {
372 TAG_LOGE(AAFwkTag::FA, "err = %{public}d", err);
373 }
374 }
375
376 void FAAbilityThread::AttachExtension(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
377 const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord)
378 {
379 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
380 TAG_LOGD(AAFwkTag::FA, "begin");
381 if ((application == nullptr) || (abilityRecord == nullptr)) {
382 TAG_LOGE(AAFwkTag::FA, "application or abilityRecord is nullptr");
383 return;
384 }
385
386 // 1.new AbilityHandler
387 std::string abilityName = CreateAbilityName(abilityRecord, application);
388 runner_ = AppExecFwk::EventRunner::Create(abilityName);
389 if (runner_ == nullptr) {
390 TAG_LOGE(AAFwkTag::FA, "runner is nullptr");
391 return;
392 }
393 abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(runner_);
394 if (abilityHandler_ == nullptr) {
395 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
396 return;
397 }
398
399 // 2.new ability
400 auto extension = AppExecFwk::AbilityLoader::GetInstance().GetExtensionByName(abilityName);
401 if (extension == nullptr) {
402 TAG_LOGE(AAFwkTag::FA, "extension is nullptr");
403 return;
404 }
405
406 currentExtension_.reset(extension);
407 token_ = abilityRecord->GetToken();
408 abilityRecord->SetEventHandler(abilityHandler_);
409 abilityRecord->SetEventRunner(runner_);
410 abilityRecord->SetAbilityThread(this);
411 extensionImpl_ = std::make_shared<ExtensionImpl>();
412 if (extensionImpl_ == nullptr) {
413 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
414 return;
415 }
416 // 3.new init
417 extensionImpl_->Init(application, abilityRecord, currentExtension_, abilityHandler_, token_);
418 // 4.ipc attach init
419 ErrCode err = AbilityManagerClient::GetInstance()->AttachAbilityThread(this, token_);
420 if (err != ERR_OK) {
421 TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
422 return;
423 }
424 }
425
426 void FAAbilityThread::Attach(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
427 const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord, const std::shared_ptr<Context> &stageContext)
428 {
429 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
430 TAG_LOGD(AAFwkTag::FA, "begin");
431 if ((application == nullptr) || (abilityRecord == nullptr)) {
432 TAG_LOGE(AAFwkTag::FA, "application or abilityRecord is nullptr");
433 return;
434 }
435 InitExtensionFlag(abilityRecord);
436 if (isExtension_) {
437 AttachExtension(application, abilityRecord);
438 TAG_LOGD(AAFwkTag::FA, "Execute AttachExtension");
439 return;
440 }
441
442 // 1.new AbilityHandler
443 std::string abilityName = CreateAbilityName(abilityRecord, application);
444 runner_ = AppExecFwk::EventRunner::Create(abilityName);
445 if (runner_ == nullptr) {
446 TAG_LOGE(AAFwkTag::FA, "null runner_");
447 return;
448 }
449 abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(runner_);
450 if (abilityHandler_ == nullptr) {
451 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
452 return;
453 }
454
455 // 2.new ability
456 auto ability = AppExecFwk::AbilityLoader::GetInstance().GetAbilityByName(abilityName);
457 if (ability == nullptr) {
458 TAG_LOGE(AAFwkTag::FA, "null ability");
459 return;
460 }
461 currentAbility_.reset(ability);
462 token_ = abilityRecord->GetToken();
463 abilityRecord->SetEventHandler(abilityHandler_);
464 abilityRecord->SetEventRunner(runner_);
465 abilityRecord->SetAbilityThread(this);
466 std::shared_ptr<AppExecFwk::AbilityContext> abilityObject = currentAbility_;
467 std::shared_ptr<AppExecFwk::ContextDeal> contextDeal =
468 CreateAndInitContextDeal(application, abilityRecord, abilityObject);
469 ability->AttachBaseContext(contextDeal);
470 // new hap requires
471 ability->AttachAbilityContext(
472 BuildAbilityContext(abilityRecord->GetAbilityInfo(), application, token_, stageContext));
473
474 AttachInner(application, abilityRecord, stageContext);
475 }
476
477 void FAAbilityThread::HandleAbilityTransaction(
478 const Want &want, const LifeCycleStateInfo &lifeCycleStateInfo, sptr<AAFwk::SessionInfo> sessionInfo)
479 {
480 std::string connector = "##";
481 std::string traceName = __PRETTY_FUNCTION__ + connector + want.GetElement().GetAbilityName();
482 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, traceName);
483 TAG_LOGD(AAFwkTag::FA, "Lifecycle: name is %{public}s.", want.GetElement().GetAbilityName().c_str());
484 if (abilityImpl_ == nullptr) {
485 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
486 return;
487 }
488 std::string methodName = "HandleAbilityTransaction";
489 AddLifecycleEvent(lifeCycleStateInfo.state, methodName);
490
491 abilityImpl_->SetCallingContext(lifeCycleStateInfo.caller.deviceId, lifeCycleStateInfo.caller.bundleName,
492 lifeCycleStateInfo.caller.abilityName, lifeCycleStateInfo.caller.moduleName);
493 abilityImpl_->HandleAbilityTransaction(want, lifeCycleStateInfo, sessionInfo);
494 }
495
496 void FAAbilityThread::AddLifecycleEvent(uint32_t state, std::string &methodName) const
497 {
498 if (!isUIAbility_) {
499 return;
500 }
501 if (state == AAFwk::ABILITY_STATE_FOREGROUND_NEW) {
502 FreezeUtil::LifecycleFlow flow = { token_, FreezeUtil::TimeoutState::FOREGROUND };
503 std::string entry = "AbilityThread::" + methodName + "; the foreground lifecycle.";
504 FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
505 }
506 if (state == AAFwk::ABILITY_STATE_BACKGROUND_NEW) {
507 FreezeUtil::LifecycleFlow flow = { token_, FreezeUtil::TimeoutState::BACKGROUND };
508 std::string entry = "AbilityThread::" + methodName + "; the background lifecycle.";
509 FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
510 }
511 }
512
513 void FAAbilityThread::HandleShareData(const int32_t &uniqueId)
514 {
515 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
516 if (abilityImpl_ == nullptr) {
517 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
518 return;
519 }
520 abilityImpl_->HandleShareData(uniqueId);
521 }
522
523 void FAAbilityThread::HandleExtensionTransaction(
524 const Want &want, const LifeCycleStateInfo &lifeCycleStateInfo, sptr<AAFwk::SessionInfo> sessionInfo)
525 {
526 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
527 TAG_LOGD(AAFwkTag::FA, "begin");
528 if (extensionImpl_ == nullptr) {
529 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
530 return;
531 }
532 extensionImpl_->HandleExtensionTransaction(want, lifeCycleStateInfo, sessionInfo);
533 }
534
535 void FAAbilityThread::HandleConnectAbility(const Want &want)
536 {
537 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
538 TAG_LOGD(AAFwkTag::FA, "begin");
539 if (abilityImpl_ == nullptr) {
540 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
541 return;
542 }
543
544 sptr<IRemoteObject> service = abilityImpl_->ConnectAbility(want);
545 ErrCode err = AbilityManagerClient::GetInstance()->ScheduleConnectAbilityDone(token_, service);
546 if (err != ERR_OK) {
547 TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
548 }
549 }
550
551 void FAAbilityThread::HandleDisconnectAbility(const Want &want)
552 {
553 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
554 TAG_LOGD(AAFwkTag::FA, "begin");
555 if (abilityImpl_ == nullptr) {
556 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
557 return;
558 }
559
560 abilityImpl_->DisconnectAbility(want);
561 ErrCode err = AbilityManagerClient::GetInstance()->ScheduleDisconnectAbilityDone(token_);
562 if (err != ERR_OK) {
563 TAG_LOGE(AAFwkTag::FA, "err = %{public}d", err);
564 }
565 }
566
567 void FAAbilityThread::HandleCommandAbility(const Want &want, bool restart, int32_t startId)
568 {
569 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
570 TAG_LOGD(AAFwkTag::FA, "begin");
571 if (abilityImpl_ == nullptr) {
572 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
573 return;
574 }
575 abilityImpl_->CommandAbility(want, restart, startId);
576 ErrCode err = AbilityManagerClient::GetInstance()->ScheduleCommandAbilityDone(token_);
577 if (err != ERR_OK) {
578 TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
579 }
580 }
581
582 void FAAbilityThread::HandleConnectExtension(const Want &want)
583 {
584 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
585 TAG_LOGD(AAFwkTag::FA, "begin");
586 if (extensionImpl_ == nullptr) {
587 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
588 return;
589 }
590 bool isAsyncCallback = false;
591 sptr<IRemoteObject> service = extensionImpl_->ConnectExtension(want, isAsyncCallback);
592 if (!isAsyncCallback) {
593 extensionImpl_->ConnectExtensionCallback(service);
594 }
595 }
596
597 void FAAbilityThread::HandleDisconnectExtension(const Want &want)
598 {
599 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
600 TAG_LOGD(AAFwkTag::FA, "begin");
601 if (extensionImpl_ == nullptr) {
602 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
603 return;
604 }
605
606 bool isAsyncCallback = false;
607 extensionImpl_->DisconnectExtension(want, isAsyncCallback);
608 if (!isAsyncCallback) {
609 extensionImpl_->DisconnectExtensionCallback();
610 }
611 }
612
613 void FAAbilityThread::HandleCommandExtension(const Want &want, bool restart, int32_t startId)
614 {
615 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
616 TAG_LOGD(AAFwkTag::FA, "begin");
617 if (extensionImpl_ == nullptr) {
618 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
619 return;
620 }
621 extensionImpl_->CommandExtension(want, restart, startId);
622 ErrCode err = AbilityManagerClient::GetInstance()->ScheduleCommandAbilityDone(token_);
623 if (err != ERR_OK) {
624 TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
625 }
626 }
627
628 void FAAbilityThread::HandleCommandExtensionWindow(
629 const Want &want, const sptr<AAFwk::SessionInfo> &sessionInfo, AAFwk::WindowCommand winCmd)
630 {
631 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
632 TAG_LOGD(AAFwkTag::FA, "begin");
633 if (extensionImpl_ == nullptr) {
634 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
635 return;
636 }
637 extensionImpl_->CommandExtensionWindow(want, sessionInfo, winCmd);
638 }
639
640 void FAAbilityThread::HandleRestoreAbilityState(const AppExecFwk::PacMap &state)
641 {
642 TAG_LOGD(AAFwkTag::FA, "begin");
643 if (abilityImpl_ == nullptr) {
644 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
645 return;
646 }
647
648 abilityImpl_->DispatchRestoreAbilityState(state);
649 }
650
651 void FAAbilityThread::ScheduleSaveAbilityState()
652 {
653 TAG_LOGD(AAFwkTag::FA, "begin");
654 if (abilityImpl_ == nullptr) {
655 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
656 return;
657 }
658
659 abilityImpl_->DispatchSaveAbilityState();
660 }
661
662 void FAAbilityThread::ScheduleRestoreAbilityState(const AppExecFwk::PacMap &state)
663 {
664 TAG_LOGD(AAFwkTag::FA, "begin");
665 if (abilityImpl_ == nullptr) {
666 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
667 return;
668 }
669 abilityImpl_->DispatchRestoreAbilityState(state);
670 }
671
672 void FAAbilityThread::ScheduleUpdateConfiguration(const AppExecFwk::Configuration &config)
673 {
674 TAG_LOGD(AAFwkTag::FA, "begin");
675 if (abilityHandler_ == nullptr) {
676 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
677 return;
678 }
679 wptr<FAAbilityThread> weak = this;
680 auto task = [weak, config]() {
681 auto abilityThread = weak.promote();
682 if (abilityThread == nullptr) {
683 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
684 return;
685 }
686
687 if (abilityThread->isExtension_) {
688 abilityThread->HandleExtensionUpdateConfiguration(config);
689 } else {
690 abilityThread->HandleUpdateConfiguration(config);
691 }
692 };
693 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:UpdateConfiguration");
694 if (!ret) {
695 TAG_LOGE(AAFwkTag::FA, "PostTask error");
696 }
697 }
698
699 void FAAbilityThread::HandleUpdateConfiguration(const AppExecFwk::Configuration &config)
700 {
701 TAG_LOGD(AAFwkTag::FA, "begin");
702 if (abilityImpl_ == nullptr) {
703 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
704 return;
705 }
706
707 abilityImpl_->ScheduleUpdateConfiguration(config);
708 }
709
710 void FAAbilityThread::HandleExtensionUpdateConfiguration(const AppExecFwk::Configuration &config)
711 {
712 TAG_LOGD(AAFwkTag::FA, "begin");
713 if (extensionImpl_ == nullptr) {
714 TAG_LOGE(AAFwkTag::FA, "null extensionImpl_");
715 return;
716 }
717
718 extensionImpl_->ScheduleUpdateConfiguration(config);
719 }
720
721 bool FAAbilityThread::ScheduleAbilityTransaction(
722 const Want &want, const LifeCycleStateInfo &lifeCycleStateInfo, sptr<AAFwk::SessionInfo> sessionInfo)
723 {
724 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
725 TAG_LOGD(AAFwkTag::FA, "Lifecycle: name:%{public}s,targeState:%{public}d,isNewWant:%{public}d",
726 want.GetElement().GetAbilityName().c_str(),
727 lifeCycleStateInfo.state,
728 lifeCycleStateInfo.isNewWant);
729 std::string methodName = "ScheduleAbilityTransaction";
730 AddLifecycleEvent(lifeCycleStateInfo.state, methodName);
731
732 if (token_ == nullptr) {
733 TAG_LOGE(AAFwkTag::FA, "null token_");
734 return false;
735 }
736 if (abilityHandler_ == nullptr) {
737 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
738 return false;
739 }
740 wptr<FAAbilityThread> weak = this;
741 auto task = [weak, want, lifeCycleStateInfo, sessionInfo]() {
742 auto abilityThread = weak.promote();
743 if (abilityThread == nullptr) {
744 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
745 return;
746 }
747 if (abilityThread->isExtension_) {
748 abilityThread->HandleExtensionTransaction(want, lifeCycleStateInfo, sessionInfo);
749 Want newWant(want);
750 newWant.CloseAllFd();
751 } else {
752 abilityThread->HandleAbilityTransaction(want, lifeCycleStateInfo, sessionInfo);
753 }
754 };
755 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:AbilityTransaction");
756 if (!ret) {
757 TAG_LOGE(AAFwkTag::FA, "PostTask error");
758 return false;
759 }
760 return true;
761 }
762
763 void FAAbilityThread::ScheduleShareData(const int32_t &uniqueId)
764 {
765 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
766 if (token_ == nullptr) {
767 TAG_LOGE(AAFwkTag::FA, "token_ is nullptr");
768 return;
769 }
770 if (abilityHandler_ == nullptr) {
771 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
772 return;
773 }
774 wptr<FAAbilityThread> weak = this;
775 auto task = [weak, uniqueId]() {
776 auto abilityThread = weak.promote();
777 if (abilityThread == nullptr) {
778 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
779 return;
780 }
781 abilityThread->HandleShareData(uniqueId);
782 };
783 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:ShareData");
784 if (!ret) {
785 TAG_LOGE(AAFwkTag::FA, "postTask error");
786 }
787 }
788
789 void FAAbilityThread::ScheduleConnectAbility(const Want &want)
790 {
791 TAG_LOGD(AAFwkTag::FA, "begin, isExtension_: %{public}d", isExtension_);
792 if (abilityHandler_ == nullptr) {
793 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
794 return;
795 }
796 wptr<FAAbilityThread> weak = this;
797 auto task = [weak, want]() {
798 auto abilityThread = weak.promote();
799 if (abilityThread == nullptr) {
800 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
801 return;
802 }
803 if (abilityThread->isExtension_) {
804 abilityThread->HandleConnectExtension(want);
805 } else {
806 abilityThread->HandleConnectAbility(want);
807 }
808 };
809 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:ConnectAbility");
810 if (!ret) {
811 TAG_LOGE(AAFwkTag::FA, "PostTask error");
812 }
813 }
814
815 void FAAbilityThread::ScheduleDisconnectAbility(const Want &want)
816 {
817 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
818 TAG_LOGD(AAFwkTag::FA, "begin, isExtension: %{public}d", isExtension_);
819 if (abilityHandler_ == nullptr) {
820 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
821 return;
822 }
823 wptr<FAAbilityThread> weak = this;
824 auto task = [weak, want]() {
825 auto abilityThread = weak.promote();
826 if (abilityThread == nullptr) {
827 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
828 return;
829 }
830 if (abilityThread->isExtension_) {
831 abilityThread->HandleDisconnectExtension(want);
832 } else {
833 abilityThread->HandleDisconnectAbility(want);
834 }
835 };
836 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:DisconnectAbility");
837 if (!ret) {
838 TAG_LOGE(AAFwkTag::FA, "PostTask error");
839 }
840 }
841
842 void FAAbilityThread::ScheduleCommandAbility(const Want &want, bool restart, int startId)
843 {
844 TAG_LOGD(AAFwkTag::FA, "begin. startId: %{public}d", startId);
845 if (abilityHandler_ == nullptr) {
846 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
847 return;
848 }
849 wptr<FAAbilityThread> weak = this;
850 auto task = [weak, want, restart, startId]() {
851 auto abilityThread = weak.promote();
852 if (abilityThread == nullptr) {
853 TAG_LOGE(AAFwkTag::FA, "null abilityThread");
854 return;
855 }
856 if (abilityThread->isExtension_) {
857 Want newWant(want);
858 #ifdef WITH_DLP
859 bool sandboxFlag = Security::DlpPermission::DlpFileKits::GetSandboxFlag(newWant);
860 newWant.SetParam(DLP_PARAMS_SANDBOX, sandboxFlag);
861 if (sandboxFlag) {
862 newWant.CloseAllFd();
863 }
864 #endif // WITH_DLP
865 abilityThread->HandleCommandExtension(newWant, restart, startId);
866 newWant.CloseAllFd();
867 } else {
868 abilityThread->HandleCommandAbility(want, restart, startId);
869 }
870 };
871 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:CommandAbility");
872 if (!ret) {
873 TAG_LOGE(AAFwkTag::FA, "PostTask error");
874 }
875 }
876
877 bool FAAbilityThread::SchedulePrepareTerminateAbility()
878 {
879 TAG_LOGD(AAFwkTag::FA, "begin");
880 if (abilityImpl_ == nullptr) {
881 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
882 return false;
883 }
884 if (abilityHandler_ == nullptr) {
885 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
886 return false;
887 }
888 if (getpid() == gettid()) {
889 bool ret = abilityImpl_->PrepareTerminateAbility();
890 TAG_LOGD(AAFwkTag::FA, "end, ret = %{public}d", ret);
891 return ret;
892 }
893 wptr<FAAbilityThread> weak = this;
894 auto task = [weak]() {
895 auto abilityThread = weak.promote();
896 if (abilityThread == nullptr) {
897 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
898 return;
899 }
900 abilityThread->HandlePrepareTermianteAbility();
901 };
902 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:PrepareTerminateAbility");
903 if (!ret) {
904 TAG_LOGE(AAFwkTag::FA, "PostTask error");
905 return false;
906 }
907
908 std::unique_lock<std::mutex> lock(mutex_);
909 auto condition = [weak] {
910 auto abilityThread = weak.promote();
911 if (abilityThread == nullptr) {
912 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
913 return false;
914 }
915 return abilityThread->isPrepareTerminateAbilityDone_.load();
916 };
917 if (!cv_.wait_for(lock, std::chrono::milliseconds(PREPARE_TO_TERMINATE_TIMEOUT_MILLISECONDS), condition)) {
918 TAG_LOGW(AAFwkTag::FA, "Wait timeout");
919 }
920 TAG_LOGD(AAFwkTag::FA, "end, ret = %{public}d", isPrepareTerminate_);
921 return isPrepareTerminate_;
922 }
923
924 void FAAbilityThread::ScheduleCommandAbilityWindow(
925 const Want &want, const sptr<AAFwk::SessionInfo> &sessionInfo, AAFwk::WindowCommand winCmd)
926 {
927 TAG_LOGD(AAFwkTag::FA, "begin");
928 if (abilityHandler_ == nullptr) {
929 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
930 return;
931 }
932 wptr<FAAbilityThread> weak = this;
933 auto task = [weak, want, sessionInfo, winCmd]() {
934 auto abilityThread = weak.promote();
935 if (abilityThread == nullptr) {
936 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
937 return;
938 }
939 abilityThread->HandleCommandExtensionWindow(want, sessionInfo, winCmd);
940 };
941 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:CommandAbilityWindow");
942 if (!ret) {
943 TAG_LOGE(AAFwkTag::FA, "PostTask error");
944 }
945 }
946
947 void FAAbilityThread::SendResult(int requestCode, int resultCode, const Want &want)
948 {
949 TAG_LOGD(AAFwkTag::FA, "begin");
950 if (abilityHandler_ == nullptr) {
951 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
952 return;
953 }
954 wptr<FAAbilityThread> weak = this;
955 auto task = [weak, requestCode, resultCode, want]() {
956 auto abilityThread = weak.promote();
957 if (abilityThread == nullptr) {
958 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
959 return;
960 }
961 if (requestCode == -1) {
962 TAG_LOGE(AAFwkTag::FA, "requestCode is -1");
963 return;
964 }
965 if (abilityThread->isExtension_ && abilityThread->extensionImpl_ != nullptr) {
966 abilityThread->extensionImpl_->SendResult(requestCode, resultCode, want);
967 return;
968 }
969 if (!abilityThread->isExtension_ && abilityThread->abilityImpl_ != nullptr) {
970 abilityThread->abilityImpl_->SendResult(requestCode, resultCode, want);
971 return;
972 }
973 TAG_LOGE(AAFwkTag::FA, "%{public}s impl is nullptr", abilityThread->isExtension_ ? "extension" : "ability");
974 };
975 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:SendResult");
976 if (!ret) {
977 TAG_LOGE(AAFwkTag::FA, "PostTask error");
978 }
979 }
980
981 std::vector<std::string> FAAbilityThread::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
982 {
983 TAG_LOGD(AAFwkTag::FA, "begin");
984 std::vector<std::string> types;
985 if (abilityImpl_ == nullptr) {
986 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
987 return types;
988 }
989
990 types = abilityImpl_->GetFileTypes(uri, mimeTypeFilter);
991 return types;
992 }
993
994 int FAAbilityThread::OpenFile(const Uri &uri, const std::string &mode)
995 {
996 TAG_LOGD(AAFwkTag::FA, "called");
997 if (abilityImpl_ == nullptr) {
998 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
999 return -1;
1000 }
1001 return abilityImpl_->OpenFile(uri, mode);
1002 }
1003
1004 int FAAbilityThread::OpenRawFile(const Uri &uri, const std::string &mode)
1005 {
1006 TAG_LOGD(AAFwkTag::FA, "called");
1007 if (abilityImpl_ == nullptr) {
1008 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1009 return -1;
1010 }
1011
1012 return abilityImpl_->OpenRawFile(uri, mode);
1013 }
1014
1015 int FAAbilityThread::Insert(const Uri &uri, const NativeRdb::ValuesBucket &value)
1016 {
1017 TAG_LOGD(AAFwkTag::FA, "called");
1018 if (abilityImpl_ == nullptr) {
1019 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1020 return -1;
1021 }
1022
1023 return abilityImpl_->Insert(uri, value);
1024 }
1025
1026 std::shared_ptr<AppExecFwk::PacMap> FAAbilityThread::Call(
1027 const Uri &uri, const std::string &method, const std::string &arg, const AppExecFwk::PacMap &pacMap)
1028 {
1029 TAG_LOGD(AAFwkTag::FA, "called");
1030 if (abilityImpl_ == nullptr) {
1031 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1032 return nullptr;
1033 }
1034
1035 return abilityImpl_->Call(uri, method, arg, pacMap);
1036 }
1037
1038 int FAAbilityThread::Update(
1039 const Uri &uri, const NativeRdb::ValuesBucket &value, const NativeRdb::DataAbilityPredicates &predicates)
1040 {
1041 TAG_LOGD(AAFwkTag::FA, "called");
1042 if (abilityImpl_ == nullptr) {
1043 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1044 return -1;
1045 }
1046
1047 return abilityImpl_->Update(uri, value, predicates);
1048 }
1049
1050 int FAAbilityThread::Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates)
1051 {
1052 TAG_LOGD(AAFwkTag::FA, "called");
1053 if (abilityImpl_ == nullptr) {
1054 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1055 return -1;
1056 }
1057 return abilityImpl_->Delete(uri, predicates);
1058 }
1059
1060 std::shared_ptr<NativeRdb::AbsSharedResultSet> FAAbilityThread::Query(
1061 const Uri &uri, std::vector<std::string> &columns, const NativeRdb::DataAbilityPredicates &predicates)
1062 {
1063 TAG_LOGD(AAFwkTag::FA, "called");
1064 if (abilityImpl_ == nullptr) {
1065 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1066 return nullptr;
1067 }
1068
1069 return abilityImpl_->Query(uri, columns, predicates);
1070 }
1071
1072 std::string FAAbilityThread::GetType(const Uri &uri)
1073 {
1074 TAG_LOGD(AAFwkTag::FA, "called");
1075 std::string type;
1076 if (abilityImpl_ == nullptr) {
1077 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1078 return "";
1079 }
1080
1081 return abilityImpl_->GetType(uri);
1082 }
1083
1084 bool FAAbilityThread::Reload(const Uri &uri, const AppExecFwk::PacMap &extras)
1085 {
1086 TAG_LOGD(AAFwkTag::FA, "called");
1087 if (abilityImpl_ == nullptr) {
1088 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1089 return false;
1090 }
1091 return abilityImpl_->Reload(uri, extras);
1092 }
1093
1094 int FAAbilityThread::BatchInsert(const Uri &uri, const std::vector<NativeRdb::ValuesBucket> &values)
1095 {
1096 TAG_LOGD(AAFwkTag::FA, "called");
1097 if (abilityImpl_ == nullptr) {
1098 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1099 return -1;
1100 }
1101
1102 return abilityImpl_->BatchInsert(uri, values);
1103 }
1104
1105 void FAAbilityThread::ContinueAbility(const std::string &deviceId, uint32_t versionCode)
1106 {
1107 TAG_LOGD(AAFwkTag::FA, "begin");
1108 if (abilityImpl_ == nullptr) {
1109 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1110 return;
1111 }
1112 abilityImpl_->ContinueAbility(deviceId, versionCode);
1113 }
1114
1115 void FAAbilityThread::NotifyContinuationResult(int32_t result)
1116 {
1117 TAG_LOGD(AAFwkTag::FA, "begin, result: %{public}d", result);
1118 if (abilityImpl_ == nullptr) {
1119 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1120 return;
1121 }
1122 abilityImpl_->NotifyContinuationResult(result);
1123 }
1124
1125 void FAAbilityThread::NotifyMemoryLevel(int32_t level)
1126 {
1127 TAG_LOGD(AAFwkTag::FA, "begin, result: %{public}d", level);
1128 if (isExtension_) {
1129 if (extensionImpl_ == nullptr) {
1130 TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
1131 return;
1132 }
1133 extensionImpl_->NotifyMemoryLevel(level);
1134 return;
1135 }
1136 if (abilityImpl_ == nullptr) {
1137 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1138 return;
1139 }
1140 abilityImpl_->NotifyMemoryLevel(level);
1141 }
1142
1143 void FAAbilityThread::InitExtensionFlag(const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord)
1144 {
1145 TAG_LOGD(AAFwkTag::FA, "begin");
1146 if (abilityRecord == nullptr) {
1147 TAG_LOGE(AAFwkTag::FA, "abilityRecord is nullptr");
1148 return;
1149 }
1150 std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo = abilityRecord->GetAbilityInfo();
1151 if (abilityInfo == nullptr) {
1152 TAG_LOGE(AAFwkTag::FA, "null ability");
1153 return;
1154 }
1155 if (abilityInfo->type == AppExecFwk::AbilityType::EXTENSION) {
1156 TAG_LOGD(AAFwkTag::FA, "InitExtensionFlag is true");
1157 isExtension_ = true;
1158 } else {
1159 isExtension_ = false;
1160 }
1161 if (abilityInfo->type == AppExecFwk::AbilityType::PAGE) {
1162 TAG_LOGD(AAFwkTag::FA, "isUIAbility_ is assigned true");
1163 isUIAbility_ = true;
1164 }
1165 }
1166
1167 Uri FAAbilityThread::NormalizeUri(const Uri &uri)
1168 {
1169 TAG_LOGD(AAFwkTag::FA, "begin");
1170 Uri urivalue("");
1171 if (abilityImpl_ == nullptr) {
1172 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1173 return urivalue;
1174 }
1175
1176 urivalue = abilityImpl_->NormalizeUri(uri);
1177 return urivalue;
1178 }
1179
1180 Uri FAAbilityThread::DenormalizeUri(const Uri &uri)
1181 {
1182 TAG_LOGD(AAFwkTag::FA, "begin");
1183 Uri urivalue("");
1184 if (abilityImpl_ == nullptr) {
1185 TAG_LOGE(AAFwkTag::FA, "abilityImpl is nullptr");
1186 return urivalue;
1187 }
1188
1189 urivalue = abilityImpl_->DenormalizeUri(uri);
1190 return urivalue;
1191 }
1192
1193 bool FAAbilityThread::HandleRegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1194 {
1195 auto obsMgrClient = DataObsMgrClient::GetInstance();
1196 if (obsMgrClient == nullptr) {
1197 TAG_LOGE(AAFwkTag::FA, "obsMgrClient is nullptr");
1198 return false;
1199 }
1200
1201 ErrCode ret = obsMgrClient->RegisterObserver(uri, dataObserver);
1202 if (ret != ERR_OK) {
1203 TAG_LOGE(AAFwkTag::FA, "error %{public}d", ret);
1204 return false;
1205 }
1206 return true;
1207 }
1208
1209 bool FAAbilityThread::HandleUnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1210 {
1211 auto obsMgrClient = DataObsMgrClient::GetInstance();
1212 if (obsMgrClient == nullptr) {
1213 TAG_LOGE(AAFwkTag::FA, "obsMgrClient is nullptr");
1214 return false;
1215 }
1216
1217 ErrCode ret = obsMgrClient->UnregisterObserver(uri, dataObserver);
1218 if (ret != ERR_OK) {
1219 TAG_LOGE(AAFwkTag::FA, "error %{public}d", ret);
1220 return false;
1221 }
1222 return true;
1223 }
1224
1225 bool FAAbilityThread::HandleNotifyChange(const Uri &uri)
1226 {
1227 auto obsMgrClient = DataObsMgrClient::GetInstance();
1228 if (obsMgrClient == nullptr) {
1229 TAG_LOGE(AAFwkTag::FA, "obsMgrClient is nullptr");
1230 return false;
1231 }
1232
1233 ErrCode ret = obsMgrClient->NotifyChange(uri);
1234 if (ret != ERR_OK) {
1235 TAG_LOGE(AAFwkTag::FA, "error %{public}d", ret);
1236 return false;
1237 }
1238 return true;
1239 }
1240
1241 bool FAAbilityThread::ScheduleRegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1242 {
1243 TAG_LOGD(AAFwkTag::FA, "called");
1244 if (abilityHandler_ == nullptr) {
1245 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1246 return false;
1247 }
1248 wptr<FAAbilityThread> weak = this;
1249 auto task = [weak, uri, dataObserver]() {
1250 auto abilityThread = weak.promote();
1251 if (abilityThread == nullptr) {
1252 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1253 return;
1254 }
1255 abilityThread->HandleRegisterObserver(uri, dataObserver);
1256 };
1257 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:RegisterObserver");
1258 if (!ret) {
1259 TAG_LOGE(AAFwkTag::FA, "PostTask error");
1260 }
1261 return ret;
1262 }
1263
1264 bool FAAbilityThread::ScheduleUnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1265 {
1266 TAG_LOGD(AAFwkTag::FA, "called");
1267 if (abilityHandler_ == nullptr) {
1268 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1269 return false;
1270 }
1271 wptr<FAAbilityThread> weak = this;
1272 auto task = [weak, uri, dataObserver]() {
1273 auto abilityThread = weak.promote();
1274 if (abilityThread == nullptr) {
1275 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1276 return;
1277 }
1278 abilityThread->HandleUnregisterObserver(uri, dataObserver);
1279 };
1280 bool ret = abilityHandler_->PostSyncTask(task, "FAAbilityThread:UnregisterObserver");
1281 if (!ret) {
1282 TAG_LOGE(AAFwkTag::FA, "PostTask error");
1283 }
1284 return ret;
1285 }
1286
1287 bool FAAbilityThread::ScheduleNotifyChange(const Uri &uri)
1288 {
1289 TAG_LOGD(AAFwkTag::FA, "called");
1290 if (abilityHandler_ == nullptr) {
1291 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1292 return false;
1293 }
1294 wptr<FAAbilityThread> weak = this;
1295 auto task = [weak, uri]() {
1296 auto abilityThread = weak.promote();
1297 if (abilityThread == nullptr) {
1298 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1299 return;
1300 }
1301 abilityThread->HandleNotifyChange(uri);
1302 };
1303 bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:NotifyChange");
1304 if (!ret) {
1305 TAG_LOGE(AAFwkTag::FA, "PostTask error");
1306 }
1307 return ret;
1308 }
1309
1310 std::vector<std::shared_ptr<AppExecFwk::DataAbilityResult>> FAAbilityThread::ExecuteBatch(
1311 const std::vector<std::shared_ptr<AppExecFwk::DataAbilityOperation>> &operations)
1312 {
1313 TAG_LOGD(AAFwkTag::FA, "begin");
1314 std::vector<std::shared_ptr<AppExecFwk::DataAbilityResult>> results;
1315 if (abilityImpl_ == nullptr) {
1316 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1317 results.clear();
1318 return results;
1319 }
1320 results = abilityImpl_->ExecuteBatch(operations);
1321 return results;
1322 }
1323
1324 std::shared_ptr<AbilityContext> FAAbilityThread::BuildAbilityContext(
1325 const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo,
1326 const std::shared_ptr<AppExecFwk::OHOSApplication> &application, const sptr<IRemoteObject> &token,
1327 const std::shared_ptr<Context> &stageContext)
1328 {
1329 auto abilityContextImpl = std::make_shared<AbilityContextImpl>();
1330 if (abilityContextImpl == nullptr) {
1331 TAG_LOGE(AAFwkTag::FA, "abilityContextImpl is nullptr");
1332 return abilityContextImpl;
1333 }
1334 abilityContextImpl->SetStageContext(stageContext);
1335 abilityContextImpl->SetToken(token);
1336 abilityContextImpl->SetAbilityInfo(abilityInfo);
1337 abilityContextImpl->SetConfiguration(application->GetConfiguration());
1338 return abilityContextImpl;
1339 }
1340
1341 void FAAbilityThread::DumpAbilityInfo(const std::vector<std::string> ¶ms, std::vector<std::string> &info)
1342 {
1343 TAG_LOGD(AAFwkTag::FA, "begin");
1344 if (token_ == nullptr) {
1345 TAG_LOGE(AAFwkTag::FA, "token_ is nullptr");
1346 return;
1347 }
1348 if (abilityHandler_ == nullptr) {
1349 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1350 return;
1351 }
1352 wptr<FAAbilityThread> weak = this;
1353 auto task = [weak, params, token = token_]() {
1354 auto abilityThread = weak.promote();
1355 if (abilityThread == nullptr) {
1356 TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1357 return;
1358 }
1359 std::vector<std::string> dumpInfo;
1360 abilityThread->DumpAbilityInfoInner(params, dumpInfo);
1361 ErrCode err = AbilityManagerClient::GetInstance()->DumpAbilityInfoDone(dumpInfo, token);
1362 if (err != ERR_OK) {
1363 TAG_LOGE(AAFwkTag::FA, "failed = %{public}d", err);
1364 }
1365 };
1366 abilityHandler_->PostTask(task, "FAAbilityThread:DumpAbilityInfo");
1367 }
1368
1369 #ifdef SUPPORT_GRAPHICS
1370 void FAAbilityThread::DumpAbilityInfoInner(const std::vector<std::string> ¶ms, std::vector<std::string> &info)
1371 {
1372 TAG_LOGD(AAFwkTag::FA, "begin");
1373 if (currentAbility_ == nullptr && currentExtension_ == nullptr) {
1374 TAG_LOGD(AAFwkTag::FA, "currentAbility and currentExtension_ is nullptr");
1375 return;
1376 }
1377 if (currentAbility_ != nullptr) {
1378 if (abilityImpl_->IsStageBasedModel()) {
1379 auto scene = currentAbility_->GetScene();
1380 if (scene == nullptr) {
1381 TAG_LOGE(AAFwkTag::FA, "scene is nullptr");
1382 return;
1383 }
1384 auto window = scene->GetMainWindow();
1385 if (window == nullptr) {
1386 TAG_LOGE(AAFwkTag::FA, "window is nullptr");
1387 return;
1388 }
1389 window->DumpInfo(params, info);
1390 }
1391 currentAbility_->Dump(params, info);
1392 }
1393 if (currentExtension_ != nullptr) {
1394 currentExtension_->Dump(params, info);
1395 }
1396 if (params.empty()) {
1397 DumpOtherInfo(info);
1398 return;
1399 }
1400 }
1401 #else
1402 void FAAbilityThread::DumpAbilityInfoInner(const std::vector<std::string> ¶ms, std::vector<std::string> &info)
1403 {
1404 TAG_LOGD(AAFwkTag::FA, "begin");
1405 if (currentAbility_ != nullptr) {
1406 currentAbility_->Dump(params, info);
1407 }
1408
1409 if (currentExtension_ != nullptr) {
1410 currentExtension_->Dump(params, info);
1411 }
1412 DumpOtherInfo(info);
1413 }
1414 #endif
1415
1416 void FAAbilityThread::DumpOtherInfo(std::vector<std::string> &info)
1417 {
1418 std::string dumpInfo = " event:";
1419 info.push_back(dumpInfo);
1420 if (abilityHandler_ == nullptr) {
1421 TAG_LOGD(AAFwkTag::FA, "null abilityHandler_");
1422 return;
1423 }
1424 auto runner = abilityHandler_->GetEventRunner();
1425 if (runner == nullptr) {
1426 TAG_LOGD(AAFwkTag::FA, "null runner_");
1427 return;
1428 }
1429 dumpInfo = "";
1430 runner->DumpRunnerInfo(dumpInfo);
1431 info.push_back(dumpInfo);
1432 if (currentAbility_ != nullptr) {
1433 const auto ablityContext = currentAbility_->GetAbilityContext();
1434 if (ablityContext == nullptr) {
1435 TAG_LOGD(AAFwkTag::FA, "abilitycontext is nullptr");
1436 return;
1437 }
1438 const auto localCallContainer = ablityContext->GetLocalCallContainer();
1439 if (localCallContainer == nullptr) {
1440 TAG_LOGD(AAFwkTag::FA, "localCallContainer is nullptr");
1441 return;
1442 }
1443 localCallContainer->DumpCalls(info);
1444 }
1445 }
1446
1447 void FAAbilityThread::CallRequest()
1448 {
1449 TAG_LOGD(AAFwkTag::FA, "begin");
1450 if (currentAbility_ == nullptr) {
1451 TAG_LOGE(AAFwkTag::FA, "null ability");
1452 return;
1453 }
1454 if (abilityHandler_ == nullptr) {
1455 TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1456 return;
1457 }
1458
1459 sptr<IRemoteObject> retval = nullptr;
1460 std::weak_ptr<OHOS::AppExecFwk::Ability> weakAbility = currentAbility_;
1461 auto syncTask = [ability = weakAbility, &retval]() {
1462 auto currentAbility = ability.lock();
1463 if (currentAbility == nullptr) {
1464 TAG_LOGE(AAFwkTag::FA, "null ability");
1465 return;
1466 }
1467
1468 retval = currentAbility->CallRequest();
1469 };
1470 abilityHandler_->PostSyncTask(syncTask, "FAAbilityThread:CallRequest");
1471 AbilityManagerClient::GetInstance()->CallRequestDone(token_, retval);
1472 }
1473
1474 void FAAbilityThread::HandlePrepareTermianteAbility()
1475 {
1476 std::unique_lock<std::mutex> lock(mutex_);
1477 if (abilityImpl_ == nullptr) {
1478 TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1479 return;
1480 }
1481 isPrepareTerminate_ = abilityImpl_->PrepareTerminateAbility();
1482 TAG_LOGD(AAFwkTag::FA, "end, ret = %{public}d", isPrepareTerminate_);
1483 isPrepareTerminateAbilityDone_.store(true);
1484 cv_.notify_all();
1485 }
1486
1487 int FAAbilityThread::CreateModalUIExtension(const Want &want)
1488 {
1489 TAG_LOGD(AAFwkTag::FA, "Call");
1490 if (currentAbility_ == nullptr) {
1491 TAG_LOGE(AAFwkTag::FA, "current ability is nullptr");
1492 return ERR_INVALID_VALUE;
1493 }
1494 return currentAbility_->CreateModalUIExtension(want);
1495 }
1496
1497 void FAAbilityThread::UpdateSessionToken(sptr<IRemoteObject> sessionToken)
1498 {
1499 if (currentAbility_ == nullptr) {
1500 TAG_LOGE(AAFwkTag::FA, "current ability is nullptr");
1501 return;
1502 }
1503 currentAbility_->UpdateSessionToken(sessionToken);
1504 }
1505 } // namespace AbilityRuntime
1506 } // namespace OHOS
1507