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