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