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