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