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