• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "ability_record.h"
17 
18 #include <singleton.h>
19 #include <vector>
20 
21 #include "ability_event_handler.h"
22 #include "ability_manager_service.h"
23 #include "ability_scheduler_stub.h"
24 #include "ability_util.h"
25 #include "bundle_mgr_client.h"
26 #include "bytrace.h"
27 #include "errors.h"
28 #include "hilog_wrapper.h"
29 #include "os_account_manager.h"
30 #include "uri_permission_manager_client.h"
31 
32 namespace OHOS {
33 namespace AAFwk {
34 const std::string DEBUG_APP = "debugApp";
35 const std::string ABILITY_OWNER_USERID = "AbilityMS_Owner_UserId";
36 int64_t AbilityRecord::abilityRecordId = 0;
37 int64_t AbilityRecord::g_abilityRecordEventId_ = 0;
38 const std::map<AbilityState, std::string> AbilityRecord::stateToStrMap = {
39     std::map<AbilityState, std::string>::value_type(INITIAL, "INITIAL"),
40     std::map<AbilityState, std::string>::value_type(INACTIVE, "INACTIVE"),
41     std::map<AbilityState, std::string>::value_type(ACTIVE, "ACTIVE"),
42     std::map<AbilityState, std::string>::value_type(BACKGROUND, "BACKGROUND"),
43     std::map<AbilityState, std::string>::value_type(SUSPENDED, "SUSPENDED"),
44     std::map<AbilityState, std::string>::value_type(INACTIVATING, "INACTIVATING"),
45     std::map<AbilityState, std::string>::value_type(ACTIVATING, "ACTIVATING"),
46     std::map<AbilityState, std::string>::value_type(MOVING_BACKGROUND, "MOVING_BACKGROUND"),
47     std::map<AbilityState, std::string>::value_type(TERMINATING, "TERMINATING"),
48     std::map<AbilityState, std::string>::value_type(FOREGROUND_NEW, "FOREGROUND_NEW"),
49     std::map<AbilityState, std::string>::value_type(BACKGROUND_NEW, "BACKGROUND_NEW"),
50     std::map<AbilityState, std::string>::value_type(FOREGROUNDING_NEW, "FOREGROUNDING_NEW"),
51     std::map<AbilityState, std::string>::value_type(BACKGROUNDING_NEW, "BACKGROUNDING_NEW"),
52 };
53 const std::map<AppState, std::string> AbilityRecord::appStateToStrMap_ = {
54     std::map<AppState, std::string>::value_type(AppState::BEGIN, "BEGIN"),
55     std::map<AppState, std::string>::value_type(AppState::READY, "READY"),
56     std::map<AppState, std::string>::value_type(AppState::FOREGROUND, "FOREGROUND"),
57     std::map<AppState, std::string>::value_type(AppState::BACKGROUND, "BACKGROUND"),
58     std::map<AppState, std::string>::value_type(AppState::SUSPENDED, "SUSPENDED"),
59     std::map<AppState, std::string>::value_type(AppState::TERMINATED, "TERMINATED"),
60     std::map<AppState, std::string>::value_type(AppState::END, "END"),
61 };
62 const std::map<AbilityLifeCycleState, AbilityState> AbilityRecord::convertStateMap = {
63     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INITIAL, INITIAL),
64     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_INACTIVE, INACTIVE),
65     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_ACTIVE, ACTIVE),
66     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND, BACKGROUND),
67     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_SUSPENDED, SUSPENDED),
68     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_FOREGROUND_NEW, FOREGROUND_NEW),
69     std::map<AbilityLifeCycleState, AbilityState>::value_type(ABILITY_STATE_BACKGROUND_NEW, BACKGROUND_NEW),
70 };
71 
Token(std::weak_ptr<AbilityRecord> abilityRecord)72 Token::Token(std::weak_ptr<AbilityRecord> abilityRecord) : abilityRecord_(abilityRecord)
73 {}
74 
~Token()75 Token::~Token()
76 {}
77 
GetAbilityRecordByToken(const sptr<IRemoteObject> & token)78 std::shared_ptr<AbilityRecord> Token::GetAbilityRecordByToken(const sptr<IRemoteObject> &token)
79 {
80     CHECK_POINTER_AND_RETURN(token, nullptr);
81     return (static_cast<Token *>(token.GetRefPtr()))->GetAbilityRecord();
82 }
83 
GetAbilityRecord() const84 std::shared_ptr<AbilityRecord> Token::GetAbilityRecord() const
85 {
86     return abilityRecord_.lock();
87 }
88 
AbilityRecord(const Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,int requestCode,int32_t apiVersion)89 AbilityRecord::AbilityRecord(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
90     const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode, int32_t apiVersion)
91     : want_(want), abilityInfo_(abilityInfo), applicationInfo_(applicationInfo),
92     requestCode_(requestCode), compatibleVersion_(apiVersion)
93 {
94     recordId_ = abilityRecordId++;
95     auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
96     if (abilityMgr) {
97         abilityMgr->GetMaxRestartNum(restratMax_);
98     }
99     restartCount_ = restratMax_;
100 }
101 
~AbilityRecord()102 AbilityRecord::~AbilityRecord()
103 {
104     if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
105         auto object = scheduler_->AsObject();
106         if (object != nullptr) {
107             object->RemoveDeathRecipient(schedulerDeathRecipient_);
108         }
109     }
110 }
111 
CreateAbilityRecord(const AbilityRequest & abilityRequest)112 std::shared_ptr<AbilityRecord> AbilityRecord::CreateAbilityRecord(const AbilityRequest &abilityRequest)
113 {
114     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
115     if (abilityRequest.IsNewVersion() && abilityRequest.abilityInfo.type == AbilityType::PAGE) {
116         abilityRecord = std::make_shared<AbilityRecordNew>(abilityRequest.want, abilityRequest.abilityInfo,
117             abilityRequest.appInfo, abilityRequest.requestCode, abilityRequest.compatibleVersion);
118     } else {
119         abilityRecord = std::make_shared<AbilityRecord>(abilityRequest.want, abilityRequest.abilityInfo,
120             abilityRequest.appInfo, abilityRequest.requestCode, abilityRequest.compatibleVersion);
121     }
122     CHECK_POINTER_AND_RETURN(abilityRecord, nullptr);
123     abilityRecord->SetUid(abilityRequest.uid);
124     if (!abilityRecord->Init()) {
125         HILOG_ERROR("failed to init new ability record");
126         return nullptr;
127     }
128     if (abilityRequest.startSetting != nullptr) {
129         HILOG_INFO("abilityRequest.startSetting...");
130         abilityRecord->SetStartSetting(abilityRequest.startSetting);
131     }
132     if (abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
133         HILOG_INFO("abilityRequest.callType is CALL_REQUEST_TYPE.");
134         abilityRecord->SetStartedByCall(true);
135     }
136     return abilityRecord;
137 }
138 
Init()139 bool AbilityRecord::Init()
140 {
141     lifecycleDeal_ = std::make_unique<LifecycleDeal>();
142     CHECK_POINTER_RETURN_BOOL(lifecycleDeal_);
143 
144     token_ = new (std::nothrow) Token(weak_from_this());
145     CHECK_POINTER_RETURN_BOOL(token_);
146 
147     if (applicationInfo_.isLauncherApp) {
148         isLauncherAbility_ = true;
149     }
150     return true;
151 }
152 
SetUid(int32_t uid)153 void AbilityRecord::SetUid(int32_t uid)
154 {
155     uid_ = uid;
156 }
157 
GetUid()158 int32_t AbilityRecord::GetUid()
159 {
160     return uid_;
161 }
162 
LoadAbility()163 int AbilityRecord::LoadAbility()
164 {
165     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
166     HILOG_INFO("%{public}s", __func__);
167     startTime_ = AbilityUtil::SystemTimeMillis();
168     CHECK_POINTER_AND_RETURN(token_, ERR_INVALID_VALUE);
169     std::string appName = applicationInfo_.name;
170     if (appName.empty()) {
171         HILOG_ERROR("app name is empty");
172         return ERR_INVALID_VALUE;
173     }
174 
175     if (!CanRestartRootLauncher()) {
176         HILOG_ERROR("Root launcher restart is out of max count.");
177         return ERR_INVALID_VALUE;
178     }
179 
180     if (abilityInfo_.type != AppExecFwk::AbilityType::DATA) {
181         if (isKernalSystemAbility_) {
182             SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, AbilityManagerService::SYSTEM_UI_TIMEOUT);
183         } else {
184             SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, AbilityManagerService::LOAD_TIMEOUT);
185         }
186     }
187     sptr<Token> callerToken_ = nullptr;
188     if (!callerList_.empty() && callerList_.back()) {
189         auto caller = callerList_.back()->GetCaller();
190         if (caller) {
191             callerToken_ = caller->GetToken();
192         }
193     }
194 
195     want_.SetParam(ABILITY_OWNER_USERID, ownerMissionUserId_);
196     auto result = DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
197         token_, callerToken_, abilityInfo_, applicationInfo_, want_);
198     want_.RemoveParam(ABILITY_OWNER_USERID);
199     return result;
200 }
201 
CanRestartRootLauncher()202 bool AbilityRecord::CanRestartRootLauncher()
203 {
204     if (isLauncherRoot_ && isRestarting_ && IsLauncherAbility() && (restartCount_ <= 0)) {
205         HILOG_ERROR("Root launcher restart is out of max count.");
206         return false;
207     }
208     return true;
209 }
210 
ForegroundAbility(uint32_t sceneFlag)211 void AbilityRecord::ForegroundAbility(uint32_t sceneFlag)
212 {
213     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
214     HILOG_INFO("ForegroundAbility.");
215     CHECK_POINTER(lifecycleDeal_);
216 
217     SendEvent(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, AbilityManagerService::FOREGROUNDNEW_TIMEOUT);
218 
219     // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
220     // earlier than above actions.
221     currentState_ = AbilityState::FOREGROUNDING_NEW;
222     lifeCycleStateInfo_.sceneFlag = sceneFlag;
223     lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_);
224     lifeCycleStateInfo_.sceneFlag = 0;
225     lifeCycleStateInfo_.sceneFlagBak = 0;
226 
227     // update ability state to appMgr service when restart
228     if (IsNewWant()) {
229         sptr<Token> preToken = nullptr;
230         if (GetPreAbilityRecord()) {
231             preToken = GetPreAbilityRecord()->GetToken();
232         }
233         DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
234     }
235 }
236 
ProcessForegroundAbility(uint32_t sceneFlag)237 void AbilityRecord::ProcessForegroundAbility(uint32_t sceneFlag)
238 {
239     std::string element = GetWant().GetElement().GetURI();
240     HILOG_DEBUG("ability record: %{public}s", element.c_str());
241 
242     if (isReady_) {
243         if (IsAbilityState(AbilityState::BACKGROUND_NEW)) {
244             // background to activte state
245             HILOG_DEBUG("MoveToForground, %{public}s", element.c_str());
246             lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
247             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForground(token_);
248         } else {
249             HILOG_DEBUG("Activate %{public}s", element.c_str());
250             ForegroundAbility(sceneFlag);
251         }
252     } else {
253         lifeCycleStateInfo_.sceneFlagBak = sceneFlag;
254         LoadAbility();
255     }
256 }
257 
BackgroundAbility(const Closure & task)258 void AbilityRecord::BackgroundAbility(const Closure &task)
259 {
260     HILOG_INFO("Move to backgroundNew.");
261     CHECK_POINTER(lifecycleDeal_);
262     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
263     if (handler && task) {
264         if (!want_.GetBoolParam(DEBUG_APP, false)) {
265             g_abilityRecordEventId_++;
266             eventId_ = g_abilityRecordEventId_;
267             // eventId_ is a unique id of the task.
268             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUNDNEW_TIMEOUT);
269         } else {
270             HILOG_INFO("Is debug mode, no need to handle time out.");
271         }
272     }
273 
274     if (!IsTerminating() || IsRestarting()) {
275         // schedule save ability state before moving to background.
276         SaveAbilityState();
277     }
278 
279     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
280     // earlier than above actions.
281     currentState_ = AbilityState::BACKGROUNDING_NEW;
282     lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
283 }
284 
TerminateAbility()285 int AbilityRecord::TerminateAbility()
286 {
287     HILOG_INFO("%{public}s", __func__);
288     return DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(token_);
289 }
290 
291 #ifdef SUPPORT_GRAPHICS
SetMissionRecord(const std::shared_ptr<MissionRecord> & missionRecord)292 void AbilityRecord::SetMissionRecord(const std::shared_ptr<MissionRecord> &missionRecord)
293 {
294     missionRecord_ = missionRecord;
295     if (missionRecord) {
296         lifeCycleStateInfo_.missionId = missionRecord->GetMissionRecordId();
297     }
298 }
299 
SetMissionStackId(const int stackId)300 void AbilityRecord::SetMissionStackId(const int stackId)
301 {
302     lifeCycleStateInfo_.stackId = stackId;
303 }
304 
GetMissionStackId() const305 int AbilityRecord::GetMissionStackId() const
306 {
307     return lifeCycleStateInfo_.stackId;
308 }
309 
GetMissionRecord() const310 std::shared_ptr<MissionRecord> AbilityRecord::GetMissionRecord() const
311 {
312     return missionRecord_.lock();
313 }
314 
GetMissionRecordId() const315 int AbilityRecord::GetMissionRecordId() const
316 {
317     if (missionRecord_.lock()) {
318         return missionRecord_.lock()->GetMissionRecordId();
319     }
320     return DEFAULT_INVAL_VALUE;
321 }
322 #endif
323 
GetAbilityInfo() const324 const AppExecFwk::AbilityInfo &AbilityRecord::GetAbilityInfo() const
325 {
326     return abilityInfo_;
327 }
328 
GetApplicationInfo() const329 const AppExecFwk::ApplicationInfo &AbilityRecord::GetApplicationInfo() const
330 {
331     return applicationInfo_;
332 }
333 
GetAbilityState() const334 AbilityState AbilityRecord::GetAbilityState() const
335 {
336     return currentState_;
337 }
338 
IsForeground() const339 bool AbilityRecord::IsForeground() const
340 {
341     return currentState_ == AbilityState::FOREGROUND_NEW || currentState_ == AbilityState::FOREGROUNDING_NEW;
342 }
343 
SetAbilityState(AbilityState state)344 void AbilityRecord::SetAbilityState(AbilityState state)
345 {
346     currentState_ = state;
347     if (state == AbilityState::ACTIVE) {
348         auto mission = GetMissionRecord();
349         if (mission) {
350             mission->UpdateActiveTimestamp();
351         }
352     }
353 
354     if (state == AbilityState::FOREGROUND_NEW || state == AbilityState::ACTIVE) {
355         SetRestarting(false);
356     }
357 }
358 
SetScheduler(const sptr<IAbilityScheduler> & scheduler)359 void AbilityRecord::SetScheduler(const sptr<IAbilityScheduler> &scheduler)
360 {
361     HILOG_INFO("%{public}s", __func__);
362     CHECK_POINTER(lifecycleDeal_);
363     if (scheduler != nullptr) {
364         if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
365             auto schedulerObject = scheduler_->AsObject();
366             if (schedulerObject != nullptr) {
367                 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
368             }
369         }
370         if (schedulerDeathRecipient_ == nullptr) {
371             schedulerDeathRecipient_ =
372                 new AbilitySchedulerRecipient(std::bind(&AbilityRecord::OnSchedulerDied, this, std::placeholders::_1));
373         }
374         isReady_ = true;
375         scheduler_ = scheduler;
376         lifecycleDeal_->SetScheduler(scheduler);
377         auto schedulerObject = scheduler_->AsObject();
378         if (schedulerObject != nullptr) {
379             schedulerObject->AddDeathRecipient(schedulerDeathRecipient_);
380         }
381     } else {
382         HILOG_ERROR("scheduler is nullptr");
383         isReady_ = false;
384         isWindowAttached_ = false;
385         SetIsNewWant(false);
386         if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
387             auto schedulerObject = scheduler_->AsObject();
388             if (schedulerObject != nullptr) {
389                 schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
390             }
391         }
392         scheduler_ = scheduler;
393     }
394 }
395 
GetToken() const396 sptr<Token> AbilityRecord::GetToken() const
397 {
398     return token_;
399 }
400 
SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)401 void AbilityRecord::SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
402 {
403     preAbilityRecord_ = abilityRecord;
404 }
405 
GetPreAbilityRecord() const406 std::shared_ptr<AbilityRecord> AbilityRecord::GetPreAbilityRecord() const
407 {
408     return preAbilityRecord_.lock();
409 }
410 
SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)411 void AbilityRecord::SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
412 {
413     nextAbilityRecord_ = abilityRecord;
414 }
415 
GetNextAbilityRecord() const416 std::shared_ptr<AbilityRecord> AbilityRecord::GetNextAbilityRecord() const
417 {
418     return nextAbilityRecord_.lock();
419 }
420 
SetBackAbilityRecord(const std::shared_ptr<AbilityRecord> & abilityRecord)421 void AbilityRecord::SetBackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord)
422 {
423     backAbilityRecord_ = abilityRecord;
424 }
425 
GetBackAbilityRecord() const426 std::shared_ptr<AbilityRecord> AbilityRecord::GetBackAbilityRecord() const
427 {
428     return backAbilityRecord_.lock();
429 }
430 
SetEventId(int64_t eventId)431 void AbilityRecord::SetEventId(int64_t eventId)
432 {
433     eventId_ = eventId;
434 }
435 
GetEventId() const436 int64_t AbilityRecord::GetEventId() const
437 {
438     return eventId_;
439 }
440 
IsReady() const441 bool AbilityRecord::IsReady() const
442 {
443     return isReady_;
444 }
445 
446 #ifdef SUPPORT_GRAPHICS
IsWindowAttached() const447 bool AbilityRecord::IsWindowAttached() const
448 {
449     return isWindowAttached_;
450 }
451 #endif
452 
IsLauncherAbility() const453 bool AbilityRecord::IsLauncherAbility() const
454 {
455     return isLauncherAbility_;
456 }
457 
IsTerminating() const458 bool AbilityRecord::IsTerminating() const
459 {
460     return isTerminating_;
461 }
462 
IsForceTerminate() const463 bool AbilityRecord::IsForceTerminate() const
464 {
465     return isForceTerminate_;
466 }
467 
SetForceTerminate(bool flag)468 void AbilityRecord::SetForceTerminate(bool flag)
469 {
470     isForceTerminate_ = flag;
471 }
472 
SetTerminatingState()473 void AbilityRecord::SetTerminatingState()
474 {
475     isTerminating_ = true;
476 }
477 
IsNewWant() const478 bool AbilityRecord::IsNewWant() const
479 {
480     return lifeCycleStateInfo_.isNewWant;
481 }
482 
SetIsNewWant(bool isNewWant)483 void AbilityRecord::SetIsNewWant(bool isNewWant)
484 {
485     lifeCycleStateInfo_.isNewWant = isNewWant;
486 }
487 
IsCreateByConnect() const488 bool AbilityRecord::IsCreateByConnect() const
489 {
490     return isCreateByConnect_;
491 }
492 
SetCreateByConnectMode()493 void AbilityRecord::SetCreateByConnectMode()
494 {
495     isCreateByConnect_ = true;
496 }
497 
Activate()498 void AbilityRecord::Activate()
499 {
500     HILOG_INFO("Activate.");
501     CHECK_POINTER(lifecycleDeal_);
502 
503     SendEvent(AbilityManagerService::ACTIVE_TIMEOUT_MSG, AbilityManagerService::ACTIVE_TIMEOUT);
504 
505     // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
506     // earlier than above actions.
507     currentState_ = AbilityState::ACTIVATING;
508     lifecycleDeal_->Activate(want_, lifeCycleStateInfo_);
509 
510     // update ability state to appMgr service when restart
511     if (IsNewWant()) {
512         sptr<Token> preToken = nullptr;
513         if (GetPreAbilityRecord()) {
514             preToken = GetPreAbilityRecord()->GetToken();
515         }
516         DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
517     }
518 }
519 
ProcessActivateInMoving()520 void AbilityRecord::ProcessActivateInMoving()
521 {
522     HILOG_DEBUG("ProcessActivateInMovingState.");
523     if (!IsAbilityState(AbilityState::ACTIVE) && !IsAbilityState(AbilityState::ACTIVATING)) {
524         SetInMovingState(true);
525         ProcessActivate();
526     }
527 }
528 
ProcessInactivateInMoving()529 void AbilityRecord::ProcessInactivateInMoving()
530 {
531     HILOG_DEBUG("ProcessInactivateInMoving.");
532     if (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING)) {
533         SetInMovingState(true);
534         ProcessInactivate();
535     }
536 }
537 
ProcessActivate()538 void AbilityRecord::ProcessActivate()
539 {
540     std::string element = GetWant().GetElement().GetURI();
541     HILOG_DEBUG("ability record: %{public}s", element.c_str());
542 
543     if (isReady_) {
544         if (IsAbilityState(AbilityState::BACKGROUND) || IsAbilityState(AbilityState::BACKGROUND_NEW)) {
545             // background to activte state
546             HILOG_DEBUG("MoveToForground, %{public}s", element.c_str());
547             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForground(token_);
548         } else {
549             HILOG_DEBUG("Activate %{public}s", element.c_str());
550             Activate();
551         }
552     } else {
553         LoadAbility();
554     }
555 }
556 
ProcessInactivate()557 void AbilityRecord::ProcessInactivate()
558 {
559     std::string element = GetWant().GetElement().GetURI();
560     HILOG_DEBUG("ability record: %{public}s", element.c_str());
561 
562     if (isReady_) {
563         if (IsAbilityState(AbilityState::BACKGROUND)) {
564             // background to activte state
565             HILOG_DEBUG("MoveToForground, %{public}s", element.c_str());
566             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForground(token_);
567         } else if (!IsAbilityState(AbilityState::INACTIVE) && !IsAbilityState(AbilityState::INACTIVATING)) {
568             HILOG_DEBUG("Inactivate %{public}s", element.c_str());
569             Inactivate();
570         }
571     } else {
572         LoadAbility();
573     }
574 }
575 
Inactivate()576 void AbilityRecord::Inactivate()
577 {
578     HILOG_INFO("Inactivate.");
579     CHECK_POINTER(lifecycleDeal_);
580 
581     SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
582 
583     // schedule inactive after updating AbilityState and sending timeout message to avoid ability async callback
584     // earlier than above actions.
585     currentState_ = AbilityState::INACTIVATING;
586     lifecycleDeal_->Inactivate(want_, lifeCycleStateInfo_);
587 }
588 
MoveToBackground(const Closure & task)589 void AbilityRecord::MoveToBackground(const Closure &task)
590 {
591     HILOG_INFO("Move to background.");
592     CHECK_POINTER(lifecycleDeal_);
593     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
594     if (handler && task) {
595         if (!want_.GetBoolParam(DEBUG_APP, false)) {
596             g_abilityRecordEventId_++;
597             eventId_ = g_abilityRecordEventId_;
598             // eventId_ is a unique id of the task.
599             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUND_TIMEOUT);
600         } else {
601             HILOG_INFO("Is debug mode, no need to handle time out.");
602         }
603     }
604 
605     if (!IsTerminating() || IsRestarting()) {
606         // schedule save ability state before moving to background.
607         SaveAbilityState();
608     }
609 
610     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
611     // earlier than above actions.
612     currentState_ = AbilityState::MOVING_BACKGROUND;
613     lifecycleDeal_->MoveToBackground(want_, lifeCycleStateInfo_);
614 }
615 
Terminate(const Closure & task)616 void AbilityRecord::Terminate(const Closure &task)
617 {
618     HILOG_INFO("Terminate ability.");
619     CHECK_POINTER(lifecycleDeal_);
620     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
621     if (handler && task) {
622         if (!want_.GetBoolParam(DEBUG_APP, false)) {
623             g_abilityRecordEventId_++;
624             eventId_ = g_abilityRecordEventId_;
625             // eventId_ is a unique id of the task.
626             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::TERMINATE_TIMEOUT);
627         } else {
628             HILOG_INFO("Is debug mode, no need to handle time out.");
629         }
630     }
631     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
632     // earlier than above actions.
633     currentState_ = AbilityState::TERMINATING;
634     lifecycleDeal_->Terminate(want_, lifeCycleStateInfo_);
635 }
636 
ConnectAbility()637 void AbilityRecord::ConnectAbility()
638 {
639     HILOG_INFO("Connect ability.");
640     CHECK_POINTER(lifecycleDeal_);
641     lifecycleDeal_->ConnectAbility(want_);
642 }
643 
DisconnectAbility()644 void AbilityRecord::DisconnectAbility()
645 {
646     HILOG_INFO("Disconnect ability.");
647     CHECK_POINTER(lifecycleDeal_);
648     lifecycleDeal_->DisconnectAbility(want_);
649 }
650 
CommandAbility()651 void AbilityRecord::CommandAbility()
652 {
653     HILOG_INFO("Command ability, startId_:%{public}d.", startId_);
654     CHECK_POINTER(lifecycleDeal_);
655     lifecycleDeal_->CommandAbility(want_, false, startId_);
656 }
657 
SaveAbilityState()658 void AbilityRecord::SaveAbilityState()
659 {
660     HILOG_INFO("%{public}s", __func__);
661     CHECK_POINTER(lifecycleDeal_);
662     lifecycleDeal_->SaveAbilityState();
663 }
664 
SaveAbilityState(const PacMap & inState)665 void AbilityRecord::SaveAbilityState(const PacMap &inState)
666 {
667     HILOG_INFO("%{public}s : pacmap save", __func__);
668     stateDatas_ = inState;
669 }
670 
RestoreAbilityState()671 void AbilityRecord::RestoreAbilityState()
672 {
673     HILOG_INFO("%{public}s", __func__);
674     CHECK_POINTER(lifecycleDeal_);
675     lifecycleDeal_->RestoreAbilityState(stateDatas_);
676     stateDatas_.Clear();
677     isRestarting_ = false;
678 }
679 
680 #ifdef SUPPORT_GRAPHICS
TopActiveAbilityChanged(bool flag)681 void AbilityRecord::TopActiveAbilityChanged(bool flag)
682 {
683     HILOG_INFO("%{public}s called, isTop: %{public}d", __func__, flag);
684     CHECK_POINTER(scheduler_);
685     scheduler_->NotifyTopActiveAbilityChanged(flag);
686 }
687 #endif
688 
SetWant(const Want & want)689 void AbilityRecord::SetWant(const Want &want)
690 {
691     want_ = want;
692 }
693 
GetWant() const694 const Want &AbilityRecord::GetWant() const
695 {
696     return want_;
697 }
698 
GetRequestCode() const699 int AbilityRecord::GetRequestCode() const
700 {
701     return requestCode_;
702 }
703 
SetResult(const std::shared_ptr<AbilityResult> & result)704 void AbilityRecord::SetResult(const std::shared_ptr<AbilityResult> &result)
705 {
706     result_ = result;
707 }
708 
GetResult() const709 std::shared_ptr<AbilityResult> AbilityRecord::GetResult() const
710 {
711     return result_;
712 }
713 
SendResult()714 void AbilityRecord::SendResult()
715 {
716     HILOG_INFO("Send result.");
717     std::lock_guard<std::mutex> guard(lock_);
718     CHECK_POINTER(scheduler_);
719     CHECK_POINTER(result_);
720     scheduler_->SendResult(result_->requestCode_, result_->resultCode_, result_->resultWant_);
721     GrantUriPermission(result_->resultWant_);
722     // reset result to avoid send result next time
723     result_.reset();
724 }
725 
SendResultToCallers()726 void AbilityRecord::SendResultToCallers()
727 {
728     for (auto caller : GetCallerRecordList()) {
729         if (caller == nullptr) {
730             HILOG_WARN("Caller record is nullptr.");
731             continue;
732         }
733         std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
734         if (callerAbilityRecord != nullptr && callerAbilityRecord->GetResult() != nullptr) {
735             callerAbilityRecord->SendResult();
736         }
737     }
738 }
739 
SaveResultToCallers(const int resultCode,const Want * resultWant)740 void AbilityRecord::SaveResultToCallers(const int resultCode, const Want *resultWant)
741 {
742     for (auto caller : GetCallerRecordList()) {
743         if (caller == nullptr) {
744             HILOG_WARN("Caller record is nullptr.");
745             continue;
746         }
747         std::shared_ptr<AbilityRecord> callerAbilityRecord = caller->GetCaller();
748         if (callerAbilityRecord != nullptr) {
749             callerAbilityRecord->SetResult(
750                 std::make_shared<AbilityResult>(caller->GetRequestCode(), resultCode, *resultWant));
751         }
752     }
753 }
754 
AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> & connRecord)755 void AbilityRecord::AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord)
756 {
757     CHECK_POINTER(connRecord);
758     auto it = std::find(connRecordList_.begin(), connRecordList_.end(), connRecord);
759     // found it
760     if (it != connRecordList_.end()) {
761         HILOG_DEBUG("Found it in list, so no need to add same connection(%{public}p)", connRecord.get());
762         return;
763     }
764     // no found then add new connection to list
765     HILOG_DEBUG("No found in list, so add new connection(%{public}p) to list", connRecord.get());
766     connRecordList_.push_back(connRecord);
767 }
768 
GetConnectRecordList() const769 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectRecordList() const
770 {
771     return connRecordList_;
772 }
773 
RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> & connRecord)774 void AbilityRecord::RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord)
775 {
776     CHECK_POINTER(connRecord);
777     connRecordList_.remove(connRecord);
778 }
779 
AddCallerRecord(const sptr<IRemoteObject> & callerToken,int requestCode)780 void AbilityRecord::AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode)
781 {
782     BYTRACE_NAME(BYTRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
783     HILOG_INFO("Add caller record.");
784     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
785     CHECK_POINTER(abilityRecord);
786 
787     auto isExist = [&abilityRecord](const std::shared_ptr<CallerRecord> &callerRecord) {
788         return (callerRecord->GetCaller() == abilityRecord);
789     };
790 
791     auto record = std::find_if(callerList_.begin(), callerList_.end(), isExist);
792     if (record != callerList_.end()) {
793         callerList_.erase(record);
794     }
795 
796     callerList_.emplace_back(std::make_shared<CallerRecord>(requestCode, abilityRecord));
797 
798     lifeCycleStateInfo_.caller.requestCode = requestCode;
799     lifeCycleStateInfo_.caller.deviceId = abilityRecord->GetAbilityInfo().deviceId;
800     lifeCycleStateInfo_.caller.bundleName = abilityRecord->GetAbilityInfo().bundleName;
801     lifeCycleStateInfo_.caller.abilityName = abilityRecord->GetAbilityInfo().name;
802     HILOG_INFO("caller %{public}s, %{public}s, %{public}s",
803         abilityRecord->GetAbilityInfo().deviceId.c_str(),
804         abilityRecord->GetAbilityInfo().bundleName.c_str(),
805         abilityRecord->GetAbilityInfo().name.c_str());
806 }
807 
GetCallerRecordList() const808 std::list<std::shared_ptr<CallerRecord>> AbilityRecord::GetCallerRecordList() const
809 {
810     return callerList_;
811 }
812 
GetCallerRecord() const813 std::shared_ptr<AbilityRecord> AbilityRecord::GetCallerRecord() const
814 {
815     if (callerList_.empty()) {
816         return nullptr;
817     }
818     return callerList_.back()->GetCaller();
819 }
820 
821 #ifdef SUPPORT_GRAPHICS
AddWindowInfo(int windowToken)822 void AbilityRecord::AddWindowInfo(int windowToken)
823 {
824     windowInfo_ = std::make_shared<WindowInfo>(windowToken);
825     isWindowAttached_ = true;
826 }
827 
RemoveWindowInfo()828 void AbilityRecord::RemoveWindowInfo()
829 {
830     windowInfo_.reset();
831 }
832 #endif
833 
IsConnectListEmpty()834 bool AbilityRecord::IsConnectListEmpty()
835 {
836     return connRecordList_.empty();
837 }
838 
GetWindowInfo() const839 std::shared_ptr<WindowInfo> AbilityRecord::GetWindowInfo() const
840 {
841     return windowInfo_;
842 }
843 
GetConnectingRecord() const844 std::shared_ptr<ConnectionRecord> AbilityRecord::GetConnectingRecord() const
845 {
846     auto connect =
847         std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
848             return record->GetConnectState() == ConnectionState::CONNECTING;
849         });
850     return (connect != connRecordList_.end()) ? *connect : nullptr;
851 }
852 
GetConnectingRecordList()853 std::list<std::shared_ptr<ConnectionRecord>> AbilityRecord::GetConnectingRecordList()
854 {
855     std::list<std::shared_ptr<ConnectionRecord>> connectingList;
856     for (auto record : connRecordList_) {
857         if (record && record->GetConnectState() == ConnectionState::CONNECTING) {
858             connectingList.push_back(record);
859         }
860     }
861     return connectingList;
862 }
863 
GetDisconnectingRecord() const864 std::shared_ptr<ConnectionRecord> AbilityRecord::GetDisconnectingRecord() const
865 {
866     auto connect =
867         std::find_if(connRecordList_.begin(), connRecordList_.end(), [](std::shared_ptr<ConnectionRecord> record) {
868             return record->GetConnectState() == ConnectionState::DISCONNECTING;
869         });
870     return (connect != connRecordList_.end()) ? *connect : nullptr;
871 }
872 
GetAbilityTypeString(std::string & typeStr)873 void AbilityRecord::GetAbilityTypeString(std::string &typeStr)
874 {
875     AppExecFwk::AbilityType type = GetAbilityInfo().type;
876     switch (type) {
877 #ifdef SUPPORT_GRAPHICS
878         case AppExecFwk::AbilityType::PAGE: {
879             typeStr = "PAGE";
880             break;
881         }
882 #endif
883         case AppExecFwk::AbilityType::SERVICE: {
884             typeStr = "SERVICE";
885             break;
886         }
887         // for config.json type
888         case AppExecFwk::AbilityType::DATA: {
889             typeStr = "DATA";
890             break;
891         }
892         default: {
893             typeStr = "UNKNOWN";
894             break;
895         }
896     }
897 }
898 
ConvertAbilityState(const AbilityState & state)899 std::string AbilityRecord::ConvertAbilityState(const AbilityState &state)
900 {
901     auto it = stateToStrMap.find(state);
902     if (it != stateToStrMap.end()) {
903         return it->second;
904     }
905     return "INVALIDSTATE";
906 }
907 
ConvertAppState(const AppState & state)908 std::string AbilityRecord::ConvertAppState(const AppState &state)
909 {
910     auto it = appStateToStrMap_.find(state);
911     if (it != appStateToStrMap_.end()) {
912         return it->second;
913     }
914     return "INVALIDSTATE";
915 }
916 
ConvertLifeCycleToAbilityState(const AbilityLifeCycleState & state)917 int AbilityRecord::ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state)
918 {
919     auto it = convertStateMap.find(state);
920     if (it != convertStateMap.end()) {
921         return it->second;
922     }
923     return DEFAULT_INVAL_VALUE;
924 }
925 
Dump(std::vector<std::string> & info)926 void AbilityRecord::Dump(std::vector<std::string> &info)
927 {
928     std::string dumpInfo = "      AbilityRecord ID #" + std::to_string(recordId_);
929     info.push_back(dumpInfo);
930     dumpInfo = "        app name [" + GetAbilityInfo().applicationName + "]";
931     info.push_back(dumpInfo);
932     dumpInfo = "        main name [" + GetAbilityInfo().name + "]";
933     info.push_back(dumpInfo);
934     dumpInfo = "        bundle name [" + GetAbilityInfo().bundleName + "]";
935     info.push_back(dumpInfo);
936     // get ability type(unknown/page/service/provider)
937     std::string typeStr;
938     GetAbilityTypeString(typeStr);
939     dumpInfo = "        ability type [" + typeStr + "]";
940     info.push_back(dumpInfo);
941     std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
942     if (preAbility == nullptr) {
943         dumpInfo = "        previous ability app name [NULL]" + LINE_SEPARATOR;
944         dumpInfo += "        previous ability file name [NULL]";
945     } else {
946         dumpInfo =
947             "        previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
948         dumpInfo += "        previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
949     }
950     info.push_back(dumpInfo);
951     std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
952     if (nextAbility == nullptr) {
953         dumpInfo = "        next ability app name [NULL]" + LINE_SEPARATOR;
954         dumpInfo += "        next ability file name [NULL]";
955     } else {
956         dumpInfo =
957             "        next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
958         dumpInfo += "        next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
959     }
960     info.push_back(dumpInfo);
961     dumpInfo = "        state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + "  start time [" +
962                std::to_string(startTime_) + "]";
963     info.push_back(dumpInfo);
964     dumpInfo = "        app state #" + AbilityRecord::ConvertAppState(appState_);
965     info.push_back(dumpInfo);
966     dumpInfo = "        ready #" + std::to_string(isReady_) + "  window attached #" +
967                std::to_string(isWindowAttached_) + "  launcher #" + std::to_string(isLauncherAbility_);
968     info.push_back(dumpInfo);
969 
970     if (isLauncherRoot_) {
971         dumpInfo = "        can restart num #" + std::to_string(restartCount_);
972         info.push_back(dumpInfo);
973     }
974 }
975 
DumpAbilityState(std::vector<std::string> & info,bool isClient,const std::vector<std::string> & params)976 void AbilityRecord::DumpAbilityState(
977     std::vector<std::string> &info, bool isClient, const std::vector<std::string> &params)
978 {
979     HILOG_INFO("%{public}s begin.", __func__);
980     std::string dumpInfo = "      AbilityRecord ID #" + std::to_string(recordId_);
981     info.push_back(dumpInfo);
982     dumpInfo = "        app name [" + GetAbilityInfo().applicationName + "]";
983     info.push_back(dumpInfo);
984     dumpInfo = "        main name [" + GetAbilityInfo().name + "]";
985     info.push_back(dumpInfo);
986     dumpInfo = "        bundle name [" + GetAbilityInfo().bundleName + "]";
987     info.push_back(dumpInfo);
988     std::string typeStr;
989     GetAbilityTypeString(typeStr);
990     dumpInfo = "        ability type [" + typeStr + "]";
991     info.push_back(dumpInfo);
992 
993     dumpInfo = "        state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + "  start time [" +
994                std::to_string(startTime_) + "]";
995     info.push_back(dumpInfo);
996     dumpInfo = "        app state #" + AbilityRecord::ConvertAppState(appState_);
997     info.push_back(dumpInfo);
998     dumpInfo = "        ready #" + std::to_string(isReady_) + "  window attached #" +
999                std::to_string(isWindowAttached_) + "  launcher #" + std::to_string(isLauncherAbility_);
1000     info.push_back(dumpInfo);
1001     dumpInfo = "        callee connections: ";
1002     info.push_back(dumpInfo);
1003     if (callContainer_) {
1004         callContainer_->Dump(info);
1005     }
1006 
1007     if (isLauncherRoot_) {
1008         dumpInfo = "        can restart num #" + std::to_string(restartCount_);
1009         info.push_back(dumpInfo);
1010     }
1011 
1012     // add dump client info
1013     DumpClientInfo(info, params, isClient, params.empty());
1014 }
1015 
SetStartTime()1016 void AbilityRecord::SetStartTime()
1017 {
1018     if (startTime_ == 0) {
1019         startTime_ = AbilityUtil::SystemTimeMillis();
1020     }
1021 }
1022 
GetStartTime() const1023 int64_t AbilityRecord::GetStartTime() const
1024 {
1025     return startTime_;
1026 }
1027 
DumpService(std::vector<std::string> & info,bool isClient) const1028 void AbilityRecord::DumpService(std::vector<std::string> &info, bool isClient) const
1029 {
1030     info.emplace_back("      AbilityRecord ID #" + std::to_string(GetRecordId()) + "   state #" +
1031                       AbilityRecord::ConvertAbilityState(GetAbilityState()) + "   start time [" +
1032                       std::to_string(GetStartTime()) + "]");
1033     info.emplace_back("      main name [" + GetAbilityInfo().name + "]");
1034     info.emplace_back("      bundle name [" + GetAbilityInfo().bundleName + "]");
1035     info.emplace_back("      ability type [SERVICE]");
1036     info.emplace_back("      app state #" + AbilityRecord::ConvertAppState(appState_));
1037 
1038     if (isLauncherRoot_) {
1039         info.emplace_back("      can restart num #" + std::to_string(restartCount_));
1040     }
1041 
1042     info.emplace_back("      Connections: " + std::to_string(connRecordList_.size()));
1043     for (auto &&conn : connRecordList_) {
1044         if (conn) {
1045             conn->Dump(info);
1046         }
1047     }
1048     // add dump client info
1049     const std::vector<std::string> params;
1050     DumpClientInfo(info, params, isClient);
1051 }
1052 
GetAbilityRecordInfo(AbilityRecordInfo & recordInfo)1053 void AbilityRecord::GetAbilityRecordInfo(AbilityRecordInfo &recordInfo)
1054 {
1055     recordInfo.elementName = want_.GetElement().GetURI();
1056     recordInfo.id = recordId_;
1057     recordInfo.appName = abilityInfo_.applicationName;
1058     recordInfo.mainName = abilityInfo_.name;
1059     recordInfo.abilityType = static_cast<int32_t>(abilityInfo_.type);
1060 
1061     std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1062     if (preAbility) {
1063         recordInfo.previousAppName = preAbility->GetAbilityInfo().applicationName;
1064         recordInfo.previousMainName = preAbility->GetAbilityInfo().name;
1065     }
1066 
1067     std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1068     if (nextAbility) {
1069         recordInfo.nextAppName = nextAbility->GetAbilityInfo().applicationName;
1070         recordInfo.nextMainName = nextAbility->GetAbilityInfo().name;
1071     }
1072 
1073     recordInfo.state = static_cast<AbilityState>(currentState_);
1074     recordInfo.startTime = std::to_string(startTime_);
1075     recordInfo.ready = isReady_;
1076     recordInfo.windowAttached = isWindowAttached_;
1077     recordInfo.lanucher = isLauncherAbility_;
1078 }
1079 
OnSchedulerDied(const wptr<IRemoteObject> & remote)1080 void AbilityRecord::OnSchedulerDied(const wptr<IRemoteObject> &remote)
1081 {
1082     HILOG_WARN("On scheduler died.");
1083     auto mission = GetMission();
1084     if (mission) {
1085         HILOG_WARN("On scheduler died. Is app not response Reason:%{public}d", mission->IsANRState());
1086     }
1087     std::lock_guard<std::mutex> guard(lock_);
1088     CHECK_POINTER(scheduler_);
1089 
1090     auto object = remote.promote();
1091     CHECK_POINTER(object);
1092 
1093     if (object != scheduler_->AsObject()) {
1094         HILOG_ERROR("Ability on scheduler died: scheduler is not matches with remote.");
1095         return;
1096     }
1097 
1098     if (scheduler_ != nullptr && schedulerDeathRecipient_ != nullptr) {
1099         auto schedulerObject = scheduler_->AsObject();
1100         if (schedulerObject != nullptr) {
1101             schedulerObject->RemoveDeathRecipient(schedulerDeathRecipient_);
1102         }
1103     }
1104     scheduler_.clear();
1105     CHECK_POINTER(lifecycleDeal_);
1106     lifecycleDeal_->SetScheduler(nullptr);
1107     isWindowAttached_ = false;
1108 
1109     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1110     CHECK_POINTER(abilityManagerService);
1111 
1112     auto handler = abilityManagerService->GetEventHandler();
1113     CHECK_POINTER(handler);
1114 
1115     HILOG_INFO("Ability on scheduler died: '%{public}s'", abilityInfo_.name.c_str());
1116     auto task = [abilityManagerService, ability = shared_from_this()]() {
1117         abilityManagerService->OnAbilityDied(ability);
1118     };
1119     handler->PostTask(task);
1120     auto uriTask = [want = want_, ability = shared_from_this()]() {
1121         ability->SaveResultToCallers(-1, &want);
1122         ability->SendResultToCallers();
1123     };
1124     handler->PostTask(uriTask);
1125 }
1126 
SetConnRemoteObject(const sptr<IRemoteObject> & remoteObject)1127 void AbilityRecord::SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject)
1128 {
1129     connRemoteObject_ = remoteObject;
1130 }
1131 
GetConnRemoteObject() const1132 sptr<IRemoteObject> AbilityRecord::GetConnRemoteObject() const
1133 {
1134     return connRemoteObject_;
1135 }
1136 
AddStartId()1137 void AbilityRecord::AddStartId()
1138 {
1139     startId_++;
1140 }
GetStartId() const1141 int AbilityRecord::GetStartId() const
1142 {
1143     return startId_;
1144 }
1145 
SetIsUninstallAbility()1146 void AbilityRecord::SetIsUninstallAbility()
1147 {
1148     isUninstall_ = true;
1149 }
1150 
IsUninstallAbility() const1151 bool AbilityRecord::IsUninstallAbility() const
1152 {
1153     return isUninstall_;
1154 }
1155 
SetKernalSystemAbility()1156 void AbilityRecord::SetKernalSystemAbility()
1157 {
1158     isKernalSystemAbility_ = true;
1159 }
1160 
IsKernalSystemAbility() const1161 bool AbilityRecord::IsKernalSystemAbility() const
1162 {
1163     return isKernalSystemAbility_;
1164 }
1165 
SetLauncherRoot()1166 void AbilityRecord::SetLauncherRoot()
1167 {
1168     isLauncherRoot_ = true;
1169 }
1170 
IsLauncherRoot() const1171 bool AbilityRecord::IsLauncherRoot() const
1172 {
1173     return isLauncherRoot_;
1174 }
1175 
IsAbilityState(const AbilityState & state) const1176 bool AbilityRecord::IsAbilityState(const AbilityState &state) const
1177 {
1178     return (currentState_ == state);
1179 }
1180 
IsActiveState() const1181 bool AbilityRecord::IsActiveState() const
1182 {
1183     return (IsAbilityState(AbilityState::ACTIVE) || IsAbilityState(AbilityState::ACTIVATING) ||
1184             IsAbilityState(AbilityState::INITIAL) || IsAbilityState(AbilityState::FOREGROUND_NEW) ||
1185             IsAbilityState(AbilityState::FOREGROUNDING_NEW));
1186 }
1187 
SendEvent(uint32_t msg,uint32_t timeOut)1188 void AbilityRecord::SendEvent(uint32_t msg, uint32_t timeOut)
1189 {
1190     if (want_.GetBoolParam(DEBUG_APP, false)) {
1191         HILOG_INFO("Is debug mode, no need to handle time out.");
1192         return;
1193     }
1194     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1195     CHECK_POINTER(handler);
1196 
1197     g_abilityRecordEventId_++;
1198     eventId_ = g_abilityRecordEventId_;
1199     handler->SendEvent(msg, eventId_, timeOut);
1200 }
1201 
1202 #ifdef SUPPORT_GRAPHICS
SupportMultWindow() const1203 bool AbilityRecord::SupportMultWindow() const
1204 {
1205     // LauncherAbility don't support multi window display.
1206     if (isLauncherAbility_) {
1207         return false;
1208     }
1209 
1210     return true;
1211 }
1212 
NotifyMultiWinModeChanged(const AbilityWindowConfiguration & winModeKey,bool flag)1213 void AbilityRecord::NotifyMultiWinModeChanged(const AbilityWindowConfiguration &winModeKey, bool flag)
1214 {
1215     HILOG_INFO("Notify multi window mode changed.");
1216     CHECK_POINTER(scheduler_);
1217     scheduler_->NotifyMultiWinModeChanged(static_cast<int32_t>(winModeKey), flag);
1218 }
1219 #endif
1220 
SetInMovingState(bool isMoving)1221 void AbilityRecord::SetInMovingState(bool isMoving)
1222 {
1223     isInMovingState_ = isMoving;
1224 }
1225 
GetInMovingState() const1226 bool AbilityRecord::GetInMovingState() const
1227 {
1228     return isInMovingState_;
1229 }
1230 
IsToEnd() const1231 bool AbilityRecord::IsToEnd() const
1232 {
1233     return isToEnd_;
1234 }
SetToEnd(bool isToEnd)1235 void AbilityRecord::SetToEnd(bool isToEnd)
1236 {
1237     isToEnd_ = isToEnd;
1238 }
1239 
SetStartSetting(const std::shared_ptr<AbilityStartSetting> & setting)1240 void AbilityRecord::SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting)
1241 {
1242     lifeCycleStateInfo_.setting = setting;
1243 }
1244 
GetStartSetting() const1245 std::shared_ptr<AbilityStartSetting> AbilityRecord::GetStartSetting() const
1246 {
1247     return lifeCycleStateInfo_.setting;
1248 }
1249 
SetPowerState(const bool isPower)1250 void AbilityRecord::SetPowerState(const bool isPower)
1251 {
1252     isPowerState_ = isPower;
1253 }
1254 
GetPowerState() const1255 bool AbilityRecord::GetPowerState() const
1256 {
1257     return isPowerState_;
1258 }
1259 
SetRestarting(const bool isRestart)1260 void AbilityRecord::SetRestarting(const bool isRestart)
1261 {
1262     isRestarting_ = isRestart;
1263     HILOG_DEBUG("SetRestarting: %{public}d", isRestarting_);
1264 
1265     if (isLauncherRoot_ && IsLauncherAbility()) {
1266         restartCount_ = isRestart ? (--restartCount_) : restratMax_;
1267         HILOG_INFO("root launcher restart count: %{public}d", restartCount_);
1268     }
1269 }
1270 
SetRestarting(const bool isRestart,int32_t canReStartCount)1271 void AbilityRecord::SetRestarting(const bool isRestart, int32_t canReStartCount)
1272 {
1273     isRestarting_ = isRestart;
1274     HILOG_DEBUG("SetRestarting: %{public}d, restart count: %{public}d", isRestarting_, canReStartCount);
1275 
1276     if (isLauncherRoot_ && IsLauncherAbility()) {
1277         restartCount_ = isRestart ? canReStartCount : restratMax_;
1278         HILOG_INFO("root launcher restart count: %{public}d", restartCount_);
1279     }
1280 }
1281 
GetRestartCount() const1282 int32_t AbilityRecord::GetRestartCount() const
1283 {
1284     return restartCount_;
1285 }
1286 
IsRestarting() const1287 bool AbilityRecord::IsRestarting() const
1288 {
1289     return isRestarting_;
1290 }
1291 
SetAppState(const AppState & state)1292 void AbilityRecord::SetAppState(const AppState &state)
1293 {
1294     appState_ = state;
1295 }
1296 
GetAppState() const1297 AppState AbilityRecord::GetAppState() const
1298 {
1299     return appState_;
1300 }
1301 
ClearFlag()1302 void AbilityRecord::ClearFlag()
1303 {
1304     isRestarting_ = false;
1305     isPowerState_ = false;
1306     isForceTerminate_ = false;
1307     isUninstall_ = false;
1308     isTerminating_ = false;
1309     isInMovingState_ = false;
1310     preAbilityRecord_.reset();
1311     nextAbilityRecord_.reset();
1312     backAbilityRecord_.reset();
1313     startTime_ = 0;
1314     appState_ = AppState::END;
1315 }
1316 
1317 #ifdef SUPPORT_GRAPHICS
SetLockScreenState(const bool isLock)1318 void AbilityRecord::SetLockScreenState(const bool isLock)
1319 {
1320     isLockScreenState_ = isLock;
1321 }
1322 
GetLockScreenState() const1323 bool AbilityRecord::GetLockScreenState() const
1324 {
1325     return isLockScreenState_;
1326 }
1327 #endif
1328 
SetMovingBackgroundFlag(bool isMoving)1329 void AbilityRecord::SetMovingBackgroundFlag(bool isMoving)
1330 {
1331     isMovingBackground_ = isMoving;
1332 }
1333 
IsMovingBackground() const1334 bool AbilityRecord::IsMovingBackground() const
1335 {
1336     return isMovingBackground_;
1337 }
1338 
1339 #ifdef SUPPORT_GRAPHICS
SetLockScreenRoot()1340 void AbilityRecord::SetLockScreenRoot()
1341 {
1342     isLockScreenRoot_ = true;
1343 }
1344 
IsLockScreenRoot() const1345 bool AbilityRecord::IsLockScreenRoot() const
1346 {
1347     return isLockScreenRoot_;
1348 }
1349 
SetPowerStateLockScreen(const bool isPower)1350 void AbilityRecord::SetPowerStateLockScreen(const bool isPower)
1351 {
1352     isPowerStateLockScreen_ = isPower;
1353 }
1354 
GetPowerStateLockScreen() const1355 bool AbilityRecord::GetPowerStateLockScreen() const
1356 {
1357     return isPowerStateLockScreen_;
1358 }
1359 #endif
1360 
IsNewVersion()1361 bool AbilityRecord::IsNewVersion()
1362 {
1363     return compatibleVersion_ > API_VERSION_7;
1364 }
1365 
SetLaunchReason(const LaunchReason & reason)1366 void AbilityRecord::SetLaunchReason(const LaunchReason &reason)
1367 {
1368     lifeCycleStateInfo_.launchParam.launchReason = reason;
1369 }
1370 
SetLastExitReason(const LastExitReason & reason)1371 void AbilityRecord::SetLastExitReason(const LastExitReason &reason)
1372 {
1373     lifeCycleStateInfo_.launchParam.lastExitReason = reason;
1374 }
1375 
NotifyContinuationResult(int32_t result)1376 void AbilityRecord::NotifyContinuationResult(int32_t result)
1377 {
1378     HILOG_INFO("NotifyContinuationResult.");
1379     CHECK_POINTER(lifecycleDeal_);
1380 
1381     lifecycleDeal_->NotifyContinuationResult(result);
1382 }
1383 
1384 #ifdef SUPPORT_GRAPHICS
GetOwnedMissionList() const1385 std::shared_ptr<MissionList> AbilityRecord::GetOwnedMissionList() const
1386 {
1387     return missionList_.lock();
1388 }
1389 
SetMissionList(const std::shared_ptr<MissionList> & missionList)1390 void AbilityRecord::SetMissionList(const std::shared_ptr<MissionList> &missionList)
1391 {
1392     missionList_ = missionList;
1393 }
1394 
SetUseNewMission()1395 void AbilityRecord::SetUseNewMission()
1396 {
1397     lifeCycleStateInfo_.useNewMission = true;
1398 }
1399 
SetMission(const std::shared_ptr<Mission> & mission)1400 void AbilityRecord::SetMission(const std::shared_ptr<Mission> &mission)
1401 {
1402     if (mission) {
1403         missionId_ = mission->GetMissionId();
1404         HILOG_INFO("SetMission come, missionId is %{public}d.", missionId_);
1405     }
1406     mission_ = mission;
1407 }
1408 #endif
1409 
SetMinimizeReason(bool fromUser)1410 void AbilityRecord::SetMinimizeReason(bool fromUser)
1411 {
1412     minimizeReason_ = fromUser;
1413 }
1414 
IsMinimizeFromUser() const1415 bool AbilityRecord::IsMinimizeFromUser() const
1416 {
1417     return minimizeReason_;
1418 }
1419 
1420 #ifdef SUPPORT_GRAPHICS
GetMission() const1421 std::shared_ptr<Mission> AbilityRecord::GetMission() const
1422 {
1423     return mission_.lock();
1424 }
1425 
GetMissionId() const1426 int32_t AbilityRecord::GetMissionId() const
1427 {
1428     return missionId_;
1429 }
1430 #endif
1431 
SetSpecifiedFlag(const std::string & flag)1432 void AbilityRecord::SetSpecifiedFlag(const std::string &flag)
1433 {
1434     specifiedFlag_ = flag;
1435 }
1436 
GetSpecifiedFlag() const1437 std::string AbilityRecord::GetSpecifiedFlag() const
1438 {
1439     return specifiedFlag_;
1440 }
1441 
AbilityRecordNew(const Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const AppExecFwk::ApplicationInfo & applicationInfo,int requestCode,int32_t apiVersion)1442 AbilityRecordNew::AbilityRecordNew(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo,
1443     const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode, int32_t apiVersion)
1444     : AbilityRecord(want, abilityInfo, applicationInfo, requestCode, apiVersion)
1445 {
1446 }
1447 
~AbilityRecordNew()1448 AbilityRecordNew::~AbilityRecordNew()
1449 {
1450 }
1451 
Activate()1452 void AbilityRecordNew::Activate()
1453 {
1454     ForegroundNew();
1455 }
1456 
Inactivate()1457 void AbilityRecordNew::Inactivate()
1458 {
1459     HILOG_INFO("AbilityRecordNew Move to Inactivate.");
1460     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1461     if (handler == nullptr) {
1462         HILOG_ERROR("handler is nullptr or task is nullptr.");
1463         return;
1464     }
1465     SendEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, AbilityManagerService::INACTIVE_TIMEOUT);
1466 
1467     auto task = [token = token_]() {
1468         HILOG_DEBUG("AbilityRecordNew inactive done.");
1469         PacMap restoreData;
1470         DelayedSingleton<AbilityManagerService>::GetInstance()->AbilityTransitionDone(token,
1471             ABILITY_STATE_INACTIVE, restoreData);
1472     };
1473     handler->PostTask(task);
1474 }
1475 
ForegroundNew()1476 void AbilityRecordNew::ForegroundNew()
1477 {
1478     HILOG_INFO("ForegroundingNew.");
1479     CHECK_POINTER(lifecycleDeal_);
1480 
1481     SendEvent(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, AbilityManagerService::FOREGROUNDNEW_TIMEOUT);
1482 
1483     // schedule active after updating AbilityState and sending timeout message to avoid ability async callback
1484     // earlier than above actions.
1485     currentState_ = AbilityState::FOREGROUNDING_NEW;
1486     lifecycleDeal_->ForegroundNew(want_, lifeCycleStateInfo_);
1487 
1488     // update ability state to appMgr service when restart
1489     if (IsNewWant()) {
1490         sptr<Token> preToken = nullptr;
1491         if (GetPreAbilityRecord()) {
1492             preToken = GetPreAbilityRecord()->GetToken();
1493         }
1494         DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token_, preToken, 1, 1, 1);
1495     }
1496 }
1497 
MoveToBackground(const Closure & task)1498 void AbilityRecordNew::MoveToBackground(const Closure &task)
1499 {
1500     BackgroundNew(task);
1501 }
1502 
BackgroundNew(const Closure & task)1503 void AbilityRecordNew::BackgroundNew(const Closure &task)
1504 {
1505     HILOG_INFO("Move to backgroundNew.");
1506     CHECK_POINTER(lifecycleDeal_);
1507     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1508     if (handler && task) {
1509         if (!want_.GetBoolParam(DEBUG_APP, false)) {
1510             g_abilityRecordEventId_++;
1511             eventId_ = g_abilityRecordEventId_;
1512             // eventId_ is a unique id of the task.
1513             handler->PostTask(task, std::to_string(eventId_), AbilityManagerService::BACKGROUNDNEW_TIMEOUT);
1514         } else {
1515             HILOG_INFO("Is debug mode, no need to handle time out.");
1516         }
1517     }
1518 
1519     if (!IsTerminating() || IsRestarting()) {
1520         // schedule save ability state before moving to background.
1521         SaveAbilityState();
1522     }
1523 
1524     // schedule background after updating AbilityState and sending timeout message to avoid ability async callback
1525     // earlier than above actions.
1526     currentState_ = AbilityState::BACKGROUNDING_NEW;
1527     lifecycleDeal_->BackgroundNew(want_, lifeCycleStateInfo_);
1528 }
1529 
1530 // new version  --start
IsStartedByCall() const1531 bool AbilityRecord::IsStartedByCall() const
1532 {
1533     return isStartedByCall_;
1534 }
1535 
SetStartedByCall(const bool isFlag)1536 void AbilityRecord::SetStartedByCall(const bool isFlag)
1537 {
1538     isStartedByCall_ = isFlag;
1539 }
1540 
IsStartToBackground() const1541 bool AbilityRecord::IsStartToBackground() const
1542 {
1543     return isStartToBackground_;
1544 }
1545 
SetStartToBackground(const bool flag)1546 void AbilityRecord::SetStartToBackground(const bool flag)
1547 {
1548     isStartToBackground_ = flag;
1549 }
1550 
CallRequest()1551 bool AbilityRecord::CallRequest()
1552 {
1553     HILOG_INFO("Call Request.");
1554     CHECK_POINTER_RETURN_BOOL(scheduler_);
1555     CHECK_POINTER_RETURN_BOOL(callContainer_);
1556 
1557     // sync call request
1558     sptr<IRemoteObject> callStub = scheduler_->CallRequest();
1559     if (!callStub) {
1560         HILOG_ERROR("call request failed, callstub is nullptr.");
1561         return false;
1562     }
1563 
1564     // complete call request
1565     return callContainer_->CallRequestDone(callStub);
1566 }
1567 
Resolve(const AbilityRequest & abilityRequest)1568 ResolveResultType AbilityRecord::Resolve(const AbilityRequest &abilityRequest)
1569 {
1570     auto callback = abilityRequest.connect;
1571     if (abilityRequest.callType != AbilityCallType::CALL_REQUEST_TYPE || !callback) {
1572         HILOG_ERROR("only startd by call type can create a call record.");
1573         return ResolveResultType::NG_INNER_ERROR;
1574     }
1575     if (!callContainer_) {
1576         callContainer_ = std::make_shared<CallContainer>();
1577         if (!callContainer_) {
1578             HILOG_ERROR("mark_shared error.");
1579             return ResolveResultType::NG_INNER_ERROR;
1580         }
1581     }
1582 
1583     HILOG_DEBUG("create call record for this resolve. callerUid:%{public}d ,targetname:%{public}s",
1584         abilityRequest.callerUid,
1585         abilityRequest.abilityInfo.name.c_str());
1586 
1587     std::shared_ptr<CallRecord> callRecord = callContainer_->GetCallRecord(callback);
1588     if (!callRecord) {
1589         callRecord = CallRecord::CreateCallRecord(
1590             abilityRequest.callerUid, shared_from_this(), callback, abilityRequest.callerToken);
1591         if (!callRecord) {
1592             HILOG_ERROR("mark_shared error.");
1593             return ResolveResultType::NG_INNER_ERROR;
1594         }
1595     }
1596 
1597     callContainer_->AddCallRecord(callback, callRecord);
1598 
1599     if (callRecord->IsCallState(CallState::REQUESTED) && callRecord->GetCallStub()) {
1600         HILOG_DEBUG("this record has requested.");
1601         if (!callRecord->SchedulerConnectDone()) {
1602             HILOG_DEBUG("this callrecord has requested, but callback failed.");
1603             return ResolveResultType::NG_INNER_ERROR;
1604         }
1605         return ResolveResultType::OK_HAS_REMOTE_OBJ;
1606     }
1607 
1608     callRecord->SetCallState(CallState::REQUESTING);
1609     return ResolveResultType::OK_NO_REMOTE_OBJ;
1610 }
1611 
Release(const sptr<IAbilityConnection> & connect)1612 bool AbilityRecord::Release(const sptr<IAbilityConnection> & connect)
1613 {
1614     HILOG_DEBUG("ability release call record by callback.");
1615     CHECK_POINTER_RETURN_BOOL(callContainer_);
1616 
1617     return callContainer_->RemoveCallRecord(connect);
1618 }
1619 
IsNeedToCallRequest() const1620 bool AbilityRecord::IsNeedToCallRequest() const
1621 {
1622     HILOG_DEBUG("ability release call record by callback.");
1623     CHECK_POINTER_RETURN_BOOL(callContainer_);
1624 
1625     return callContainer_->IsNeedToCallRequest();
1626 }
1627 
ContinueAbility(const std::string & deviceId)1628 void AbilityRecord::ContinueAbility(const std::string& deviceId)
1629 {
1630     HILOG_INFO("ContinueAbility.");
1631     CHECK_POINTER(lifecycleDeal_);
1632 
1633     lifecycleDeal_->ContinueAbility(deviceId);
1634 }
1635 
SetSwitchingPause(bool state)1636 void AbilityRecord::SetSwitchingPause(bool state)
1637 {
1638     isSwitchingPause_ = state;
1639 }
1640 
IsSwitchingPause()1641 bool AbilityRecord::IsSwitchingPause()
1642 {
1643     return isSwitchingPause_;
1644 }
1645 
SetOwnerMissionUserId(int32_t userId)1646 void AbilityRecord::SetOwnerMissionUserId(int32_t userId)
1647 {
1648     ownerMissionUserId_ = userId;
1649 }
1650 
GetOwnerMissionUserId()1651 int32_t AbilityRecord::GetOwnerMissionUserId()
1652 {
1653     return ownerMissionUserId_;
1654 }
1655 
DumpSys(std::vector<std::string> & info,bool isClient)1656 void AbilityRecord::DumpSys(std::vector<std::string> &info, bool isClient)
1657 {
1658     std::string dumpInfo = "      AbilityRecord ID #" + std::to_string(recordId_);
1659     info.push_back(dumpInfo);
1660     dumpInfo = "        app name [" + GetAbilityInfo().applicationName + "]";
1661     info.push_back(dumpInfo);
1662     dumpInfo = "        main name [" + GetAbilityInfo().name + "]";
1663     info.push_back(dumpInfo);
1664     dumpInfo = "        bundle name [" + GetAbilityInfo().bundleName + "]";
1665     info.push_back(dumpInfo);
1666     std::string typeStr;
1667     GetAbilityTypeString(typeStr);
1668     dumpInfo = "        ability type [" + typeStr + "]";
1669     info.push_back(dumpInfo);
1670     std::shared_ptr<AbilityRecord> preAbility = GetPreAbilityRecord();
1671     if (preAbility == nullptr) {
1672         dumpInfo = "        previous ability app name [NULL]" + LINE_SEPARATOR;
1673         dumpInfo += "        previous ability file name [NULL]";
1674     } else {
1675         dumpInfo =
1676             "        previous ability app name [" + preAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
1677         dumpInfo += "        previous ability file name [" + preAbility->GetAbilityInfo().name + "]";
1678     }
1679     info.push_back(dumpInfo);
1680     std::shared_ptr<AbilityRecord> nextAbility = GetNextAbilityRecord();
1681     if (nextAbility == nullptr) {
1682         dumpInfo = "        next ability app name [NULL]" + LINE_SEPARATOR;
1683         dumpInfo += "        next ability file name [NULL]";
1684     } else {
1685         dumpInfo =
1686             "        next ability app name [" + nextAbility->GetAbilityInfo().applicationName + "]" + LINE_SEPARATOR;
1687         dumpInfo += "        next ability main name [" + nextAbility->GetAbilityInfo().name + "]";
1688     }
1689     info.push_back(dumpInfo);
1690     dumpInfo = "        state #" + AbilityRecord::ConvertAbilityState(GetAbilityState()) + "  start time [" +
1691                std::to_string(startTime_) + "]";
1692     info.push_back(dumpInfo);
1693     dumpInfo = "        app state #" + AbilityRecord::ConvertAppState(appState_);
1694     info.push_back(dumpInfo);
1695     dumpInfo = "        ready #" + std::to_string(isReady_) + "  window attached #" +
1696                std::to_string(isWindowAttached_) + "  launcher #" + std::to_string(isLauncherAbility_);
1697     info.push_back(dumpInfo);
1698 
1699     if (isLauncherRoot_ && IsNewVersion()) {
1700         dumpInfo = "        can restart num #" + std::to_string(restartCount_);
1701         info.push_back(dumpInfo);
1702     }
1703     const std::vector<std::string> params;
1704     DumpClientInfo(info, params, isClient);
1705 }
1706 
DumpClientInfo(std::vector<std::string> & info,const std::vector<std::string> & params,bool isClient,bool dumpConfig) const1707 void AbilityRecord::DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> &params,
1708     bool isClient, bool dumpConfig) const
1709 {
1710     if (!isClient || !scheduler_ || !isReady_) {
1711         HILOG_ERROR("something nullptr.");
1712         return;
1713     }
1714     std::unique_lock<std::mutex> lock(dumpLock_);
1715     scheduler_->DumpAbilityInfo(params, info);
1716 
1717     HILOG_INFO("Dump begin wait.");
1718     isDumpTimeout_ = false;
1719     std::chrono::milliseconds timeout { AbilityManagerService::DUMP_TIMEOUT };
1720     if (dumpCondition_.wait_for(lock, timeout) == std::cv_status::timeout) {
1721         isDumpTimeout_ = true;
1722     }
1723     HILOG_INFO("Dump done and begin parse.");
1724     if (!isDumpTimeout_) {
1725         std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
1726         for (auto one : dumpInfos_) {
1727             info.emplace_back(one);
1728         }
1729     }
1730 
1731     if (!dumpConfig) {
1732         HILOG_INFO("not dumpConfig.");
1733         return;
1734     }
1735     AppExecFwk::Configuration config;
1736     if (DelayedSingleton<AppScheduler>::GetInstance()->GetConfiguration(config) == ERR_OK) {
1737         info.emplace_back("          configuration: " + config.GetName());
1738     }
1739 }
1740 
DumpAbilityInfoDone(std::vector<std::string> & infos)1741 void AbilityRecord::DumpAbilityInfoDone(std::vector<std::string> &infos)
1742 {
1743     HILOG_INFO("DumpAbilityInfoDone begin.");
1744     if (isDumpTimeout_) {
1745         HILOG_WARN("%{public}s, dump time out.", __func__);
1746         return;
1747     }
1748     {
1749         std::lock_guard<std::mutex> infoLock(dumpInfoLock_);
1750         dumpInfos_.clear();
1751         for (auto info : infos) {
1752             dumpInfos_.emplace_back(info);
1753         }
1754     }
1755     dumpCondition_.notify_all();
1756 }
1757 
GrantUriPermission(const Want & want)1758 void AbilityRecord::GrantUriPermission(const Want &want)
1759 {
1760     HILOG_DEBUG("AbilityRecord::GrantUriPermission is called.");
1761     auto flags = want.GetFlags();
1762     if (flags & (Want::FLAG_AUTH_READ_URI_PERMISSION | Want::FLAG_AUTH_WRITE_URI_PERMISSION)) {
1763         HILOG_INFO("Want to grant r/w permission of the uri");
1764         auto targetTokenId = abilityInfo_.applicationInfo.accessTokenId;
1765         auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
1766         if (abilityMgr) {
1767             abilityMgr->GrantUriPermission(want, GetCurrentAccountId(), targetTokenId);
1768         }
1769     }
1770 }
1771 
GetCurrentAccountId()1772 int AbilityRecord::GetCurrentAccountId()
1773 {
1774     std::vector<int32_t> osActiveAccountIds;
1775     ErrCode ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(osActiveAccountIds);
1776     if (ret != ERR_OK) {
1777         HILOG_ERROR("QueryActiveOsAccountIds failed.");
1778         return DEFAULT_USER_ID;
1779     }
1780 
1781     if (osActiveAccountIds.empty()) {
1782         HILOG_ERROR("QueryActiveOsAccountIds is empty, no accounts.");
1783         return DEFAULT_USER_ID;
1784     }
1785 
1786     return osActiveAccountIds.front();
1787 }
1788 
SetWindowMode(int32_t windowMode)1789 void AbilityRecord::SetWindowMode(int32_t windowMode)
1790 {
1791     want_.SetParam(Want::PARAM_RESV_WINDOW_MODE, windowMode);
1792 }
1793 
RemoveWindowMode()1794 void AbilityRecord::RemoveWindowMode()
1795 {
1796     want_.RemoveParam(Want::PARAM_RESV_WINDOW_MODE);
1797 }
1798 }  // namespace AAFwk
1799 }  // namespace OHOS
1800