1 /*
2  * Copyright (c) 2021-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 "mission_list_manager.h"
17 
18 #include <cstdlib>
19 
20 #include "ability_manager_errors.h"
21 #include "ability_manager_service.h"
22 #include "ability_util.h"
23 #include "app_exit_reason_data_manager.h"
24 #include "appfreeze_manager.h"
25 #include "errors.h"
26 #include "global_constant.h"
27 #include "hitrace_meter.h"
28 #include "hilog_tag_wrapper.h"
29 #include "hisysevent.h"
30 #include "mission_info_mgr.h"
31 #include "in_process_call_wrapper.h"
32 #include "permission_constants.h"
33 #include "res_sched_util.h"
34 #include "server_constant.h"
35 #include "startup_util.h"
36 #include "ui_extension_utils.h"
37 #ifdef SUPPORT_GRAPHICS
38 #include "ability_first_frame_state_observer_manager.h"
39 #endif
40 
41 namespace OHOS {
42 using AbilityRuntime::FreezeUtil;
43 namespace AAFwk {
44 namespace {
45 constexpr uint32_t DELAY_NOTIFY_LABEL_TIME = 30; // 30ms
46 constexpr uint32_t SCENE_FLAG_KEYGUARD = 1;
47 constexpr uint32_t ONLY_ONE_ABILITY = 1;
48 constexpr const char* EVENT_KEY_UID = "UID";
49 constexpr const char* EVENT_KEY_PID = "PID";
50 constexpr const char* EVENT_KEY_MESSAGE = "MSG";
51 constexpr const char* EVENT_KEY_PACKAGE_NAME = "PACKAGE_NAME";
52 constexpr const char* EVENT_KEY_PROCESS_NAME = "PROCESS_NAME";
53 constexpr int32_t SINGLE_MAX_INSTANCE_COUNT = 128;
54 constexpr int32_t MAX_INSTANCE_COUNT = 512;
55 constexpr uint64_t NANO_SECOND_PER_SEC = 1000000000; // ns
56 const std::string DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
57 const std::string DMS_MISSION_ID = "dmsMissionId";
58 constexpr int DEFAULT_DMS_MISSION_ID = -1;
59 #ifdef SUPPORT_ASAN
60 constexpr int KILL_TIMEOUT_MULTIPLE = 45;
61 #else
62 constexpr int KILL_TIMEOUT_MULTIPLE = 3;
63 #endif
64 constexpr int32_t PREPARE_TERMINATE_ENABLE_SIZE = 6;
65 constexpr const char* PREPARE_TERMINATE_ENABLE_PARAMETER = "persist.sys.prepare_terminate";
66 constexpr int32_t PREPARE_TERMINATE_TIMEOUT_MULTIPLE = 10;
67 constexpr int32_t TRACE_ATOMIC_SERVICE_ID = 201;
68 const std::string TRACE_ATOMIC_SERVICE = "StartAtomicService";
69 constexpr int GET_TARGET_MISSION_OVER = 200;
70 constexpr int32_t MAX_FIND_UIEXTENSION_CALLER_TIMES = 10;
GetCurrentTime()71 std::string GetCurrentTime()
72 {
73     struct timespec tn;
74     clock_gettime(CLOCK_REALTIME, &tn);
75     uint64_t uTime = static_cast<uint64_t>(tn.tv_sec) * NANO_SECOND_PER_SEC +
76         static_cast<uint64_t>(tn.tv_nsec);
77     return std::to_string(uTime);
78 }
79 
MsgId2State(uint32_t msgId)80 FreezeUtil::TimeoutState MsgId2State(uint32_t msgId)
81 {
82     if (msgId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
83         return FreezeUtil::TimeoutState::LOAD;
84     } else if (msgId == AbilityManagerService::FOREGROUND_TIMEOUT_MSG) {
85         return FreezeUtil::TimeoutState::FOREGROUND;
86     } else if (msgId == AbilityManagerService::BACKGROUND_TIMEOUT_MSG) {
87         return FreezeUtil::TimeoutState::BACKGROUND;
88     }
89     return FreezeUtil::TimeoutState::UNKNOWN;
90 }
91 
__anonbbe990f90202(const sptr<Token> &token, FreezeUtil::TimeoutState state) 92 auto g_deleteLifecycleEventTask = [](const sptr<Token> &token, FreezeUtil::TimeoutState state) {
93     CHECK_POINTER_LOG(token, "token is nullptr.");
94     FreezeUtil::LifecycleFlow flow = { token->AsObject(), state };
95     FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
96 };
97 } // namespace
98 
MissionListManager(int userId)99 MissionListManager::MissionListManager(int userId) : userId_(userId) {}
100 
~MissionListManager()101 MissionListManager::~MissionListManager() {}
102 
Init()103 void MissionListManager::Init()
104 {
105     launcherList_ = std::make_shared<MissionList>(MissionListType::LAUNCHER);
106     defaultStandardList_ = std::make_shared<MissionList>(MissionListType::DEFAULT_STANDARD);
107     defaultSingleList_ = std::make_shared<MissionList>(MissionListType::DEFAULT_SINGLE);
108     currentMissionLists_.push_front(launcherList_);
109 
110     if (!listenerController_) {
111         listenerController_ = std::make_shared<MissionListenerController>();
112         listenerController_->Init();
113     }
114 #ifdef SUPPORT_GRAPHICS
115     InitPrepareTerminateConfig();
116 #endif
117     DelayedSingleton<MissionInfoMgr>::GetInstance()->Init(userId_);
118 }
119 
FindEarliestMission() const120 std::shared_ptr<Mission> MissionListManager::FindEarliestMission() const
121 {
122     // find the earliest mission of background abilityRecord
123     std::shared_ptr<Mission> earliestMission;
124     for (const auto& missionList : currentMissionLists_) {
125         if (!missionList) {
126             continue;
127         }
128         missionList->FindEarliestMission(earliestMission);
129     }
130     if (defaultStandardList_) {
131         defaultStandardList_->FindEarliestMission(earliestMission);
132     }
133     if (defaultSingleList_) {
134         defaultSingleList_->FindEarliestMission(earliestMission);
135     }
136     return earliestMission;
137 }
138 
GetMissionCount() const139 int32_t MissionListManager::GetMissionCount() const
140 {
141     int32_t missionCount = 0;
142     for (const auto& missionList : currentMissionLists_) {
143         if (!missionList) {
144             continue;
145         }
146         missionCount += missionList->GetMissionCount();
147     }
148     if (defaultStandardList_) {
149         missionCount += defaultStandardList_->GetMissionCount();
150     }
151     if (defaultSingleList_) {
152         missionCount += defaultSingleList_->GetMissionCount();
153     }
154     return missionCount;
155 }
156 
StartAbility(AbilityRequest & abilityRequest)157 int MissionListManager::StartAbility(AbilityRequest &abilityRequest)
158 {
159     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
160     std::lock_guard guard(managerLock_);
161     bool isReachToSingleLimit = CheckSingleLimit(abilityRequest);
162     if (isReachToSingleLimit) {
163         TAG_LOGE(AAFwkTag::ABILITYMGR, "already reach single limit instance. limit is : %{public}d",
164             SINGLE_MAX_INSTANCE_COUNT);
165         return ERR_REACH_UPPER_LIMIT;
166     }
167 
168     auto currentTopAbility = GetCurrentTopAbilityLocked();
169     if (currentTopAbility && !currentTopAbility->GetRestartAppFlag()) {
170         std::string element = currentTopAbility->GetElementName().GetURI();
171         auto state = currentTopAbility->GetAbilityState();
172         TAG_LOGD(AAFwkTag::ABILITYMGR, "current top: %{public}s, state: %{public}s",
173             element.c_str(), AbilityRecord::ConvertAbilityState(state).c_str());
174         if (state == FOREGROUNDING) {
175             TAG_LOGI(AAFwkTag::ABILITYMGR, "Top ability:%{public}s is foregrounding, so enqueue ability for waiting.",
176                 element.c_str());
177             EnqueueWaitingAbility(abilityRequest);
178             return START_ABILITY_WAITING;
179         }
180     }
181 
182     auto callerAbility = GetAbilityRecordByTokenInner(abilityRequest.callerToken);
183     if (callerAbility) {
184         std::string element = callerAbility->GetElementName().GetURI();
185         auto state = callerAbility->GetAbilityState();
186         TAG_LOGD(AAFwkTag::ABILITYMGR, "callerAbility is: %{public}s, state: %{public}s",
187             element.c_str(), AbilityRecord::ConvertAbilityState(state).c_str());
188     }
189 
190     abilityRequest.callerAccessTokenId = IPCSkeleton::GetCallingTokenID();
191     int ret = StartAbility(currentTopAbility, callerAbility, abilityRequest);
192     if (ret == 0 && !abilityRequest.abilityInfo.visible) {
193         SendKeyEvent(abilityRequest);
194     }
195     NotifyStartAbilityResult(abilityRequest, ret);
196     if (callerAbility != nullptr) {
197         ResSchedUtil::GetInstance().ReportAbilityAssociatedStartInfoToRSS(abilityRequest.abilityInfo,
198             RES_TYPE_MISSION_LIST_START_ABILITY, callerAbility->GetUid(), callerAbility->GetPid());
199     }
200     return ret;
201 }
202 
StartAbility(const std::shared_ptr<AbilityRecord> & currentTopAbility,const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)203 int MissionListManager::StartAbility(const std::shared_ptr<AbilityRecord> &currentTopAbility,
204     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
205 {
206     auto isSpecified = (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED);
207     if (isSpecified) {
208         EnqueueWaitingAbilityToFront(abilityRequest);
209         DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility(
210             abilityRequest.want, abilityRequest.abilityInfo);
211         return 0;
212     }
213 
214     return StartAbilityLocked(currentTopAbility, callerAbility, abilityRequest);
215 }
216 
MinimizeAbility(const sptr<IRemoteObject> & token,bool fromUser)217 int MissionListManager::MinimizeAbility(const sptr<IRemoteObject> &token, bool fromUser)
218 {
219     TAG_LOGI(AAFwkTag::ABILITYMGR, "fromUser:%{public}d.", fromUser);
220     std::lock_guard guard(managerLock_);
221     // check if ability is in list to avoid user create fake token.
222     CHECK_POINTER_AND_RETURN_LOG(GetAbilityRecordByTokenInner(token), INNER_ERR,
223         "Minimize ability fail, ability is not in mission list.");
224     auto abilityRecord = Token::GetAbilityRecordByToken(token);
225     return MinimizeAbilityLocked(abilityRecord, fromUser);
226 }
227 
RegisterMissionListener(const sptr<IMissionListener> & listener)228 int MissionListManager::RegisterMissionListener(const sptr<IMissionListener> &listener)
229 {
230     if (!listenerController_) {
231         TAG_LOGE(AAFwkTag::ABILITYMGR, "service not init, try again later.");
232         return -1;
233     }
234 
235     return listenerController_->AddMissionListener(listener);
236 }
237 
UnRegisterMissionListener(const sptr<IMissionListener> & listener)238 int MissionListManager::UnRegisterMissionListener(const sptr<IMissionListener> &listener)
239 {
240     if (!listenerController_) {
241         TAG_LOGE(AAFwkTag::ABILITYMGR, "service not init, try unregister again later.");
242         return -1;
243     }
244 
245     listenerController_->DelMissionListener(listener);
246     return 0;
247 }
248 
GetMissionInfos(int32_t numMax,std::vector<MissionInfo> & missionInfos)249 int MissionListManager::GetMissionInfos(int32_t numMax, std::vector<MissionInfo> &missionInfos)
250 {
251     TAG_LOGD(AAFwkTag::ABILITYMGR, "Get mission infos.");
252     if (numMax < 0) {
253         TAG_LOGE(AAFwkTag::ABILITYMGR, "numMax is invalid, numMax:%{public}d", numMax);
254         return ERR_INVALID_VALUE;
255     }
256 
257     return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionInfos(numMax, missionInfos);
258 }
259 
GetMissionInfo(int32_t missionId,MissionInfo & missionInfo)260 int MissionListManager::GetMissionInfo(int32_t missionId, MissionInfo &missionInfo)
261 {
262     TAG_LOGD(AAFwkTag::ABILITYMGR, "Get mission info by id:%{public}d.", missionId);
263     return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionInfoById(missionId, missionInfo);
264 }
265 
MoveMissionToFront(int32_t missionId,std::shared_ptr<StartOptions> startOptions)266 int MissionListManager::MoveMissionToFront(int32_t missionId, std::shared_ptr<StartOptions> startOptions)
267 {
268     std::lock_guard guard(managerLock_);
269     return MoveMissionToFrontInner(missionId, true, true, nullptr, startOptions);
270 }
271 
MoveMissionToFront(int32_t missionId,bool isCallerFromLauncher,bool isRecent,std::shared_ptr<AbilityRecord> callerAbility,std::shared_ptr<StartOptions> startOptions)272 int MissionListManager::MoveMissionToFront(int32_t missionId, bool isCallerFromLauncher, bool isRecent,
273     std::shared_ptr<AbilityRecord> callerAbility, std::shared_ptr<StartOptions> startOptions)
274 {
275     std::lock_guard guard(managerLock_);
276     return MoveMissionToFrontInner(missionId, isCallerFromLauncher, isRecent, callerAbility, startOptions);
277 }
278 
MoveMissionToFrontInner(int32_t missionId,bool isCallerFromLauncher,bool isRecent,std::shared_ptr<AbilityRecord> callerAbility,std::shared_ptr<StartOptions> startOptions)279 int MissionListManager::MoveMissionToFrontInner(int32_t missionId, bool isCallerFromLauncher, bool isRecent,
280     std::shared_ptr<AbilityRecord> callerAbility, std::shared_ptr<StartOptions> startOptions)
281 {
282     TAG_LOGI(AAFwkTag::ABILITYMGR, "missionId:%{public}d.", missionId);
283     std::shared_ptr<Mission> mission;
284     bool isReachToLimit = false;
285     auto targetMissionList = GetTargetMissionList(missionId, mission, isReachToLimit);
286     if (isReachToLimit) {
287         TAG_LOGE(AAFwkTag::ABILITYMGR, "get target mission list failed, already reach to limit.");
288         return ERR_REACH_UPPER_LIMIT;
289     }
290     if (!targetMissionList || !mission) {
291         TAG_LOGE(AAFwkTag::ABILITYMGR, "get target mission list failed, missionId: %{public}d", missionId);
292         return MOVE_MISSION_FAILED;
293     }
294 
295     MoveMissionToTargetList(isCallerFromLauncher, targetMissionList, mission);
296     MoveMissionListToTop(targetMissionList);
297 
298     auto targetAbilityRecord = mission->GetAbilityRecord();
299     if (!targetAbilityRecord) {
300         TAG_LOGE(AAFwkTag::ABILITYMGR, "get target ability record failed, missionId: %{public}d", missionId);
301         return MOVE_MISSION_FAILED;
302     }
303     targetAbilityRecord->SetIsNewWant(false);
304     targetAbilityRecord->RemoveWindowMode();
305     if (startOptions != nullptr) {
306         targetAbilityRecord->SetWindowMode(startOptions->GetWindowMode());
307     }
308 
309 #ifdef SUPPORT_GRAPHICS
310     AbilityRequest abilityRequest;
311     targetAbilityRecord->ProcessForegroundAbility(isRecent, abilityRequest, startOptions, callerAbility);
312 #else
313     targetAbilityRecord->ProcessForegroundAbility(0);
314 #endif
315     TAG_LOGD(AAFwkTag::ABILITYMGR, "SetMovingState, missionId: %{public}d", missionId);
316     mission->SetMovingState(true);
317     return ERR_OK;
318 }
319 
EnqueueWaitingAbility(const AbilityRequest & abilityRequest)320 void MissionListManager::EnqueueWaitingAbility(const AbilityRequest &abilityRequest)
321 {
322     waitingAbilityQueue_.push(abilityRequest);
323     return;
324 }
325 
EnqueueWaitingAbilityToFront(const AbilityRequest & abilityRequest)326 void MissionListManager::EnqueueWaitingAbilityToFront(const AbilityRequest &abilityRequest)
327 {
328     std::queue<AbilityRequest> abilityQueue;
329     abilityQueue.push(abilityRequest);
330     waitingAbilityQueue_.swap(abilityQueue);
331     while (!abilityQueue.empty()) {
332         AbilityRequest tempAbilityRequest = abilityQueue.front();
333         abilityQueue.pop();
334         waitingAbilityQueue_.push(tempAbilityRequest);
335     }
336 }
337 
StartWaitingAbility()338 void MissionListManager::StartWaitingAbility()
339 {
340     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
341     std::lock_guard guard(managerLock_);
342     auto topAbility = GetCurrentTopAbilityLocked();
343     if (topAbility != nullptr && topAbility->IsAbilityState(FOREGROUNDING)) {
344         TAG_LOGI(AAFwkTag::ABILITYMGR, "Top ability is foregrounding, must return for start waiting again.");
345         return;
346     }
347 
348     if (!waitingAbilityQueue_.empty()) {
349         AbilityRequest abilityRequest = waitingAbilityQueue_.front();
350         TAG_LOGI(AAFwkTag::ABILITYMGR, "name:%{public}s", abilityRequest.abilityInfo.name.c_str());
351         waitingAbilityQueue_.pop();
352         auto callerAbility = GetAbilityRecordByTokenInner(abilityRequest.callerToken);
353         if (StartAbility(topAbility, callerAbility, abilityRequest) == 0 && !abilityRequest.abilityInfo.visible) {
354             SendKeyEvent(abilityRequest);
355         }
356         return;
357     }
358 }
359 
AddRecord(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & targetAbilityRecord)360 void MissionListManager::AddRecord(const AbilityRequest &abilityRequest,
361     std::shared_ptr<AbilityRecord> &targetAbilityRecord)
362 {
363     std::string srcAbilityId = "";
364     if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_FOR_RESULT, false)) {
365         std::string srcDeviceId = abilityRequest.want.GetStringParam(DMS_SRC_NETWORK_ID);
366         int missionId = abilityRequest.want.GetIntParam(DMS_MISSION_ID, DEFAULT_DMS_MISSION_ID);
367         TAG_LOGD(AAFwkTag::ABILITYMGR, "Get srcNetWorkId = %s, missionId = %d", srcDeviceId.c_str(), missionId);
368         Want* newWant = const_cast<Want*>(&abilityRequest.want);
369         newWant->RemoveParam(DMS_SRC_NETWORK_ID);
370         newWant->RemoveParam(DMS_MISSION_ID);
371         newWant->RemoveParam(Want::PARAM_RESV_FOR_RESULT);
372         srcAbilityId = srcDeviceId + "_" + std::to_string(missionId);
373     }
374     targetAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want,
375         srcAbilityId);
376 }
377 
GetTargetMission(const AbilityRequest & abilityRequest,std::shared_ptr<Mission> & targetMission,std::shared_ptr<AbilityRecord> & targetAbilityRecord)378 int MissionListManager::GetTargetMission(const AbilityRequest &abilityRequest, std::shared_ptr<Mission> &targetMission,
379     std::shared_ptr<AbilityRecord> &targetAbilityRecord)
380 {
381     bool isReachToLimit = false;
382     GetTargetMissionAndAbility(abilityRequest, targetMission, targetAbilityRecord, isReachToLimit);
383     if (isReachToLimit) {
384         TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get mission and ability, already reach to limit.");
385         return ERR_REACH_UPPER_LIMIT;
386     }
387     if (!targetMission || !targetAbilityRecord) {
388         TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get mission or record.");
389         return ERR_INVALID_VALUE;
390     }
391 
392     if (targetAbilityRecord->IsTerminating()) {
393         TAG_LOGE(
394             AAFwkTag::ABILITYMGR, "%{public}s is terminating.", targetAbilityRecord->GetAbilityInfo().name.c_str());
395         return ERR_INVALID_VALUE;
396     }
397 
398     if (targetAbilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
399         TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND.");
400         targetAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
401         return ERR_OK;
402     } else {
403         TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is not FOREGROUND.");
404         targetAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
405         if (targetAbilityRecord->IsLoading()) {
406             TAG_LOGI(AAFwkTag::ABILITYMGR, "ability: %{public}s is loading.", abilityRequest.abilityInfo.name.c_str());
407             return ERR_OK;
408         }
409     }
410 
411     UpdateAbilityRecordLaunchReason(abilityRequest, targetAbilityRecord);
412     AddRecord(abilityRequest, targetAbilityRecord);
413 
414     return GET_TARGET_MISSION_OVER;
415 }
416 
StartAbilityLocked(const std::shared_ptr<AbilityRecord> & currentTopAbility,const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)417 int MissionListManager::StartAbilityLocked(const std::shared_ptr<AbilityRecord> &currentTopAbility,
418     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
419 {
420     std::string connector = "##";
421     auto element = abilityRequest.want.GetElement();
422     std::string traceName = __PRETTY_FUNCTION__ + connector + element.GetBundleName() + connector +
423         element.GetAbilityName();
424     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, traceName);
425     TAG_LOGD(AAFwkTag::ABILITYMGR, "Start ability locked.");
426     // 1. choose target mission list
427     auto targetList = GetTargetMissionList(callerAbility, abilityRequest);
428     CHECK_POINTER_AND_RETURN(targetList, ERR_INVALID_CALLER);
429 
430     // 2. get target mission
431     std::shared_ptr<Mission> targetMission;
432     std::shared_ptr<AbilityRecord> targetAbilityRecord;
433     int ret = GetTargetMission(abilityRequest, targetMission, targetAbilityRecord);
434     if (ret != GET_TARGET_MISSION_OVER) {
435         return ret;
436     }
437 
438     // 3. move mission to target list
439     bool isCallerFromLauncher = (callerAbility && callerAbility->IsLauncherAbility());
440     MoveMissionToTargetList(isCallerFromLauncher, targetList, targetMission);
441 
442     // 4. move target list to top
443     MoveMissionListToTop(targetList);
444 
445     // 5. schedule target ability
446     if (!currentTopAbility) {
447         // top ability is null, then launch the first Ability.
448         if (targetAbilityRecord->GetAbilityInfo().applicationInfo.isLauncherApp) {
449             targetAbilityRecord->SetLauncherRoot();
450         }
451     } else {
452         // only SA or no Page Ability support back to other mission stack
453         auto supportBackToOtherMissionStack =
454             (!callerAbility) || (callerAbility->GetAbilityInfo().type != AppExecFwk::AbilityType::PAGE);
455         auto needBackToOtherMissionStack =
456             abilityRequest.want.GetBoolParam(Want::PARAM_BACK_TO_OTHER_MISSION_STACK, false);
457         if (supportBackToOtherMissionStack && needBackToOtherMissionStack) {
458             // mark if need back to other mission stack
459             targetAbilityRecord->SetNeedBackToOtherMissionStack(true);
460             auto focusAbility = AbilityManagerService::GetPubInstance()->GetFocusAbility();
461             if (focusAbility && (GetMissionIdByAbilityTokenInner(focusAbility->GetToken()) != -1)) {
462                 targetAbilityRecord->SetOtherMissionStackAbilityRecord(focusAbility);
463             } else {
464                 targetAbilityRecord->SetOtherMissionStackAbilityRecord(currentTopAbility);
465             }
466         }
467     }
468 
469     NotifyAbilityToken(targetAbilityRecord->GetToken(), abilityRequest);
470 
471     TAG_LOGD(AAFwkTag::ABILITYMGR, "StartAbilityLocked, abilityRequest.specifyTokenId is %{public}u.",
472         abilityRequest.specifyTokenId);
473     targetAbilityRecord->SetSpecifyTokenId(abilityRequest.specifyTokenId);
474     targetAbilityRecord->SetAbilityForegroundingFlag();
475 
476 #ifdef SUPPORT_GRAPHICS
477     std::shared_ptr<StartOptions> startOptions = nullptr;
478     targetAbilityRecord->ProcessForegroundAbility(false, abilityRequest, startOptions, callerAbility);
479 #else
480     targetAbilityRecord->ProcessForegroundAbility(0);
481 #endif
482     return ERR_OK;
483 }
484 
CallType2StartMethod(int32_t callType)485 static int32_t CallType2StartMethod(int32_t callType)
486 {
487     switch (callType) {
488         case AbilityCallType::INVALID_TYPE:
489             return static_cast<int32_t>(StartMethod::START_NORMAL);
490         case AbilityCallType::CALL_REQUEST_TYPE:
491             return static_cast<int32_t>(StartMethod::START_CALL);
492         default:
493             break;
494     }
495     return -1;
496 }
497 
CallTypeFilter(int32_t callType)498 static bool CallTypeFilter(int32_t callType)
499 {
500     switch (callType) {
501         case AbilityCallType::CALL_REQUEST_TYPE:
502             return true;
503         default:
504             break;
505     }
506     return false;
507 }
508 
HandleReusedMissionAndAbility(const AbilityRequest & abilityRequest,std::shared_ptr<Mission> & targetMission,std::shared_ptr<AbilityRecord> & targetRecord)509 bool MissionListManager::HandleReusedMissionAndAbility(const AbilityRequest &abilityRequest,
510     std::shared_ptr<Mission> &targetMission, std::shared_ptr<AbilityRecord> &targetRecord)
511 {
512     auto startMethod = CallType2StartMethod(abilityRequest.callType);
513     TAG_LOGD(AAFwkTag::ABILITYMGR, "HandleReusedMissionAndAbility called startMethod is %{public}d.", startMethod);
514     auto reUsedMission = GetReusedMission(abilityRequest);
515     if (!reUsedMission) {
516         return false;
517     }
518 
519     TAG_LOGD(AAFwkTag::ABILITYMGR, "find reused mission in running list.");
520     targetMission = reUsedMission;
521     targetRecord = targetMission->GetAbilityRecord();
522     if (targetRecord) {
523         targetRecord->SetWant(abilityRequest.want);
524         targetRecord->SetIsNewWant(true);
525     }
526     /* No need to update condition:
527      *      1. not start by call
528      *      2. start by call, but call to background again
529      * Need to update condition:
530      *      1. start by call, but this time is not start by call
531      *      2. start by call, and call to foreground again
532      */
533     if (!(targetMission->IsStartByCall()
534         && (!CallTypeFilter(startMethod) ||
535             abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)))) {
536         TAG_LOGD(AAFwkTag::ABILITYMGR, "mission exists. No update required");
537         return true;
538     }
539 
540     auto missionId = targetMission->GetMissionId();
541     TAG_LOGI(AAFwkTag::ABILITYMGR, "mission exists. missionId:%{public}d", missionId);
542     InnerMissionInfo info;
543     if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
544         targetMission->GetMissionId(), info) == 0) {
545         info.missionInfo.time = GetCurrentTime();
546         info.missionInfo.runningState = 0;
547         info.startMethod = CallType2StartMethod(abilityRequest.callType);
548         DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
549         targetMission->UpdateMissionId(missionId, info.startMethod);
550         targetMission->UpdateMissionTime(info.missionInfo.time);
551     }
552 
553     return true;
554 }
555 
GetMissionName(const AbilityRequest & abilityRequest) const556 std::string MissionListManager::GetMissionName(const AbilityRequest &abilityRequest) const
557 {
558     int32_t appIndex = 0;
559     (void)AbilityRuntime::StartupUtil::GetAppIndex(abilityRequest.want, appIndex);
560     return AbilityUtil::ConvertBundleNameSingleton(abilityRequest.abilityInfo.bundleName,
561         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName, appIndex);
562 }
563 
CreateOrReusedMissionInfo(const AbilityRequest & abilityRequest,InnerMissionInfo & info) const564 bool MissionListManager::CreateOrReusedMissionInfo(const AbilityRequest &abilityRequest, InnerMissionInfo &info) const
565 {
566     // get mission name.
567     bool reUsedMissionInfo = false;
568     bool needFind = false;
569     bool isFindRecentStandard = abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD &&
570         abilityRequest.startRecent;
571     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD || isFindRecentStandard) {
572         needFind = true;
573     }
574 
575     std::string missionName = GetMissionName(abilityRequest);
576     auto mgr = DelayedSingleton<MissionInfoMgr>::GetInstance();
577     if (needFind && mgr &&
578         mgr->FindReusedMissionInfo(missionName, abilityRequest.specifiedFlag, isFindRecentStandard, info)
579         && info.missionInfo.id > 0) {
580         reUsedMissionInfo = true;
581     }
582     TAG_LOGI(AAFwkTag::ABILITYMGR, "result:%{public}d", reUsedMissionInfo);
583 
584     BuildInnerMissionInfo(info, missionName, abilityRequest);
585     auto abilityRecord = GetAbilityRecordByNameFromCurrentMissionLists(abilityRequest.want.GetElement());
586     if (reUsedMissionInfo == false && abilityRecord != nullptr) {
587         int32_t getAbilityNumber = 0;
588         getAbilityNumber = GetAbilityNumber(abilityRequest.want.GetElement());
589         TAG_LOGD(AAFwkTag::ABILITYMGR, "GetAbilityNumber:%{public}d.", getAbilityNumber);
590 
591         if (getAbilityNumber >= 1) {
592             auto abilityInfo = abilityRequest.abilityInfo;
593             EventInfo eventInfo;
594             eventInfo.userId = abilityRequest.userId;
595             eventInfo.abilityName = abilityInfo.name;
596             eventInfo.bundleName = abilityInfo.bundleName;
597             eventInfo.moduleName = abilityInfo.moduleName;
598             // get ability number created previously and add new one.
599             eventInfo.abilityNumber = getAbilityNumber + 1;
600             EventReport::SendAbilityEvent(EventName::START_STANDARD_ABILITIES, HiSysEventType::BEHAVIOR, eventInfo);
601         }
602     }
603 
604     return reUsedMissionInfo;
605 }
606 
GetTargetMissionAndAbility(const AbilityRequest & abilityRequest,std::shared_ptr<Mission> & targetMission,std::shared_ptr<AbilityRecord> & targetRecord,bool & isReachToLimit)607 void MissionListManager::GetTargetMissionAndAbility(const AbilityRequest &abilityRequest,
608     std::shared_ptr<Mission> &targetMission, std::shared_ptr<AbilityRecord> &targetRecord, bool &isReachToLimit)
609 {
610     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
611     if (HandleReusedMissionAndAbility(abilityRequest, targetMission, targetRecord)) {
612         return;
613     }
614 
615     // try reuse mission info
616     InnerMissionInfo info;
617     bool findReusedMissionInfo = CreateOrReusedMissionInfo(abilityRequest, info);
618     if (!findReusedMissionInfo) {
619         if (!DelayedSingleton<MissionInfoMgr>::GetInstance()->GenerateMissionId(info.missionInfo.id)) {
620             TAG_LOGD(AAFwkTag::ABILITYMGR, "failed to generate mission id.");
621             return;
622         }
623     }
624 
625     if (targetMission == nullptr) {
626         if (CheckLimit()) {
627             isReachToLimit = true;
628             TAG_LOGE(AAFwkTag::ABILITYMGR, "already reach to limit, not create new mission and ability.");
629             return;
630         }
631         TAG_LOGD(AAFwkTag::ABILITYMGR, "Make new mission data.");
632         targetRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
633         if (targetRecord == nullptr) {
634             TAG_LOGE(AAFwkTag::ABILITYMGR, "targetRecord is nullptr");
635             return;
636         }
637         targetMission = std::make_shared<Mission>(info.missionInfo.id, targetRecord,
638             info.missionName, info.startMethod);
639         targetRecord->UpdateRecoveryInfo(info.hasRecoverInfo);
640         info.hasRecoverInfo = false;
641         targetMission->SetLockedState(info.missionInfo.lockedState);
642         targetMission->SetUnclearable(info.missionInfo.unclearable);
643         targetMission->UpdateMissionTime(info.missionInfo.time);
644         targetRecord->SetMissionId(targetMission->GetMissionId());
645         targetRecord->SetOwnerMissionUserId(userId_);
646         SetLastExitReason(targetRecord);
647 
648         // handle specified
649         if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
650             targetMission->SetSpecifiedFlag(abilityRequest.specifiedFlag);
651             targetRecord->SetSpecifiedFlag(abilityRequest.specifiedFlag);
652         }
653     }
654 
655     if (!findReusedMissionInfo && targetRecord) {
656         info.missionInfo.label = targetRecord->GetLabel();
657     }
658 
659     if (abilityRequest.abilityInfo.excludeFromMissions) {
660         return;
661     }
662 
663     if (findReusedMissionInfo) {
664         DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
665     } else {
666         DelayedSingleton<MissionInfoMgr>::GetInstance()->AddMissionInfo(info);
667     }
668 }
669 
EnableRecoverAbility(int32_t missionId)670 void MissionListManager::EnableRecoverAbility(int32_t missionId)
671 {
672     InnerMissionInfo info;
673     if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) != ERR_OK) {
674         TAG_LOGE(AAFwkTag::ABILITYMGR, "failed to get mission info by id.");
675         return;
676     }
677     info.hasRecoverInfo = true;
678     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
679 }
680 
BuildInnerMissionInfo(InnerMissionInfo & info,const std::string & missionName,const AbilityRequest & abilityRequest) const681 void MissionListManager::BuildInnerMissionInfo(InnerMissionInfo &info, const std::string &missionName,
682     const AbilityRequest &abilityRequest) const
683 {
684     info.missionName = missionName;
685     info.launchMode = static_cast<int32_t>(abilityRequest.abilityInfo.launchMode);
686     info.startMethod = CallType2StartMethod(abilityRequest.callType);
687     info.bundleName = abilityRequest.abilityInfo.bundleName;
688     info.uid = abilityRequest.uid;
689     info.missionInfo.runningState = 0;
690     info.missionInfo.continuable = abilityRequest.abilityInfo.continuable;
691     info.missionInfo.time = GetCurrentTime();
692     info.missionInfo.iconPath = abilityRequest.appInfo.iconPath;
693     info.missionInfo.want = abilityRequest.want;
694     info.missionInfo.unclearable = abilityRequest.abilityInfo.unclearableMission;
695     info.isTemporary = abilityRequest.abilityInfo.removeMissionAfterTerminate;
696     auto dlpIndex = abilityRequest.want.GetIntParam(AbilityRuntime::ServerConstant::DLP_INDEX, 0);
697     if (dlpIndex > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
698         info.isTemporary = true;
699     }
700     info.specifiedFlag = abilityRequest.specifiedFlag;
701 
702     auto element = info.missionInfo.want.GetElement();
703     if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
704         info.missionInfo.want.SetElementName(abilityRequest.abilityInfo.bundleName, abilityRequest.abilityInfo.name);
705     }
706 }
707 
GetTargetMissionList(const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)708 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionList(
709     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
710 {
711     // priority : starting launcher ability.
712     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
713         TAG_LOGD(AAFwkTag::ABILITYMGR, "ability request is launcher app.");
714         return launcherList_;
715     }
716 
717     // no caller ability, start ability from system service.
718     if (!callerAbility) {
719         TAG_LOGD(AAFwkTag::ABILITYMGR, "ability request without caller.");
720         std::shared_ptr<MissionList> targetMissionList = std::make_shared<MissionList>();
721         return targetMissionList;
722     }
723 
724     // caller is launcher, new or reuse list.
725     if (callerAbility->IsLauncherAbility()) {
726         TAG_LOGD(AAFwkTag::ABILITYMGR, "start ability, caller is launcher app.");
727         return GetTargetMissionListByLauncher(abilityRequest);
728     }
729 
730     // caller is not launcher: refer to the list of the caller ability.
731     return GetTargetMissionListByDefault(callerAbility, abilityRequest);
732 }
733 
GetTargetMissionListByLauncher(const AbilityRequest & abilityRequest)734 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionListByLauncher(const AbilityRequest &abilityRequest)
735 {
736     auto reUsedMission = GetReusedMission(abilityRequest);
737     if (reUsedMission) {
738         TAG_LOGD(AAFwkTag::ABILITYMGR, "GetTargetMissionListByLauncher find reused mission list.");
739         auto missionList = reUsedMission->GetMissionList();
740         if (missionList && missionList != defaultSingleList_ && missionList != defaultStandardList_) {
741             return missionList;
742         }
743     }
744 
745     TAG_LOGD(AAFwkTag::ABILITYMGR, "GetTargetMissionListByLauncher do not find reused mission list.");
746     std::shared_ptr<MissionList> targetMissionList = std::make_shared<MissionList>();
747     return targetMissionList;
748 }
749 
GetTargetMissionListByDefault(const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)750 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionListByDefault(
751     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
752 {
753     if (!callerAbility) {
754         return nullptr;
755     }
756 
757     auto callerMission = GetMissionById(callerAbility->GetMissionId());
758     CHECK_POINTER_AND_RETURN(callerMission, nullptr);
759     auto callerList = callerMission->GetMissionList();
760     CHECK_POINTER_AND_RETURN(callerList, nullptr);
761 
762     // target mission should in caller mission list
763     if (callerList != defaultStandardList_ && callerList != defaultSingleList_) {
764         TAG_LOGD(AAFwkTag::ABILITYMGR, "GetTargetMissionListByDefault target is caller list.");
765         return callerList;
766     }
767 
768     // caller is default, need to start a new mission list
769     TAG_LOGD(AAFwkTag::ABILITYMGR, "GetTargetMissionListByDefault target is default list.");
770     std::shared_ptr<MissionList> targetMissionList = std::make_shared<MissionList>();
771     callerList->RemoveMission(callerMission);
772     targetMissionList->AddMissionToTop(callerMission);
773 
774     return targetMissionList;
775 }
776 
GetReusedMission(const AbilityRequest & abilityRequest)777 std::shared_ptr<Mission> MissionListManager::GetReusedMission(const AbilityRequest &abilityRequest)
778 {
779     if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
780         return GetReusedSpecifiedMission(abilityRequest);
781     }
782 
783     if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD) {
784         return GetReusedStandardMission(abilityRequest);
785     }
786 
787     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SINGLETON) {
788         return nullptr;
789     }
790 
791     std::shared_ptr<Mission> reUsedMission = nullptr;
792     std::string missionName = GetMissionName(abilityRequest);
793 
794     // find launcher first.
795     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
796         if ((reUsedMission = launcherList_->GetSingletonMissionByName(missionName)) != nullptr) {
797             return reUsedMission;
798         }
799     }
800 
801     // current
802     for (auto missionList : currentMissionLists_) {
803         if (missionList && (reUsedMission = missionList->GetSingletonMissionByName(missionName)) != nullptr) {
804             return reUsedMission;
805         }
806     }
807 
808     // default single list
809     if ((reUsedMission = defaultSingleList_->GetSingletonMissionByName(missionName)) != nullptr) {
810         return reUsedMission;
811     }
812 
813     return nullptr;
814 }
815 
GetReusedSpecifiedMission(const AbilityRequest & abilityRequest)816 std::shared_ptr<Mission> MissionListManager::GetReusedSpecifiedMission(const AbilityRequest &abilityRequest)
817 {
818     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
819         return nullptr;
820     }
821 
822     // specified mission name format is same as singleton.
823     std::shared_ptr<Mission> reUsedMission = nullptr;
824     std::string missionName = GetMissionName(abilityRequest);
825     std::string flag = abilityRequest.specifiedFlag;
826 
827     // find launcher first.
828     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
829         if ((reUsedMission = launcherList_->GetSpecifiedMission(missionName, flag)) != nullptr) {
830             return reUsedMission;
831         }
832     }
833 
834     // current
835     for (auto missionList : currentMissionLists_) {
836         if (missionList && (reUsedMission = missionList->GetSpecifiedMission(missionName, flag)) != nullptr) {
837             return reUsedMission;
838         }
839     }
840 
841     // default standard list
842     if ((reUsedMission = defaultStandardList_->GetSpecifiedMission(missionName, flag)) != nullptr) {
843         return reUsedMission;
844     }
845 
846     return nullptr;
847 }
848 
GetReusedStandardMission(const AbilityRequest & abilityRequest)849 std::shared_ptr<Mission> MissionListManager::GetReusedStandardMission(const AbilityRequest &abilityRequest)
850 {
851     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD) {
852         return nullptr;
853     }
854     if (!abilityRequest.startRecent) {
855         return nullptr;
856     }
857 
858     // all mission name format is same.
859     std::string missionName = GetMissionName(abilityRequest);
860     std::shared_ptr<Mission> reUsedMission = nullptr;
861 
862     // find launcher first, if find it in launcher list, no need to find in other list.
863     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
864         if ((reUsedMission = launcherList_->GetRecentStandardMission(missionName)) != nullptr) {
865             return reUsedMission;
866         }
867     }
868 
869     // try find it from current and default standard.
870     std::string missionTime = "0";
871     for (const auto &missionList : currentMissionLists_) {
872         if (!missionList) {
873             continue;
874         }
875 
876         auto mission = missionList->GetRecentStandardMission(missionName);
877         if (mission && mission->GetMissionTime() >= missionTime) {
878             missionTime = mission->GetMissionTime();
879             reUsedMission = mission;
880         }
881     }
882 
883     auto mission = defaultStandardList_->GetRecentStandardMission(missionName);
884     if (mission && mission->GetMissionTime() >= missionTime) {
885         reUsedMission = mission;
886     }
887 
888     return reUsedMission;
889 }
890 
MoveMissionToTargetList(bool isCallFromLauncher,const std::shared_ptr<MissionList> & targetMissionList,const std::shared_ptr<Mission> & mission)891 void MissionListManager::MoveMissionToTargetList(bool isCallFromLauncher,
892     const std::shared_ptr<MissionList> &targetMissionList,
893     const std::shared_ptr<Mission> &mission)
894 {
895     auto missionList = mission->GetMissionList();
896     // 1. new mission,move to target list.
897     if (!missionList) {
898         targetMissionList->AddMissionToTop(mission);
899         return;
900     }
901 
902     // 2. launcher call launcher
903     if (isCallFromLauncher && targetMissionList == launcherList_) {
904         targetMissionList->AddMissionToTop(mission);
905         return;
906     }
907 
908     // 3. reused mission is in default, move from default to target list.
909     if (missionList == defaultSingleList_ || missionList == defaultStandardList_) {
910         missionList->RemoveMission(mission);
911         targetMissionList->AddMissionToTop(mission);
912         return;
913     }
914 
915     // 4. reused mission is in a valid list.
916     bool isListChange = !(targetMissionList == missionList);
917     if (isListChange) {
918         // list change, pop above missions to default.
919         MoveNoneTopMissionToDefaultList(mission);
920         missionList->RemoveMission(mission);
921     } else if (isCallFromLauncher) {
922         // list not change, but call from launcher, pop above missions to default.
923         MoveNoneTopMissionToDefaultList(mission);
924     }
925     targetMissionList->AddMissionToTop(mission);
926 
927     if (missionList->IsEmpty()) {
928         currentMissionLists_.remove(missionList);
929     }
930 }
931 
MoveNoneTopMissionToDefaultList(const std::shared_ptr<Mission> & mission)932 void MissionListManager::MoveNoneTopMissionToDefaultList(const std::shared_ptr<Mission> &mission)
933 {
934     auto missionList = mission->GetMissionList();
935     if (!missionList) {
936         return;
937     }
938 
939     while (!missionList->IsEmpty()) {
940         auto item = missionList->GetTopMission();
941         if (item == nullptr || item == mission) {
942             break;
943         }
944 
945         missionList->RemoveMission(item);
946         if (item->IsSingletonAbility()) {
947             defaultSingleList_->AddMissionToTop(item);
948         } else {
949             defaultStandardList_->AddMissionToTop(item);
950         }
951     }
952 }
953 
MoveMissionListToTop(const std::shared_ptr<MissionList> & missionList)954 void MissionListManager::MoveMissionListToTop(const std::shared_ptr<MissionList> &missionList)
955 {
956     if (!missionList) {
957         TAG_LOGE(AAFwkTag::ABILITYMGR, "mission list is nullptr.");
958         return;
959     }
960     if (!currentMissionLists_.empty() && currentMissionLists_.front() == missionList) {
961         TAG_LOGD(AAFwkTag::ABILITYMGR, "mission list is at the top of list");
962         return;
963     }
964 
965     currentMissionLists_.remove(missionList);
966     currentMissionLists_.push_front(missionList);
967 }
968 
MinimizeAbilityLocked(const std::shared_ptr<AbilityRecord> & abilityRecord,bool fromUser)969 int MissionListManager::MinimizeAbilityLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, bool fromUser)
970 {
971     if (abilityRecord == nullptr) {
972         TAG_LOGE(AAFwkTag::ABILITYMGR, "Minimize ability fail, ability record is null.");
973         return ERR_INVALID_VALUE;
974     }
975     TAG_LOGI(AAFwkTag::ABILITYMGR, "ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
976     abilityRecord->SetPendingState(AbilityState::BACKGROUND);
977 
978     if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
979         TAG_LOGE(AAFwkTag::ABILITYMGR, "Fail to minimize ability, ability state is not foreground.");
980         return ERR_OK;
981     }
982 
983     abilityRecord->SetMinimizeReason(fromUser);
984     MoveToBackgroundTask(abilityRecord);
985 
986     return ERR_OK;
987 }
988 
GetCurrentTopAbilityLocked() const989 std::shared_ptr<AbilityRecord> MissionListManager::GetCurrentTopAbilityLocked() const
990 {
991     if (currentMissionLists_.empty()) {
992         return nullptr;
993     }
994 
995     auto& topMissionList = currentMissionLists_.front();
996     if (topMissionList) {
997         return topMissionList->GetTopAbility();
998     }
999     return nullptr;
1000 }
1001 
AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)1002 int MissionListManager::AttachAbilityThread(const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
1003 {
1004     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1005     std::lock_guard guard(managerLock_);
1006     auto abilityRecord = GetAbilityRecordByTokenInner(token);
1007     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1008 
1009     TAG_LOGD(AAFwkTag::ABILITYMGR, "AbilityMS attach abilityThread, name is %{public}s.",
1010         abilityRecord->GetAbilityInfo().name.c_str());
1011 
1012     auto eventHandler = AbilityManagerService::GetPubInstance()->GetEventHandler();
1013     CHECK_POINTER_AND_RETURN_LOG(eventHandler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1014     eventHandler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1015     abilityRecord->SetLoading(false);
1016     FreezeUtil::LifecycleFlow flow = { token, FreezeUtil::TimeoutState::LOAD };
1017     FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
1018 
1019     abilityRecord->SetScheduler(scheduler);
1020 
1021     if (abilityRecord->IsStartedByCall()) {
1022         if (abilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
1023             abilityRecord->SetStartToForeground(true);
1024             abilityRecord->PostForegroundTimeoutTask();
1025             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
1026         } else {
1027             abilityRecord->SetStartToBackground(true);
1028             MoveToBackgroundTask(abilityRecord);
1029         }
1030         return ERR_OK;
1031     }
1032 
1033     if (abilityRecord->IsNeedToCallRequest()) {
1034         abilityRecord->CallRequest();
1035     }
1036 
1037     auto taskHandler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
1038     CHECK_POINTER_AND_RETURN_LOG(taskHandler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
1039     auto taskName = std::to_string(abilityRecord->GetMissionId()) + "_cold";
1040     taskHandler->CancelTask(taskName);
1041 #ifdef SUPPORT_GRAPHICS
1042     abilityRecord->PostCancelStartingWindowHotTask();
1043 #endif
1044     abilityRecord->PostForegroundTimeoutTask();
1045     DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
1046 
1047     return ERR_OK;
1048 }
1049 
OnAbilityRequestDone(const sptr<IRemoteObject> & token,int32_t state)1050 void MissionListManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, int32_t state)
1051 {
1052     TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability request state %{public}d done.", state);
1053     std::lock_guard guard(managerLock_);
1054     AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
1055     if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
1056         auto abilityRecord = GetAliveAbilityRecordByToken(token);
1057         CHECK_POINTER(abilityRecord);
1058         std::string element = abilityRecord->GetElementName().GetURI();
1059         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability is %{public}s, start to foreground.", element.c_str());
1060         abilityRecord->ForegroundAbility(abilityRecord->lifeCycleStateInfo_.sceneFlagBak);
1061     }
1062 }
1063 
OnAppStateChanged(const AppInfo & info)1064 void MissionListManager::OnAppStateChanged(const AppInfo &info)
1065 {
1066     std::lock_guard guard(managerLock_);
1067 
1068     if (info.state == AppState::TERMINATED || info.state == AppState::END) {
1069         for (const auto& abilityRecord : terminateAbilityList_) {
1070             if (!abilityRecord) {
1071                 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
1072                 continue;
1073             }
1074             if (info.processName == abilityRecord->GetAbilityInfo().process ||
1075                 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
1076                 abilityRecord->SetAppState(info.state);
1077             }
1078         }
1079     } else if (info.state == AppState::COLD_START) {
1080         UpdateAbilityRecordColdStartFlag(info, true);
1081     } else {
1082         for (const auto& missionList : currentMissionLists_) {
1083             auto missions = missionList->GetAllMissions();
1084             for (const auto& missionInfo : missions) {
1085                 if (!missionInfo) {
1086                     TAG_LOGE(AAFwkTag::ABILITYMGR, "missionInfo is nullptr.");
1087                     continue;
1088                 }
1089                 auto abilityRecord = missionInfo->GetAbilityRecord();
1090                 if (info.processName == abilityRecord->GetAbilityInfo().process ||
1091                     info.processName == abilityRecord->GetApplicationInfo().bundleName) {
1092                     abilityRecord->SetAppState(info.state);
1093                 }
1094             }
1095         }
1096         auto defaultStandardListmissions = defaultStandardList_->GetAllMissions();
1097         for (const auto& missionInfo : defaultStandardListmissions) {
1098             if (!missionInfo) {
1099                 TAG_LOGE(AAFwkTag::ABILITYMGR, "defaultStandardListmissions is nullptr.");
1100                 continue;
1101             }
1102             auto abilityRecord = missionInfo->GetAbilityRecord();
1103             if (info.processName == abilityRecord->GetAbilityInfo().process ||
1104                 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
1105                 abilityRecord->SetAppState(info.state);
1106             }
1107         }
1108         auto defaultSingleListmissions = defaultSingleList_->GetAllMissions();
1109         for (const auto& missionInfo : defaultSingleListmissions) {
1110             if (!missionInfo) {
1111                 TAG_LOGE(AAFwkTag::ABILITYMGR, "defaultSingleListmissions is nullptr.");
1112                 continue;
1113             }
1114             auto abilityRecord = missionInfo->GetAbilityRecord();
1115             if (info.processName == abilityRecord->GetAbilityInfo().process ||
1116                 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
1117                 abilityRecord->SetAppState(info.state);
1118             }
1119         }
1120     }
1121 }
1122 
GetAbilityRecordByToken(const sptr<IRemoteObject> & token)1123 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByToken(
1124     const sptr<IRemoteObject> &token)
1125 {
1126     std::lock_guard guard(managerLock_);
1127     return GetAbilityRecordByTokenInner(token);
1128 }
1129 
GetAbilityRecordByTokenInner(const sptr<IRemoteObject> & token) const1130 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByTokenInner(
1131     const sptr<IRemoteObject> &token) const
1132 {
1133     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1134     if (!token) {
1135         return nullptr;
1136     }
1137     // first find in terminating list
1138     for (auto ability : terminateAbilityList_) {
1139         if (ability && token == ability->GetToken()->AsObject()) {
1140             return ability;
1141         }
1142     }
1143 
1144     return GetAliveAbilityRecordByToken(token);
1145 }
1146 
GetAliveAbilityRecordByToken(const sptr<IRemoteObject> & token) const1147 std::shared_ptr<AbilityRecord> MissionListManager::GetAliveAbilityRecordByToken(
1148     const sptr<IRemoteObject> &token) const
1149 {
1150     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1151     if (!token) {
1152         return nullptr;
1153     }
1154 
1155     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
1156     for (auto missionList : currentMissionLists_) {
1157         if (missionList && (abilityRecord = missionList->GetAbilityRecordByToken(token)) != nullptr) {
1158             return abilityRecord;
1159         }
1160     }
1161 
1162     if ((abilityRecord = defaultSingleList_->GetAbilityRecordByToken(token)) != nullptr) {
1163         return abilityRecord;
1164     }
1165 
1166     return defaultStandardList_->GetAbilityRecordByToken(token);
1167 }
1168 
GetMissionById(int missionId) const1169 std::shared_ptr<Mission> MissionListManager::GetMissionById(int missionId) const
1170 {
1171     std::shared_ptr<Mission> mission = nullptr;
1172     for (auto missionList : currentMissionLists_) {
1173         if (missionList && (mission = missionList->GetMissionById(missionId)) != nullptr) {
1174             return mission;
1175         }
1176     }
1177 
1178     if ((mission = defaultSingleList_->GetMissionById(missionId)) != nullptr) {
1179         return mission;
1180     }
1181 
1182     if ((mission = launcherList_->GetMissionById(missionId)) != nullptr) {
1183         return mission;
1184     }
1185 
1186     return defaultStandardList_->GetMissionById(missionId);
1187 }
1188 
AbilityTransactionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)1189 int MissionListManager::AbilityTransactionDone(const sptr<IRemoteObject> &token, int state, const PacMap &saveData)
1190 {
1191     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1192     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
1193     std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
1194     TAG_LOGI(AAFwkTag::ABILITYMGR, "state: %{public}s.", abilityState.c_str());
1195 
1196     std::lock_guard guard(managerLock_);
1197     auto abilityRecord = GetAbilityFromTerminateListInner(token);
1198     if (abilityRecord == nullptr) {
1199         abilityRecord = GetAbilityRecordByTokenInner(token);
1200         CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1201     }
1202     abilityRecord->RemoveSignatureInfo();
1203     std::string element = abilityRecord->GetElementName().GetURI();
1204     TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
1205 
1206     if (targetState == AbilityState::BACKGROUND) {
1207         abilityRecord->SaveAbilityState(saveData);
1208     }
1209 
1210     return DispatchState(abilityRecord, targetState);
1211 }
1212 
DispatchState(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)1213 int MissionListManager::DispatchState(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
1214 {
1215     switch (state) {
1216         case AbilityState::INITIAL: {
1217             return DispatchTerminate(abilityRecord);
1218         }
1219         case AbilityState::BACKGROUND:
1220         case AbilityState::BACKGROUND_FAILED: {
1221             return DispatchBackground(abilityRecord);
1222         }
1223         case AbilityState::FOREGROUND: {
1224             return DispatchForeground(abilityRecord, true);
1225         }
1226         case AbilityState::FOREGROUND_FAILED:
1227         case AbilityState::FOREGROUND_INVALID_MODE:
1228         case AbilityState::FOREGROUND_WINDOW_FREEZED:
1229         case AbilityState::FOREGROUND_DO_NOTHING: {
1230             return DispatchForeground(abilityRecord, false, static_cast<AbilityState>(state));
1231         }
1232         default: {
1233             TAG_LOGW(AAFwkTag::ABILITYMGR, "Don't support transiting state: %{public}d", state);
1234             return ERR_INVALID_VALUE;
1235         }
1236     }
1237 }
1238 
DispatchForeground(const std::shared_ptr<AbilityRecord> & abilityRecord,bool success,AbilityState state)1239 int MissionListManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord, bool success,
1240     AbilityState state)
1241 {
1242     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1243 
1244     if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
1245         PostStartWaitingAbility();
1246         TAG_LOGE(AAFwkTag::ABILITYMGR,
1247             "DispatchForeground Ability transition life state error. expect %{public}d, actual %{public}d",
1248             AbilityState::FOREGROUNDING, abilityRecord->GetAbilityState());
1249         return ERR_INVALID_VALUE;
1250     }
1251     auto eventHandler = AbilityManagerService::GetPubInstance()->GetEventHandler();
1252     CHECK_POINTER_AND_RETURN_LOG(eventHandler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1253     eventHandler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1254     g_deleteLifecycleEventTask(abilityRecord->GetToken(), FreezeUtil::TimeoutState::FOREGROUND);
1255     FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid());
1256     auto self(weak_from_this());
1257     auto taskHandler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
1258     CHECK_POINTER_AND_RETURN_LOG(taskHandler, ERR_INVALID_VALUE, "Fail to get AbilityTaskHandler.");
1259     if (success) {
1260 #ifdef SUPPORT_GRAPHICS
1261         TAG_LOGI(AAFwkTag::ABILITYMGR, "ok");
1262         abilityRecord->SetStartingWindow(false);
1263         auto taskName = std::to_string(abilityRecord->GetMissionId()) + "_hot";
1264         taskHandler->CancelTask(taskName);
1265 #endif
1266         auto task = [self, abilityRecord]() {
1267             auto selfObj = self.lock();
1268             if (!selfObj) {
1269                 TAG_LOGW(AAFwkTag::ABILITYMGR, "Mission list mgr is invalid.");
1270                 return;
1271             }
1272             selfObj->CompleteForegroundSuccess(abilityRecord);
1273         };
1274         taskHandler->SubmitTask(task);
1275     } else {
1276         auto task = [self, abilityRecord, state]() {
1277             auto selfObj = self.lock();
1278             if (!selfObj) {
1279                 TAG_LOGW(AAFwkTag::ABILITYMGR, "Mission list mgr is invalid.");
1280                 return;
1281             }
1282             selfObj->CompleteForegroundFailed(abilityRecord, state);
1283         };
1284         taskHandler->SubmitTask(task);
1285     }
1286     return ERR_OK;
1287 }
1288 
CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> & abilityRecord)1289 void MissionListManager::CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord)
1290 {
1291     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1292     std::lock_guard guard(managerLock_);
1293 
1294     CHECK_POINTER(abilityRecord);
1295     // ability do not save window mode
1296     abilityRecord->RemoveWindowMode();
1297     std::string element = abilityRecord->GetElementName().GetURI();
1298     TAG_LOGD(AAFwkTag::ABILITYMGR, "ability: %{public}s", element.c_str());
1299 
1300     abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
1301 
1302 #if BINDER_IPC_32BIT
1303     TAG_LOGI(AAFwkTag::ABILITYMGR, "bundle:%{public}s,ability:%{public}s,time:%{public}lld",
1304         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1305         abilityRecord->GetAbilityInfo().name.c_str(),
1306         AbilityUtil::UTCTimeSeconds());
1307 #else
1308     TAG_LOGI(AAFwkTag::ABILITYMGR, "bundle:%{public}s,ability:%{public}s,time:%{public}ld",
1309         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1310         abilityRecord->GetAbilityInfo().name.c_str(),
1311         AbilityUtil::UTCTimeSeconds());
1312 #endif
1313 
1314     auto mission = GetMissionById(abilityRecord->GetMissionId());
1315     if (mission) {
1316         auto currentTime = GetCurrentTime();
1317         mission->UpdateMissionTime(currentTime);
1318         InnerMissionInfo info;
1319         if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1320             mission->GetMissionId(), info) == 0) {
1321             info.missionInfo.time = currentTime;
1322             info.missionInfo.runningState = 0;
1323             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
1324         }
1325     }
1326 
1327     if (mission && mission->IsMovingState()) {
1328         mission->SetMovingState(false);
1329         if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
1330             listenerController_->NotifyMissionMovedToFront(mission->GetMissionId());
1331         }
1332     }
1333     PostStartWaitingAbility();
1334     TerminatePreviousAbility(abilityRecord);
1335 
1336     // new version. started by caller, scheduler call request
1337     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToForeground() && abilityRecord->IsReady()) {
1338         TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing foreground state");
1339         abilityRecord->CallRequest();
1340         abilityRecord->SetStartToForeground(false);
1341     }
1342 
1343     if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1344         abilityRecord->SetMinimizeReason(true);
1345         MoveToBackgroundTask(abilityRecord);
1346     } else if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1347         TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup.");
1348         abilityRecord->SetPendingState(AbilityState::INITIAL);
1349     }
1350 }
1351 
TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1352 void MissionListManager::TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1353 {
1354     auto terminatingAbilityRecord = abilityRecord->GetPreAbilityRecord();
1355     if (!terminatingAbilityRecord) {
1356         TAG_LOGI(AAFwkTag::ABILITYMGR, "terminatingAbilityRecord is nullptr.");
1357         return;
1358     }
1359     if (!terminatingAbilityRecord->IsTerminating()) {
1360         TAG_LOGI(AAFwkTag::ABILITYMGR, "terminatingAbilityRecord is not terminating.");
1361         return;
1362     }
1363     abilityRecord->SetPreAbilityRecord(nullptr);
1364     auto self(shared_from_this());
1365     if (terminatingAbilityRecord->GetAbilityState() == AbilityState::FOREGROUND) {
1366         MoveToBackgroundTask(terminatingAbilityRecord, true);
1367     }
1368     if (terminatingAbilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1369         auto task = [terminatingAbilityRecord, self]() {
1370             TAG_LOGI(AAFwkTag::ABILITYMGR, "To terminate terminatingAbilityRecord.");
1371             self->DelayCompleteTerminate(terminatingAbilityRecord);
1372         };
1373         terminatingAbilityRecord->Terminate(task);
1374     }
1375 }
1376 
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1377 int MissionListManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1378 {
1379     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
1380     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTasktHandler.");
1381     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1382 
1383     if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
1384         TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability transition life state error. actual %{public}d",
1385             abilityRecord->GetAbilityState());
1386         return ERR_INVALID_VALUE;
1387     }
1388 
1389     // remove background timeout task.
1390     handler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1391     g_deleteLifecycleEventTask(abilityRecord->GetToken(), FreezeUtil::TimeoutState::BACKGROUND);
1392     FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid());
1393     auto self(shared_from_this());
1394     auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1395     handler->SubmitTask(task);
1396 
1397     return ERR_OK;
1398 }
1399 
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1400 void MissionListManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1401 {
1402     std::lock_guard guard(managerLock_);
1403     if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1404         TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability state is %{public}d, it can't complete background.",
1405             abilityRecord->GetAbilityState());
1406         return;
1407     }
1408 
1409     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1410     // send application state to AppMS.
1411     // notify AppMS to update application state.
1412     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1413     if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1414         abilityRecord->PostForegroundTimeoutTask();
1415         DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
1416     } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1417         TAG_LOGD(AAFwkTag::ABILITYMGR, "not continuous startup.");
1418         abilityRecord->SetPendingState(AbilityState::INITIAL);
1419     }
1420 
1421     if (abilityRecord->IsSwitchingPause()) {
1422         abilityRecord->SetSwitchingPause(false);
1423         return;
1424     }
1425 
1426     // Abilities ahead of the one started with SingleTask mode were put in terminate list, we need to terminate
1427     // them.
1428     auto self(shared_from_this());
1429     for (auto terminateAbility : terminateAbilityList_) {
1430         if (terminateAbility->GetAbilityState() == AbilityState::BACKGROUND) {
1431             auto timeoutTask = [terminateAbility, self]() {
1432                 TAG_LOGW(AAFwkTag::ABILITYMGR, "Terminate ability timeout after background.");
1433                 self->DelayCompleteTerminate(terminateAbility);
1434             };
1435             terminateAbility->Terminate(timeoutTask);
1436         }
1437     }
1438 
1439     // new version. started by caller, scheduler call request
1440     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToBackground() && abilityRecord->IsReady()) {
1441         TAG_LOGD(AAFwkTag::ABILITYMGR, "call request after completing background state");
1442         abilityRecord->CallRequest();
1443         abilityRecord->SetStartToBackground(false);
1444     }
1445 }
1446 
BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,int32_t resultCode,const Want * resultWant,int64_t callerRequestCode)1447 int32_t MissionListManager::BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,
1448     int32_t resultCode, const Want *resultWant, int64_t callerRequestCode)
1449 {
1450     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1451     std::lock_guard<ffrt::mutex> guard(managerLock_);
1452     if (abilityRecord == nullptr) {
1453         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord nullptr.");
1454         return ERR_INVALID_VALUE;
1455     }
1456     auto requestInfo = StartupUtil::ParseFullRequestCode(callerRequestCode);
1457     TAG_LOGI(AAFwkTag::ABILITYMGR, "pid:%{public}d, backFlag:%{public}d, requestCode:%{public}d.",
1458         requestInfo.pid, requestInfo.backFlag, requestInfo.requestCode);
1459     if (requestInfo.requestCode <= 0 || requestInfo.pid <= 0) {
1460         TAG_LOGE(AAFwkTag::ABILITYMGR, "Cant't find caller by requestCode.");
1461         return ERR_CALLER_NOT_EXISTS;
1462     }
1463     auto callerAbilityRecord = abilityRecord->GetCallerByRequestCode(requestInfo.requestCode, requestInfo.pid);
1464     if (callerAbilityRecord == nullptr) {
1465         TAG_LOGE(AAFwkTag::ABILITYMGR, "Caller not exists.");
1466         return ERR_CALLER_NOT_EXISTS;
1467     }
1468     auto abilityResult = std::make_shared<AbilityResult>(requestInfo.requestCode, resultCode, *resultWant);
1469     callerAbilityRecord->SendResultByBackToCaller(abilityResult);
1470     abilityRecord->RemoveCallerRequestCode(callerAbilityRecord, requestInfo.requestCode);
1471     if (!requestInfo.backFlag) {
1472         TAG_LOGW(AAFwkTag::ABILITYMGR, "Not support back to caller");
1473         return ERR_NOT_SUPPORT_BACK_TO_CALLER;
1474     }
1475     if (callerAbilityRecord == abilityRecord) {
1476         TAG_LOGI(AAFwkTag::ABILITYMGR, "caller is self");
1477         return ERR_OK;
1478     }
1479     auto tokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
1480     TAG_LOGD(AAFwkTag::ABILITYMGR, "tokenId: %{public}d.", tokenId);
1481     if (!abilityRecord->IsForeground() && !abilityRecord->GetAbilityForegroundingFlag() &&
1482         !PermissionVerification::GetInstance()->VerifyPermissionByTokenId(tokenId,
1483         PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND)) {
1484         TAG_LOGW(AAFwkTag::ABILITYMGR, "can't start ability from background.");
1485         return CHECK_PERMISSION_FAILED;
1486     }
1487     // find host of UI Extension
1488     auto foundCount = 0;
1489     while (((++foundCount) <= MAX_FIND_UIEXTENSION_CALLER_TIMES) && callerAbilityRecord &&
1490         UIExtensionUtils::IsUIExtension(callerAbilityRecord->GetAbilityInfo().extensionAbilityType)) {
1491         TAG_LOGI(AAFwkTag::ABILITYMGR, "caller is uiExtension.");
1492         callerAbilityRecord = callerAbilityRecord->GetCallerRecord();
1493     }
1494     return MoveAbilityToBackgroundLocked(abilityRecord, callerAbilityRecord);
1495 }
1496 
MoveAbilityToBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1497 int MissionListManager::MoveAbilityToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1498 {
1499     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1500     std::lock_guard guard(managerLock_);
1501     return MoveAbilityToBackgroundLocked(abilityRecord);
1502 }
1503 
MoveAbilityToBackgroundLocked(const std::shared_ptr<AbilityRecord> & abilityRecord,const std::shared_ptr<AbilityRecord> & specifiedNextRecord)1504 int MissionListManager::MoveAbilityToBackgroundLocked(const std::shared_ptr<AbilityRecord> &abilityRecord,
1505     const std::shared_ptr<AbilityRecord> &specifiedNextRecord)
1506 {
1507     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1508     if (abilityRecord == nullptr) {
1509         TAG_LOGE(AAFwkTag::ABILITYMGR, "Move ability to background fail, ability record is null.");
1510         return ERR_INVALID_VALUE;
1511     }
1512     TAG_LOGD(AAFwkTag::ABILITYMGR, "ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
1513     RemoveBackgroundingAbility(abilityRecord);
1514 
1515     if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) {
1516         TAG_LOGD(AAFwkTag::ABILITYMGR, "current ability is active");
1517         abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1518         auto nextAbilityRecord = specifiedNextRecord ? specifiedNextRecord : abilityRecord->GetNextAbilityRecord();
1519         if (nextAbilityRecord) {
1520             nextAbilityRecord->SetPreAbilityRecord(abilityRecord);
1521 #ifdef SUPPORT_GRAPHICS
1522             nextAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1523             nextAbilityRecord->ProcessForegroundAbility(abilityRecord, false);
1524         } else {
1525             bool animaEnabled = false;
1526             if (!abilityRecord->IsClearMissionFlag()) {
1527                 abilityRecord->NotifyAnimationFromMinimizeAbility(animaEnabled);
1528             }
1529             if (animaEnabled) {
1530                 return ERR_OK;
1531             }
1532 #else
1533             nextAbilityRecord->ProcessForegroundAbility(0);
1534         } else {
1535 #endif
1536             MoveToBackgroundTask(abilityRecord, true);
1537         }
1538         return ERR_OK;
1539     } else {
1540         TAG_LOGE(AAFwkTag::ABILITYMGR, "Move ability to background fail, ability state is not foreground.");
1541         return ERR_OK;
1542     }
1543 }
1544 
GetMissionList(int32_t missionId)1545 std::shared_ptr<MissionList> MissionListManager::GetMissionList(int32_t missionId)
1546 {
1547     auto mission = GetMissionById(missionId);
1548     CHECK_POINTER_AND_RETURN(mission, nullptr);
1549     return mission->GetMissionList();
1550 }
1551 
RemoveBackgroundingAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1552 void MissionListManager::RemoveBackgroundingAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1553 {
1554     CHECK_POINTER_LOG(abilityRecord, "RemoveBackgroundingAbility fail, ability record is null.")
1555     auto missionList = GetMissionList(abilityRecord->GetMissionId());
1556     CHECK_POINTER(missionList);
1557     auto mission = missionList->GetTopMission();
1558     missionList->RemoveMissionByAbilityRecord(abilityRecord);
1559     if (mission->IsSingletonAbility()) {
1560         defaultSingleList_->AddMissionToTop(mission);
1561     } else {
1562         defaultStandardList_->AddMissionToTop(mission);
1563     }
1564 
1565     if (missionList->IsEmpty()) {
1566         TAG_LOGD(AAFwkTag::ABILITYMGR, "Remove backgrounding ability, missionList is empty, remove.");
1567         RemoveMissionList(missionList);
1568     }
1569 
1570     abilityRecord->SetNextAbilityRecord(nullptr);
1571     if (!(abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING))) {
1572         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability state is %{public}d, just return.", abilityRecord->GetAbilityState());
1573         return;
1574     }
1575 
1576     std::shared_ptr<AbilityRecord> needTopAbility;
1577     if (!missionList->IsEmpty()) {
1578         needTopAbility = missionList->GetTopAbility();
1579     } else {
1580         TAG_LOGD(AAFwkTag::ABILITYMGR, "mission list is empty, no next ability.");
1581     }
1582 
1583     if (!needTopAbility) {
1584         if (!abilityRecord->IsNeedBackToOtherMissionStack()) {
1585             TAG_LOGI(AAFwkTag::ABILITYMGR, "This ability doesn't need back to other mission stack.");
1586             return;
1587         }
1588         needTopAbility = abilityRecord->GetOtherMissionStackAbilityRecord();
1589         CHECK_POINTER_LOG(needTopAbility, "The ability needs back to other mission stack, but needTopAbility is null.")
1590         abilityRecord->SetNeedBackToOtherMissionStack(false);
1591     }
1592 
1593     AppExecFwk::ElementName elementName = needTopAbility->GetElementName();
1594     TAG_LOGD(AAFwkTag::ABILITYMGR, "Next top ability is %{public}s, state is %{public}d, minimizeReason is %{public}d!",
1595         elementName.GetURI().c_str(), needTopAbility->GetAbilityState(), needTopAbility->IsMinimizeFromUser());
1596 
1597     if (elementName.GetBundleName() == AbilityConfig::LAUNCHER_BUNDLE_NAME &&
1598         elementName.GetAbilityName() == AbilityConfig::LAUNCHER_RECENT_ABILITY_NAME) {
1599         TAG_LOGD(AAFwkTag::ABILITYMGR, "Next to need is recent, just to launcher!");
1600         needTopAbility = launcherList_->GetLauncherRoot();
1601     }
1602 
1603     CHECK_POINTER_LOG(needTopAbility, "NeedTopAbility of launcherRoot is null.")
1604 
1605     if (!needTopAbility->IsForeground() && !needTopAbility->IsMinimizeFromUser() && needTopAbility->IsReady()) {
1606         TAG_LOGD(AAFwkTag::ABILITYMGR, "%{public}s is need to foreground.", elementName.GetURI().c_str());
1607         abilityRecord->SetNextAbilityRecord(needTopAbility);
1608     }
1609 }
1610 
TerminateAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool flag)1611 int MissionListManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1612     int resultCode, const Want *resultWant, bool flag)
1613 {
1614     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1615     std::lock_guard guard(managerLock_);
1616     return TerminateAbilityInner(abilityRecord, resultCode, resultWant, flag);
1617 }
1618 
TerminateAbilityInner(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool flag)1619 int MissionListManager::TerminateAbilityInner(const std::shared_ptr<AbilityRecord> &abilityRecord,
1620     int resultCode, const Want *resultWant, bool flag)
1621 {
1622     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1623     std::string element = abilityRecord->GetElementName().GetURI();
1624     TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate ability, ability is %{public}s.", element.c_str());
1625     if (abilityRecord->IsTerminating() && !abilityRecord->IsForeground()) {
1626         TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability is on terminating.");
1627         return ERR_OK;
1628     }
1629 
1630     if (abilityRecord->IsTerminating() && abilityRecord->IsForeground()) {
1631         TAG_LOGW(AAFwkTag::ABILITYMGR, "Ability is on terminating and ability state is foreground, force close");
1632         flag = false;
1633     }
1634 
1635     // double check to avoid the ability has been removed
1636     if (!GetAbilityRecordByTokenInner(abilityRecord->GetToken())) {
1637         TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability has already been removed");
1638         return ERR_OK;
1639     }
1640 
1641     abilityRecord->SetTerminatingState();
1642     // save result to caller AbilityRecord
1643     if (resultWant != nullptr) {
1644         Want* newWant = const_cast<Want*>(resultWant);
1645         newWant->RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
1646         abilityRecord->SaveResultToCallers(resultCode, newWant);
1647     } else {
1648         Want want;
1649         abilityRecord->SaveResultToCallers(resultCode, &want);
1650     }
1651 
1652     return TerminateAbilityLocked(abilityRecord, flag);
1653 }
1654 
TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1655 int MissionListManager::TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1656 {
1657     std::string element = abilityRecord->GetElementName().GetURI();
1658     TAG_LOGD(AAFwkTag::ABILITYMGR, "Terminate ability locked, ability is %{public}s.", element.c_str());
1659     // remove AbilityRecord out of list
1660     RemoveTerminatingAbility(abilityRecord, flag);
1661     abilityRecord->SendResultToCallers();
1662 
1663     // 1. if the ability was foreground, first should find whether there is other ability foreground
1664     if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) {
1665         TAG_LOGD(AAFwkTag::ABILITYMGR, "current ability is active");
1666         abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1667         auto nextAbilityRecord = abilityRecord->GetNextAbilityRecord();
1668         if (nextAbilityRecord) {
1669             nextAbilityRecord->SetPreAbilityRecord(abilityRecord);
1670 #ifdef SUPPORT_GRAPHICS
1671             nextAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1672             nextAbilityRecord->ProcessForegroundAbility(abilityRecord);
1673         } else {
1674             if (!abilityRecord->IsClearMissionFlag()) {
1675                 abilityRecord->NotifyAnimationFromTerminatingAbility();
1676             }
1677 #else
1678             nextAbilityRecord->ProcessForegroundAbility(0);
1679         } else {
1680 #endif
1681             MoveToBackgroundTask(abilityRecord, true);
1682         }
1683         return ERR_OK;
1684     }
1685 
1686     // 2. if the ability was BACKGROUNDING, waiting for completeBackgroundNew
1687 
1688     // 3. ability on background, schedule to terminate.
1689     if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1690         auto self(shared_from_this());
1691         auto task = [abilityRecord, self]() {
1692             TAG_LOGW(AAFwkTag::ABILITYMGR, "Terminate ability timeout.");
1693             self->DelayCompleteTerminate(abilityRecord);
1694         };
1695         abilityRecord->Terminate(task);
1696     }
1697     return ERR_OK;
1698 }
1699 
1700 /**
1701  * @brief This method aims to do things as below
1702  * 1. remove the mission from the current missionList
1703  * 2. if the current missionList is empty after, then remove from the manager
1704  * 3. if the current ability is foreground, then should schedule the next ability to foreground before terminate
1705  *
1706  * @param abilityRecord the ability that was terminating
1707  */
RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1708 void MissionListManager::RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1709 {
1710     std::string element = abilityRecord->GetElementName().GetURI();
1711     TAG_LOGD(AAFwkTag::ABILITYMGR, "Remove terminating ability, ability is %{public}s.", element.c_str());
1712     if (GetAbilityFromTerminateListInner(abilityRecord->GetToken())) {
1713         abilityRecord->SetNextAbilityRecord(nullptr);
1714         TAG_LOGD(AAFwkTag::ABILITYMGR, "Find ability in terminating list, return.");
1715         return;
1716     }
1717     auto mission = GetMissionById(abilityRecord->GetMissionId());
1718     CHECK_POINTER(mission);
1719     auto missionList = mission->GetMissionList();
1720     CHECK_POINTER(missionList);
1721 
1722     missionList->RemoveMissionByAbilityRecord(abilityRecord);
1723     DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminate(abilityRecord->GetToken());
1724     terminateAbilityList_.push_back(abilityRecord);
1725 
1726     if (missionList->IsEmpty()) {
1727         TAG_LOGD(AAFwkTag::ABILITYMGR, "Remove terminating ability, missionList is empty, remove.");
1728         RemoveMissionList(missionList);
1729     }
1730 
1731     // 1. clear old
1732     abilityRecord->SetNextAbilityRecord(nullptr);
1733     // 2. if the ability to terminate is background, just background
1734     if (!(abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING))) {
1735         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability state is %{public}d, just return.", abilityRecord->GetAbilityState());
1736         return;
1737     }
1738     // 3. if close ability, noting to do
1739     if (!flag) {
1740         TAG_LOGD(AAFwkTag::ABILITYMGR, "Close ability schedule.");
1741         return;
1742     }
1743 
1744     // 4. the ability should find the next ability to foreground
1745     std::shared_ptr<AbilityRecord> needTopAbility;
1746     if (!missionList->IsEmpty()) {
1747         needTopAbility = missionList->GetTopAbility();
1748     } else {
1749         TAG_LOGD(AAFwkTag::ABILITYMGR, "mission list is empty, no next ability.");
1750     }
1751 
1752     if (!needTopAbility) {
1753         TAG_LOGD(AAFwkTag::ABILITYMGR, "The ability need to top is null.");
1754         if (!abilityRecord->IsNeedBackToOtherMissionStack()) {
1755             TAG_LOGI(AAFwkTag::ABILITYMGR, "This ability doesn't need back to other mission stack.");
1756             return;
1757         }
1758         needTopAbility = abilityRecord->GetOtherMissionStackAbilityRecord();
1759         if (!needTopAbility) {
1760             TAG_LOGE(
1761                 AAFwkTag::ABILITYMGR, "This ability needs back to other mission stack, but needTopAbility is null.");
1762             return;
1763         }
1764         abilityRecord->SetNeedBackToOtherMissionStack(false);
1765     }
1766     AppExecFwk::ElementName elementName = needTopAbility->GetElementName();
1767     TAG_LOGD(AAFwkTag::ABILITYMGR, "Next top ability is %{public}s, state is %{public}d, minimizeReason is %{public}d.",
1768         elementName.GetURI().c_str(), needTopAbility->GetAbilityState(), needTopAbility->IsMinimizeFromUser());
1769 
1770     // 5. if caller is recent, close
1771     if (elementName.GetBundleName() == AbilityConfig::LAUNCHER_BUNDLE_NAME &&
1772         elementName.GetAbilityName() == AbilityConfig::LAUNCHER_RECENT_ABILITY_NAME) {
1773         TAG_LOGD(AAFwkTag::ABILITYMGR, "Next to need is recent, just to launcher.");
1774         needTopAbility = launcherList_->GetLauncherRoot();
1775     }
1776 
1777     if (!needTopAbility) {
1778         TAG_LOGD(AAFwkTag::ABILITYMGR, "NeedTopAbility of launcherRoot is null.");
1779         return;
1780     }
1781 
1782     if (!needTopAbility->IsForeground() && !needTopAbility->IsMinimizeFromUser() && needTopAbility->IsReady()) {
1783         TAG_LOGD(AAFwkTag::ABILITYMGR, "%{public}s is need to foreground.", elementName.GetURI().c_str());
1784         abilityRecord->SetNextAbilityRecord(needTopAbility);
1785         needTopAbility->SetAbilityForegroundingFlag();
1786     }
1787 }
1788 
RemoveMissionList(const std::shared_ptr<MissionList> & missionList)1789 void MissionListManager::RemoveMissionList(const std::shared_ptr<MissionList> &missionList)
1790 {
1791     if (missionList == nullptr) {
1792         return;
1793     }
1794 
1795     for (auto iter = currentMissionLists_.begin(); iter != currentMissionLists_.end(); iter++) {
1796         if ((*iter) == missionList) {
1797             currentMissionLists_.erase(iter);
1798             return;
1799         }
1800     }
1801 }
1802 
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1803 int MissionListManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1804 {
1805     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1806     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1807         TAG_LOGE(AAFwkTag::ABILITYMGR, "DispatchTerminate error, ability state is %{public}d",
1808             abilityRecord->GetAbilityState());
1809         return INNER_ERR;
1810     }
1811 
1812     // remove terminate timeout task.
1813     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
1814     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityTasktHandler.");
1815     handler->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1816     auto self(shared_from_this());
1817     auto task = [self, abilityRecord]() { self->CompleteTerminate(abilityRecord); };
1818     handler->SubmitTask(task);
1819 
1820     return ERR_OK;
1821 }
1822 
DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1823 void MissionListManager::DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1824 {
1825     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
1826     CHECK_POINTER(handler);
1827 
1828     PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1829 
1830     auto timeoutTask = [self = shared_from_this(), abilityRecord]() {
1831         TAG_LOGI(AAFwkTag::ABILITYMGR, "emit delay complete terminate task.");
1832         self->CompleteTerminate(abilityRecord);
1833     };
1834     int killTimeout = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * KILL_TIMEOUT_MULTIPLE;
1835     handler->SubmitTask(timeoutTask, "DELAY_KILL_PROCESS", killTimeout);
1836 }
1837 
CompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1838 void MissionListManager::CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1839 {
1840     CHECK_POINTER(abilityRecord);
1841     std::lock_guard guard(managerLock_);
1842     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1843         TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s, ability is not terminating.", __func__);
1844         return;
1845     }
1846     abilityRecord->RemoveAbilityDeathRecipient();
1847 
1848     // notify AppMS terminate
1849     if (abilityRecord->TerminateAbility() != ERR_OK) {
1850         // Don't return here
1851         TAG_LOGE(AAFwkTag::ABILITYMGR, "AppMS fail to terminate ability.");
1852     }
1853 
1854     auto&& preAbilityRecord = abilityRecord->GetPreAbilityRecord();
1855     if (preAbilityRecord != nullptr) {
1856         TerminateAbilityLocked(preAbilityRecord, false);
1857     }
1858 
1859     CompleteTerminateAndUpdateMission(abilityRecord);
1860 }
1861 
CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> & abilityRecord)1862 void MissionListManager::CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> &abilityRecord)
1863 {
1864     CHECK_POINTER(abilityRecord);
1865     for (auto it : terminateAbilityList_) {
1866         if (it == abilityRecord) {
1867             abilityRecord->RevokeUriPermission();
1868             terminateAbilityList_.remove(it);
1869             // update inner mission info time
1870             bool excludeFromMissions = abilityRecord->GetAbilityInfo().excludeFromMissions;
1871             if ((abilityRecord->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) ||
1872                 abilityRecord->GetAbilityInfo().removeMissionAfterTerminate || excludeFromMissions) {
1873                 RemoveMissionLocked(abilityRecord->GetMissionId(), excludeFromMissions);
1874                 return;
1875             }
1876             InnerMissionInfo innerMissionInfo;
1877             auto missionId = abilityRecord->GetMissionId();
1878             int result = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1879                 missionId, innerMissionInfo);
1880             if (result != 0) {
1881                 TAG_LOGE(AAFwkTag::ABILITYMGR, "Get missionInfo error, result is %{public}d, missionId is %{public}d",
1882                     result, missionId);
1883                 break;
1884             }
1885             innerMissionInfo.hasRecoverInfo = false;
1886             innerMissionInfo.missionInfo.runningState = -1;
1887             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
1888             if (listenerController_) {
1889                 listenerController_->NotifyMissionClosed(missionId);
1890             }
1891             TAG_LOGD(AAFwkTag::ABILITYMGR, "Destroy ability record count %{public}ld", abilityRecord.use_count());
1892             break;
1893         }
1894         TAG_LOGW(AAFwkTag::ABILITYMGR, "Can't find ability in terminate list.");
1895     }
1896 }
1897 
GetAbilityFromTerminateList(const sptr<IRemoteObject> & token)1898 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityFromTerminateList(const sptr<IRemoteObject> &token)
1899 {
1900     std::lock_guard guard(managerLock_);
1901     return GetAbilityFromTerminateListInner(token);
1902 }
1903 
GetAbilityFromTerminateListInner(const sptr<IRemoteObject> & token)1904 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityFromTerminateListInner(const sptr<IRemoteObject> &token)
1905 {
1906     if (!token) {
1907         return nullptr;
1908     }
1909 
1910     for (auto abilityRecord : terminateAbilityList_) {
1911         // token is type of IRemoteObject, abilityRecord->GetToken() is type of Token extending from IRemoteObject.
1912         if (abilityRecord && abilityRecord->GetToken() && token == abilityRecord->GetToken()->AsObject()) {
1913             return abilityRecord;
1914         }
1915     }
1916     return nullptr;
1917 }
1918 
ClearMission(int missionId)1919 int MissionListManager::ClearMission(int missionId)
1920 {
1921     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1922     if (missionId < 0) {
1923         TAG_LOGE(AAFwkTag::ABILITYMGR, "Mission id is invalid.");
1924         return ERR_INVALID_VALUE;
1925     }
1926     std::lock_guard guard(managerLock_);
1927     auto mission = GetMissionById(missionId);
1928     if (mission && mission->GetMissionList() && mission->GetMissionList()->GetType() == MissionListType::LAUNCHER) {
1929         TAG_LOGE(AAFwkTag::ABILITYMGR, "Mission id is launcher, can not clear.");
1930         return ERR_INVALID_VALUE;
1931     }
1932 
1933     if (IsExcludeFromMissions(mission)) {
1934         TAG_LOGW(AAFwkTag::ABILITYMGR, "excludeFromMissions is true, not clear by id.");
1935         return ERR_INVALID_VALUE;
1936     }
1937 
1938     if (mission && mission->IsUnclearable()) {
1939         TAG_LOGW(AAFwkTag::ABILITYMGR, "mission is unclearable.");
1940         return ERR_INVALID_VALUE;
1941     }
1942 
1943     if (CheckPrepareTerminateEnable(mission)) {
1944         return PrepareClearMissionLocked(missionId, mission);
1945     }
1946 
1947     return ClearMissionLocked(missionId, mission);
1948 }
1949 
ClearMissionLocking(int missionId,const std::shared_ptr<Mission> & mission)1950 int MissionListManager::ClearMissionLocking(int missionId, const std::shared_ptr<Mission> &mission)
1951 {
1952     std::lock_guard guard(managerLock_);
1953     return ClearMissionLocked(missionId, mission);
1954 }
1955 
ClearMissionLocked(int missionId,const std::shared_ptr<Mission> & mission)1956 int MissionListManager::ClearMissionLocked(int missionId, const std::shared_ptr<Mission> &mission)
1957 {
1958     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1959     if (missionId != -1) {
1960         DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
1961         if (listenerController_) {
1962             listenerController_->NotifyMissionDestroyed(missionId);
1963         }
1964     }
1965 
1966     if (mission == nullptr) {
1967         TAG_LOGD(AAFwkTag::ABILITYMGR, "ability has already terminate, just remove mission.");
1968         return ERR_OK;
1969     }
1970 
1971     auto abilityRecord = mission->GetAbilityRecord();
1972     if (abilityRecord == nullptr || abilityRecord->IsTerminating()) {
1973         TAG_LOGW(AAFwkTag::ABILITYMGR, "Ability record is not exist or is on terminating.");
1974         return ERR_OK;
1975     }
1976 
1977     abilityRecord->SetTerminatingState();
1978     abilityRecord->SetClearMissionFlag(true);
1979     Want want;
1980     abilityRecord->SaveResultToCallers(-1, &want);
1981     auto ret = TerminateAbilityLocked(abilityRecord, false);
1982     if (ret != ERR_OK) {
1983         TAG_LOGE(AAFwkTag::ABILITYMGR, "clear mission error: %{public}d.", ret);
1984         return REMOVE_MISSION_FAILED;
1985     }
1986 
1987     return ERR_OK;
1988 }
1989 
ClearAllMissions()1990 int MissionListManager::ClearAllMissions()
1991 {
1992     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1993     std::lock_guard guard(managerLock_);
1994     DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteAllMissionInfos(listenerController_);
1995     std::list<std::shared_ptr<Mission>> foregroundAbilities;
1996     ClearAllMissionsLocked(defaultStandardList_->GetAllMissions(), foregroundAbilities, false);
1997     ClearAllMissionsLocked(defaultSingleList_->GetAllMissions(), foregroundAbilities, false);
1998     {
1999         HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER,
2000             "for (auto listIter = currentMissionLists_.begin(); listIter != currentMissionLists_.end();)");
2001         for (auto listIter = currentMissionLists_.begin(); listIter != currentMissionLists_.end();) {
2002             auto missionList = (*listIter);
2003             listIter++;
2004             if (!missionList || missionList->GetType() == MissionListType::LAUNCHER) {
2005                 continue;
2006             }
2007             ClearAllMissionsLocked(missionList->GetAllMissions(), foregroundAbilities, true);
2008         }
2009     }
2010 
2011     ClearAllMissionsLocked(foregroundAbilities, foregroundAbilities, false);
2012     return ERR_OK;
2013 }
2014 
ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> & missionList,std::list<std::shared_ptr<Mission>> & foregroundAbilities,bool searchActive)2015 void MissionListManager::ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> &missionList,
2016     std::list<std::shared_ptr<Mission>> &foregroundAbilities, bool searchActive)
2017 {
2018     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2019     for (auto listIter = missionList.begin(); listIter != missionList.end();) {
2020         auto mission = (*listIter);
2021         listIter++;
2022         if (!mission || mission->IsLockedState()) {
2023             continue;
2024         }
2025 
2026         if (mission && mission->IsUnclearable()) {
2027             TAG_LOGW(AAFwkTag::ABILITYMGR, "mission is unclearable.");
2028             continue;
2029         }
2030 
2031         auto abilityMs_ = AbilityManagerService::GetPubInstance();
2032         if (abilityMs_->IsBackgroundTaskUid(mission->GetAbilityRecord()->GetUid())) {
2033             TAG_LOGI(AAFwkTag::ABILITYMGR, "the mission is background task, do not need clear");
2034             continue;
2035         }
2036 
2037         if (searchActive && mission->GetAbilityRecord() && mission->GetAbilityRecord()->IsActiveState()) {
2038             foregroundAbilities.push_front(mission);
2039             continue;
2040         }
2041         if (CheckPrepareTerminateEnable(mission)) {
2042             PrepareClearMissionLocked(-1, mission);
2043         } else {
2044             ClearMissionLocked(-1, mission);
2045         }
2046     }
2047 }
2048 
SetMissionLockedState(int missionId,bool lockedState)2049 int MissionListManager::SetMissionLockedState(int missionId, bool lockedState)
2050 {
2051     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2052     std::lock_guard guard(managerLock_);
2053     if (missionId < 0) {
2054         TAG_LOGE(AAFwkTag::ABILITYMGR, "param is invalid");
2055         return MISSION_NOT_FOUND;
2056     }
2057 
2058     std::shared_ptr<Mission> mission = GetMissionById(missionId);
2059     if (mission) {
2060         auto abilityRecord = mission->GetAbilityRecord();
2061         if (abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions) {
2062             TAG_LOGE(AAFwkTag::ABILITYMGR, "excludeFromMissions is true, missionId:%{public}d", missionId);
2063             return MISSION_NOT_FOUND;
2064         }
2065         mission->SetLockedState(lockedState);
2066     }
2067 
2068     // update inner mission info time
2069     InnerMissionInfo innerMissionInfo;
2070     auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo);
2071     if (ret != 0) {
2072         TAG_LOGE(AAFwkTag::ABILITYMGR, "mission is not exist, missionId %{public}d", missionId);
2073         return MISSION_NOT_FOUND;
2074     }
2075     innerMissionInfo.missionInfo.lockedState = lockedState;
2076     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
2077     return ERR_OK;
2078 }
2079 
UpdateSnapShot(const sptr<IRemoteObject> & token,const std::shared_ptr<Media::PixelMap> & pixelMap)2080 void MissionListManager::UpdateSnapShot(const sptr<IRemoteObject> &token,
2081     const std::shared_ptr<Media::PixelMap> &pixelMap)
2082 {
2083     auto abilityRecord = GetAbilityRecordByToken(token);
2084     if (!abilityRecord) {
2085         TAG_LOGE(AAFwkTag::ABILITYMGR, "Cannot find AbilityRecord by Token.");
2086         return;
2087     }
2088     if (abilityRecord->GetAbilityInfo().excludeFromMissions) {
2089         TAG_LOGD(AAFwkTag::ABILITYMGR, "excludeFromMissions is true, no need to update mission snapshot.");
2090         return;
2091     }
2092     int32_t missionId = abilityRecord->GetMissionId();
2093     auto isPrivate = abilityRecord->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX;
2094     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionSnapshot(missionId, pixelMap, isPrivate);
2095     if (listenerController_) {
2096         listenerController_->NotifyMissionSnapshotChanged(missionId);
2097     }
2098 }
2099 
GetAbilityNumber(const AppExecFwk::ElementName & element) const2100 int32_t MissionListManager::GetAbilityNumber(const AppExecFwk::ElementName &element) const
2101 {
2102     int32_t getAbilityNumber = 0;
2103 
2104     // find in currentMissionLists_
2105     for (auto const &missionList : currentMissionLists_) {
2106         if (missionList != nullptr) {
2107             auto ability = missionList->GetAbilityRecordByName(element);
2108             if (ability != nullptr) {
2109                 getAbilityNumber++;
2110             }
2111         }
2112     }
2113 
2114     // find in defaultStandardList_
2115     if (defaultStandardList_ != nullptr) {
2116         auto defaultStandardAbility = defaultStandardList_->GetAbilityRecordByName(element);
2117         if (defaultStandardAbility != nullptr) {
2118             getAbilityNumber++;
2119         }
2120     }
2121 
2122     return getAbilityNumber;
2123 }
2124 
MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> & abilityRecord,bool isClose)2125 void MissionListManager::MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> &abilityRecord, bool isClose)
2126 {
2127     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2128     if (abilityRecord == nullptr) {
2129         TAG_LOGE(AAFwkTag::ABILITYMGR, "Move the ability to background fail, ability record is null.");
2130         return;
2131     }
2132     TAG_LOGI(AAFwkTag::ABILITYMGR, "ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
2133     abilityRecord->SetIsNewWant(false);
2134     if (abilityRecord->lifeCycleStateInfo_.sceneFlag != SCENE_FLAG_KEYGUARD &&
2135         !abilityRecord->IsClearMissionFlag() &&
2136         !(isClose && AbilityManagerService::GetPubInstance()->GetAnimationFlag())) {
2137         UpdateMissionSnapshot(abilityRecord);
2138     }
2139 
2140     auto self(shared_from_this());
2141     auto task = [abilityRecord, self]() {
2142         TAG_LOGE(AAFwkTag::ABILITYMGR, "Mission list manager move to background timeout.");
2143         self->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
2144         self->CompleteBackground(abilityRecord);
2145     };
2146     abilityRecord->BackgroundAbility(task);
2147 }
2148 
NotifyMissionCreated(const std::shared_ptr<AbilityRecord> & abilityRecord) const2149 void  MissionListManager::NotifyMissionCreated(const std::shared_ptr<AbilityRecord> &abilityRecord) const
2150 {
2151     CHECK_POINTER(abilityRecord);
2152     auto mission = GetMissionById(abilityRecord->GetMissionId());
2153     if (mission && mission->NeedNotify() && listenerController_ &&
2154         !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
2155         auto missionId = abilityRecord->GetMissionId();
2156         listenerController_->NotifyMissionCreated(missionId);
2157         mission->SetNotifyLabel(false);
2158 
2159         if (mission->NeedNotifyUpdateLabel()) {
2160             PostMissionLabelUpdateTask(missionId);
2161             mission->SetNeedNotifyUpdateLabel(false);
2162         }
2163     }
2164 }
2165 
PostMissionLabelUpdateTask(int missionId) const2166 void MissionListManager::PostMissionLabelUpdateTask(int missionId) const
2167 {
2168     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
2169     if (handler == nullptr) {
2170         TAG_LOGE(AAFwkTag::ABILITYMGR, "Fail to get EventHandler, do not post mission label update message.");
2171         return;
2172     }
2173 
2174     std::weak_ptr<MissionListenerController> wpController = listenerController_;
2175     auto task = [wpController, missionId] {
2176         auto controller = wpController.lock();
2177         if (controller == nullptr) {
2178             TAG_LOGE(AAFwkTag::ABILITYMGR, "controller is nullptr.");
2179             return;
2180         }
2181         controller->NotifyMissionLabelUpdated(missionId);
2182     };
2183     handler->SubmitTask(task, "NotifyMissionLabelUpdated.", DELAY_NOTIFY_LABEL_TIME);
2184 }
2185 
PrintTimeOutLog(const std::shared_ptr<AbilityRecord> & ability,uint32_t msgId,bool isHalf)2186 void MissionListManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId, bool isHalf)
2187 {
2188     if (ability == nullptr) {
2189         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability is nullptr");
2190         return;
2191     }
2192 
2193     AppExecFwk::RunningProcessInfo processInfo = {};
2194     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
2195     if (processInfo.pid_ == 0) {
2196         TAG_LOGE(AAFwkTag::ABILITYMGR, "error: the ability[%{public}s], app may fork fail or not running.",
2197             ability->GetAbilityInfo().name.data());
2198         return;
2199     }
2200     int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT;
2201     std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
2202     FreezeUtil::TimeoutState state = MsgId2State(msgId);
2203     if (!GetContentAndTypeId(msgId, msgContent, typeId)) {
2204         TAG_LOGW(AAFwkTag::ABILITYMGR, "msgId is invalid!");
2205         return;
2206     }
2207 
2208     std::string eventName = isHalf ?
2209         AppExecFwk::AppFreezeType::LIFECYCLE_HALF_TIMEOUT : AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT;
2210     TAG_LOGW(AAFwkTag::ABILITYMGR,
2211         "%{public}s: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
2212         "msg: %{public}s!",
2213         eventName.c_str(), processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
2214         ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
2215 
2216     AppExecFwk::AppfreezeManager::ParamInfo info = {
2217         .typeId = typeId,
2218         .pid = processInfo.pid_,
2219         .eventName = eventName,
2220         .bundleName = ability->GetAbilityInfo().bundleName,
2221     };
2222     if (state != FreezeUtil::TimeoutState::UNKNOWN) {
2223         FreezeUtil::LifecycleFlow flow;
2224         if (ability->GetToken() != nullptr) {
2225             flow.token = ability->GetToken()->AsObject();
2226             flow.state = state;
2227         }
2228         info.msg = msgContent + "\nserver:\n" + FreezeUtil::GetInstance().GetLifecycleEvent(flow)
2229             + "\nserver app:\n" + FreezeUtil::GetInstance().GetAppLifecycleEvent(processInfo.pid_);
2230         if (!isHalf) {
2231             FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
2232             FreezeUtil::GetInstance().DeleteAppLifecycleEvent(ability->GetPid());
2233         }
2234         AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info, flow);
2235     } else {
2236         info.msg = msgContent;
2237         AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(info);
2238     }
2239 }
2240 
GetContentAndTypeId(uint32_t msgId,std::string & msgContent,int & typeId) const2241 bool MissionListManager::GetContentAndTypeId(uint32_t msgId, std::string &msgContent, int &typeId) const
2242 {
2243     switch (msgId) {
2244         case AbilityManagerService::LOAD_TIMEOUT_MSG:
2245             msgContent += "load timeout";
2246             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
2247             break;
2248         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
2249             msgContent += "active timeout";
2250             break;
2251         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
2252             msgContent += "inactive timeout";
2253             break;
2254         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
2255             msgContent += "foreground timeout";
2256             typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
2257             break;
2258         case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
2259             msgContent += "background timeout";
2260             break;
2261         case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
2262             msgContent += "terminate timeout";
2263             break;
2264         default:
2265             return false;
2266     }
2267     return true;
2268 }
2269 
UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord> & abilityRecord) const2270 void MissionListManager::UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord>& abilityRecord) const
2271 {
2272     CHECK_POINTER(abilityRecord);
2273     if (abilityRecord->GetAbilityInfo().excludeFromMissions) {
2274         TAG_LOGD(AAFwkTag::ABILITYMGR, "excludeFromMissions is true, no need to update mission snapshot.");
2275         return;
2276     }
2277     int32_t missionId = abilityRecord->GetMissionId();
2278     MissionSnapshot snapshot;
2279     snapshot.isPrivate = (abilityRecord->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX);
2280     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionSnapshot(missionId, abilityRecord->GetToken(),
2281         snapshot);
2282     if (listenerController_) {
2283         listenerController_->NotifyMissionSnapshotChanged(missionId);
2284     }
2285 }
2286 
OnTimeOut(uint32_t msgId,int64_t abilityRecordId,bool isHalf)2287 void MissionListManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf)
2288 {
2289     TAG_LOGI(AAFwkTag::ABILITYMGR, "On timeout, msgId is %{public}d", msgId);
2290     std::lock_guard guard(managerLock_);
2291     auto abilityRecord = GetAbilityRecordById(abilityRecordId);
2292     if (abilityRecord == nullptr) {
2293         TAG_LOGE(AAFwkTag::ABILITYMGR, "MissionListManager on time out event: ability record is nullptr.");
2294         return;
2295     }
2296     TAG_LOGI(AAFwkTag::ABILITYMGR, "Ability timeout, name:%{public}s", abilityRecord->GetAbilityInfo().name.c_str());
2297     abilityRecord->RevokeUriPermission();
2298 
2299 #ifdef SUPPORT_GRAPHICS
2300     if (abilityRecord->IsStartingWindow()) {
2301         PostCancelStartingWindowTask(abilityRecord);
2302     }
2303 #endif
2304 
2305     PrintTimeOutLog(abilityRecord, msgId, isHalf);
2306     if (isHalf) {
2307         return;
2308     }
2309     switch (msgId) {
2310         case AbilityManagerService::LOAD_TIMEOUT_MSG:
2311             abilityRecord->SetLoading(false);
2312             HandleLoadTimeout(abilityRecord);
2313             break;
2314         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
2315             break;
2316         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
2317         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
2318             HandleForegroundTimeout(abilityRecord);
2319             break;
2320         default:
2321             break;
2322     }
2323 }
2324 
HandleLoadTimeout(const std::shared_ptr<AbilityRecord> & ability)2325 void MissionListManager::HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &ability)
2326 {
2327     if (ability == nullptr) {
2328         TAG_LOGE(AAFwkTag::ABILITYMGR, "MissionListManager on time out event: ability record is nullptr.");
2329         return;
2330     }
2331     // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
2332     if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
2333         ability->SetRestarting(true);
2334         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
2335         TAG_LOGI(AAFwkTag::ABILITYMGR, "Launcher root load timeout, restart.");
2336         DelayedStartLauncher();
2337         return;
2338     }
2339 
2340     // other
2341     HandleTimeoutAndResumeAbility(ability);
2342 }
2343 
HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> & ability,AbilityState state)2344 void MissionListManager::HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &ability, AbilityState state)
2345 {
2346     if (ability == nullptr) {
2347         TAG_LOGE(AAFwkTag::ABILITYMGR, "MissionListManager on time out event: ability record is nullptr.");
2348         return;
2349     }
2350 
2351     auto mission = GetMissionById(ability->GetMissionId());
2352     if (mission) {
2353         mission->SetMovingState(false);
2354     }
2355 
2356     if (!ability->IsAbilityState(AbilityState::FOREGROUNDING)) {
2357         TAG_LOGE(AAFwkTag::ABILITYMGR, "this ability is not foregrounding state.");
2358         return;
2359     }
2360 
2361     // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
2362     if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
2363         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
2364         TAG_LOGI(AAFwkTag::ABILITYMGR, "Launcher root load timeout, restart.");
2365         DelayedStartLauncher();
2366         return;
2367     }
2368 
2369     // other
2370     HandleTimeoutAndResumeAbility(ability, state);
2371 }
2372 
CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> & abilityRecord,AbilityState state)2373 void MissionListManager::CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> &abilityRecord,
2374     AbilityState state)
2375 {
2376     TAG_LOGD(AAFwkTag::ABILITYMGR, "CompleteForegroundFailed come, state: %{public}d.", static_cast<int32_t>(state));
2377     std::lock_guard guard(managerLock_);
2378     if (abilityRecord == nullptr) {
2379         TAG_LOGE(AAFwkTag::ABILITYMGR, "CompleteForegroundFailed, ability is nullptr.");
2380         return;
2381     }
2382     if (state == AbilityState::FOREGROUND_WINDOW_FREEZED) {
2383         TAG_LOGI(AAFwkTag::ABILITYMGR, "Window was freezed.");
2384         abilityRecord->SetPendingState(AbilityState::INITIAL);
2385         abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
2386         DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
2387         TerminatePreviousAbility(abilityRecord);
2388         return;
2389     }
2390     if (state == AbilityState::FOREGROUND_DO_NOTHING) {
2391         TAG_LOGI(AAFwkTag::ABILITYMGR, "ForegroundFailed. WMS return do_nothing");
2392         abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
2393         MoveToBackgroundTask(abilityRecord);
2394         return;
2395     }
2396 #ifdef SUPPORT_GRAPHICS
2397     if (state == AbilityState::FOREGROUND_INVALID_MODE) {
2398         abilityRecord->SetStartingWindow(false);
2399     }
2400     if (abilityRecord->IsStartingWindow()) {
2401         PostCancelStartingWindowTask(abilityRecord);
2402     }
2403 #endif
2404 
2405     HandleForegroundTimeout(abilityRecord, state);
2406     TerminatePreviousAbility(abilityRecord);
2407     PostStartWaitingAbility();
2408 }
2409 
HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> & timeOutAbilityRecord,AbilityState state)2410 void MissionListManager::HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> &timeOutAbilityRecord,
2411     AbilityState state)
2412 {
2413     TAG_LOGD(AAFwkTag::ABILITYMGR, "HandleTimeoutAndResumeTopAbility start");
2414     if (timeOutAbilityRecord == nullptr) {
2415         TAG_LOGE(AAFwkTag::ABILITYMGR, "LoadAndForeGroundCommon: timeOutAbilityRecord is nullptr.");
2416         return;
2417     }
2418 
2419     // complete mission list moving
2420     MoveToTerminateList(timeOutAbilityRecord);
2421 
2422     // load and foreground timeout, notify appMs force terminate the ability.
2423     DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(timeOutAbilityRecord->GetToken());
2424 
2425     // caller not exist or caller is service or timeout ability is launcher, back to launcher
2426     auto callerAbility = timeOutAbilityRecord->GetCallerRecord();
2427     if ((callerAbility == nullptr) ||
2428         (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::SERVICE) ||
2429         (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::EXTENSION) ||
2430         timeOutAbilityRecord->IsLauncherAbility() ||
2431         callerAbility->IsLauncherAbility()) {
2432         TAG_LOGD(AAFwkTag::ABILITYMGR, "ability timeout, back to launcher.");
2433         DelayedStartLauncher();
2434         return;
2435     }
2436 
2437     if (state != AbilityState::FOREGROUND_INVALID_MODE) {
2438         DelayedResumeTimeout(callerAbility);
2439     }
2440 
2441     TAG_LOGI(AAFwkTag::ABILITYMGR, "ok");
2442 }
2443 
DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> & callerAbility)2444 void MissionListManager::DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> &callerAbility)
2445 {
2446     auto abilityManagerService = AbilityManagerService::GetPubInstance();
2447     CHECK_POINTER(abilityManagerService);
2448     auto handler = abilityManagerService->GetTaskHandler();
2449     CHECK_POINTER(handler);
2450     std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
2451     auto timeoutTask = [wpListMgr, callerAbility]() {
2452         TAG_LOGD(AAFwkTag::ABILITYMGR, "The caller ability need to resume.");
2453         auto listMgr = wpListMgr.lock();
2454         if (listMgr) {
2455             listMgr->BackToCaller(callerAbility);
2456         }
2457     };
2458     handler->SubmitTask(timeoutTask, "Caller_Restart");
2459 }
2460 
BackToCaller(const std::shared_ptr<AbilityRecord> & callerAbility)2461 void MissionListManager::BackToCaller(const std::shared_ptr<AbilityRecord> &callerAbility)
2462 {
2463     TAG_LOGI(AAFwkTag::ABILITYMGR, "Back to Caller.");
2464     std::lock_guard guard(managerLock_);
2465 
2466     // caller is already the top ability and foregroundnew.
2467     auto topAbility = GetCurrentTopAbilityLocked();
2468     if (callerAbility == topAbility && topAbility->IsAbilityState(AbilityState::FOREGROUND)) {
2469         TAG_LOGD(AAFwkTag::ABILITYMGR, "caller is already the top ability and foregroundnew.");
2470         return;
2471     }
2472 
2473     // other , resume caller ability to top and foreground.
2474     MoveMissionToFrontInner(callerAbility->GetMissionId(), false, false, nullptr);
2475 }
2476 
MoveToTerminateList(const std::shared_ptr<AbilityRecord> & abilityRecord)2477 void MissionListManager::MoveToTerminateList(const std::shared_ptr<AbilityRecord>& abilityRecord)
2478 {
2479     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
2480     if (abilityRecord == nullptr) {
2481         TAG_LOGE(AAFwkTag::ABILITYMGR, "timeout ability record is nullptr.");
2482         return;
2483     }
2484     auto mission = GetMissionById(abilityRecord->GetMissionId());
2485     CHECK_POINTER(mission);
2486     auto missionList = mission->GetMissionList();
2487     if (missionList == nullptr) {
2488         TAG_LOGE(AAFwkTag::ABILITYMGR, "timeout missionList is nullptr.");
2489         return;
2490     }
2491     auto selMission = GetMissionById(abilityRecord->GetMissionId());
2492     if (selMission == nullptr) {
2493         TAG_LOGE(AAFwkTag::ABILITYMGR, "timeout mission is nullptr.");
2494         return;
2495     }
2496 
2497     missionList->RemoveMission(selMission);
2498     if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
2499         RemoveMissionList(missionList);
2500     }
2501 
2502     // load timeout will not wait for died event, directly remove.
2503     if (abilityRecord->IsAbilityState(AbilityState::INITIAL)) {
2504         TAG_LOGW(AAFwkTag::ABILITYMGR, "load timeout will not wait for died event, directly remove.");
2505         // update running state.
2506         InnerMissionInfo info;
2507         auto missionId = selMission->GetMissionId();
2508         if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2509             info.missionInfo.runningState = -1;
2510             if (listenerController_) {
2511                 listenerController_->NotifyMissionClosed(missionId);
2512             }
2513             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2514         }
2515         return;
2516     }
2517     TAG_LOGD(AAFwkTag::ABILITYMGR, "success move timeout ability to terminate mission list.");
2518     // other remove to terminate list.
2519     abilityRecord->SetTerminatingState();
2520     terminateAbilityList_.push_back(abilityRecord);
2521 
2522     TAG_LOGI(AAFwkTag::ABILITYMGR, "MoveToDefaultList end");
2523 }
2524 
GetAbilityRecordByCaller(const std::shared_ptr<AbilityRecord> & caller,int requestCode)2525 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByCaller(
2526     const std::shared_ptr<AbilityRecord> &caller, int requestCode)
2527 {
2528     if (!caller) {
2529         return nullptr;
2530     }
2531 
2532     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2533     for (auto missionList : currentMissionLists_) {
2534         if (missionList && (abilityRecord = missionList->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2535             return abilityRecord;
2536         }
2537     }
2538 
2539     if ((abilityRecord = defaultSingleList_->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2540         return abilityRecord;
2541     }
2542 
2543     return defaultStandardList_->GetAbilityRecordByCaller(caller, requestCode);
2544 }
2545 
GetAbilityRecordById(int64_t abilityRecordId) const2546 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordById(int64_t abilityRecordId) const
2547 {
2548     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2549     for (auto missionList : currentMissionLists_) {
2550         if (missionList && (abilityRecord = missionList->GetAbilityRecordById(abilityRecordId)) != nullptr) {
2551             return abilityRecord;
2552         }
2553     }
2554 
2555     if ((abilityRecord = defaultSingleList_->GetAbilityRecordById(abilityRecordId)) != nullptr) {
2556         return abilityRecord;
2557     }
2558 
2559     return defaultStandardList_->GetAbilityRecordById(abilityRecordId);
2560 }
2561 
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord,int32_t currentUserId)2562 void MissionListManager::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord, int32_t currentUserId)
2563 {
2564     TAG_LOGI(AAFwkTag::ABILITYMGR, "On ability died.");
2565     if (!abilityRecord) {
2566         TAG_LOGE(AAFwkTag::ABILITYMGR, "OnAbilityDied come, abilityRecord is nullptr.");
2567         return;
2568     }
2569     std::string element = abilityRecord->GetElementName().GetURI();
2570     TAG_LOGD(AAFwkTag::ABILITYMGR, "OnAbilityDied come, ability is %{public}s", element.c_str());
2571     if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2572         TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability type is not page.");
2573         return;
2574     }
2575 
2576     std::lock_guard guard(managerLock_);
2577 #ifdef SUPPORT_GRAPHICS
2578     if (abilityRecord->IsStartingWindow()) {
2579         PostCancelStartingWindowTask(abilityRecord);
2580     }
2581 #endif
2582 
2583     if (abilityRecord->IsLauncherRoot() && currentUserId != userId_) {
2584         TAG_LOGI(AAFwkTag::ABILITYMGR, "launcher root Ability died, state: INITIAL, %{public}d", __LINE__);
2585         abilityRecord->SetAbilityState(AbilityState::INITIAL);
2586         abilityRecord->SetRestarting(true);
2587         return;
2588     }
2589 
2590     auto handler = AbilityManagerService::GetPubInstance()->GetEventHandler();
2591     CHECK_POINTER_LOG(handler, "Get AbilityEventHandler failed.");
2592     if (abilityRecord->GetAbilityState() == AbilityState::INITIAL) {
2593         handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
2594         abilityRecord->SetLoading(false);
2595     }
2596     if (abilityRecord->GetAbilityState() == AbilityState::FOREGROUNDING) {
2597         handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
2598     }
2599     auto taskHandler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
2600     CHECK_POINTER_LOG(taskHandler, "Fail to get AbilityTaskHandler.");
2601     if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUNDING) {
2602         taskHandler->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
2603     }
2604     if (abilityRecord->GetAbilityState() == AbilityState::TERMINATING) {
2605         taskHandler->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
2606     }
2607 
2608     HandleAbilityDied(abilityRecord);
2609 }
2610 
GetTargetMissionList(int missionId,std::shared_ptr<Mission> & mission,bool & isReachToLimit)2611 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionList(int missionId, std::shared_ptr<Mission> &mission,
2612     bool &isReachToLimit)
2613 {
2614     mission = GetMissionById(missionId);
2615     if (mission) {
2616         TAG_LOGD(AAFwkTag::ABILITYMGR, "get mission by id successfully, missionId: %{public}d", missionId);
2617         auto missionList = mission->GetMissionList();
2618         if (!missionList) {
2619             // mission is not null ptr, so its missionList ptr should be not null ptr too.
2620             TAG_LOGE(AAFwkTag::ABILITYMGR, "mission list ptr is null ptr");
2621             return nullptr;
2622         }
2623 
2624         auto missionType = missionList->GetType();
2625         std::shared_ptr<MissionList> targetMissionList = nullptr;
2626         switch (missionType) {
2627             case LAUNCHER:
2628                 // not support move launcher to front.
2629                 TAG_LOGE(AAFwkTag::ABILITYMGR, "get launcher mission list, missionId: %{public}d", missionId);
2630                 break;
2631             case CURRENT:
2632                 targetMissionList = mission->GetMissionList();
2633                 break;
2634             case DEFAULT_STANDARD:
2635             case DEFAULT_SINGLE:
2636                 // generate a new missionList
2637                 targetMissionList = std::make_shared<MissionList>();
2638                 break;
2639             default:
2640                 TAG_LOGE(AAFwkTag::ABILITYMGR, "invalid missionType: %{public}d", missionType);
2641         }
2642         return targetMissionList;
2643     }
2644 
2645     // cannot find mission, may reasons: system restart or mission removed by system.
2646     TAG_LOGI(AAFwkTag::ABILITYMGR, "cannot find mission missionId: %{public}d", missionId);
2647 
2648     InnerMissionInfo innerMissionInfo;
2649     int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
2650         missionId, innerMissionInfo);
2651     if (getMission != ERR_OK) {
2652         TAG_LOGE(
2653             AAFwkTag::ABILITYMGR, "cannot find mission info from MissionInfoList by missionId: %{public}d", missionId);
2654         return nullptr;
2655     }
2656 
2657     // generate a new mission and missionList
2658     AbilityRequest abilityRequest;
2659     int generateAbility = AbilityManagerService::GetPubInstance()->GenerateAbilityRequest(
2660         innerMissionInfo.missionInfo.want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, userId_);
2661     if (generateAbility != ERR_OK) {
2662         TAG_LOGE(AAFwkTag::ABILITYMGR, "cannot find generate ability request, missionId: %{public}d", missionId);
2663         return nullptr;
2664     }
2665 
2666     if (CheckLimit()) {
2667         isReachToLimit = true;
2668         TAG_LOGE(AAFwkTag::ABILITYMGR, "already reach to limit, not create new mission list.");
2669         return nullptr;
2670     }
2671 
2672     auto abilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
2673     mission = std::make_shared<Mission>(innerMissionInfo.missionInfo.id, abilityRecord, innerMissionInfo.missionName);
2674     abilityRecord->UpdateRecoveryInfo(innerMissionInfo.hasRecoverInfo);
2675     innerMissionInfo.hasRecoverInfo = false;
2676     mission->SetLockedState(innerMissionInfo.missionInfo.lockedState);
2677     mission->SetUnclearable(innerMissionInfo.missionInfo.unclearable);
2678     abilityRecord->SetMissionId(mission->GetMissionId());
2679     abilityRecord->SetOwnerMissionUserId(userId_);
2680     SetLastExitReason(abilityRecord);
2681     std::shared_ptr<MissionList> newMissionList = std::make_shared<MissionList>();
2682     return newMissionList;
2683 }
2684 
GetMissionIdByAbilityToken(const sptr<IRemoteObject> & token)2685 int32_t MissionListManager::GetMissionIdByAbilityToken(const sptr<IRemoteObject> &token)
2686 {
2687     std::lock_guard guard(managerLock_);
2688     return GetMissionIdByAbilityTokenInner(token);
2689 }
2690 
GetMissionIdByAbilityTokenInner(const sptr<IRemoteObject> & token)2691 int32_t MissionListManager::GetMissionIdByAbilityTokenInner(const sptr<IRemoteObject> &token)
2692 {
2693     auto abilityRecord = GetAbilityRecordByTokenInner(token);
2694     if (!abilityRecord) {
2695         return -1;
2696     }
2697     auto mission = GetMissionById(abilityRecord->GetMissionId());
2698     if (!mission) {
2699         return -1;
2700     }
2701     return mission->GetMissionId();
2702 }
2703 
GetAbilityTokenByMissionId(int32_t missionId)2704 sptr<IRemoteObject> MissionListManager::GetAbilityTokenByMissionId(int32_t missionId)
2705 {
2706     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2707     std::lock_guard guard(managerLock_);
2708     sptr<IRemoteObject> result = nullptr;
2709     for (auto missionList : currentMissionLists_) {
2710         if (missionList && (result = missionList->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2711             return result;
2712         }
2713     }
2714 
2715     if ((result = defaultSingleList_->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2716         return result;
2717     }
2718 
2719     return defaultStandardList_->GetAbilityTokenByMissionId((missionId));
2720 }
2721 
GetAbilityRecordByMissionId(int32_t missionId)2722 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByMissionId(int32_t missionId)
2723 {
2724     return Token::GetAbilityRecordByToken(GetAbilityTokenByMissionId(missionId));
2725 }
2726 
PostStartWaitingAbility()2727 void MissionListManager::PostStartWaitingAbility()
2728 {
2729     auto self(shared_from_this());
2730     auto startWaitingAbilityTask = [self]() { self->StartWaitingAbility(); };
2731 
2732     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
2733     CHECK_POINTER_LOG(handler, "Fail to get AbilityTaskHandler.");
2734 
2735     /* PostTask to trigger start Ability from waiting queue */
2736     handler->SubmitTask(startWaitingAbilityTask, "startWaitingAbility");
2737 }
2738 
HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)2739 void MissionListManager::HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
2740 {
2741     TAG_LOGI(AAFwkTag::ABILITYMGR, "Handle Ability Died.");
2742     CHECK_POINTER(abilityRecord);
2743 
2744     if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2745         TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability type is not page.");
2746         return;
2747     }
2748 
2749     if (abilityRecord->IsLauncherAbility()) {
2750         HandleLauncherDied(abilityRecord);
2751         return;
2752     }
2753 
2754     HandleAbilityDiedByDefault(abilityRecord);
2755 }
2756 
HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)2757 void MissionListManager::HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)
2758 {
2759     TAG_LOGI(AAFwkTag::ABILITYMGR, "Handle launcher Ability Died.");
2760     auto mission = GetMissionById(ability->GetMissionId());
2761     CHECK_POINTER_LOG(mission, "Fail to get launcher mission.");
2762     auto missionList = mission->GetMissionList();
2763     if (launcherList_ != missionList) {
2764         TAG_LOGE(AAFwkTag::ABILITYMGR, "not launcher missionList.");
2765         return;
2766     }
2767 
2768     bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2769     if (ability->IsLauncherRoot()) {
2770         TAG_LOGI(AAFwkTag::ABILITYMGR, "launcher root Ability died, state: INITIAL");
2771         ability->SetAbilityState(AbilityState::INITIAL);
2772         ability->SetRestarting(true);
2773     } else {
2774         TAG_LOGI(AAFwkTag::ABILITYMGR, "launcher Ability died, remove");
2775         missionList->RemoveMission(mission);
2776     }
2777     if (isForeground) {
2778         TAG_LOGI(AAFwkTag::ABILITYMGR, "active launcher ability died, start launcher");
2779         DelayedStartLauncher();
2780     }
2781 }
2782 
HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)2783 void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)
2784 {
2785     TAG_LOGI(AAFwkTag::ABILITYMGR, "Handle Ability DiedByDefault.");
2786     CHECK_POINTER_LOG(ability, "ability is null.");
2787     if (ability->IsTerminating()) {
2788         TAG_LOGI(AAFwkTag::ABILITYMGR, "Handle Ability DiedByTerminating.");
2789         CompleteTerminateAndUpdateMission(ability);
2790         return;
2791     }
2792 
2793     auto mission = GetMissionById(ability->GetMissionId());
2794     CHECK_POINTER_LOG(mission, "Fail to get mission.");
2795     auto missionList = mission->GetMissionList();
2796     CHECK_POINTER_LOG(missionList, "Fail to get mission list.");
2797 
2798     std::shared_ptr<AbilityRecord> launcherRoot = launcherList_->GetLauncherRoot();
2799     bool isLauncherActive = (launcherRoot &&
2800         (launcherRoot->IsAbilityState(FOREGROUND) || launcherRoot->IsAbilityState(FOREGROUNDING)));
2801     bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2802 
2803     // remove from mission list.
2804     missionList->RemoveMission(mission);
2805     if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
2806         RemoveMissionList(missionList);
2807     }
2808 
2809     // update running state.
2810     auto missionId = mission->GetMissionId();
2811     if (!ability->IsUninstallAbility()) {
2812         if ((ability->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) ||
2813             ability->GetAbilityInfo().removeMissionAfterTerminate || ability->GetAbilityInfo().excludeFromMissions) {
2814             RemoveMissionLocked(missionId, ability->GetAbilityInfo().excludeFromMissions);
2815         } else {
2816             InnerMissionInfo info;
2817             if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2818                 info.missionInfo.runningState = -1;
2819                 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2820             }
2821 
2822             if (listenerController_) {
2823                 listenerController_->NotifyMissionClosed(missionId);
2824             }
2825         }
2826     }
2827 
2828     // start launcher
2829     if (isForeground && !isLauncherActive) {
2830         TAG_LOGI(AAFwkTag::ABILITYMGR, "active ability died, start launcher later");
2831         DelayedStartLauncher();
2832     }
2833 }
2834 
DelayedStartLauncher()2835 void MissionListManager::DelayedStartLauncher()
2836 {
2837     auto abilityManagerService = AbilityManagerService::GetPubInstance();
2838     CHECK_POINTER(abilityManagerService);
2839     auto handler = abilityManagerService->GetTaskHandler();
2840     CHECK_POINTER(handler);
2841     std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
2842     auto timeoutTask = [wpListMgr]() {
2843         TAG_LOGD(AAFwkTag::ABILITYMGR, "The launcher needs to be restarted.");
2844         auto listMgr = wpListMgr.lock();
2845         if (listMgr) {
2846             listMgr->BackToLauncher();
2847         }
2848     };
2849     handler->SubmitTask(timeoutTask, "Launcher_Restart");
2850 }
2851 
BackToLauncher()2852 void MissionListManager::BackToLauncher()
2853 {
2854     TAG_LOGI(AAFwkTag::ABILITYMGR, "Back to launcher.");
2855     std::lock_guard guard(managerLock_);
2856     CHECK_POINTER(launcherList_);
2857 
2858     auto launcherRootAbility = launcherList_->GetLauncherRoot();
2859     if (!launcherRootAbility) {
2860         TAG_LOGW(AAFwkTag::ABILITYMGR, "no root launcher ability, no need back to launcher.");
2861         return;
2862     }
2863 
2864     if (launcherRootAbility->GetAbilityInfo().bundleName != AbilityConfig::LAUNCHER_BUNDLE_NAME) {
2865         TAG_LOGW(AAFwkTag::ABILITYMGR, "not launcher mission, no need back to launcher.");
2866         return;
2867     }
2868 
2869     auto launcherRootMission = GetMissionById(launcherRootAbility->GetMissionId());
2870     if (!launcherRootMission) {
2871         TAG_LOGW(AAFwkTag::ABILITYMGR, "no root launcher mission, no need back to launcher.");
2872         return;
2873     }
2874 
2875     std::queue<AbilityRequest> emptyQueue;
2876     std::swap(waitingAbilityQueue_, emptyQueue);
2877 
2878     launcherList_->AddMissionToTop(launcherRootMission);
2879     MoveMissionListToTop(launcherList_);
2880     launcherRootAbility->ProcessForegroundAbility(0);
2881 }
2882 
SetMissionContinueState(const sptr<IRemoteObject> & token,int32_t missionId,const AAFwk::ContinueState & state)2883 int MissionListManager::SetMissionContinueState(const sptr<IRemoteObject> &token, int32_t missionId,
2884     const AAFwk::ContinueState &state)
2885 {
2886     TAG_LOGD(AAFwkTag::ABILITYMGR, "SetMissionContinueState start. Mission id: %{public}d, state: %{public}d",
2887         missionId, state);
2888     if (!token) {
2889         TAG_LOGE(AAFwkTag::ABILITYMGR,
2890             "SetMissionContinueState token is nullptr. Mission id: %{public}d, state: %{public}d", missionId, state);
2891         return -1;
2892     }
2893 
2894     return DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionContinueState(missionId, state);
2895 }
2896 
2897 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const sptr<IRemoteObject> & token,const std::string & label)2898 int MissionListManager::SetMissionLabel(const sptr<IRemoteObject> &token, const std::string &label)
2899 {
2900     if (!token) {
2901         TAG_LOGI(AAFwkTag::ABILITYMGR, "SetMissionLabel token is nullptr.");
2902         return -1;
2903     }
2904 
2905     auto missionId = GetMissionIdByAbilityToken(token);
2906     if (missionId <= 0) {
2907         TAG_LOGI(AAFwkTag::ABILITYMGR, "SetMissionLabel find mission failed.");
2908         return -1;
2909     }
2910 
2911     // store label if not notify mission created.
2912     auto abilityRecord = GetAbilityRecordByToken(token);
2913     if (abilityRecord) {
2914         auto mission = GetMissionById(abilityRecord->GetMissionId());
2915         if (mission && mission->NeedNotify()) {
2916             mission->SetNeedNotifyUpdateLabel(true);
2917         }
2918     }
2919 
2920     auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionLabel(missionId, label);
2921     if (ret == 0 && listenerController_) {
2922         listenerController_->NotifyMissionLabelUpdated(missionId);
2923     }
2924 
2925     return ret;
2926 }
2927 
SetMissionIcon(const sptr<IRemoteObject> & token,const std::shared_ptr<Media::PixelMap> & icon)2928 int MissionListManager::SetMissionIcon(const sptr<IRemoteObject> &token, const std::shared_ptr<Media::PixelMap> &icon)
2929 {
2930     if (!token) {
2931         TAG_LOGI(AAFwkTag::ABILITYMGR, "SetMissionIcon token is nullptr.");
2932         return -1;
2933     }
2934 
2935     std::lock_guard guard(managerLock_);
2936     auto missionId = GetMissionIdByAbilityTokenInner(token);
2937     if (missionId <= 0) {
2938         TAG_LOGE(AAFwkTag::ABILITYMGR, "SetMissionIcon find mission failed.");
2939         return -1;
2940     }
2941     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2942     if (!abilityRecord) {
2943         TAG_LOGE(AAFwkTag::ABILITYMGR, "SetMissionIcon find ability failed.");
2944         return -1;
2945     }
2946 
2947     if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
2948         listenerController_->NotifyMissionIconChanged(missionId, icon);
2949     }
2950 
2951     return 0;
2952 }
2953 
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & abilityToken)2954 void MissionListManager::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &abilityToken)
2955 {
2956     FinishAsyncTrace(HITRACE_TAG_ABILITY_MANAGER, TRACE_ATOMIC_SERVICE, TRACE_ATOMIC_SERVICE_ID);
2957     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
2958     if (!abilityToken) {
2959         TAG_LOGW(AAFwkTag::ABILITYMGR, "%{public}s ability token is nullptr.", __func__);
2960         return;
2961     }
2962 
2963     auto abilityRecord = GetAbilityRecordByToken(abilityToken);
2964     if (!abilityRecord) {
2965         TAG_LOGW(AAFwkTag::ABILITYMGR, "%{public}s get AbilityRecord by token failed.", __func__);
2966         return;
2967     }
2968 
2969     if (abilityRecord->IsCompleteFirstFrameDrawing()) {
2970         TAG_LOGD(AAFwkTag::ABILITYMGR, "First frame drawing has completed.");
2971         return;
2972     }
2973     abilityRecord->ReportAtomicServiceDrawnCompleteEvent();
2974     abilityRecord->SetCompleteFirstFrameDrawing(true);
2975     AppExecFwk::AbilityFirstFrameStateObserverManager::GetInstance().
2976         HandleOnFirstFrameState(abilityRecord);
2977     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
2978     if (handler == nullptr) {
2979         TAG_LOGE(AAFwkTag::ABILITYMGR, "Fail to get Ability task handler.");
2980         return;
2981     }
2982 
2983     auto task = [owner = weak_from_this(), abilityRecord] {
2984         auto mgr = owner.lock();
2985         if (mgr == nullptr) {
2986             TAG_LOGE(AAFwkTag::ABILITYMGR, "MissionListManager is nullptr.");
2987             return;
2988         }
2989         mgr->NotifyMissionCreated(abilityRecord);
2990         if (AbilityManagerService::GetPubInstance()->IsDmsAlive()) {
2991             mgr->UpdateMissionSnapshot(abilityRecord);
2992         }
2993     };
2994     handler->SubmitTask(task, "FirstFrameDrawing");
2995     auto preloadTask = [owner = weak_from_this(), abilityRecord] {
2996         auto mgr = owner.lock();
2997         if (mgr == nullptr) {
2998             TAG_LOGE(AAFwkTag::ABILITYMGR, "MissionListManager is nullptr.");
2999             return;
3000         }
3001         mgr->ProcessPreload(abilityRecord);
3002     };
3003     handler->SubmitTask(preloadTask);
3004 }
3005 
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const3006 void MissionListManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
3007 {
3008     auto bundleMgrHelper = AbilityUtil::GetBundleManagerHelper();
3009     CHECK_POINTER(bundleMgrHelper);
3010     auto abilityInfo = record->GetAbilityInfo();
3011     Want want;
3012     want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
3013     auto uid = record->GetUid();
3014     want.SetParam("uid", uid);
3015     bundleMgrHelper->ProcessPreload(want);
3016 }
3017 
GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const3018 Closure MissionListManager::GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
3019 {
3020     auto windowHandler = AbilityManagerService::GetPubInstance()->GetWMSHandler();
3021     if (!windowHandler) {
3022         TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s, Get WMS handler failed.", __func__);
3023         return nullptr;
3024     }
3025 
3026     return [windowHandler, abilityRecord] {
3027         if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow()) {
3028             TAG_LOGI(AAFwkTag::ABILITYMGR, "%{public}s, call windowHandler CancelStartingWindow.", __func__);
3029             windowHandler->CancelStartingWindow(abilityRecord->GetToken());
3030             abilityRecord->SetStartingWindow(false);
3031         }
3032     };
3033 }
3034 
PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const3035 void MissionListManager::PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
3036 {
3037     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
3038     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
3039     if (!handler) {
3040         TAG_LOGE(AAFwkTag::ABILITYMGR, "Fail to get AbilityTaskHandler.");
3041         return;
3042     }
3043 
3044     auto task = GetCancelStartingWindowTask(abilityRecord);
3045     if (!task) {
3046         TAG_LOGE(AAFwkTag::ABILITYMGR, "Fail to get CancelStartingWindow task.");
3047         return;
3048     }
3049     handler->SubmitTask(task, TaskQoS::USER_INTERACTIVE);
3050 }
3051 
InitPrepareTerminateConfig()3052 void MissionListManager::InitPrepareTerminateConfig()
3053 {
3054     char value[PREPARE_TERMINATE_ENABLE_SIZE] = "false";
3055     int retSysParam = GetParameter(PREPARE_TERMINATE_ENABLE_PARAMETER, "false", value, PREPARE_TERMINATE_ENABLE_SIZE);
3056     TAG_LOGI(AAFwkTag::ABILITYMGR, "CheckPrepareTerminateEnable, %{public}s value is %{public}s.",
3057         PREPARE_TERMINATE_ENABLE_PARAMETER, value);
3058     if (retSysParam > 0 && !std::strcmp(value, "true")) {
3059         isPrepareTerminateEnable_ = true;
3060     }
3061 }
3062 
UpdateAbilityRecordColdStartFlag(const AppInfo & info,bool isColdStart)3063 void MissionListManager::UpdateAbilityRecordColdStartFlag(const AppInfo& info, bool isColdStart)
3064 {
3065     for (const auto& missionList : currentMissionLists_) {
3066         auto missions = missionList->GetAllMissions();
3067         for (const auto& missionInfo : missions) {
3068             if (!missionInfo) {
3069                 TAG_LOGE(AAFwkTag::ABILITYMGR, "missionInfo is nullptr.");
3070                 continue;
3071             }
3072             auto abilityRecord = missionInfo->GetAbilityRecord();
3073             if (info.processName == abilityRecord->GetAbilityInfo().process ||
3074                 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
3075                 abilityRecord->SetColdStartFlag(isColdStart);
3076             }
3077         }
3078     }
3079     auto defaultStandardListmissions = defaultStandardList_->GetAllMissions();
3080     for (const auto& missionInfo : defaultStandardListmissions) {
3081         if (!missionInfo) {
3082             TAG_LOGE(AAFwkTag::ABILITYMGR, "defaultStandardListmissions is nullptr.");
3083             continue;
3084         }
3085         auto abilityRecord = missionInfo->GetAbilityRecord();
3086         if (info.processName == abilityRecord->GetAbilityInfo().process ||
3087             info.processName == abilityRecord->GetApplicationInfo().bundleName) {
3088             abilityRecord->SetColdStartFlag(isColdStart);
3089         }
3090     }
3091     auto defaultSingleListmissions = defaultSingleList_->GetAllMissions();
3092     for (const auto& missionInfo : defaultSingleListmissions) {
3093         if (!missionInfo) {
3094             TAG_LOGE(AAFwkTag::ABILITYMGR, "defaultSingleListmissions is nullptr.");
3095             continue;
3096         }
3097         auto abilityRecord = missionInfo->GetAbilityRecord();
3098         if (info.processName == abilityRecord->GetAbilityInfo().process ||
3099             info.processName == abilityRecord->GetApplicationInfo().bundleName) {
3100             abilityRecord->SetColdStartFlag(isColdStart);
3101         }
3102     }
3103 }
3104 #endif
3105 
Dump(std::vector<std::string> & info)3106 void MissionListManager::Dump(std::vector<std::string> &info)
3107 {
3108     std::lock_guard guard(managerLock_);
3109     std::string dumpInfo = "User ID #" + std::to_string(userId_);
3110     info.push_back(dumpInfo);
3111     dumpInfo = " current mission lists:{";
3112     info.push_back(dumpInfo);
3113     for (const auto& missionList : currentMissionLists_) {
3114         if (missionList) {
3115             missionList->Dump(info);
3116         }
3117     }
3118     dumpInfo = " }";
3119     info.push_back(dumpInfo);
3120 
3121     dumpInfo = " default stand mission list:{";
3122     info.push_back(dumpInfo);
3123     if (defaultStandardList_) {
3124         defaultStandardList_->Dump(info);
3125     }
3126     dumpInfo = " }";
3127     info.push_back(dumpInfo);
3128 
3129     dumpInfo = " default single mission list:{";
3130     info.push_back(dumpInfo);
3131     if (defaultSingleList_) {
3132         defaultSingleList_->Dump(info);
3133     }
3134     dumpInfo = " }";
3135     info.push_back(dumpInfo);
3136 
3137     dumpInfo = " launcher mission list:{";
3138     info.push_back(dumpInfo);
3139     if (launcherList_) {
3140         launcherList_->Dump(info);
3141     }
3142     dumpInfo = " }";
3143     info.push_back(dumpInfo);
3144 }
3145 
DumpMissionListByRecordId(std::vector<std::string> & info,bool isClient,int32_t abilityRecordId,const std::vector<std::string> & params)3146 void MissionListManager::DumpMissionListByRecordId(
3147     std::vector<std::string> &info, bool isClient, int32_t abilityRecordId, const std::vector<std::string> &params)
3148 {
3149     std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
3150     std::unique_ptr<MissionList> defaultStandardListBackup;
3151     std::unique_ptr<MissionList> defaultSingleListBackup;
3152     std::unique_ptr<MissionList> launcherListBackup;
3153     {
3154         std::lock_guard guard(managerLock_);
3155         for (const auto& missionList : currentMissionLists_) {
3156             if (missionList != nullptr) {
3157                 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
3158             }
3159         }
3160         defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
3161         defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
3162         launcherListBackup = std::make_unique<MissionList>(*launcherList_);
3163     }
3164 
3165     std::string dumpInfo = "User ID #" + std::to_string(userId_);
3166     info.push_back(dumpInfo);
3167     for (const auto& missionList : currentMissionListsBackup) {
3168         if (missionList && missionList != launcherListBackup) {
3169             TAG_LOGI(AAFwkTag::ABILITYMGR, "missionList");
3170             missionList->DumpStateByRecordId(info, isClient, abilityRecordId, params);
3171         }
3172     }
3173 
3174     if (defaultStandardListBackup) {
3175         TAG_LOGI(AAFwkTag::ABILITYMGR, "defaultStandardList");
3176         defaultStandardListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
3177     }
3178 
3179     if (defaultSingleListBackup) {
3180         TAG_LOGI(AAFwkTag::ABILITYMGR, "defaultSingleList");
3181         defaultSingleListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
3182     }
3183 
3184     if (launcherListBackup) {
3185         TAG_LOGI(AAFwkTag::ABILITYMGR, "launcherList");
3186         launcherListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
3187     }
3188 }
3189 
DumpMissionList(std::vector<std::string> & info,bool isClient,const std::string & args)3190 void MissionListManager::DumpMissionList(std::vector<std::string> &info, bool isClient, const std::string &args)
3191 {
3192     std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
3193     std::unique_ptr<MissionList> defaultStandardListBackup;
3194     std::unique_ptr<MissionList> defaultSingleListBackup;
3195     std::unique_ptr<MissionList> launcherListBackup;
3196     {
3197         std::lock_guard guard(managerLock_);
3198         for (const auto& missionList : currentMissionLists_) {
3199             if (missionList != nullptr) {
3200                 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
3201             }
3202         }
3203         defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
3204         defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
3205         launcherListBackup = std::make_unique<MissionList>(*launcherList_);
3206     }
3207 
3208     if (args.size() != 0 &&
3209         args != "NORMAL" &&
3210         args != "DEFAULT_STANDARD" &&
3211         args != "DEFAULT_SINGLE" &&
3212         args != "LAUNCHER") {
3213         info.emplace_back("MissionList Type NORMAL|DEFAULT_STANDARD|DEFAULT_SINGLE|LAUNCHER");
3214         return;
3215     }
3216 
3217     std::string dumpInfo = "User ID #" + std::to_string(userId_);
3218     info.push_back(dumpInfo);
3219     if (args.size() == 0 || args == "NORMAL") {
3220         dumpInfo = "  Current mission lists:";
3221         info.push_back(dumpInfo);
3222         for (const auto& missionList : currentMissionListsBackup) {
3223             if (missionList) {
3224                 missionList->DumpList(info, isClient);
3225             }
3226         }
3227     }
3228 
3229     if (args.size() == 0 || args == "DEFAULT_STANDARD") {
3230         dumpInfo = "  default stand mission list:";
3231         info.push_back(dumpInfo);
3232         defaultStandardListBackup->DumpList(info, isClient);
3233     }
3234 
3235     if (args.size() == 0 || args == "DEFAULT_SINGLE") {
3236         dumpInfo = "  default single mission list:";
3237         info.push_back(dumpInfo);
3238         defaultSingleListBackup->DumpList(info, isClient);
3239     }
3240     if (args.size() == 0 || args == "LAUNCHER") {
3241         dumpInfo = "  launcher mission list:";
3242         info.push_back(dumpInfo);
3243         launcherListBackup->DumpList(info, isClient);
3244     }
3245 }
3246 
DumpMissionInfos(std::vector<std::string> & info)3247 void MissionListManager::DumpMissionInfos(std::vector<std::string> &info)
3248 {
3249     std::string dumpInfo = "User ID #" + std::to_string(userId_);
3250     info.push_back(dumpInfo);
3251     DelayedSingleton<MissionInfoMgr>::GetInstance()->Dump(info);
3252 }
3253 
DumpMission(int missionId,std::vector<std::string> & info)3254 void MissionListManager::DumpMission(int missionId, std::vector<std::string> &info)
3255 {
3256     std::string dumpInfo = "User ID #" + std::to_string(userId_);
3257     info.push_back(dumpInfo);
3258     InnerMissionInfo innerMissionInfo;
3259     if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo) != 0) {
3260         info.push_back("error: invalid mission number, please see 'aa dump --mission-list'.");
3261         return;
3262     }
3263     innerMissionInfo.Dump(info);
3264 }
3265 
ResolveLocked(const AbilityRequest & abilityRequest)3266 int MissionListManager::ResolveLocked(const AbilityRequest &abilityRequest)
3267 {
3268     TAG_LOGI(AAFwkTag::ABILITYMGR, "ability_name:%{public}s", abilityRequest.want.GetElement().GetURI().c_str());
3269 
3270     if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
3271         TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s, resolve ability_name:", __func__);
3272         return RESOLVE_CALL_ABILITY_INNER_ERR;
3273     }
3274 
3275     return CallAbilityLocked(abilityRequest);
3276 }
3277 
IsAbilityStarted(AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & targetRecord)3278 bool MissionListManager::IsAbilityStarted(AbilityRequest &abilityRequest,
3279     std::shared_ptr<AbilityRecord> &targetRecord)
3280 {
3281     std::shared_ptr<Mission> targetMission;
3282 
3283     return HandleReusedMissionAndAbility(abilityRequest, targetMission, targetRecord);
3284 }
3285 
CallAbilityLocked(const AbilityRequest & abilityRequest)3286 int MissionListManager::CallAbilityLocked(const AbilityRequest &abilityRequest)
3287 {
3288     TAG_LOGI(AAFwkTag::ABILITYMGR, "call ability.");
3289     std::lock_guard guard(managerLock_);
3290 
3291     // allow to start ability by called type without loading ui.
3292     if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
3293         TAG_LOGE(AAFwkTag::ABILITYMGR, "start ability not by call.");
3294         return ERR_INVALID_VALUE;
3295     }
3296 
3297     // Get target mission and ability record.
3298     std::shared_ptr<AbilityRecord> targetAbilityRecord;
3299     std::shared_ptr<Mission> targetMission;
3300     bool isReachToLimit = false;
3301     GetTargetMissionAndAbility(abilityRequest, targetMission, targetAbilityRecord, isReachToLimit);
3302     if (isReachToLimit) {
3303         TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get mission or record, already reach to limit.");
3304         return ERR_REACH_UPPER_LIMIT;
3305     }
3306     if (!targetMission || !targetAbilityRecord) {
3307         TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get mission or record.");
3308         return ERR_INVALID_VALUE;
3309     }
3310 
3311     targetAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, abilityRequest.want);
3312     targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
3313 
3314     // mission is first created, add mission to default call mission list.
3315     // other keep in current mission list.
3316     if (!targetMission->GetMissionList()) {
3317         if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SINGLETON) {
3318             defaultSingleList_->AddMissionToTop(targetMission);
3319         } else {
3320             defaultStandardList_->AddMissionToTop(targetMission);
3321         }
3322     }
3323 
3324     NotifyAbilityToken(targetAbilityRecord->GetToken(), abilityRequest);
3325 
3326     // new version started by call type
3327     auto ret = ResolveAbility(targetAbilityRecord, abilityRequest);
3328     bool isStartToForeground = targetAbilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false);
3329     if (ret == ResolveResultType::OK_HAS_REMOTE_OBJ) {
3330         TAG_LOGD(AAFwkTag::ABILITYMGR, "target ability has been resolved.");
3331         if (isStartToForeground) {
3332             TAG_LOGD(AAFwkTag::ABILITYMGR, "target ability needs to be switched to foreground.");
3333             if (targetAbilityRecord->GetPendingState() != AbilityState::INITIAL) {
3334                 TAG_LOGI(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND or BACKGROUND, dropped.");
3335                 targetAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
3336                 return ERR_OK;
3337             }
3338             targetAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
3339 #ifdef SUPPORT_SCREEN
3340             std::shared_ptr<StartOptions> startOptions = nullptr;
3341             auto callerAbility = GetAbilityRecordByTokenInner(abilityRequest.callerToken);
3342             targetAbilityRecord->ProcessForegroundAbility(false, abilityRequest, startOptions, callerAbility);
3343 #else
3344             targetAbilityRecord->ProcessForegroundAbility(0);
3345 #endif
3346         }
3347         return ERR_OK;
3348     } else if (ret == ResolveResultType::NG_INNER_ERROR) {
3349         TAG_LOGE(AAFwkTag::ABILITYMGR, "resolve failed, error: %{public}d.", RESOLVE_CALL_ABILITY_INNER_ERR);
3350         return RESOLVE_CALL_ABILITY_INNER_ERR;
3351     }
3352 
3353     // schedule target ability
3354     std::string element = targetAbilityRecord->GetElementName().GetURI();
3355     TAG_LOGD(AAFwkTag::ABILITYMGR, "load ability record: %{public}s", element.c_str());
3356 
3357     // flag the first ability.
3358     auto currentTopAbility = GetCurrentTopAbilityLocked();
3359     if (!currentTopAbility) {
3360         if (targetAbilityRecord->GetAbilityInfo().applicationInfo.isLauncherApp) {
3361             targetAbilityRecord->SetLauncherRoot();
3362         }
3363     }
3364     if (isStartToForeground) {
3365         targetAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
3366     } else {
3367         TAG_LOGI(AAFwkTag::ABILITYMGR, "set pending BACKGROUND");
3368         targetAbilityRecord->SetPendingState(AbilityState::BACKGROUND);
3369     }
3370     return targetAbilityRecord->LoadAbility();
3371 }
3372 
ReleaseCallLocked(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)3373 int MissionListManager::ReleaseCallLocked(
3374     const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
3375 {
3376     TAG_LOGD(AAFwkTag::ABILITYMGR, "release call ability.");
3377 
3378     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
3379     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
3380 
3381     std::lock_guard guard(managerLock_);
3382 
3383     auto abilityRecords = GetAbilityRecordsByName(element);
3384     auto isExist = [connect] (const std::shared_ptr<AbilityRecord> &abilityRecord) {
3385         return abilityRecord->IsExistConnection(connect);
3386     };
3387     auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist);
3388     if (findRecord == abilityRecords.end()) {
3389         TAG_LOGE(AAFwkTag::ABILITYMGR, "not found ability record by callback!");
3390         return RELEASE_CALL_ABILITY_INNER_ERR;
3391     }
3392     auto abilityRecord = *findRecord;
3393     CHECK_POINTER_AND_RETURN(abilityRecord, RELEASE_CALL_ABILITY_INNER_ERR);
3394 
3395     if (!abilityRecord->ReleaseCall(connect)) {
3396         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability release call record failed!");
3397         return RELEASE_CALL_ABILITY_INNER_ERR;
3398     }
3399     return ERR_OK;
3400 }
3401 
ResolveAbility(const std::shared_ptr<AbilityRecord> & targetAbility,const AbilityRequest & abilityRequest)3402 int MissionListManager::ResolveAbility(
3403     const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest)
3404 {
3405     TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbilityRecord resolve call record.");
3406     CHECK_POINTER_AND_RETURN(targetAbility, ResolveResultType::NG_INNER_ERROR);
3407 
3408     ResolveResultType result = targetAbility->Resolve(abilityRequest);
3409     switch (result) {
3410         case ResolveResultType::NG_INNER_ERROR:
3411         case ResolveResultType::OK_HAS_REMOTE_OBJ:
3412             return result;
3413         default:
3414             break;
3415     }
3416 
3417     if (targetAbility->IsReady()) {
3418         TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility is ready, directly scheduler call request.");
3419         targetAbility->CallRequest();
3420         return ResolveResultType::OK_HAS_REMOTE_OBJ;
3421     }
3422 
3423     TAG_LOGD(AAFwkTag::ABILITYMGR, "targetAbility need to call request after lifecycle.");
3424     return result;
3425 }
3426 
GetAbilityRecordByName(const AppExecFwk::ElementName & element)3427 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByName(const AppExecFwk::ElementName &element)
3428 {
3429     // find in currentMissionLists_
3430     for (auto missionList : currentMissionLists_) {
3431         if (missionList != nullptr) {
3432             auto ability = missionList->GetAbilityRecordByName(element);
3433             if (ability != nullptr) {
3434                 return ability;
3435             }
3436         }
3437     }
3438 
3439     // find in launcherMissionList_
3440     auto ability = launcherList_->GetAbilityRecordByName(element);
3441     if (ability != nullptr) {
3442         return ability;
3443     }
3444 
3445     // find in default singlelist_
3446     return defaultSingleList_->GetAbilityRecordByName(element);
3447 }
3448 
GetAbilityRecordByNameFromCurrentMissionLists(const AppExecFwk::ElementName & element) const3449 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByNameFromCurrentMissionLists(
3450     const AppExecFwk::ElementName &element) const
3451 {
3452     // find in currentMissionLists_
3453     for (auto missionList : currentMissionLists_) {
3454         if (missionList != nullptr) {
3455             auto ability = missionList->GetAbilityRecordByName(element);
3456             if (ability != nullptr) {
3457                 return ability;
3458             }
3459         }
3460     }
3461 
3462     // find in defaultStandardList_
3463     if (defaultStandardList_ != nullptr) {
3464         auto defaultStandardAbility = defaultStandardList_->GetAbilityRecordByName(element);
3465         if (defaultStandardAbility != nullptr) {
3466             return defaultStandardAbility;
3467         }
3468     }
3469 
3470     // find in launcherList_
3471     if (launcherList_ != nullptr) {
3472         return launcherList_->GetAbilityRecordByName(element);
3473     }
3474 
3475     return nullptr;
3476 }
3477 
GetAbilityRecordsByName(const AppExecFwk::ElementName & element)3478 std::vector<std::shared_ptr<AbilityRecord>> MissionListManager::GetAbilityRecordsByName(
3479     const AppExecFwk::ElementName &element)
3480 {
3481     std::vector<std::shared_ptr<AbilityRecord>> records;
3482     for (auto missionList : currentMissionLists_) {
3483         if (missionList != nullptr) {
3484             missionList->GetAbilityRecordsByName(element, records);
3485         }
3486     }
3487 
3488     // find in launcherMissionList_
3489     if (launcherList_ != nullptr) {
3490         launcherList_->GetAbilityRecordsByName(element, records);
3491     }
3492 
3493     // find in defaultStandardList_
3494     if (defaultStandardList_ != nullptr) {
3495         defaultStandardList_->GetAbilityRecordsByName(element, records);
3496     }
3497 
3498     if (!records.empty()) {
3499         return records;
3500     }
3501 
3502     // find in default singlelist_
3503     if (defaultSingleList_ != nullptr) {
3504         defaultSingleList_->GetAbilityRecordsByName(element, records);
3505     }
3506     TAG_LOGD(AAFwkTag::ABILITYMGR, "records is %{public}s.", records.empty() ? "empty" : "not empty");
3507     return records;
3508 }
3509 
OnCallConnectDied(const std::shared_ptr<CallRecord> & callRecord)3510 void MissionListManager::OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord)
3511 {
3512     TAG_LOGI(AAFwkTag::ABILITYMGR, "On callConnect died.");
3513     CHECK_POINTER(callRecord);
3514     std::lock_guard guard(managerLock_);
3515 
3516     AppExecFwk::ElementName element = callRecord->GetTargetServiceName();
3517     auto abilityRecords = GetAbilityRecordsByName(element);
3518     auto isExist = [callRecord] (const std::shared_ptr<AbilityRecord> &abilityRecord) {
3519         return abilityRecord->IsExistConnection(callRecord->GetConCallBack());
3520     };
3521     auto findRecord = std::find_if(abilityRecords.begin(), abilityRecords.end(), isExist);
3522     if (findRecord == abilityRecords.end()) {
3523         TAG_LOGE(AAFwkTag::ABILITYMGR, "not found ability record by callback");
3524         return;
3525     }
3526     auto abilityRecord = *findRecord;
3527     CHECK_POINTER(abilityRecord);
3528     abilityRecord->ReleaseCall(callRecord->GetConCallBack());
3529 }
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)3530 void MissionListManager::OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag)
3531 {
3532     std::lock_guard guard(managerLock_);
3533     if (waitingAbilityQueue_.empty()) {
3534         return;
3535     }
3536 
3537     AbilityRequest abilityRequest = waitingAbilityQueue_.front();
3538     waitingAbilityQueue_.pop();
3539 
3540     auto currentTopAbility = GetCurrentTopAbilityLocked();
3541     auto callerAbility = GetAbilityRecordByTokenInner(abilityRequest.callerToken);
3542 
3543     if (!flag.empty()) {
3544         auto mission = GetMissionBySpecifiedFlag(want, flag);
3545         if (mission) {
3546             auto ability = mission->GetAbilityRecord();
3547             if (!ability) {
3548                 return;
3549             }
3550             ability->SetWant(abilityRequest.want);
3551             ability->SetIsNewWant(true);
3552             UpdateAbilityRecordLaunchReason(abilityRequest, ability);
3553             if (callerAbility == nullptr) {
3554                 callerAbility = Token::GetAbilityRecordByToken(abilityRequest.callerToken);
3555             }
3556             auto isCallerFromLauncher = (callerAbility && callerAbility->IsLauncherAbility());
3557             MoveMissionToFrontInner(mission->GetMissionId(), isCallerFromLauncher, false, callerAbility);
3558             NotifyRestartSpecifiedAbility(abilityRequest, ability->GetToken());
3559             return;
3560         }
3561     }
3562 
3563     abilityRequest.specifiedFlag = flag;
3564     NotifyStartSpecifiedAbility(abilityRequest, want);
3565     StartAbilityLocked(currentTopAbility, callerAbility, abilityRequest);
3566 }
3567 
NotifyRestartSpecifiedAbility(AbilityRequest & request,const sptr<IRemoteObject> & token)3568 void MissionListManager::NotifyRestartSpecifiedAbility(AbilityRequest &request, const sptr<IRemoteObject> &token)
3569 {
3570     if (request.abilityInfoCallback == nullptr) {
3571         return;
3572     }
3573     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
3574         = iface_cast<AppExecFwk::IAbilityInfoCallback> (request.abilityInfoCallback);
3575     if (abilityInfoCallback != nullptr) {
3576         TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
3577         abilityInfoCallback->NotifyRestartSpecifiedAbility(token);
3578     }
3579 }
3580 
NotifyStartSpecifiedAbility(AbilityRequest & abilityRequest,const AAFwk::Want & want)3581 void MissionListManager::NotifyStartSpecifiedAbility(AbilityRequest &abilityRequest, const AAFwk::Want &want)
3582 {
3583     if (abilityRequest.abilityInfoCallback == nullptr) {
3584         return;
3585     }
3586 
3587     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
3588         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
3589     if (abilityInfoCallback != nullptr) {
3590         Want newWant = want;
3591         int32_t type = static_cast<int32_t>(abilityRequest.abilityInfo.type);
3592         newWant.SetParam("abilityType", type);
3593         sptr<Want> extraParam = new (std::nothrow) Want();
3594         abilityInfoCallback->NotifyStartSpecifiedAbility(abilityRequest.callerToken, newWant,
3595             abilityRequest.requestCode, extraParam);
3596         int32_t procCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
3597         if (procCode != 0) {
3598             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
3599         }
3600         int32_t tokenCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
3601         if (tokenCode != 0) {
3602             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
3603         }
3604     }
3605 }
3606 
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want)3607 void MissionListManager::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want)
3608 {
3609     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
3610     std::lock_guard guard(managerLock_);
3611     if (waitingAbilityQueue_.empty()) {
3612         return;
3613     }
3614     waitingAbilityQueue_.pop();
3615 
3616     if (waitingAbilityQueue_.empty()) {
3617         return;
3618     }
3619     AbilityRequest abilityRequest = waitingAbilityQueue_.front();
3620     waitingAbilityQueue_.pop();
3621 
3622     auto currentTopAbility = GetCurrentTopAbilityLocked();
3623     auto callerAbility = GetAbilityRecordByTokenInner(abilityRequest.callerToken);
3624     if (StartAbility(currentTopAbility, callerAbility, abilityRequest) == 0 && !abilityRequest.abilityInfo.visible) {
3625         SendKeyEvent(abilityRequest);
3626     }
3627 }
3628 
GetMissionBySpecifiedFlag(const AAFwk::Want & want,const std::string & flag) const3629 std::shared_ptr<Mission> MissionListManager::GetMissionBySpecifiedFlag(
3630     const AAFwk::Want &want, const std::string &flag) const
3631 {
3632     std::shared_ptr<Mission> mission = nullptr;
3633     for (auto missionList : currentMissionLists_) {
3634         if (missionList && (mission = missionList->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
3635             return mission;
3636         }
3637     }
3638 
3639     if ((mission = defaultSingleList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
3640         return mission;
3641     }
3642 
3643     if ((mission = launcherList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
3644         return mission;
3645     }
3646 
3647     return defaultStandardList_->GetMissionBySpecifiedFlag(want, flag);
3648 }
3649 
CheckSingleLimit(const AbilityRequest & abilityRequest)3650 bool MissionListManager::CheckSingleLimit(const AbilityRequest &abilityRequest)
3651 {
3652     auto reUsedMission = GetReusedMission(abilityRequest);
3653     if (!reUsedMission) {
3654         bool isSingleMaxLimit = IsReachToSingleLimitLocked(abilityRequest.uid);
3655         if (isSingleMaxLimit) {
3656             return true;
3657         }
3658     }
3659     return false;
3660 }
3661 
CheckLimit()3662 bool MissionListManager::CheckLimit()
3663 {
3664     bool isAllMaxLimit = IsReachToLimitLocked();
3665     if (isAllMaxLimit) {
3666         auto earliestMission = FindEarliestMission();
3667         if (earliestMission) {
3668             if (TerminateAbilityInner(earliestMission->GetAbilityRecord(), DEFAULT_INVAL_VALUE,
3669                 nullptr, true) != ERR_OK) {
3670                 TAG_LOGE(AAFwkTag::ABILITYMGR,
3671                     "already reach limit instance. limit: %{public}d, and terminate earliestAbility failed.",
3672                     MAX_INSTANCE_COUNT);
3673                 return true;
3674             }
3675             if (IsAppLastAbility(earliestMission->GetAbilityRecord())) {
3676                 ExitReason exitReason = { REASON_RESOURCE_CONTROL,
3677                     "Already reach ability max limit, terminate earliest ability." };
3678                 AbilityManagerService::GetPubInstance()->RecordAppExitReason(exitReason);
3679             }
3680             TAG_LOGI(AAFwkTag::ABILITYMGR,
3681                 "already reach limit instance. limit: %{public}d, and terminate earliestAbility success.",
3682                 MAX_INSTANCE_COUNT);
3683         }
3684     }
3685     TAG_LOGD(AAFwkTag::ABILITYMGR, "current is not reach limit instance.");
3686     return false;
3687 }
3688 
IsReachToLimitLocked() const3689 bool MissionListManager::IsReachToLimitLocked() const
3690 {
3691     auto missionCount = GetMissionCount();
3692     if (missionCount >= MAX_INSTANCE_COUNT) {
3693         return true;
3694     }
3695     return false;
3696 }
3697 
IsReachToSingleLimitLocked(const int32_t uid) const3698 bool MissionListManager::IsReachToSingleLimitLocked(const int32_t uid) const
3699 {
3700     int32_t singleAppMissionCount = 0;
3701     for (const auto& missionList : currentMissionLists_) {
3702         if (!missionList) {
3703             continue;
3704         }
3705         singleAppMissionCount += missionList->GetMissionCountByUid(uid);
3706         if (singleAppMissionCount >= SINGLE_MAX_INSTANCE_COUNT) {
3707             return true;
3708         }
3709     }
3710     singleAppMissionCount += defaultStandardList_->GetMissionCountByUid(uid);
3711     if (singleAppMissionCount >= SINGLE_MAX_INSTANCE_COUNT) {
3712         return true;
3713     }
3714     singleAppMissionCount += defaultSingleList_->GetMissionCountByUid(uid);
3715     if (singleAppMissionCount >= SINGLE_MAX_INSTANCE_COUNT) {
3716         return true;
3717     }
3718     return false;
3719 }
3720 
RegisterSnapshotHandler(const sptr<ISnapshotHandler> & handler)3721 void MissionListManager::RegisterSnapshotHandler(const sptr<ISnapshotHandler>& handler)
3722 {
3723     DelayedSingleton<MissionInfoMgr>::GetInstance()->RegisterSnapshotHandler(handler);
3724 }
3725 
GetMissionSnapshot(int32_t missionId,const sptr<IRemoteObject> & abilityToken,MissionSnapshot & missionSnapshot,bool isLowResolution)3726 bool MissionListManager::GetMissionSnapshot(int32_t missionId, const sptr<IRemoteObject>& abilityToken,
3727     MissionSnapshot& missionSnapshot, bool isLowResolution)
3728 {
3729     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3730     TAG_LOGD(AAFwkTag::ABILITYMGR, "snapshot: Start get mission snapshot.");
3731     bool forceSnapshot = false;
3732     {
3733         std::lock_guard guard(managerLock_);
3734         auto abilityRecord = GetAbilityRecordByTokenInner(abilityToken);
3735         if (abilityRecord && abilityRecord->IsAbilityState(FOREGROUND)) {
3736             forceSnapshot = true;
3737             missionSnapshot.isPrivate =
3738                 (abilityRecord->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX);
3739         }
3740     }
3741     return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionSnapshot(
3742         missionId, abilityToken, missionSnapshot, isLowResolution, forceSnapshot);
3743 }
3744 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)3745 void MissionListManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
3746 {
3747     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3748     std::lock_guard guard(managerLock_);
3749 
3750     auto func = [&info, isPerm](const std::shared_ptr<Mission> &mission) {
3751         if (!mission) {
3752             return;
3753         }
3754 
3755         auto ability = mission->GetAbilityRecord();
3756         if (!ability) {
3757             return;
3758         }
3759 
3760         if (isPerm) {
3761             AbilityManagerService::GetPubInstance()->GetAbilityRunningInfo(info, ability);
3762         } else {
3763             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
3764             auto tokenID = ability->GetApplicationInfo().accessTokenId;
3765             if (callingTokenId == tokenID) {
3766                 AbilityManagerService::GetPubInstance()->GetAbilityRunningInfo(info, ability);
3767             }
3768         }
3769     };
3770     if (!(defaultStandardList_->GetAllMissions().empty())) {
3771         auto list = defaultStandardList_->GetAllMissions();
3772         std::for_each(list.begin(), list.end(), func);
3773     }
3774     if (!(defaultSingleList_->GetAllMissions().empty())) {
3775         auto list = defaultSingleList_->GetAllMissions();
3776         std::for_each(list.begin(), list.end(), func);
3777     }
3778     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "for (auto missionList : currentMissionLists_)");
3779     for (auto missionList : currentMissionLists_) {
3780         if (!(missionList->GetAllMissions().empty())) {
3781             auto list = missionList->GetAllMissions();
3782             std::for_each(list.begin(), list.end(), func);
3783         }
3784     }
3785 }
3786 
UninstallApp(const std::string & bundleName,int32_t uid)3787 void MissionListManager::UninstallApp(const std::string &bundleName, int32_t uid)
3788 {
3789     TAG_LOGI(AAFwkTag::ABILITYMGR, "Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3790     auto abilityManagerService = AbilityManagerService::GetPubInstance();
3791     CHECK_POINTER(abilityManagerService);
3792     auto handler = abilityManagerService->GetTaskHandler();
3793     CHECK_POINTER(handler);
3794     std::weak_ptr<MissionListManager> wpMgr = shared_from_this();
3795     auto task = [wpMgr, bundleName, uid]() {
3796         TAG_LOGI(AAFwkTag::ABILITYMGR, "Handle Uninstall app, bundleName: %{public}s, uid:%{public}d",
3797             bundleName.c_str(), uid);
3798         auto mgr = wpMgr.lock();
3799         if (mgr) {
3800             mgr->AddUninstallTags(bundleName, uid);
3801         }
3802     };
3803     handler->SubmitTask(task);
3804 }
3805 
AddUninstallTags(const std::string & bundleName,int32_t uid)3806 void MissionListManager::AddUninstallTags(const std::string &bundleName, int32_t uid)
3807 {
3808     TAG_LOGI(AAFwkTag::ABILITYMGR, "AddUninstallTags, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3809     std::lock_guard guard(managerLock_);
3810     for (auto it = currentMissionLists_.begin(); it != currentMissionLists_.end();) {
3811         auto missionList = *it;
3812         if (missionList) {
3813             missionList->HandleUnInstallApp(bundleName, uid); // add tag here.
3814             if (missionList->IsEmpty()) {
3815                 currentMissionLists_.erase(it++);
3816                 continue;
3817             }
3818         }
3819         it++;
3820     }
3821     defaultSingleList_->HandleUnInstallApp(bundleName, uid);
3822     defaultStandardList_->HandleUnInstallApp(bundleName, uid);
3823     std::list<int32_t> matchedMissions;
3824     DelayedSingleton<MissionInfoMgr>::GetInstance()->HandleUnInstallApp(bundleName, uid, matchedMissions);
3825     if (listenerController_) {
3826         listenerController_->HandleUnInstallApp(matchedMissions);
3827     }
3828 
3829     EraseWaitingAbility(bundleName, uid);
3830 }
3831 
EraseWaitingAbility(const std::string & bundleName,int32_t uid)3832 void MissionListManager::EraseWaitingAbility(const std::string &bundleName, int32_t uid)
3833 {
3834     std::queue<AbilityRequest> abilityQueue;
3835     waitingAbilityQueue_.swap(abilityQueue);
3836     while (!abilityQueue.empty()) {
3837         AbilityRequest tempAbilityRequest = abilityQueue.front();
3838         abilityQueue.pop();
3839         if (tempAbilityRequest.abilityInfo.bundleName == bundleName && tempAbilityRequest.uid == uid) {
3840             TAG_LOGI(AAFwkTag::ABILITYMGR, "AddUninstallTags, erase AbilityRequest from waitingAbilityQueue.");
3841         } else {
3842             waitingAbilityQueue_.push(tempAbilityRequest);
3843         }
3844     }
3845 }
3846 
IsStarted()3847 bool MissionListManager::IsStarted()
3848 {
3849     std::lock_guard guard(managerLock_);
3850     auto launcherRoot = launcherList_->GetLauncherRoot();
3851     return launcherRoot != nullptr;
3852 }
3853 
PauseManager()3854 void MissionListManager::PauseManager()
3855 {
3856     TAG_LOGI(AAFwkTag::ABILITYMGR, "MissionListManager PauseManager. move foreground to background.");
3857     std::lock_guard guard(managerLock_);
3858     std::list<std::shared_ptr<AbilityRecord>> foregroundAbilities;
3859     GetAllForegroundAbilities(foregroundAbilities);
3860 
3861     for (auto& abilityRecord : foregroundAbilities) {
3862         if (!abilityRecord) {
3863             continue;
3864         }
3865         abilityRecord->SetSwitchingPause(true);
3866         MoveToBackgroundTask(abilityRecord);
3867     }
3868 }
3869 
ResumeManager()3870 void MissionListManager::ResumeManager()
3871 {
3872     TAG_LOGI(AAFwkTag::ABILITYMGR, "ResumeManager, back to launcher.");
3873     BackToLauncher();
3874 }
3875 
GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3876 void MissionListManager::GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3877 {
3878     for (auto& missionList : currentMissionLists_) {
3879         GetForegroundAbilities(missionList, foregroundList);
3880     }
3881     GetForegroundAbilities(defaultSingleList_, foregroundList);
3882     GetForegroundAbilities(defaultStandardList_, foregroundList);
3883 }
3884 
GetForegroundAbilities(const std::shared_ptr<MissionList> & missionList,std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3885 void MissionListManager::GetForegroundAbilities(const std::shared_ptr<MissionList>& missionList,
3886     std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3887 {
3888     if (!missionList || missionList->IsEmpty()) {
3889         return;
3890     }
3891 
3892     for (auto& mission : missionList->GetAllMissions()) {
3893         if (!mission) {
3894             continue;
3895         }
3896 
3897         auto abilityRecord = mission->GetAbilityRecord();
3898         if (!abilityRecord) {
3899             continue;
3900         }
3901 
3902         if (abilityRecord->IsActiveState()) {
3903             foregroundList.emplace_back(abilityRecord);
3904         }
3905     }
3906 }
3907 
RemoveMissionLocked(int32_t missionId,bool excludeFromMissions)3908 void MissionListManager::RemoveMissionLocked(int32_t missionId, bool excludeFromMissions)
3909 {
3910     if (missionId <= 0) {
3911         return;
3912     }
3913 
3914     DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
3915     if (listenerController_ && !excludeFromMissions) {
3916         listenerController_->NotifyMissionDestroyed(missionId);
3917     }
3918 }
3919 
IsExcludeFromMissions(const std::shared_ptr<Mission> & mission)3920 bool MissionListManager::IsExcludeFromMissions(const std::shared_ptr<Mission> &mission)
3921 {
3922     if (!mission) {
3923         return false;
3924     }
3925 
3926     auto abilityRecord = mission->GetAbilityRecord();
3927     return abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions;
3928 }
3929 
SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> & tokens)3930 void MissionListManager::SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> &tokens)
3931 {
3932     TAG_LOGI(AAFwkTag::ABILITYMGR, "call");
3933     for (auto &item : tokens) {
3934         auto abilityRecord = GetAbilityRecordByToken(item);
3935         if (abilityRecord == nullptr) {
3936             TAG_LOGW(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
3937             continue;
3938         }
3939         auto mission = GetMissionById(abilityRecord->GetMissionId());
3940         if (mission == nullptr) {
3941             TAG_LOGW(AAFwkTag::ABILITYMGR, "mission is nullptr.");
3942             continue;
3943         }
3944         mission->SetANRState(true);
3945     }
3946 }
3947 
IsValidMissionIds(const std::vector<int32_t> & missionIds,std::vector<MissionValidResult> & results)3948 int32_t MissionListManager::IsValidMissionIds(
3949     const std::vector<int32_t> &missionIds, std::vector<MissionValidResult> &results)
3950 {
3951     constexpr int32_t searchCount = 20;
3952     auto callerUid = IPCSkeleton::GetCallingUid();
3953     auto missionInfoMgr = DelayedSingleton<MissionInfoMgr>::GetInstance();
3954     if (missionInfoMgr == nullptr) {
3955         TAG_LOGE(AAFwkTag::ABILITYMGR, "missionInfoMgr is nullptr.");
3956         return ERR_INVALID_VALUE;
3957     }
3958     std::lock_guard guard(managerLock_);
3959     for (auto i = 0; i < searchCount && i < static_cast<int32_t>(missionIds.size()); ++i) {
3960         MissionValidResult missionResult = {};
3961         missionResult.missionId = missionIds.at(i);
3962         InnerMissionInfo info;
3963         if (missionInfoMgr->GetInnerMissionInfoById(missionResult.missionId, info) != ERR_OK) {
3964             results.push_back(missionResult);
3965             continue;
3966         }
3967 
3968         if (callerUid != info.uid) {
3969             results.push_back(missionResult);
3970             continue;
3971         }
3972 
3973         missionResult.isValid = true;
3974         results.push_back(missionResult);
3975     }
3976 
3977     return ERR_OK;
3978 }
3979 
UpdateAbilityRecordLaunchReason(const AbilityRequest & abilityRequest,std::shared_ptr<AbilityRecord> & abilityRecord)3980 bool MissionListManager::UpdateAbilityRecordLaunchReason(
3981     const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &abilityRecord)
3982 {
3983     if (abilityRecord == nullptr) {
3984         TAG_LOGE(AAFwkTag::ABILITYMGR, "input record is nullptr.");
3985         return false;
3986     }
3987 
3988     if (abilityRequest.IsAppRecovery() || abilityRecord->GetRecoveryInfo()) {
3989         abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
3990         return true;
3991     }
3992 
3993     auto res = abilityRequest.IsContinuation();
3994     if (res.first) {
3995         abilityRecord->SetLaunchReason(res.second);
3996         return true;
3997     }
3998 
3999     if (abilityRequest.IsAcquireShareData()) {
4000         abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_SHARE);
4001         return true;
4002     }
4003 
4004     abilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
4005     return true;
4006 }
4007 
NotifyMissionFocused(int32_t missionId)4008 void MissionListManager::NotifyMissionFocused(int32_t missionId)
4009 {
4010     if (listenerController_) {
4011         listenerController_->NotifyMissionFocused(missionId);
4012     } else {
4013         TAG_LOGE(AAFwkTag::ABILITYMGR, "listener controller is null");
4014     }
4015 }
4016 
NotifyMissionUnfocused(int32_t missionId)4017 void MissionListManager::NotifyMissionUnfocused(int32_t missionId)
4018 {
4019     if (listenerController_) {
4020         listenerController_->NotifyMissionUnfocused(missionId);
4021     } else {
4022         TAG_LOGE(AAFwkTag::ABILITYMGR, "listener controller is null");
4023     }
4024 }
4025 
NotifyAbilityToken(const sptr<IRemoteObject> & token,const AbilityRequest & abilityRequest)4026 void MissionListManager::NotifyAbilityToken(const sptr<IRemoteObject> &token, const AbilityRequest &abilityRequest)
4027 {
4028     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
4029         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
4030     if (abilityInfoCallback != nullptr) {
4031         abilityInfoCallback->NotifyAbilityToken(token, abilityRequest.want);
4032     }
4033 }
4034 
NotifyStartAbilityResult(const AbilityRequest & abilityRequest,int result)4035 void MissionListManager::NotifyStartAbilityResult(const AbilityRequest &abilityRequest, int result)
4036 {
4037     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
4038         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
4039     if (abilityInfoCallback != nullptr) {
4040         abilityInfoCallback->NotifyStartAbilityResult(abilityRequest.want, result);
4041     }
4042 }
4043 
DoAbilityForeground(std::shared_ptr<AbilityRecord> & abilityRecord,uint32_t flag)4044 int MissionListManager::DoAbilityForeground(std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t flag)
4045 {
4046     std::lock_guard guard(managerLock_);
4047     if (abilityRecord == nullptr) {
4048         TAG_LOGE(AAFwkTag::ABILITYMGR, "DoAbilityForeground failed, ability record is null.");
4049         return ERR_INVALID_VALUE;
4050     }
4051     if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
4052         TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is FOREGROUND.");
4053         abilityRecord->SetPendingState(AbilityState::FOREGROUND);
4054         return ERR_OK;
4055     } else {
4056         TAG_LOGD(AAFwkTag::ABILITYMGR, "pending state is not FOREGROUND.");
4057         abilityRecord->SetPendingState(AbilityState::FOREGROUND);
4058     }
4059     abilityRecord->ProcessForegroundAbility(0, flag);
4060     return ERR_OK;
4061 }
4062 
GetActiveAbilityList(int32_t uid,std::vector<std::string> & abilityList,int32_t pid)4063 void MissionListManager::GetActiveAbilityList(int32_t uid, std::vector<std::string> &abilityList, int32_t pid)
4064 {
4065     std::lock_guard guard(managerLock_);
4066     for (auto missionList : currentMissionLists_) {
4067         if (missionList != nullptr) {
4068             std::vector<std::string> currentActiveAbilities;
4069             missionList->GetActiveAbilityList(uid, currentActiveAbilities, pid);
4070             if (!currentActiveAbilities.empty()) {
4071                 abilityList.insert(abilityList.end(), currentActiveAbilities.begin(), currentActiveAbilities.end());
4072             }
4073         }
4074     }
4075 
4076     if (defaultStandardList_ != nullptr) {
4077         std::vector<std::string> defaultActiveStandardList;
4078         defaultStandardList_->GetActiveAbilityList(uid, defaultActiveStandardList, pid);
4079         if (!defaultActiveStandardList.empty()) {
4080             abilityList.insert(abilityList.end(), defaultActiveStandardList.begin(), defaultActiveStandardList.end());
4081         }
4082     }
4083 
4084     if (defaultSingleList_ != nullptr) {
4085         std::vector<std::string> defaultActiveSingleList;
4086         defaultSingleList_->GetActiveAbilityList(uid, defaultActiveSingleList, pid);
4087         if (!defaultActiveSingleList.empty()) {
4088             abilityList.insert(abilityList.end(), defaultActiveSingleList.begin(), defaultActiveSingleList.end());
4089         }
4090     }
4091 
4092     if (!abilityList.empty()) {
4093         sort(abilityList.begin(), abilityList.end());
4094         abilityList.erase(unique(abilityList.begin(), abilityList.end()), abilityList.end());
4095     }
4096 }
4097 
SetLastExitReason(std::shared_ptr<AbilityRecord> & abilityRecord)4098 void MissionListManager::SetLastExitReason(std::shared_ptr<AbilityRecord> &abilityRecord)
4099 {
4100     if (abilityRecord == nullptr) {
4101         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
4102         return;
4103     }
4104 
4105     if (abilityRecord->GetAbilityInfo().bundleName.empty()) {
4106         TAG_LOGE(AAFwkTag::ABILITYMGR, "bundleName is empty.");
4107         return;
4108     }
4109 
4110     ExitReason exitReason;
4111     bool isSetReason;
4112     auto accessTokenId = abilityRecord->GetAbilityInfo().applicationInfo.accessTokenId;
4113     DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->GetAppExitReason(
4114         abilityRecord->GetAbilityInfo().bundleName, accessTokenId, abilityRecord->GetAbilityInfo().name,
4115         isSetReason, exitReason);
4116 
4117     if (isSetReason) {
4118         abilityRecord->SetLastExitReason(exitReason);
4119     }
4120 }
4121 
IsAppLastAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)4122 bool MissionListManager::IsAppLastAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
4123 {
4124     if (abilityRecord == nullptr) {
4125         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord is nullptr.");
4126         return false;
4127     }
4128 
4129     auto uid = abilityRecord->GetAbilityInfo().applicationInfo.uid;
4130 
4131     std::vector<std::string> abilityList;
4132     for (auto missionList : currentMissionLists_) {
4133         if (missionList != nullptr) {
4134             missionList->GetActiveAbilityList(uid, abilityList);
4135         }
4136     }
4137 
4138     if (abilityList.size() == ONLY_ONE_ABILITY) {
4139         return true;
4140     }
4141     return false;
4142 }
4143 
PrepareClearMissionLocked(int missionId,const std::shared_ptr<Mission> & mission)4144 int MissionListManager::PrepareClearMissionLocked(int missionId, const std::shared_ptr<Mission> &mission)
4145 {
4146     if (mission == nullptr) {
4147         TAG_LOGD(AAFwkTag::ABILITYMGR, "ability has already terminate, just remove mission.");
4148         return ERR_OK;
4149     }
4150     auto abilityRecord = mission->GetAbilityRecord();
4151     if (abilityRecord == nullptr || abilityRecord->IsTerminating()) {
4152         TAG_LOGW(AAFwkTag::ABILITYMGR, "Ability record is not exist or is on terminating.");
4153         return ERR_OK;
4154     }
4155 
4156     // terminate on timeout
4157     std::weak_ptr<MissionListManager> wpMgr = shared_from_this();
4158     auto terminateTask = [wpMgr, missionId, mission]() {
4159         TAG_LOGI(AAFwkTag::ABILITYMGR, "Handle terminate task: %{public}d", missionId);
4160         auto mgr = wpMgr.lock();
4161         if (mgr) {
4162             mgr->ClearMissionLocking(missionId, mission);
4163         }
4164     };
4165     auto handler = AbilityManagerService::GetPubInstance()->GetTaskHandler();
4166     int prepareTerminateTimeout =
4167         AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * PREPARE_TERMINATE_TIMEOUT_MULTIPLE;
4168     if (handler) {
4169         handler->SubmitTask(terminateTask, "PrepareTermiante_" + std::to_string(abilityRecord->GetAbilityRecordId()),
4170             prepareTerminateTimeout);
4171     }
4172 
4173     bool res = abilityRecord->PrepareTerminateAbility();
4174     if (res) {
4175         TAG_LOGI(AAFwkTag::ABILITYMGR, "stop terminating.");
4176         handler->CancelTask("PrepareTermiante_" + std::to_string(abilityRecord->GetAbilityRecordId()));
4177         return ERR_OK;
4178     }
4179     handler->CancelTask("PrepareTermiante_" + std::to_string(abilityRecord->GetAbilityRecordId()));
4180     return ClearMissionLocked(missionId, mission);
4181 }
4182 
CheckPrepareTerminateEnable(const std::shared_ptr<Mission> & mission)4183 bool MissionListManager::CheckPrepareTerminateEnable(const std::shared_ptr<Mission> &mission)
4184 {
4185     if (!isPrepareTerminateEnable_) {
4186         TAG_LOGD(AAFwkTag::ABILITYMGR, "Only support PC.");
4187         return false;
4188     }
4189     if (mission == nullptr) {
4190         TAG_LOGD(AAFwkTag::ABILITYMGR, "ability has already terminate, just remove mission.");
4191         return false;
4192     }
4193     auto abilityRecord = mission->GetAbilityRecord();
4194     if (abilityRecord == nullptr || abilityRecord->IsTerminating()) {
4195         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability record is not exist or is on terminating.");
4196         return false;
4197     }
4198     auto type = abilityRecord->GetAbilityInfo().type;
4199     bool isStageBasedModel = abilityRecord->GetAbilityInfo().isStageBasedModel;
4200     if (!isStageBasedModel || type != AppExecFwk::AbilityType::PAGE) {
4201         TAG_LOGD(AAFwkTag::ABILITYMGR, "ability mode not support.");
4202         return false;
4203     }
4204     auto tokenId = abilityRecord->GetApplicationInfo().accessTokenId;
4205     if (!AAFwk::PermissionVerification::GetInstance()->VerifyPrepareTerminatePermission(tokenId)) {
4206         TAG_LOGD(AAFwkTag::ABILITYMGR, "failed, please apply permission ohos.permission.PREPARE_APP_TERMINATE");
4207         return false;
4208     }
4209     return true;
4210 }
4211 
CallRequestDone(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<IRemoteObject> & callStub)4212 void MissionListManager::CallRequestDone(const std::shared_ptr<AbilityRecord> &abilityRecord,
4213     const sptr<IRemoteObject> &callStub)
4214 {
4215     std::lock_guard guard(managerLock_);
4216     if (abilityRecord == nullptr) {
4217         TAG_LOGE(AAFwkTag::ABILITYMGR, "ability record is null.");
4218         return;
4219     }
4220     if (callStub == nullptr) {
4221         TAG_LOGE(AAFwkTag::ABILITYMGR, "call stub is null.");
4222         return;
4223     }
4224     abilityRecord->CallRequestDone(callStub);
4225 }
4226 
SendKeyEvent(const AbilityRequest & abilityRequest)4227 void MissionListManager::SendKeyEvent(const AbilityRequest &abilityRequest)
4228 {
4229     auto abilityInfo = abilityRequest.abilityInfo;
4230     EventInfo eventInfo;
4231     eventInfo.abilityName = abilityInfo.name;
4232     eventInfo.bundleName = abilityInfo.bundleName;
4233     eventInfo.moduleName = abilityInfo.moduleName;
4234     EventReport::SendKeyEvent(EventName::START_PRIVATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
4235 }
4236 
SignRestartAppFlag(int32_t uid)4237 void MissionListManager::SignRestartAppFlag(int32_t uid)
4238 {
4239     std::lock_guard guard(managerLock_);
4240     for (const auto& missionList : currentMissionLists_) {
4241         if (!missionList) {
4242             continue;
4243         }
4244         missionList->SignRestartAppFlag(uid);
4245     }
4246     if (defaultStandardList_) {
4247         defaultStandardList_->SignRestartAppFlag(uid);
4248     }
4249     if (defaultSingleList_) {
4250         defaultSingleList_->SignRestartAppFlag(uid);
4251     }
4252 }
4253 
4254 class MissionListWrapImpl : public MissionListWrap {
4255 public:
4256     ~MissionListWrapImpl() = default;
4257 
CreateMissionListManager(int32_t userId)4258     std::shared_ptr<MissionListManagerInterface> CreateMissionListManager(int32_t userId) override
4259     {
4260         return std::make_shared<MissionListManager>(userId);
4261     }
4262 
RemoveUserDir(int32_t userId)4263     void RemoveUserDir(int32_t userId) override
4264     {
4265         DelayedSingleton<TaskDataPersistenceMgr>::GetInstance()->RemoveUserDir(userId);
4266     }
4267 
InitMissionInfoMgr(int32_t userId)4268     void InitMissionInfoMgr(int32_t userId) override
4269     {
4270         DelayedSingleton<MissionInfoMgr>::GetInstance()->Init(userId);
4271     }
4272 
SetMissionAbilityState(int32_t missionId,AbilityState state)4273     void SetMissionAbilityState(int32_t missionId, AbilityState state) override
4274     {
4275         DelayedSingleton<MissionInfoMgr>::GetInstance()->SetMissionAbilityState(missionId, state);
4276     }
4277 
GetInnerMissionInfoById(int32_t missionId,InnerMissionInfo & innerMissionInfo)4278     int32_t GetInnerMissionInfoById(int32_t missionId, InnerMissionInfo &innerMissionInfo) override
4279     {
4280         return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
4281             missionId, innerMissionInfo);
4282     }
4283 #ifdef SUPPORT_SCREEN
GetSnapshot(int32_t missionId)4284     std::shared_ptr<Media::PixelMap> GetSnapshot(int32_t missionId) override
4285     {
4286         return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetSnapshot(missionId);
4287     }
4288 #endif
4289 };
4290 }  // namespace AAFwk
4291 }  // namespace OHOS
4292 
CreateMissionListWrap()4293 extern "C" __attribute__((visibility("default"))) OHOS::AAFwk::MissionListWrap* CreateMissionListWrap()
4294 {
4295     return new OHOS::AAFwk::MissionListWrapImpl();
4296 }