• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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 "hitrace_meter.h"
24 #include "errors.h"
25 #include "hilog_wrapper.h"
26 #include "hisysevent.h"
27 #include "mission_info_mgr.h"
28 
29 namespace OHOS {
30 namespace AAFwk {
31 namespace {
32 constexpr uint32_t DELAY_NOTIFY_LABEL_TIME = 30; // 30ms
33 constexpr uint32_t SCENE_FLAG_KEYGUARD = 1;
34 constexpr char EVENT_KEY_UID[] = "UID";
35 constexpr char EVENT_KEY_PID[] = "PID";
36 constexpr char EVENT_KEY_MESSAGE[] = "MSG";
37 constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
38 constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
39 constexpr int32_t MAX_INSTANCE_COUNT = 128;
40 constexpr uint64_t NANO_SECOND_PER_SEC = 1000000000; // ns
41 const std::string DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
42 const std::string DMS_MISSION_ID = "dmsMissionId";
43 const int DEFAULT_DMS_MISSION_ID = -1;
44 const std::string DLP_INDEX = "ohos.dlp.params.index";
GetCurrentTime()45 std::string GetCurrentTime()
46 {
47     struct timespec tn;
48     clock_gettime(CLOCK_REALTIME, &tn);
49     uint64_t uTime = static_cast<uint64_t>(tn.tv_sec) * NANO_SECOND_PER_SEC +
50         static_cast<uint64_t>(tn.tv_nsec);
51     return std::to_string(uTime);
52 }
53 } // namespace
54 
MissionListManager(int userId)55 MissionListManager::MissionListManager(int userId) : userId_(userId) {}
56 
~MissionListManager()57 MissionListManager::~MissionListManager() {}
58 
Init()59 void MissionListManager::Init()
60 {
61     launcherList_ = std::make_shared<MissionList>(MissionListType::LAUNCHER);
62     defaultStandardList_ = std::make_shared<MissionList>(MissionListType::DEFAULT_STANDARD);
63     defaultSingleList_ = std::make_shared<MissionList>(MissionListType::DEFAULT_SINGLE);
64     currentMissionLists_.push_front(launcherList_);
65 
66     if (!listenerController_) {
67         listenerController_ = std::make_shared<MissionListenerController>();
68         listenerController_->Init();
69     }
70 
71     DelayedSingleton<MissionInfoMgr>::GetInstance()->Init(userId_);
72 }
73 
StartAbility(AbilityRequest & abilityRequest)74 int MissionListManager::StartAbility(AbilityRequest &abilityRequest)
75 {
76     std::lock_guard<std::recursive_mutex> guard(managerLock_);
77     if (IsReachToLimitLocked(abilityRequest)) {
78         HILOG_ERROR("already reach limit instance. limit is : %{public}d", MAX_INSTANCE_COUNT);
79         return ERR_REACH_UPPER_LIMIT;
80     }
81 
82     auto currentTopAbility = GetCurrentTopAbilityLocked();
83     if (currentTopAbility) {
84         std::string element = currentTopAbility->GetWant().GetElement().GetURI();
85         auto state = currentTopAbility->GetAbilityState();
86         HILOG_DEBUG("current top: %{public}s, state: %{public}s",
87             element.c_str(), AbilityRecord::ConvertAbilityState(state).c_str());
88         if (state == FOREGROUNDING) {
89             HILOG_INFO("Top ability is foregrounding, so enqueue ability for waiting.");
90             EnqueueWaitingAbility(abilityRequest);
91             return START_ABILITY_WAITING;
92         }
93     }
94 
95     auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
96     if (callerAbility) {
97         std::string element = callerAbility->GetWant().GetElement().GetURI();
98         auto state = callerAbility->GetAbilityState();
99         HILOG_DEBUG("callerAbility is: %{public}s, state: %{public}s",
100             element.c_str(), AbilityRecord::ConvertAbilityState(state).c_str());
101     }
102 
103     abilityRequest.callerAccessTokenId = IPCSkeleton::GetCallingTokenID();
104     return StartAbility(currentTopAbility, callerAbility, abilityRequest);
105 }
106 
StartAbility(const std::shared_ptr<AbilityRecord> & currentTopAbility,const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)107 int MissionListManager::StartAbility(const std::shared_ptr<AbilityRecord> &currentTopAbility,
108     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
109 {
110     auto isSpecified = (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED);
111     if (isSpecified) {
112         EnqueueWaitingAbilityToFront(abilityRequest);
113         DelayedSingleton<AppScheduler>::GetInstance()->StartSpecifiedAbility(
114             abilityRequest.want, abilityRequest.abilityInfo);
115         return 0;
116     }
117 
118     return StartAbilityLocked(currentTopAbility, callerAbility, abilityRequest);
119 }
120 
MinimizeAbility(const sptr<IRemoteObject> & token,bool fromUser)121 int MissionListManager::MinimizeAbility(const sptr<IRemoteObject> &token, bool fromUser)
122 {
123     HILOG_INFO("Minimize ability, fromUser:%{public}d.", fromUser);
124     std::lock_guard<std::recursive_mutex> guard(managerLock_);
125     // check if ability is in list to avoid user create fake token.
126     CHECK_POINTER_AND_RETURN_LOG(
127         GetAbilityRecordByToken(token), INNER_ERR, "Minimize ability fail, ability is not in mission list.");
128     auto abilityRecord = Token::GetAbilityRecordByToken(token);
129     return MinimizeAbilityLocked(abilityRecord, fromUser);
130 }
131 
RegisterMissionListener(const sptr<IMissionListener> & listener)132 int MissionListManager::RegisterMissionListener(const sptr<IMissionListener> &listener)
133 {
134     if (!listenerController_) {
135         HILOG_ERROR("service not init, try again later.");
136         return -1;
137     }
138 
139     return listenerController_->AddMissionListener(listener);
140 }
141 
UnRegisterMissionListener(const sptr<IMissionListener> & listener)142 int MissionListManager::UnRegisterMissionListener(const sptr<IMissionListener> &listener)
143 {
144     if (!listenerController_) {
145         HILOG_ERROR("service not init, try unregister again later.");
146         return -1;
147     }
148 
149     listenerController_->DelMissionListener(listener);
150     return 0;
151 }
152 
GetMissionInfos(int32_t numMax,std::vector<MissionInfo> & missionInfos)153 int MissionListManager::GetMissionInfos(int32_t numMax, std::vector<MissionInfo> &missionInfos)
154 {
155     HILOG_INFO("Get mission infos.");
156     if (numMax < 0) {
157         HILOG_ERROR("numMax is invalid, numMax:%{public}d", numMax);
158         return ERR_INVALID_VALUE;
159     }
160 
161     return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionInfos(numMax, missionInfos);
162 }
163 
GetMissionInfo(int32_t missionId,MissionInfo & missionInfo)164 int MissionListManager::GetMissionInfo(int32_t missionId, MissionInfo &missionInfo)
165 {
166     HILOG_INFO("Get mission info by id:%{public}d.", missionId);
167     return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionInfoById(missionId, missionInfo);
168 }
169 
MoveMissionToFront(int32_t missionId,std::shared_ptr<StartOptions> startOptions)170 int MissionListManager::MoveMissionToFront(int32_t missionId, std::shared_ptr<StartOptions> startOptions)
171 {
172     std::lock_guard<std::recursive_mutex> guard(managerLock_);
173     return MoveMissionToFront(missionId, true, startOptions);
174 }
175 
MoveMissionToFront(int32_t missionId,bool isCallerFromLauncher,std::shared_ptr<StartOptions> startOptions)176 int MissionListManager::MoveMissionToFront(int32_t missionId, bool isCallerFromLauncher,
177     std::shared_ptr<StartOptions> startOptions)
178 {
179     HILOG_INFO("move mission to front:%{public}d.", missionId);
180     std::lock_guard<std::recursive_mutex> guard(managerLock_);
181     std::shared_ptr<Mission> mission;
182     auto targetMissionList = GetTargetMissionList(missionId, mission);
183     if (!targetMissionList || !mission) {
184         HILOG_ERROR("get target mission list failed, missionId: %{public}d", missionId);
185         return MOVE_MISSION_FAILED;
186     }
187 
188     MoveMissionToTargetList(isCallerFromLauncher, targetMissionList, mission);
189     MoveMissionListToTop(targetMissionList);
190 
191     auto targetAbilityRecord = mission->GetAbilityRecord();
192     if (!targetAbilityRecord) {
193         HILOG_ERROR("get target ability record failed, missionId: %{public}d", missionId);
194         return MOVE_MISSION_FAILED;
195     }
196     targetAbilityRecord->SetIsNewWant(false);
197     targetAbilityRecord->RemoveWindowMode();
198     if (startOptions != nullptr) {
199         targetAbilityRecord->SetWindowMode(startOptions->GetWindowMode());
200     }
201 
202 #ifdef SUPPORT_GRAPHICS
203     AbilityRequest abilityRequest;
204     targetAbilityRecord->ProcessForegroundAbility(true, abilityRequest, startOptions, nullptr);
205 #else
206     targetAbilityRecord->ProcessForegroundAbility();
207 #endif
208     HILOG_DEBUG("SetMovingState, missionId: %{public}d", missionId);
209     mission->SetMovingState(true);
210     return ERR_OK;
211 }
212 
EnqueueWaitingAbility(const AbilityRequest & abilityRequest)213 void MissionListManager::EnqueueWaitingAbility(const AbilityRequest &abilityRequest)
214 {
215     waitingAbilityQueue_.push(abilityRequest);
216     return;
217 }
218 
EnqueueWaitingAbilityToFront(const AbilityRequest & abilityRequest)219 void MissionListManager::EnqueueWaitingAbilityToFront(const AbilityRequest &abilityRequest)
220 {
221     std::lock_guard<std::recursive_mutex> guard(managerLock_);
222     std::queue<AbilityRequest> abilityQueue;
223     abilityQueue.push(abilityRequest);
224     waitingAbilityQueue_.swap(abilityQueue);
225     while (!abilityQueue.empty()) {
226         AbilityRequest tempAbilityRequest = abilityQueue.front();
227         abilityQueue.pop();
228         waitingAbilityQueue_.push(tempAbilityRequest);
229     }
230 }
231 
StartWaitingAbility()232 void MissionListManager::StartWaitingAbility()
233 {
234     HILOG_INFO("%{public}s was called.", __func__);
235     std::lock_guard<std::recursive_mutex> guard(managerLock_);
236     auto topAbility = GetCurrentTopAbilityLocked();
237     if (topAbility != nullptr && topAbility->IsAbilityState(FOREGROUNDING)) {
238         HILOG_INFO("Top ability is foregrounding, must return for start waiting again.");
239         return;
240     }
241 
242     if (!waitingAbilityQueue_.empty()) {
243         AbilityRequest abilityRequest = waitingAbilityQueue_.front();
244         HILOG_INFO("%{public}s. ability name: %{public}s", __func__, abilityRequest.abilityInfo.name.c_str());
245         waitingAbilityQueue_.pop();
246         auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
247         StartAbility(topAbility, callerAbility, abilityRequest);
248         return;
249     }
250 }
251 
StartAbilityLocked(const std::shared_ptr<AbilityRecord> & currentTopAbility,const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)252 int MissionListManager::StartAbilityLocked(const std::shared_ptr<AbilityRecord> &currentTopAbility,
253     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
254 {
255     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
256     HILOG_DEBUG("Start ability locked.");
257     // 1. choose target mission list
258     auto targetList = GetTargetMissionList(callerAbility, abilityRequest);
259     CHECK_POINTER_AND_RETURN(targetList, CREATE_MISSION_STACK_FAILED);
260 
261     // 2. get target mission
262     std::shared_ptr<AbilityRecord> targetAbilityRecord;
263     std::shared_ptr<Mission> targetMission;
264     GetTargetMissionAndAbility(abilityRequest, targetMission, targetAbilityRecord);
265     if (!targetMission || !targetAbilityRecord) {
266         HILOG_ERROR("Failed to get mission or record.");
267         return ERR_INVALID_VALUE;
268     }
269 
270     if (targetAbilityRecord->IsTerminating()) {
271         HILOG_ERROR("%{public}s is terminating.", targetAbilityRecord->GetAbilityInfo().name.c_str());
272         return ERR_INVALID_VALUE;
273     }
274 
275     if (targetAbilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
276         HILOG_DEBUG("pending state is FOREGROUND.");
277         targetAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
278         return ERR_OK;
279     } else {
280         HILOG_DEBUG("pending state is not FOREGROUND.");
281         targetAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
282     }
283 
284     if (abilityRequest.IsContinuation()) {
285         targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CONTINUATION);
286     } else if (abilityRequest.IsAppRecovery()) {
287         targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
288     } else {
289         targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
290     }
291 
292     std::string srcAbilityId = "";
293     if (abilityRequest.want.GetBoolParam(Want::PARAM_RESV_FOR_RESULT, false)) {
294         std::string srcDeviceId = abilityRequest.want.GetStringParam(DMS_SRC_NETWORK_ID);
295         int missionId = abilityRequest.want.GetIntParam(DMS_MISSION_ID, DEFAULT_DMS_MISSION_ID);
296         HILOG_DEBUG("Get srcNetWorkId = %s, missionId = %d", srcDeviceId.c_str(), missionId);
297         Want* newWant = const_cast<Want*>(&abilityRequest.want);
298         newWant->RemoveParam(DMS_SRC_NETWORK_ID);
299         newWant->RemoveParam(DMS_MISSION_ID);
300         newWant->RemoveParam(Want::PARAM_RESV_FOR_RESULT);
301         srcAbilityId = srcDeviceId + "_" + std::to_string(missionId);
302     }
303     targetAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode, srcAbilityId);
304 
305     // 3. move mission to target list
306     bool isCallerFromLauncher = (callerAbility && callerAbility->IsLauncherAbility());
307     MoveMissionToTargetList(isCallerFromLauncher, targetList, targetMission);
308 
309     // 4. move target list to top
310     MoveMissionListToTop(targetList);
311 
312     // 5. schedule target ability
313     if (!currentTopAbility) {
314         // top ability is null, then launch the first Ability.
315         if (targetAbilityRecord->GetAbilityInfo().applicationInfo.isLauncherApp) {
316             targetAbilityRecord->SetLauncherRoot();
317         }
318     } else {
319         // only SA or no Page Ability support back to other mission stack
320         auto supportBackToOtherMissionStack =
321             (!callerAbility) || (callerAbility->GetAbilityInfo().type != AppExecFwk::AbilityType::PAGE);
322         auto needBackToOtherMissionStack =
323             abilityRequest.want.GetBoolParam(Want::PARAM_BACK_TO_OTHER_MISSION_STACK, false);
324         if (supportBackToOtherMissionStack && needBackToOtherMissionStack) {
325             // mark if need back to other mission stack
326             targetAbilityRecord->SetNeedBackToOtherMissionStack(true);
327             auto focusAbility = OHOS::DelayedSingleton<AbilityManagerService>::GetInstance()->GetFocusAbility();
328             if (focusAbility) {
329                 targetAbilityRecord->SetOtherMissionStackAbilityRecord(focusAbility);
330             } else {
331                 targetAbilityRecord->SetOtherMissionStackAbilityRecord(currentTopAbility);
332             }
333         }
334     }
335 
336     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
337         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
338     if (abilityInfoCallback != nullptr) {
339         abilityInfoCallback->NotifyAbilityToken(targetAbilityRecord->GetToken(), abilityRequest.want);
340     }
341 
342 #ifdef SUPPORT_GRAPHICS
343     std::shared_ptr<StartOptions> startOptions = nullptr;
344     targetAbilityRecord->ProcessForegroundAbility(false, abilityRequest, startOptions, callerAbility);
345 #else
346     targetAbilityRecord->ProcessForegroundAbility();
347 #endif
348     return ERR_OK;
349 }
350 
CallType2StartMethod(int32_t callType)351 static int32_t CallType2StartMethod(int32_t callType)
352 {
353     switch (callType) {
354         case AbilityCallType::INVALID_TYPE:
355             return static_cast<int32_t>(StartMethod::START_NORMAL);
356         case AbilityCallType::CALL_REQUEST_TYPE:
357             return static_cast<int32_t>(StartMethod::START_CALL);
358         default:
359             break;
360     }
361     return -1;
362 }
363 
CallTypeFilter(int32_t callType)364 static bool CallTypeFilter(int32_t callType)
365 {
366     switch (callType) {
367         case AbilityCallType::CALL_REQUEST_TYPE:
368             return true;
369         default:
370             break;
371     }
372     return false;
373 }
374 
HandleReusedMissionAndAbility(const AbilityRequest & abilityRequest,std::shared_ptr<Mission> & targetMission,std::shared_ptr<AbilityRecord> & targetRecord)375 bool MissionListManager::HandleReusedMissionAndAbility(const AbilityRequest &abilityRequest,
376     std::shared_ptr<Mission> &targetMission, std::shared_ptr<AbilityRecord> &targetRecord)
377 {
378     auto startMethod = CallType2StartMethod(abilityRequest.callType);
379     HILOG_DEBUG("HandleReusedMissionAndAbility called startMethod is %{public}d.", startMethod);
380     auto reUsedMission = GetReusedMission(abilityRequest);
381     if (!reUsedMission) {
382         return false;
383     }
384 
385     HILOG_DEBUG("find reused mission in running list.");
386     targetMission = reUsedMission;
387     targetRecord = targetMission->GetAbilityRecord();
388     if (targetRecord) {
389         targetRecord->SetWant(abilityRequest.want);
390         targetRecord->SetIsNewWant(true);
391     }
392     /* No need to update condition:
393      *      1. not start by call
394      *      2. start by call, but call to background again
395      * Need to update condition:
396      *      1. start by call, but this time is not start by call
397      *      2. start by call, and call to foreground again
398      */
399     if (!(targetMission->IsStartByCall()
400         && (!CallTypeFilter(startMethod) ||
401             abilityRequest.want.GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)))) {
402         HILOG_DEBUG("mission exists. No update required");
403         return true;
404     }
405 
406     auto missionId = targetMission->GetMissionId();
407     HILOG_INFO("mission exists. need to be updated, missionId:%{public}d", missionId);
408     InnerMissionInfo info;
409     if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
410         targetMission->GetMissionId(), info) == 0) {
411         info.missionInfo.time = GetCurrentTime();
412         info.missionInfo.runningState = 0;
413         info.startMethod = CallType2StartMethod(abilityRequest.callType);
414         DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
415         targetMission->UpdateMissionId(missionId, info.startMethod);
416         targetMission->UpdateMissionTime(info.missionInfo.time);
417     }
418 
419     return true;
420 }
421 
GetMissionName(const AbilityRequest & abilityRequest) const422 std::string MissionListManager::GetMissionName(const AbilityRequest &abilityRequest) const
423 {
424     int32_t appIndex = abilityRequest.want.GetIntParam(DLP_INDEX, 0);
425     return AbilityUtil::ConvertBundleNameSingleton(abilityRequest.abilityInfo.bundleName,
426         abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName, appIndex);
427 }
428 
CreateOrReusedMissionInfo(const AbilityRequest & abilityRequest,InnerMissionInfo & info) const429 bool MissionListManager::CreateOrReusedMissionInfo(const AbilityRequest &abilityRequest, InnerMissionInfo &info) const
430 {
431     // get mission name.
432     bool reUsedMissionInfo = false;
433     bool needFind = false;
434     bool isFindRecentStandard = abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD &&
435         abilityRequest.startRecent;
436     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD || isFindRecentStandard) {
437         needFind = true;
438     }
439 
440     std::string missionName = GetMissionName(abilityRequest);
441     auto mgr = DelayedSingleton<MissionInfoMgr>::GetInstance();
442     if (needFind && !abilityRequest.abilityInfo.applicationInfo.isLauncherApp && mgr &&
443         mgr->FindReusedMissionInfo(missionName, abilityRequest.specifiedFlag, isFindRecentStandard, info)
444         && info.missionInfo.id > 0) {
445         reUsedMissionInfo = true;
446     }
447     HILOG_INFO("try find reused mission info. result:%{public}d", reUsedMissionInfo);
448 
449     BuildInnerMissionInfo(info, missionName, abilityRequest);
450     return reUsedMissionInfo;
451 }
452 
GetTargetMissionAndAbility(const AbilityRequest & abilityRequest,std::shared_ptr<Mission> & targetMission,std::shared_ptr<AbilityRecord> & targetRecord)453 void MissionListManager::GetTargetMissionAndAbility(const AbilityRequest &abilityRequest,
454     std::shared_ptr<Mission> &targetMission, std::shared_ptr<AbilityRecord> &targetRecord)
455 {
456     if (HandleReusedMissionAndAbility(abilityRequest, targetMission, targetRecord)) {
457         return;
458     }
459 
460     // try reuse mission info
461     InnerMissionInfo info;
462     bool findReusedMissionInfo = CreateOrReusedMissionInfo(abilityRequest, info);
463     if (!findReusedMissionInfo) {
464         if (!DelayedSingleton<MissionInfoMgr>::GetInstance()->GenerateMissionId(info.missionInfo.id)) {
465             HILOG_DEBUG("failed to generate mission id.");
466             return;
467         }
468     }
469 
470     if (targetMission == nullptr) {
471         HILOG_DEBUG("Make new mission data.");
472         targetRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
473         targetMission = std::make_shared<Mission>(info.missionInfo.id, targetRecord,
474             info.missionName, info.startMethod);
475         targetMission->SetLockedState(info.missionInfo.lockedState);
476         targetMission->UpdateMissionTime(info.missionInfo.time);
477         targetRecord->SetMission(targetMission);
478         targetRecord->SetOwnerMissionUserId(userId_);
479         // handle specified
480         if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
481             targetMission->SetSpecifiedFlag(abilityRequest.specifiedFlag);
482             targetRecord->SetSpecifiedFlag(abilityRequest.specifiedFlag);
483          }
484     }
485 
486     if (!findReusedMissionInfo && targetRecord) {
487         info.missionInfo.label = targetRecord->GetLabel();
488     }
489 
490     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp || abilityRequest.abilityInfo.excludeFromMissions) {
491         return;
492     }
493 
494     if (findReusedMissionInfo) {
495         DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
496     } else {
497         DelayedSingleton<MissionInfoMgr>::GetInstance()->AddMissionInfo(info);
498     }
499 }
500 
BuildInnerMissionInfo(InnerMissionInfo & info,const std::string & missionName,const AbilityRequest & abilityRequest) const501 void MissionListManager::BuildInnerMissionInfo(InnerMissionInfo &info, const std::string &missionName,
502     const AbilityRequest &abilityRequest) const
503 {
504     info.missionName = missionName;
505     info.launchMode = static_cast<int32_t>(abilityRequest.abilityInfo.launchMode);
506     info.startMethod = CallType2StartMethod(abilityRequest.callType);
507     info.bundleName = abilityRequest.abilityInfo.bundleName;
508     info.uid = abilityRequest.uid;
509     info.missionInfo.runningState = 0;
510     info.missionInfo.continuable = abilityRequest.abilityInfo.continuable;
511     info.missionInfo.time = GetCurrentTime();
512     info.missionInfo.iconPath = abilityRequest.appInfo.iconPath;
513     info.missionInfo.want = abilityRequest.want;
514     info.isTemporary = abilityRequest.abilityInfo.removeMissionAfterTerminate;
515     if (abilityRequest.want.GetIntParam(DLP_INDEX, 0) != 0) {
516         info.isTemporary = true;
517     }
518     info.specifiedFlag = abilityRequest.specifiedFlag;
519 
520     auto element = info.missionInfo.want.GetElement();
521     if (element.GetBundleName().empty() || element.GetAbilityName().empty()) {
522         info.missionInfo.want.SetElementName(abilityRequest.abilityInfo.bundleName, abilityRequest.abilityInfo.name);
523     }
524 }
525 
GetTargetMissionList(const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)526 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionList(
527     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
528 {
529     // priority : starting launcher ability.
530     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
531         HILOG_DEBUG("ability request is launcher app.");
532         return launcherList_;
533     }
534 
535     // no caller ability, start ability from system service.
536     if (!callerAbility) {
537         HILOG_DEBUG("ability request without caller.");
538         std::shared_ptr<MissionList> targetMissionList = std::make_shared<MissionList>();
539         return targetMissionList;
540     }
541 
542     // caller is launcher, new or reuse list.
543     if (callerAbility->IsLauncherAbility()) {
544         HILOG_DEBUG("start ability, caller is launcher app.");
545         return GetTargetMissionListByLauncher(abilityRequest);
546     }
547 
548     // caller is not launcher: refer to the list of the caller ability.
549     return GetTargetMissionListByDefault(callerAbility, abilityRequest);
550 }
551 
GetTargetMissionListByLauncher(const AbilityRequest & abilityRequest)552 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionListByLauncher(const AbilityRequest &abilityRequest)
553 {
554     auto reUsedMission = GetReusedMission(abilityRequest);
555     if (reUsedMission) {
556         HILOG_DEBUG("GetTargetMissionListByLauncher find reused mission list.");
557         auto missionList = reUsedMission->GetMissionList();
558         if (missionList && missionList != defaultSingleList_ && missionList != defaultStandardList_) {
559             return missionList;
560         }
561     }
562 
563     HILOG_DEBUG("GetTargetMissionListByLauncher do not find reused mission list.");
564     std::shared_ptr<MissionList> targetMissionList = std::make_shared<MissionList>();
565     return targetMissionList;
566 }
567 
GetTargetMissionListByDefault(const std::shared_ptr<AbilityRecord> & callerAbility,const AbilityRequest & abilityRequest)568 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionListByDefault(
569     const std::shared_ptr<AbilityRecord> &callerAbility, const AbilityRequest &abilityRequest)
570 {
571     if (!callerAbility) {
572         return nullptr;
573     }
574 
575     auto callerMission = callerAbility->GetMission();
576     auto callerList = callerAbility->GetOwnedMissionList();
577     if (!callerMission || !callerList) {
578         return nullptr; // invalid status
579     }
580 
581     // target mission should in caller mission list
582     if (callerList != defaultStandardList_ && callerList != defaultSingleList_) {
583         HILOG_DEBUG("GetTargetMissionListByDefault target is caller list.");
584         return callerList;
585     }
586 
587     // caller is default, need to start a new mission list
588     HILOG_DEBUG("GetTargetMissionListByDefault target is default list.");
589     std::shared_ptr<MissionList> targetMissionList = std::make_shared<MissionList>();
590     callerList->RemoveMission(callerMission);
591     targetMissionList->AddMissionToTop(callerMission);
592 
593     return targetMissionList;
594 }
595 
GetReusedMission(const AbilityRequest & abilityRequest)596 std::shared_ptr<Mission> MissionListManager::GetReusedMission(const AbilityRequest &abilityRequest)
597 {
598     if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED) {
599         return GetReusedSpecifiedMission(abilityRequest);
600     }
601 
602     if (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::STANDARD) {
603         return GetReusedStandardMission(abilityRequest);
604     }
605 
606     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SINGLETON) {
607         return nullptr;
608     }
609 
610     std::shared_ptr<Mission> reUsedMission = nullptr;
611     std::string missionName = GetMissionName(abilityRequest);
612 
613     // find launcher first.
614     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
615         if ((reUsedMission = launcherList_->GetSingletonMissionByName(missionName)) != nullptr) {
616             return reUsedMission;
617         }
618     }
619 
620     // current
621     for (auto missionList : currentMissionLists_) {
622         if (missionList && (reUsedMission = missionList->GetSingletonMissionByName(missionName)) != nullptr) {
623             return reUsedMission;
624         }
625     }
626 
627     // default single list
628     if ((reUsedMission = defaultSingleList_->GetSingletonMissionByName(missionName)) != nullptr) {
629         return reUsedMission;
630     }
631 
632     return nullptr;
633 }
634 
GetReusedSpecifiedMission(const AbilityRequest & abilityRequest)635 std::shared_ptr<Mission> MissionListManager::GetReusedSpecifiedMission(const AbilityRequest &abilityRequest)
636 {
637     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::SPECIFIED) {
638         return nullptr;
639     }
640 
641     // specified mission name format is same as singleton.
642     std::shared_ptr<Mission> reUsedMission = nullptr;
643     std::string missionName = GetMissionName(abilityRequest);
644     std::string flag = abilityRequest.specifiedFlag;
645 
646     // find launcher first.
647     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
648         if ((reUsedMission = launcherList_->GetSpecifiedMission(missionName, flag)) != nullptr) {
649             return reUsedMission;
650         }
651     }
652 
653     // current
654     for (auto missionList : currentMissionLists_) {
655         if (missionList && (reUsedMission = missionList->GetSpecifiedMission(missionName, flag)) != nullptr) {
656             return reUsedMission;
657         }
658     }
659 
660     // default standard list
661     if ((reUsedMission = defaultStandardList_->GetSpecifiedMission(missionName, flag)) != nullptr) {
662         return reUsedMission;
663     }
664 
665     return nullptr;
666 }
667 
GetReusedStandardMission(const AbilityRequest & abilityRequest)668 std::shared_ptr<Mission> MissionListManager::GetReusedStandardMission(const AbilityRequest &abilityRequest)
669 {
670     if (abilityRequest.abilityInfo.launchMode != AppExecFwk::LaunchMode::STANDARD) {
671         return nullptr;
672     }
673 
674     if (!abilityRequest.startRecent) {
675         return nullptr;
676     }
677 
678     // all mission name format is same.
679     std::string missionName = GetMissionName(abilityRequest);
680     std::shared_ptr<Mission> reUsedMission = nullptr;
681 
682     // find launcher first, if find it in launcher list, no need to find in other list.
683     if (abilityRequest.abilityInfo.applicationInfo.isLauncherApp) {
684         if ((reUsedMission = launcherList_->GetRecentStandardMission(missionName)) != nullptr) {
685             return reUsedMission;
686         }
687     }
688 
689     // try find it from current and default standard.
690     std::string missionTime = "0";
691     for (const auto &missionList : currentMissionLists_) {
692         if (!missionList) {
693             continue;
694         }
695 
696         auto mission = missionList->GetRecentStandardMission(missionName);
697         if (mission && mission->GetMissionTime() >= missionTime) {
698             missionTime = mission->GetMissionTime();
699             reUsedMission = mission;
700         }
701     }
702 
703     auto mission = defaultStandardList_->GetRecentStandardMission(missionName);
704     if (mission && mission->GetMissionTime() >= missionTime) {
705         reUsedMission = mission;
706     }
707 
708     return reUsedMission;
709 }
710 
MoveMissionToTargetList(bool isCallFromLauncher,const std::shared_ptr<MissionList> & targetMissionList,const std::shared_ptr<Mission> & mission)711 void MissionListManager::MoveMissionToTargetList(bool isCallFromLauncher,
712     const std::shared_ptr<MissionList> &targetMissionList,
713     const std::shared_ptr<Mission> &mission)
714 {
715     auto missionList = mission->GetMissionList();
716     // 1. new mission,move to target list.
717     if (!missionList) {
718         targetMissionList->AddMissionToTop(mission);
719         return;
720     }
721 
722     // 2. launcher call launcher
723     if (isCallFromLauncher && targetMissionList == launcherList_) {
724         targetMissionList->AddMissionToTop(mission);
725         return;
726     }
727 
728     // 3. reused mission is in default, move from default to target list.
729     if (missionList == defaultSingleList_ || missionList == defaultStandardList_) {
730         missionList->RemoveMission(mission);
731         targetMissionList->AddMissionToTop(mission);
732         return;
733     }
734 
735     // 4. reused mission is in a valid list.
736     bool isListChange = !(targetMissionList == missionList);
737     if (isListChange) {
738         // list change, pop above missions to default.
739         MoveNoneTopMissionToDefaultList(mission);
740         missionList->RemoveMission(mission);
741     } else if (isCallFromLauncher) {
742         // list not change, but call from launcher, pop above missions to default.
743         MoveNoneTopMissionToDefaultList(mission);
744     }
745     targetMissionList->AddMissionToTop(mission);
746 
747     if (missionList->IsEmpty()) {
748         currentMissionLists_.remove(missionList);
749     }
750 }
751 
MoveNoneTopMissionToDefaultList(const std::shared_ptr<Mission> & mission)752 void MissionListManager::MoveNoneTopMissionToDefaultList(const std::shared_ptr<Mission> &mission)
753 {
754     auto missionList = mission->GetMissionList();
755     if (!missionList) {
756         return;
757     }
758 
759     while (!missionList->IsEmpty()) {
760         auto item = missionList->GetTopMission();
761         if (item == nullptr || item == mission) {
762             break;
763         }
764 
765         missionList->RemoveMission(item);
766         if (item->IsSingletonAbility()) {
767             defaultSingleList_->AddMissionToTop(item);
768         } else {
769             defaultStandardList_->AddMissionToTop(item);
770         }
771     }
772 }
773 
MoveMissionListToTop(const std::shared_ptr<MissionList> & missionList)774 void MissionListManager::MoveMissionListToTop(const std::shared_ptr<MissionList> &missionList)
775 {
776     if (!missionList) {
777         HILOG_ERROR("mission list is nullptr.");
778         return;
779     }
780     if (!currentMissionLists_.empty() && currentMissionLists_.front() == missionList) {
781         HILOG_DEBUG("mission list is at the top of list");
782         return;
783     }
784 
785     currentMissionLists_.remove(missionList);
786     currentMissionLists_.push_front(missionList);
787 }
788 
MinimizeAbilityLocked(const std::shared_ptr<AbilityRecord> & abilityRecord,bool fromUser)789 int MissionListManager::MinimizeAbilityLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, bool fromUser)
790 {
791     if (abilityRecord == nullptr) {
792         HILOG_ERROR("Minimize ability fail, ability record is null.");
793         return ERR_INVALID_VALUE;
794     }
795     HILOG_INFO("%{public}s called, ability:%{public}s.", __func__, abilityRecord->GetAbilityInfo().name.c_str());
796     abilityRecord->SetPendingState(AbilityState::BACKGROUND);
797 
798     if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) {
799         HILOG_ERROR("Fail to minimize ability, ability state is not foreground.");
800         return ERR_OK;
801     }
802 
803     abilityRecord->SetMinimizeReason(fromUser);
804     MoveToBackgroundTask(abilityRecord);
805 
806     return ERR_OK;
807 }
808 
GetCurrentTopAbilityLocked() const809 std::shared_ptr<AbilityRecord> MissionListManager::GetCurrentTopAbilityLocked() const
810 {
811     if (currentMissionLists_.empty()) {
812         return nullptr;
813     }
814 
815     auto& topMissionList = currentMissionLists_.front();
816     if (topMissionList) {
817         return topMissionList->GetTopAbility();
818     }
819     return nullptr;
820 }
821 
AttachAbilityThread(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)822 int MissionListManager::AttachAbilityThread(const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
823 {
824     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
825     std::lock_guard<std::recursive_mutex> guard(managerLock_);
826     auto abilityRecord = GetAbilityRecordByToken(token);
827     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
828 
829     HILOG_DEBUG("AbilityMS attach abilityThread, name is %{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
830 
831     std::shared_ptr<AbilityEventHandler> handler =
832         DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
833     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
834     handler->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetEventId());
835 
836     abilityRecord->SetScheduler(scheduler);
837 
838     if (abilityRecord->IsStartedByCall()) {
839         if (abilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
840             abilityRecord->SetStartToForeground(true);
841             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
842         } else {
843             abilityRecord->SetStartToBackground(true);
844             MoveToBackgroundTask(abilityRecord);
845         }
846         return ERR_OK;
847     }
848 
849     if (abilityRecord->IsNeedToCallRequest()) {
850         abilityRecord->CallRequest();
851     }
852 
853     auto taskName = std::to_string(abilityRecord->GetMissionId()) + "_cold";
854     handler->RemoveTask(taskName);
855     abilityRecord->PostCancelStartingWindowHotTask();
856     DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
857 
858     return ERR_OK;
859 }
860 
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const int32_t state)861 void MissionListManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
862 {
863     HILOG_DEBUG("Ability request state %{public}d done.", state);
864     std::lock_guard<std::recursive_mutex> guard(managerLock_);
865     AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
866     if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
867         auto abilityRecord = GetAliveAbilityRecordByToken(token);
868         CHECK_POINTER(abilityRecord);
869         std::string element = abilityRecord->GetWant().GetElement().GetURI();
870         HILOG_DEBUG("Ability is %{public}s, start to foreground.", element.c_str());
871         abilityRecord->ForegroundAbility(abilityRecord->lifeCycleStateInfo_.sceneFlagBak);
872     }
873 }
874 
OnAppStateChanged(const AppInfo & info)875 void MissionListManager::OnAppStateChanged(const AppInfo &info)
876 {
877     std::lock_guard<std::recursive_mutex> guard(managerLock_);
878 
879     if (info.state == AppState::TERMINATED || info.state == AppState::END) {
880         for (const auto& abilityRecord : terminateAbilityList_) {
881             if (!abilityRecord) {
882                 HILOG_ERROR("abilityRecord is nullptr.");
883                 continue;
884             }
885             if (info.processName == abilityRecord->GetAbilityInfo().process ||
886                 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
887                 abilityRecord->SetAppState(info.state);
888             }
889         }
890     } else {
891         for (const auto& missionList : currentMissionLists_) {
892             auto missions = missionList->GetAllMissions();
893             for (const auto& missionInfo : missions) {
894                 if (!missionInfo) {
895                     HILOG_ERROR("missionInfo is nullptr.");
896                     continue;
897                 }
898                 auto abilityRecord = missionInfo->GetAbilityRecord();
899                 if (info.processName == abilityRecord->GetAbilityInfo().process ||
900                     info.processName == abilityRecord->GetApplicationInfo().bundleName) {
901                     abilityRecord->SetAppState(info.state);
902                 }
903             }
904         }
905         auto defaultStandardListmissions = defaultStandardList_->GetAllMissions();
906         for (const auto& missionInfo : defaultStandardListmissions) {
907             if (!missionInfo) {
908                 HILOG_ERROR("defaultStandardListmissions is nullptr.");
909                 continue;
910             }
911             auto abilityRecord = missionInfo->GetAbilityRecord();
912             if (info.processName == abilityRecord->GetAbilityInfo().process ||
913                 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
914                 abilityRecord->SetAppState(info.state);
915             }
916         }
917         auto defaultSingleListmissions = defaultSingleList_->GetAllMissions();
918         for (const auto& missionInfo : defaultSingleListmissions) {
919             if (!missionInfo) {
920                 HILOG_ERROR("defaultSingleListmissions is nullptr.");
921                 continue;
922             }
923             auto abilityRecord = missionInfo->GetAbilityRecord();
924             if (info.processName == abilityRecord->GetAbilityInfo().process ||
925                 info.processName == abilityRecord->GetApplicationInfo().bundleName) {
926                 abilityRecord->SetAppState(info.state);
927             }
928         }
929     }
930 }
931 
GetAbilityRecordByToken(const sptr<IRemoteObject> & token) const932 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByToken(
933     const sptr<IRemoteObject> &token) const
934 {
935     if (!token) {
936         return nullptr;
937     }
938 
939     std::lock_guard<std::recursive_mutex> guard(managerLock_);
940     // first find in terminating list
941     for (auto ability : terminateAbilityList_) {
942         if (ability && token == ability->GetToken()->AsObject()) {
943             return ability;
944         }
945     }
946 
947     return GetAliveAbilityRecordByToken(token);
948 }
949 
GetAliveAbilityRecordByToken(const sptr<IRemoteObject> & token) const950 std::shared_ptr<AbilityRecord> MissionListManager::GetAliveAbilityRecordByToken(
951     const sptr<IRemoteObject> &token) const
952 {
953     if (!token) {
954         return nullptr;
955     }
956 
957     std::lock_guard<std::recursive_mutex> guard(managerLock_);
958     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
959     for (auto missionList : currentMissionLists_) {
960         if (missionList && (abilityRecord = missionList->GetAbilityRecordByToken(token)) != nullptr) {
961             return abilityRecord;
962         }
963     }
964 
965     if ((abilityRecord = defaultSingleList_->GetAbilityRecordByToken(token)) != nullptr) {
966         return abilityRecord;
967     }
968 
969     return defaultStandardList_->GetAbilityRecordByToken(token);
970 }
971 
GetMissionById(int missionId) const972 std::shared_ptr<Mission> MissionListManager::GetMissionById(int missionId) const
973 {
974     std::shared_ptr<Mission> mission = nullptr;
975     for (auto missionList : currentMissionLists_) {
976         if (missionList && (mission = missionList->GetMissionById(missionId)) != nullptr) {
977             return mission;
978         }
979     }
980 
981     if ((mission = defaultSingleList_->GetMissionById(missionId)) != nullptr) {
982         return mission;
983     }
984 
985     if ((mission = launcherList_->GetMissionById(missionId)) != nullptr) {
986         return mission;
987     }
988 
989     return defaultStandardList_->GetMissionById(missionId);
990 }
991 
AbilityTransactionDone(const sptr<IRemoteObject> & token,int state,const PacMap & saveData)992 int MissionListManager::AbilityTransactionDone(const sptr<IRemoteObject> &token, int state, const PacMap &saveData)
993 {
994     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
995     int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
996     std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
997     HILOG_INFO("AbilityTransactionDone, state: %{public}s.", abilityState.c_str());
998 
999     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1000     auto abilityRecord = GetAbilityFromTerminateList(token);
1001     if (abilityRecord == nullptr) {
1002         abilityRecord = GetAbilityRecordByToken(token);
1003         CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1004     }
1005 
1006     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1007     HILOG_DEBUG("ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
1008 
1009     if (targetState == AbilityState::BACKGROUND) {
1010         abilityRecord->SaveAbilityState(saveData);
1011     }
1012 
1013     return DispatchState(abilityRecord, targetState);
1014 }
1015 
DispatchState(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)1016 int MissionListManager::DispatchState(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
1017 {
1018     switch (state) {
1019         case AbilityState::INITIAL: {
1020             return DispatchTerminate(abilityRecord);
1021         }
1022         case AbilityState::BACKGROUND: {
1023             return DispatchBackground(abilityRecord);
1024         }
1025         case AbilityState::FOREGROUND: {
1026             return DispatchForeground(abilityRecord, true);
1027         }
1028         case AbilityState::FOREGROUND_FAILED:
1029         case AbilityState::FOREGROUND_INVALID_MODE:
1030         case AbilityState::FOREGROUND_WINDOW_FREEZED: {
1031             return DispatchForeground(abilityRecord, false, static_cast<AbilityState>(state));
1032         }
1033         default: {
1034             HILOG_WARN("Don't support transiting state: %{public}d", state);
1035             return ERR_INVALID_VALUE;
1036         }
1037     }
1038 }
1039 
DispatchForeground(const std::shared_ptr<AbilityRecord> & abilityRecord,bool success,AbilityState state)1040 int MissionListManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord, bool success,
1041     AbilityState state)
1042 {
1043     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1044     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1045     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1046 
1047     if (!abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
1048         PostStartWaitingAbility();
1049         HILOG_ERROR("DispatchForeground Ability transition life state error. expect %{public}d, actual %{public}d",
1050             AbilityState::FOREGROUNDING,
1051             abilityRecord->GetAbilityState());
1052         return ERR_INVALID_VALUE;
1053     }
1054 
1055     handler->RemoveEvent(AbilityManagerService::FOREGROUND_TIMEOUT_MSG, abilityRecord->GetEventId());
1056     auto self(shared_from_this());
1057     if (success) {
1058 #ifdef SUPPORT_GRAPHICS
1059         HILOG_INFO("%{public}s foreground succeeded.", __func__);
1060         abilityRecord->SetStartingWindow(false);
1061         auto taskName = std::to_string(abilityRecord->GetMissionId()) + "_hot";
1062         handler->RemoveTask(taskName);
1063 #endif
1064         auto task = [self, abilityRecord]() { self->CompleteForegroundSuccess(abilityRecord); };
1065         handler->PostTask(task);
1066     } else {
1067         auto task = [self, abilityRecord, state]() {
1068             if (state == AbilityState::FOREGROUND_WINDOW_FREEZED) {
1069                 HILOG_INFO("Window was freezed.");
1070                 if (abilityRecord != nullptr) {
1071                     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1072                 }
1073                 return;
1074             }
1075             self->CompleteForegroundFailed(abilityRecord, state);
1076         };
1077         handler->PostTask(task);
1078     }
1079     return ERR_OK;
1080 }
1081 
CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> & abilityRecord)1082 void MissionListManager::CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord)
1083 {
1084     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1085     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1086 
1087     CHECK_POINTER(abilityRecord);
1088     // ability do not save window mode
1089     abilityRecord->RemoveWindowMode();
1090     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1091     HILOG_DEBUG("ability: %{public}s", element.c_str());
1092 
1093     abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
1094 
1095 #if BINDER_IPC_32BIT
1096     HILOG_INFO("notify bms ability life status, bundle name:%{public}s, ability name:%{public}s, time:%{public}lld",
1097         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1098         abilityRecord->GetAbilityInfo().name.c_str(),
1099         AbilityUtil::UTCTimeSeconds());
1100 #else
1101     HILOG_INFO("notify bms ability life status, bundle name:%{public}s, ability name:%{public}s, time:%{public}ld",
1102         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1103         abilityRecord->GetAbilityInfo().name.c_str(),
1104         AbilityUtil::UTCTimeSeconds());
1105 #endif
1106 
1107     auto mission = abilityRecord->GetMission();
1108     if (mission) {
1109         auto currentTime = GetCurrentTime();
1110         mission->UpdateMissionTime(currentTime);
1111         InnerMissionInfo info;
1112         if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1113             mission->GetMissionId(), info) == 0) {
1114             info.missionInfo.time = currentTime;
1115             info.missionInfo.runningState = 0;
1116             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
1117         }
1118     }
1119 
1120     if (mission && mission->IsMovingState()) {
1121         mission->SetMovingState(false);
1122         if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
1123             listenerController_->NotifyMissionMovedToFront(mission->GetMissionId());
1124         }
1125     }
1126     PostStartWaitingAbility();
1127     TerminatePreviousAbility(abilityRecord);
1128 
1129     // new version. started by caller, scheduler call request
1130     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToForeground() && abilityRecord->IsReady()) {
1131         HILOG_DEBUG("call request after completing foreground state");
1132         abilityRecord->CallRequest();
1133         abilityRecord->SetStartToForeground(false);
1134     }
1135 
1136     if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1137         abilityRecord->SetMinimizeReason(true);
1138         MoveToBackgroundTask(abilityRecord);
1139     } else if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1140         HILOG_DEBUG("not continuous startup.");
1141         abilityRecord->SetPendingState(AbilityState::INITIAL);
1142     }
1143 }
1144 
TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1145 void MissionListManager::TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1146 {
1147     auto terminatingAbilityRecord = abilityRecord->GetPreAbilityRecord();
1148     if (!terminatingAbilityRecord) {
1149         HILOG_INFO("%{public}s, terminatingAbilityRecord is nullptr.", __func__);
1150         return;
1151     }
1152     abilityRecord->SetPreAbilityRecord(nullptr);
1153     auto self(shared_from_this());
1154     if (terminatingAbilityRecord->GetAbilityState() == AbilityState::FOREGROUND) {
1155         MoveToBackgroundTask(terminatingAbilityRecord);
1156     }
1157     if (terminatingAbilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1158         auto task = [terminatingAbilityRecord, self]() {
1159             HILOG_INFO("%{public}s, To terminate terminatingAbilityRecord.", __func__);
1160             self->DelayCompleteTerminate(terminatingAbilityRecord);
1161         };
1162         terminatingAbilityRecord->Terminate(task);
1163     }
1164 }
1165 
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1166 int MissionListManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1167 {
1168     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1169     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1170     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1171 
1172     if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
1173         HILOG_ERROR("Ability transition life state error. actual %{public}d", abilityRecord->GetAbilityState());
1174         return ERR_INVALID_VALUE;
1175     }
1176 
1177     // remove background timeout task.
1178     handler->RemoveTask(std::to_string(abilityRecord->GetEventId()));
1179     auto self(shared_from_this());
1180     auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1181     handler->PostTask(task);
1182 
1183     return ERR_OK;
1184 }
1185 
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1186 void MissionListManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1187 {
1188     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1189     if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1190         HILOG_ERROR("Ability state is %{public}d, it can't complete background.", abilityRecord->GetAbilityState());
1191         return;
1192     }
1193 
1194     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1195     // send application state to AppMS.
1196     // notify AppMS to update application state.
1197     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1198     if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1199         DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
1200     } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1201         HILOG_DEBUG("not continuous startup.");
1202         abilityRecord->SetPendingState(AbilityState::INITIAL);
1203     }
1204 
1205     if (abilityRecord->IsSwitchingPause()) {
1206         abilityRecord->SetSwitchingPause(false);
1207         return;
1208     }
1209 
1210     // Abilities ahead of the one started with SingleTask mode were put in terminate list, we need to terminate
1211     // them.
1212     auto self(shared_from_this());
1213     for (auto terminateAbility : terminateAbilityList_) {
1214         if (terminateAbility->GetAbilityState() == AbilityState::BACKGROUND) {
1215             auto timeoutTask = [terminateAbility, self]() {
1216                 HILOG_WARN("Terminate ability timeout after background.");
1217                 self->DelayCompleteTerminate(terminateAbility);
1218             };
1219             terminateAbility->Terminate(timeoutTask);
1220         }
1221     }
1222 
1223     // new version. started by caller, scheduler call request
1224     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToBackground() && abilityRecord->IsReady()) {
1225         HILOG_DEBUG("call request after completing background state");
1226         abilityRecord->CallRequest();
1227         abilityRecord->SetStartToBackground(false);
1228     }
1229 }
1230 
TerminateAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool flag)1231 int MissionListManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1232     int resultCode, const Want *resultWant, bool flag)
1233 {
1234     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1235     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1236     HILOG_DEBUG("Terminate ability, ability is %{public}s.", element.c_str());
1237     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1238     if (abilityRecord->IsTerminating() && !abilityRecord->IsForeground()) {
1239         HILOG_ERROR("Ability is on terminating.");
1240         return ERR_OK;
1241     }
1242 
1243     if (abilityRecord->IsTerminating() && abilityRecord->IsForeground()) {
1244         HILOG_WARN("Ability is on terminating and ability state is foreground, force close");
1245         flag = false;
1246     }
1247 
1248     // double check to avoid the ability has been removed
1249     if (!GetAbilityRecordByToken(abilityRecord->GetToken())) {
1250         HILOG_ERROR("Ability has already been removed");
1251         return ERR_OK;
1252     }
1253 
1254     abilityRecord->SetTerminatingState();
1255     // save result to caller AbilityRecord
1256     if (resultWant != nullptr) {
1257         abilityRecord->SaveResultToCallers(resultCode, resultWant);
1258     } else {
1259         Want want;
1260         abilityRecord->SaveResultToCallers(resultCode, &want);
1261     }
1262 
1263     return TerminateAbilityLocked(abilityRecord, flag);
1264 }
1265 
TerminateAbility(const std::shared_ptr<AbilityRecord> & caller,int requestCode)1266 int MissionListManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &caller, int requestCode)
1267 {
1268     HILOG_DEBUG("Terminate ability with result called.");
1269     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1270 
1271     std::shared_ptr<AbilityRecord> targetAbility = GetAbilityRecordByCaller(caller, requestCode);
1272     if (!targetAbility) {
1273         HILOG_ERROR("%{public}s, Can't find target ability", __func__);
1274         return NO_FOUND_ABILITY_BY_CALLER;
1275     }
1276 
1277     auto abilityMs = DelayedSingleton<AbilityManagerService>::GetInstance();
1278     CHECK_POINTER_AND_RETURN(abilityMs, GET_ABILITY_SERVICE_FAILED)
1279     int result = abilityMs->JudgeAbilityVisibleControl(targetAbility->GetAbilityInfo());
1280     if (result != ERR_OK) {
1281         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
1282         return result;
1283     }
1284 
1285     return TerminateAbility(targetAbility, DEFAULT_INVAL_VALUE, nullptr, true);
1286 }
1287 
TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1288 int MissionListManager::TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1289 {
1290     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1291     HILOG_DEBUG("Terminate ability locked, ability is %{public}s.", element.c_str());
1292     // remove AbilityRecord out of stack
1293     RemoveTerminatingAbility(abilityRecord, flag);
1294     abilityRecord->SendResultToCallers();
1295 
1296     // 1. if the ability was foreground, first should find wether there is other ability foreground
1297     if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) {
1298         HILOG_DEBUG("current ability is active");
1299         abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1300         auto nextAbilityRecord = abilityRecord->GetNextAbilityRecord();
1301         if (nextAbilityRecord) {
1302             nextAbilityRecord->SetPreAbilityRecord(abilityRecord);
1303 #ifdef SUPPORT_GRAPHICS
1304             nextAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1305             nextAbilityRecord->ProcessForegroundAbility(abilityRecord);
1306         } else {
1307             if (!abilityRecord->IsClearMissionFlag()) {
1308                 abilityRecord->NotifyAnimationFromTerminatingAbility();
1309             }
1310 #else
1311             nextAbilityRecord->ProcessForegroundAbility();
1312         } else {
1313 #endif
1314             MoveToBackgroundTask(abilityRecord);
1315         }
1316         return ERR_OK;
1317     }
1318 
1319     // 2. if the ability was BACKGROUNDING, waiting for completeBackgroundNew
1320 
1321     // 3. ability on background, schedule to terminate.
1322     if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1323         auto self(shared_from_this());
1324         auto task = [abilityRecord, self]() {
1325             HILOG_WARN("Terminate ability timeout.");
1326             self->DelayCompleteTerminate(abilityRecord);
1327         };
1328         abilityRecord->Terminate(task);
1329     }
1330     return ERR_OK;
1331 }
1332 
1333 /**
1334  * @brief This method aims to do things as below
1335  * 1. remove the mission from the current missionList
1336  * 2. if the current missionList is empty after, then remove from the manager
1337  * 3. if the current ability is foreground, then should schedule the next ability to foreground before terminate
1338  *
1339  * @param abilityRecord the ability that was terminating
1340  */
RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1341 void MissionListManager::RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1342 {
1343     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1344     HILOG_DEBUG("Remove terminating ability, ability is %{public}s.", element.c_str());
1345     if (GetAbilityFromTerminateList(abilityRecord->GetToken())) {
1346         abilityRecord->SetNextAbilityRecord(nullptr);
1347         HILOG_DEBUG("Find ability in terminating list, return.");
1348         return;
1349     }
1350 
1351     auto missionList = abilityRecord->GetOwnedMissionList();
1352     CHECK_POINTER(missionList);
1353 
1354     missionList->RemoveMissionByAbilityRecord(abilityRecord);
1355     DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminate(abilityRecord->GetToken());
1356     terminateAbilityList_.push_back(abilityRecord);
1357 
1358     if (missionList->IsEmpty()) {
1359         HILOG_DEBUG("Remove terminating ability, missionList is empty, remove.");
1360         RemoveMissionList(missionList);
1361     }
1362 
1363     // 1. clear old
1364     abilityRecord->SetNextAbilityRecord(nullptr);
1365     // 2. if the ability to terminate is background, just background
1366     if (!(abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING))) {
1367         HILOG_DEBUG("Ability state is %{public}d, just return.", abilityRecord->GetAbilityState());
1368         return;
1369     }
1370     // 3. if close ability, noting to do
1371     if (!flag) {
1372         HILOG_DEBUG("Close ability schedule.");
1373         return;
1374     }
1375 
1376     // 4. the ability should find the next ability to foreground
1377     std::shared_ptr<AbilityRecord> needTopAbility;
1378     if (!missionList->IsEmpty()) {
1379         needTopAbility = missionList->GetTopAbility();
1380     } else {
1381         HILOG_DEBUG("mission list is empty, no next ability.");
1382     }
1383 
1384     if (!needTopAbility) {
1385         HILOG_DEBUG("The ability need to top is null.");
1386         if (!abilityRecord->IsNeedBackToOtherMissionStack()) {
1387             HILOG_INFO("This ability doesn't need back to other mission stack.");
1388             return;
1389         }
1390         needTopAbility = abilityRecord->GetOtherMissionStackAbilityRecord();
1391         if (!needTopAbility) {
1392             HILOG_ERROR("This ability needs back to other mission stack, but needTopAbility is null.");
1393             return;
1394         }
1395         abilityRecord->SetNeedBackToOtherMissionStack(false);
1396     }
1397     AppExecFwk::ElementName elementName = needTopAbility->GetWant().GetElement();
1398     HILOG_DEBUG("Next top ability is %{public}s, state is %{public}d, minimizeReason is %{public}d.",
1399         elementName.GetURI().c_str(), needTopAbility->GetAbilityState(), needTopAbility->IsMinimizeFromUser());
1400 
1401     // 5. if caller is recent, close
1402     if (elementName.GetBundleName() == AbilityConfig::LAUNCHER_BUNDLE_NAME
1403         && elementName.GetAbilityName() == AbilityConfig::LAUNCHER_RECENT_ABILITY_NAME) {
1404         HILOG_DEBUG("Next to need is recent, just to launcher.");
1405         needTopAbility = launcherList_->GetLauncherRoot();
1406     }
1407 
1408     if (!needTopAbility) {
1409         HILOG_DEBUG("NeedTopAbility of launcherRoot is null.");
1410         return;
1411     }
1412 
1413     if (!needTopAbility->IsForeground() && !needTopAbility->IsMinimizeFromUser() && needTopAbility->IsReady()) {
1414         HILOG_DEBUG("%{public}s is need to foreground.", elementName.GetURI().c_str());
1415         abilityRecord->SetNextAbilityRecord(needTopAbility);
1416     }
1417 }
1418 
RemoveMissionList(const std::shared_ptr<MissionList> & missionList)1419 void MissionListManager::RemoveMissionList(const std::shared_ptr<MissionList> &missionList)
1420 {
1421     if (missionList == nullptr) {
1422         return;
1423     }
1424 
1425     for (auto iter = currentMissionLists_.begin(); iter != currentMissionLists_.end(); iter++) {
1426         if ((*iter) == missionList) {
1427             currentMissionLists_.erase(iter);
1428             return;
1429         }
1430     }
1431 }
1432 
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1433 int MissionListManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1434 {
1435     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1436     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1437         HILOG_ERROR("DispatchTerminate error, ability state is %{public}d", abilityRecord->GetAbilityState());
1438         return INNER_ERR;
1439     }
1440 
1441     // remove terminate timeout task.
1442     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1443     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1444     handler->RemoveTask(std::to_string(abilityRecord->GetEventId()));
1445     auto self(shared_from_this());
1446     auto task = [self, abilityRecord]() { self->CompleteTerminate(abilityRecord); };
1447     handler->PostTask(task);
1448 
1449     return ERR_OK;
1450 }
1451 
DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1452 void MissionListManager::DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1453 {
1454     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1455     CHECK_POINTER(handler);
1456 
1457     PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1458 
1459     auto timeoutTask = [self = shared_from_this(), abilityRecord]() {
1460         HILOG_INFO("emit delay complete terminate task.");
1461         self->CompleteTerminate(abilityRecord);
1462     };
1463     handler->PostTask(timeoutTask, "DELAY_KILL_PROCESS", AbilityManagerService::KILL_TIMEOUT);
1464 }
1465 
CompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1466 void MissionListManager::CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1467 {
1468     CHECK_POINTER(abilityRecord);
1469     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1470     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1471         HILOG_ERROR("%{public}s, ability is not terminating.", __func__);
1472         return;
1473     }
1474 
1475     // notify AppMS terminate
1476     if (abilityRecord->TerminateAbility() != ERR_OK) {
1477         // Don't return here
1478         HILOG_ERROR("AppMS fail to terminate ability.");
1479     }
1480 
1481     auto&& preAbilityRecord = abilityRecord->GetPreAbilityRecord();
1482     if (preAbilityRecord != nullptr) {
1483         TerminateAbilityLocked(preAbilityRecord, false);
1484     }
1485 
1486     CompleteTerminateAndUpdateMission(abilityRecord);
1487 }
1488 
CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> & abilityRecord)1489 void MissionListManager::CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> &abilityRecord)
1490 {
1491     CHECK_POINTER(abilityRecord);
1492     for (auto it : terminateAbilityList_) {
1493         if (it == abilityRecord) {
1494             abilityRecord->RemoveUriPermission();
1495             terminateAbilityList_.remove(it);
1496             // update inner mission info time
1497             bool excludeFromMissions = abilityRecord->GetAbilityInfo().excludeFromMissions;
1498             if ((abilityRecord->GetAppIndex() != 0) || abilityRecord->GetAbilityInfo().removeMissionAfterTerminate ||
1499                 excludeFromMissions) {
1500                 RemoveMissionLocked(abilityRecord->GetMissionId(), excludeFromMissions);
1501                 return;
1502             }
1503             InnerMissionInfo innerMissionInfo;
1504             auto missionId = abilityRecord->GetMissionId();
1505             int result = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1506                 missionId, innerMissionInfo);
1507             if (result != 0) {
1508                 HILOG_ERROR("Get missionInfo error, result is %{public}d, missionId is %{public}d", result, missionId);
1509                 break;
1510             }
1511             innerMissionInfo.missionInfo.time = GetCurrentTime();
1512             innerMissionInfo.missionInfo.runningState = -1;
1513             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
1514             if (listenerController_) {
1515                 listenerController_->NotifyMissionClosed(missionId);
1516             }
1517             HILOG_DEBUG("Destroy ability record count %{public}ld", abilityRecord.use_count());
1518             break;
1519         }
1520         HILOG_WARN("Can't find ability in terminate list.");
1521     }
1522 }
1523 
GetAbilityFromTerminateList(const sptr<IRemoteObject> & token)1524 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityFromTerminateList(const sptr<IRemoteObject> &token)
1525 {
1526     if (!token) {
1527         return nullptr;
1528     }
1529 
1530     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1531     for (auto abilityRecord : terminateAbilityList_) {
1532         // token is type of IRemoteObject, abilityRecord->GetToken() is type of Token extending from IRemoteObject.
1533         if (abilityRecord && abilityRecord->GetToken() && token == abilityRecord->GetToken()->AsObject()) {
1534             return abilityRecord;
1535         }
1536     }
1537     return nullptr;
1538 }
1539 
ClearMission(int missionId)1540 int MissionListManager::ClearMission(int missionId)
1541 {
1542     if (missionId < 0) {
1543         HILOG_ERROR("Mission id is invalid.");
1544         return ERR_INVALID_VALUE;
1545     }
1546     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1547     auto mission = GetMissionById(missionId);
1548     if (mission && mission->GetMissionList() && mission->GetMissionList()->GetType() == MissionListType::LAUNCHER) {
1549         HILOG_ERROR("Mission id is launcher, can not clear.");
1550         return ERR_INVALID_VALUE;
1551     }
1552 
1553     if (IsExcludeFromMissions(mission)) {
1554         HILOG_WARN("excludeFromMissions is true, not clear by id.");
1555         return ERR_INVALID_VALUE;
1556     }
1557 
1558     return ClearMissionLocked(missionId, mission);
1559 }
1560 
ClearMissionLocked(int missionId,const std::shared_ptr<Mission> & mission)1561 int MissionListManager::ClearMissionLocked(int missionId, const std::shared_ptr<Mission> &mission)
1562 {
1563     if (missionId != -1) {
1564         DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
1565         if (listenerController_) {
1566             listenerController_->NotifyMissionDestroyed(missionId);
1567         }
1568     }
1569     if (mission == nullptr) {
1570         HILOG_DEBUG("ability has already terminate, just remove mission.");
1571         return ERR_OK;
1572     }
1573 
1574     auto abilityRecord = mission->GetAbilityRecord();
1575     if (abilityRecord == nullptr || abilityRecord->IsTerminating()) {
1576         HILOG_WARN("Ability record is not exist or is on terminating.");
1577         return ERR_OK;
1578     }
1579 
1580     abilityRecord->SetTerminatingState();
1581     abilityRecord->SetClearMissionFlag(true);
1582     auto ret = TerminateAbilityLocked(abilityRecord, false);
1583     if (ret != ERR_OK) {
1584         HILOG_ERROR("clear mission error: %{public}d.", ret);
1585         return REMOVE_MISSION_FAILED;
1586     }
1587 
1588     return ERR_OK;
1589 }
1590 
ClearAllMissions()1591 int MissionListManager::ClearAllMissions()
1592 {
1593     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1594     DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteAllMissionInfos(listenerController_);
1595     std::list<std::shared_ptr<Mission>> foregroundAbilities;
1596     ClearAllMissionsLocked(defaultStandardList_->GetAllMissions(), foregroundAbilities, false);
1597     ClearAllMissionsLocked(defaultSingleList_->GetAllMissions(), foregroundAbilities, false);
1598 
1599     for (auto listIter = currentMissionLists_.begin(); listIter != currentMissionLists_.end();) {
1600         auto missionList = (*listIter);
1601         listIter++;
1602         if (!missionList || missionList->GetType() == MissionListType::LAUNCHER) {
1603             continue;
1604         }
1605         ClearAllMissionsLocked(missionList->GetAllMissions(), foregroundAbilities, true);
1606     }
1607 
1608     ClearAllMissionsLocked(foregroundAbilities, foregroundAbilities, false);
1609     return ERR_OK;
1610 }
1611 
ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> & missionList,std::list<std::shared_ptr<Mission>> & foregroundAbilities,bool searchActive)1612 void MissionListManager::ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> &missionList,
1613     std::list<std::shared_ptr<Mission>> &foregroundAbilities, bool searchActive)
1614 {
1615     for (auto listIter = missionList.begin(); listIter != missionList.end();) {
1616         auto mission = (*listIter);
1617         listIter++;
1618         if (!mission || mission->IsLockedState()) {
1619             continue;
1620         }
1621 
1622         auto abilityMs_ = OHOS::DelayedSingleton<AbilityManagerService>::GetInstance();
1623         if (abilityMs_->IsBackgroundTaskUid(mission->GetAbilityRecord()->GetUid())) {
1624             HILOG_INFO("the mission is background task, do not need clear");
1625             continue;
1626         }
1627 
1628         if (searchActive && mission->GetAbilityRecord() && mission->GetAbilityRecord()->IsActiveState()) {
1629             foregroundAbilities.push_front(mission);
1630             continue;
1631         }
1632         ClearMissionLocked(-1, mission);
1633     }
1634 }
1635 
SetMissionLockedState(int missionId,bool lockedState)1636 int MissionListManager::SetMissionLockedState(int missionId, bool lockedState)
1637 {
1638     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1639     if (missionId < 0) {
1640         HILOG_ERROR("param is invalid");
1641         return MISSION_NOT_FOUND;
1642     }
1643 
1644     std::shared_ptr<Mission> mission = GetMissionById(missionId);
1645     if (mission) {
1646         auto abilityRecord = mission->GetAbilityRecord();
1647         if (abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions) {
1648             HILOG_ERROR("excludeFromMissions is true, missionId:%{public}d", missionId);
1649             return MISSION_NOT_FOUND;
1650         }
1651         mission->SetLockedState(lockedState);
1652     }
1653 
1654     // update inner mission info time
1655     InnerMissionInfo innerMissionInfo;
1656     auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo);
1657     if (ret != 0) {
1658         HILOG_ERROR("mission is not exist, missionId %{public}d", missionId);
1659         return MISSION_NOT_FOUND;
1660     }
1661     innerMissionInfo.missionInfo.lockedState = lockedState;
1662     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
1663     return ERR_OK;
1664 }
1665 
UpdateSnapShot(const sptr<IRemoteObject> & token)1666 void MissionListManager::UpdateSnapShot(const sptr<IRemoteObject>& token)
1667 {
1668     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1669     auto abilityRecord = GetAbilityRecordByToken(token);
1670     if (!abilityRecord) {
1671         HILOG_ERROR("Cannot find AbilityRecord by Token.");
1672         return;
1673     }
1674     HILOG_INFO("UpdateSnapShot, ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
1675     UpdateMissionSnapshot(abilityRecord);
1676 }
1677 
MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> & abilityRecord)1678 void MissionListManager::MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1679 {
1680     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1681     if (abilityRecord == nullptr) {
1682         HILOG_ERROR("Move the ability to background fail, ability record is null.");
1683         return;
1684     }
1685     HILOG_INFO("Move the ability to background, ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
1686     abilityRecord->SetIsNewWant(false);
1687     if (abilityRecord->lifeCycleStateInfo_.sceneFlag != SCENE_FLAG_KEYGUARD && !abilityRecord->IsClearMissionFlag()) {
1688         UpdateMissionSnapshot(abilityRecord);
1689     }
1690 
1691     auto self(shared_from_this());
1692     auto task = [abilityRecord, self]() {
1693         HILOG_ERROR("Mission list manager move to background timeout.");
1694         self->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
1695         self->CompleteBackground(abilityRecord);
1696     };
1697     abilityRecord->BackgroundAbility(task);
1698 }
1699 
NotifyMissionCreated(const std::shared_ptr<AbilityRecord> & abilityRecord) const1700 void  MissionListManager::NotifyMissionCreated(const std::shared_ptr<AbilityRecord> &abilityRecord) const
1701 {
1702     CHECK_POINTER(abilityRecord);
1703     auto mission = abilityRecord->GetMission();
1704     if (mission && mission->NeedNotify() && listenerController_ &&
1705         !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
1706         auto missionId = abilityRecord->GetMissionId();
1707         listenerController_->NotifyMissionCreated(missionId);
1708         mission->SetNotifyLabel(false);
1709 
1710         if (mission->NeedNotifyUpdateLabel()) {
1711             PostMissionLabelUpdateTask(missionId);
1712             mission->SetNeedNotifyUpdateLabel(false);
1713         }
1714     }
1715 }
1716 
PostMissionLabelUpdateTask(int missionId) const1717 void MissionListManager::PostMissionLabelUpdateTask(int missionId) const
1718 {
1719     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1720     if (handler == nullptr) {
1721         HILOG_ERROR("Fail to get EventHandler, do not post mission label update message.");
1722         return;
1723     }
1724 
1725     std::weak_ptr<MissionListenerController> wpController = listenerController_;
1726     auto task = [wpController, missionId] {
1727         auto controller = wpController.lock();
1728         if (controller == nullptr) {
1729             HILOG_ERROR("controller is nullptr.");
1730             return;
1731         }
1732         controller->NotifyMissionLabelUpdated(missionId);
1733     };
1734     handler->PostTask(task, "NotifyMissionLabelUpdated.", DELAY_NOTIFY_LABEL_TIME);
1735 }
1736 
PrintTimeOutLog(const std::shared_ptr<AbilityRecord> & ability,uint32_t msgId)1737 void MissionListManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId)
1738 {
1739     if (ability == nullptr) {
1740         HILOG_ERROR("ability is nullptr");
1741         return;
1742     }
1743 
1744     AppExecFwk::RunningProcessInfo processInfo = {};
1745     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
1746     if (processInfo.pid_ == 0) {
1747         HILOG_ERROR("error: the ability[%{public}s], app may fork fail or not running.",
1748             ability->GetAbilityInfo().name.data());
1749         return;
1750     }
1751     std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
1752     switch (msgId) {
1753         case AbilityManagerService::LOAD_TIMEOUT_MSG:
1754             msgContent += "load timeout";
1755             break;
1756         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1757             msgContent += "active timeout";
1758             break;
1759         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1760             msgContent += "inactive timeout";
1761             break;
1762         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1763             msgContent += "foreground timeout";
1764             break;
1765         case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
1766             msgContent += "background timeout";
1767             break;
1768         case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
1769             msgContent += "terminate timeout";
1770             break;
1771         default:
1772             return;
1773     }
1774     std::string eventType = "LIFECYCLE_TIMEOUT";
1775     OHOS::HiviewDFX::HiSysEvent::Write(OHOS::HiviewDFX::HiSysEvent::Domain::AAFWK, eventType,
1776         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
1777         EVENT_KEY_UID, processInfo.uid_,
1778         EVENT_KEY_PID, processInfo.pid_,
1779         EVENT_KEY_PACKAGE_NAME, ability->GetAbilityInfo().bundleName,
1780         EVENT_KEY_PROCESS_NAME, processInfo.processName_,
1781         EVENT_KEY_MESSAGE, msgContent);
1782 
1783     HILOG_WARN("LIFECYCLE_TIMEOUT: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
1784         "msg: %{public}s", processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
1785         ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
1786 }
1787 
UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord> & abilityRecord) const1788 void MissionListManager::UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord>& abilityRecord) const
1789 {
1790     CHECK_POINTER(abilityRecord);
1791     if (abilityRecord->GetAbilityInfo().excludeFromMissions) {
1792         HILOG_DEBUG("excludeFromMissions is true, no need to update mission snapshot.");
1793         return;
1794     }
1795     int32_t missionId = abilityRecord->GetMissionId();
1796     MissionSnapshot snapshot;
1797     snapshot.isPrivate = (abilityRecord->GetAppIndex() != 0);
1798     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionSnapshot(missionId, abilityRecord->GetToken(),
1799         snapshot);
1800     if (listenerController_) {
1801         listenerController_->NotifyMissionSnapshotChanged(missionId);
1802     }
1803 }
1804 
OnTimeOut(uint32_t msgId,int64_t eventId)1805 void MissionListManager::OnTimeOut(uint32_t msgId, int64_t eventId)
1806 {
1807     HILOG_DEBUG("On timeout, msgId is %{public}d", msgId);
1808     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1809     auto abilityRecord = GetAbilityRecordByEventId(eventId);
1810     if (abilityRecord == nullptr) {
1811         HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1812         return;
1813     }
1814     HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId,
1815         abilityRecord->GetAbilityInfo().name.c_str());
1816     abilityRecord->RemoveUriPermission();
1817 
1818 #ifdef SUPPORT_GRAPHICS
1819     if (abilityRecord->IsStartingWindow()) {
1820         PostCancelStartingWindowTask(abilityRecord);
1821     }
1822 #endif
1823 
1824     PrintTimeOutLog(abilityRecord, msgId);
1825     switch (msgId) {
1826         case AbilityManagerService::LOAD_TIMEOUT_MSG:
1827             HandleLoadTimeout(abilityRecord);
1828             break;
1829         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1830             break;
1831         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1832         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1833             HandleForegroundTimeout(abilityRecord);
1834             break;
1835         default:
1836             break;
1837     }
1838 }
1839 
HandleLoadTimeout(const std::shared_ptr<AbilityRecord> & ability)1840 void MissionListManager::HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &ability)
1841 {
1842     if (ability == nullptr) {
1843         HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1844         return;
1845     }
1846     // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
1847     if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
1848         ability->SetRestarting(true);
1849         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1850         HILOG_INFO("Launcher root load timeout, restart.");
1851         DelayedStartLauncher();
1852         return;
1853     }
1854 
1855     // other
1856     HandleTimeoutAndResumeAbility(ability);
1857 }
1858 
HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> & ability,AbilityState state)1859 void MissionListManager::HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &ability, AbilityState state)
1860 {
1861     if (ability == nullptr) {
1862         HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1863         return;
1864     }
1865 
1866     if (ability->GetMission()) {
1867         ability->GetMission()->SetMovingState(false);
1868     }
1869 
1870     if (!ability->IsAbilityState(AbilityState::FOREGROUNDING)) {
1871         HILOG_ERROR("this ability is not foregrounding state.");
1872         return;
1873     }
1874 
1875     // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
1876     if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
1877         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1878         HILOG_INFO("Launcher root load timeout, restart.");
1879         DelayedStartLauncher();
1880         return;
1881     }
1882 
1883     // other
1884     HandleTimeoutAndResumeAbility(ability, state);
1885 }
1886 
CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> & abilityRecord,AbilityState state)1887 void MissionListManager::CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> &abilityRecord,
1888     AbilityState state)
1889 {
1890     HILOG_DEBUG("CompleteForegroundFailed come, state: %{public}d.", static_cast<int32_t>(state));
1891     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1892     if (abilityRecord == nullptr) {
1893         HILOG_ERROR("CompleteForegroundFailed, ability is nullptr.");
1894         return;
1895     }
1896 
1897 #ifdef SUPPORT_GRAPHICS
1898     if (state == AbilityState::FOREGROUND_INVALID_MODE) {
1899         abilityRecord->SetStartingWindow(false);
1900     }
1901     if (abilityRecord->IsStartingWindow()) {
1902         PostCancelStartingWindowTask(abilityRecord);
1903     }
1904 #endif
1905 
1906     HandleForegroundTimeout(abilityRecord, state);
1907     TerminatePreviousAbility(abilityRecord);
1908     PostStartWaitingAbility();
1909 }
1910 
HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> & timeOutAbilityRecord,AbilityState state)1911 void MissionListManager::HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> &timeOutAbilityRecord,
1912     AbilityState state)
1913 {
1914     HILOG_DEBUG("HandleTimeoutAndResumeTopAbility start");
1915     if (timeOutAbilityRecord == nullptr) {
1916         HILOG_ERROR("LoadAndForeGroundCommon: timeOutAbilityRecord is nullptr.");
1917         return;
1918     }
1919 
1920     // complete mission list moving
1921     MoveToTerminateList(timeOutAbilityRecord);
1922 
1923     // load and foreground timeout, notify appMs force terminate the ability.
1924     DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(timeOutAbilityRecord->GetToken());
1925 
1926     // caller not exist or caller is service or timeout ability is launcher, back to launcher
1927     auto callerAbility = timeOutAbilityRecord->GetCallerRecord();
1928     if ((callerAbility == nullptr) ||
1929         (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::SERVICE) ||
1930         (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::EXTENSION) ||
1931         timeOutAbilityRecord->IsLauncherAbility() ||
1932         callerAbility->IsLauncherAbility()) {
1933         HILOG_DEBUG("ability timeout, back to launcher.");
1934         DelayedStartLauncher();
1935         return;
1936     }
1937 
1938     if (state != AbilityState::FOREGROUND_INVALID_MODE) {
1939         DelayedResumeTimeout(callerAbility);
1940     }
1941 
1942     HILOG_INFO("HandleTimeoutAndResumeTopAbility end");
1943 }
1944 
DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> & callerAbility)1945 void MissionListManager::DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> &callerAbility)
1946 {
1947     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1948     CHECK_POINTER(abilityManagerService);
1949     auto handler = abilityManagerService->GetEventHandler();
1950     CHECK_POINTER(handler);
1951     std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
1952     auto timeoutTask = [wpListMgr, callerAbility]() {
1953         HILOG_DEBUG("The caller ability need to resume.");
1954         auto listMgr = wpListMgr.lock();
1955         if (listMgr) {
1956             listMgr->BackToCaller(callerAbility);
1957         }
1958     };
1959     handler->PostTask(timeoutTask, "Caller_Restart");
1960 }
1961 
BackToCaller(const std::shared_ptr<AbilityRecord> & callerAbility)1962 void MissionListManager::BackToCaller(const std::shared_ptr<AbilityRecord> &callerAbility)
1963 {
1964     HILOG_INFO("Back to Caller.");
1965     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1966 
1967     // caller is already the top ability and foregroundnew.
1968     auto topAbility = GetCurrentTopAbilityLocked();
1969     if (callerAbility == topAbility && topAbility->IsAbilityState(AbilityState::FOREGROUND)) {
1970         HILOG_DEBUG("caller is already the top ability and foregroundnew.");
1971         return;
1972     }
1973 
1974     // other , resume caller ability to top and foreground.
1975     MoveMissionToFront(callerAbility->GetMissionId(), false);
1976 }
1977 
MoveToTerminateList(const std::shared_ptr<AbilityRecord> & abilityRecord)1978 void MissionListManager::MoveToTerminateList(const std::shared_ptr<AbilityRecord>& abilityRecord)
1979 {
1980     HILOG_INFO("MoveToDefaultList start.");
1981     if (abilityRecord == nullptr) {
1982         HILOG_ERROR("timeout ability record is nullptr.");
1983         return;
1984     }
1985     auto missionList = abilityRecord->GetOwnedMissionList();
1986     if (missionList == nullptr) {
1987         HILOG_ERROR("timeout missionList is nullptr.");
1988         return;
1989     }
1990     auto selMission = abilityRecord->GetMission();
1991     if (selMission == nullptr) {
1992         HILOG_ERROR("timeout mission is nullptr.");
1993         return;
1994     }
1995 
1996     missionList->RemoveMission(selMission);
1997     if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
1998         RemoveMissionList(missionList);
1999     }
2000 
2001     // load timeout will not wait for died event, directly remove.
2002     if (abilityRecord->IsAbilityState(AbilityState::INITIAL)) {
2003         HILOG_WARN("load timeout will not wait for died event, directly remove.");
2004         // update running state.
2005         InnerMissionInfo info;
2006         auto missionId = selMission->GetMissionId();
2007         if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2008             info.missionInfo.runningState = -1;
2009             if (listenerController_) {
2010                 listenerController_->NotifyMissionClosed(missionId);
2011             }
2012             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2013         }
2014         return;
2015     }
2016     HILOG_DEBUG("success move timeout ability to terminate mission list.");
2017     // other remove to terminate list.
2018     abilityRecord->SetTerminatingState();
2019     terminateAbilityList_.push_back(abilityRecord);
2020 
2021     HILOG_INFO("MoveToDefaultList end");
2022 }
2023 
GetAbilityRecordByCaller(const std::shared_ptr<AbilityRecord> & caller,int requestCode)2024 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByCaller(
2025     const std::shared_ptr<AbilityRecord> &caller, int requestCode)
2026 {
2027     if (!caller) {
2028         return nullptr;
2029     }
2030 
2031     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2032     for (auto missionList : currentMissionLists_) {
2033         if (missionList && (abilityRecord = missionList->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2034             return abilityRecord;
2035         }
2036     }
2037 
2038     if ((abilityRecord = defaultSingleList_->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2039         return abilityRecord;
2040     }
2041 
2042     return defaultStandardList_->GetAbilityRecordByCaller(caller, requestCode);
2043 }
2044 
GetAbilityRecordByEventId(int64_t eventId) const2045 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByEventId(int64_t eventId) const
2046 {
2047     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2048     for (auto missionList : currentMissionLists_) {
2049         if (missionList && (abilityRecord = missionList->GetAbilityRecordById(eventId)) != nullptr) {
2050             return abilityRecord;
2051         }
2052     }
2053 
2054     if ((abilityRecord = defaultSingleList_->GetAbilityRecordById(eventId)) != nullptr) {
2055         return abilityRecord;
2056     }
2057 
2058     return defaultStandardList_->GetAbilityRecordById(eventId);
2059 }
2060 
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord,int32_t currentUserId)2061 void MissionListManager::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord, int32_t currentUserId)
2062 {
2063     HILOG_INFO("On ability died.");
2064     if (!abilityRecord) {
2065         HILOG_ERROR("OnAbilityDied come, abilityRecord is nullptr.");
2066         return;
2067     }
2068     std::string element = abilityRecord->GetWant().GetElement().GetURI();
2069     HILOG_DEBUG("OnAbilityDied come, ability is %{public}s", element.c_str());
2070     if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2071         HILOG_ERROR("Ability type is not page.");
2072         return;
2073     }
2074 
2075     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2076 #ifdef SUPPORT_GRAPHICS
2077     if (abilityRecord->IsStartingWindow()) {
2078         PostCancelStartingWindowTask(abilityRecord);
2079     }
2080 #endif
2081 
2082     if (abilityRecord->IsLauncherRoot() && currentUserId != userId_) {
2083         HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__);
2084         abilityRecord->SetAbilityState(AbilityState::INITIAL);
2085         abilityRecord->SetRestarting(true);
2086         return;
2087     }
2088 
2089     HandleAbilityDied(abilityRecord);
2090 }
2091 
GetTargetMissionList(int missionId,std::shared_ptr<Mission> & mission)2092 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionList(int missionId, std::shared_ptr<Mission> &mission)
2093 {
2094     mission = GetMissionById(missionId);
2095     if (mission) {
2096         HILOG_DEBUG("get mission by id successfully, missionId: %{public}d", missionId);
2097         auto missionList = mission->GetMissionList();
2098         if (!missionList) {
2099             // mission is not null ptr, so its missionList ptr should be not null ptr too.
2100             HILOG_ERROR("mission list ptr is null ptr");
2101             return nullptr;
2102         }
2103 
2104         auto missionType = missionList->GetType();
2105         std::shared_ptr<MissionList> targetMissionList = nullptr;
2106         switch (missionType) {
2107             case LAUNCHER:
2108                 // not support move launcher to front.
2109                 HILOG_ERROR("get launcher mission list, missionId: %{public}d", missionId);
2110                 break;
2111             case CURRENT:
2112                 targetMissionList = mission->GetMissionList();
2113                 break;
2114             case DEFAULT_STANDARD:
2115             case DEFAULT_SINGLE:
2116                 // generate a new missionList
2117                 targetMissionList = std::make_shared<MissionList>();
2118                 break;
2119             default:
2120                 HILOG_ERROR("invalid missionType: %{public}d", missionType);
2121         }
2122         return targetMissionList;
2123     }
2124 
2125     // cannot find mission, may reasons: system restart or mission removed by system.
2126     HILOG_INFO("cannot find mission from MissionList by missionId: %{public}d", missionId);
2127 
2128     InnerMissionInfo innerMissionInfo;
2129     int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
2130         missionId, innerMissionInfo);
2131     if (getMission != ERR_OK) {
2132         HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId);
2133         return nullptr;
2134     }
2135 
2136     // generate a new mission and missionList
2137     AbilityRequest abilityRequest;
2138     int generateAbility = DelayedSingleton<AbilityManagerService>::GetInstance()->GenerateAbilityRequest(
2139         innerMissionInfo.missionInfo.want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, userId_);
2140     if (generateAbility != ERR_OK) {
2141         HILOG_ERROR("cannot find generate ability request, missionId: %{public}d", missionId);
2142         return nullptr;
2143     }
2144 
2145     auto abilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
2146     mission = std::make_shared<Mission>(innerMissionInfo.missionInfo.id, abilityRecord, innerMissionInfo.missionName);
2147     mission->SetLockedState(innerMissionInfo.missionInfo.lockedState);
2148     abilityRecord->SetMission(mission);
2149     abilityRecord->SetOwnerMissionUserId(userId_);
2150     std::shared_ptr<MissionList> newMissionList = std::make_shared<MissionList>();
2151     return newMissionList;
2152 }
2153 
GetMissionIdByAbilityToken(const sptr<IRemoteObject> & token)2154 int32_t MissionListManager::GetMissionIdByAbilityToken(const sptr<IRemoteObject> &token)
2155 {
2156     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2157     auto abilityRecord = GetAbilityRecordByToken(token);
2158     if (!abilityRecord) {
2159         return -1;
2160     }
2161     auto mission = abilityRecord->GetMission();
2162     if (!mission) {
2163         return -1;
2164     }
2165     return mission->GetMissionId();
2166 }
2167 
GetAbilityTokenByMissionId(int32_t missionId)2168 sptr<IRemoteObject> MissionListManager::GetAbilityTokenByMissionId(int32_t missionId)
2169 {
2170     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2171     sptr<IRemoteObject> result = nullptr;
2172     for (auto missionList : currentMissionLists_) {
2173         if (missionList && (result = missionList->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2174             return result;
2175         }
2176     }
2177 
2178     if ((result = defaultSingleList_->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2179         return result;
2180     }
2181 
2182     return defaultStandardList_->GetAbilityTokenByMissionId((missionId));
2183 }
2184 
PostStartWaitingAbility()2185 void MissionListManager::PostStartWaitingAbility()
2186 {
2187     auto self(shared_from_this());
2188     auto startWaitingAbilityTask = [self]() { self->StartWaitingAbility(); };
2189 
2190     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2191     CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
2192 
2193     /* PostTask to trigger start Ability from waiting queue */
2194     handler->PostTask(startWaitingAbilityTask, "startWaitingAbility");
2195 }
2196 
HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)2197 void MissionListManager::HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
2198 {
2199     HILOG_INFO("Handle Ability Died.");
2200     CHECK_POINTER(abilityRecord);
2201 
2202     if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2203         HILOG_ERROR("Ability type is not page.");
2204         return;
2205     }
2206 
2207     if (abilityRecord->IsLauncherAbility()) {
2208         HandleLauncherDied(abilityRecord);
2209         return;
2210     }
2211 
2212     HandleAbilityDiedByDefault(abilityRecord);
2213 }
2214 
HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)2215 void MissionListManager::HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)
2216 {
2217     HILOG_INFO("Handle launcher Ability Died.");
2218     auto mission = ability->GetMission();
2219     CHECK_POINTER_LOG(mission, "Fail to get launcher mission.");
2220     auto missionList = mission->GetMissionList();
2221     if (launcherList_ != missionList) {
2222         HILOG_ERROR("not launcher missionList.");
2223         return;
2224     }
2225 
2226     bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2227     if (ability->IsLauncherRoot()) {
2228         HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__);
2229         ability->SetAbilityState(AbilityState::INITIAL);
2230         ability->SetRestarting(true);
2231     } else {
2232         HILOG_INFO("launcher Ability died, remove, %{public}d", __LINE__);
2233         missionList->RemoveMission(mission);
2234     }
2235     if (isForeground) {
2236         HILOG_INFO("active launcher ability died, start launcher, %{public}d", __LINE__);
2237         DelayedStartLauncher();
2238     }
2239 }
2240 
HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)2241 void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)
2242 {
2243     HILOG_INFO("Handle Ability DiedByDefault.");
2244     CHECK_POINTER_LOG(ability, "ability is null.");
2245     if (ability->IsTerminating()) {
2246         HILOG_INFO("Handle Ability DiedByTerminating.");
2247         CompleteTerminateAndUpdateMission(ability);
2248         return;
2249     }
2250 
2251     auto mission = ability->GetMission();
2252     CHECK_POINTER_LOG(mission, "Fail to get mission.");
2253     auto missionList = mission->GetMissionList();
2254     CHECK_POINTER_LOG(missionList, "Fail to get mission list.");
2255 
2256     std::shared_ptr<AbilityRecord> launcherRoot = launcherList_->GetLauncherRoot();
2257     bool isLauncherActive = (launcherRoot &&
2258         (launcherRoot->IsAbilityState(FOREGROUND) || launcherRoot->IsAbilityState(FOREGROUNDING)));
2259     bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2260 
2261     // remove from mission list.
2262     missionList->RemoveMission(mission);
2263     if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
2264         RemoveMissionList(missionList);
2265     }
2266 
2267     // update running state.
2268     auto missionId = mission->GetMissionId();
2269     if (!ability->IsUninstallAbility()) {
2270         if ((ability->GetAppIndex() != 0) || ability->GetAbilityInfo().removeMissionAfterTerminate ||
2271             ability->GetAbilityInfo().excludeFromMissions) {
2272             RemoveMissionLocked(missionId, ability->GetAbilityInfo().excludeFromMissions);
2273         } else {
2274             InnerMissionInfo info;
2275             if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2276                 info.missionInfo.runningState = -1;
2277                 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2278             }
2279 
2280             if (listenerController_) {
2281                 listenerController_->NotifyMissionClosed(missionId);
2282             }
2283         }
2284     }
2285 
2286     // start launcher
2287     if (isForeground && !isLauncherActive) {
2288         HILOG_INFO("active ability died, start launcher later, %{public}d", __LINE__);
2289         DelayedStartLauncher();
2290     }
2291 }
2292 
DelayedStartLauncher()2293 void MissionListManager::DelayedStartLauncher()
2294 {
2295     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
2296     CHECK_POINTER(abilityManagerService);
2297     auto handler = abilityManagerService->GetEventHandler();
2298     CHECK_POINTER(handler);
2299     std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
2300     auto timeoutTask = [wpListMgr]() {
2301         HILOG_DEBUG("The launcher needs to be restarted.");
2302         auto listMgr = wpListMgr.lock();
2303         if (listMgr) {
2304             listMgr->BackToLauncher();
2305         }
2306     };
2307     handler->PostTask(timeoutTask, "Launcher_Restart");
2308 }
2309 
BackToLauncher()2310 void MissionListManager::BackToLauncher()
2311 {
2312     HILOG_INFO("Back to launcher.");
2313     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2314     CHECK_POINTER(launcherList_);
2315 
2316     auto launcherRootAbility = launcherList_->GetLauncherRoot();
2317     if (!launcherRootAbility) {
2318         HILOG_WARN("no root launcher ability, no need back to launcher.");
2319         return;
2320     }
2321 
2322     if (launcherRootAbility->GetAbilityInfo().bundleName != AbilityConfig::LAUNCHER_BUNDLE_NAME) {
2323         HILOG_WARN("not launcher mission, no need back to launcher.");
2324         return;
2325     }
2326 
2327     auto launcherRootMission = launcherRootAbility->GetMission();
2328     if (!launcherRootMission) {
2329         HILOG_WARN("no root launcher mission, no need back to launcher.");
2330         return;
2331     }
2332 
2333     std::queue<AbilityRequest> emptyQueue;
2334     std::swap(waitingAbilityQueue_, emptyQueue);
2335 
2336     launcherList_->AddMissionToTop(launcherRootMission);
2337     MoveMissionListToTop(launcherList_);
2338     launcherRootAbility->ProcessForegroundAbility();
2339 }
2340 
2341 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const sptr<IRemoteObject> & token,const std::string & label)2342 int MissionListManager::SetMissionLabel(const sptr<IRemoteObject> &token, const std::string &label)
2343 {
2344     if (!token) {
2345         HILOG_INFO("SetMissionLabel token is nullptr.");
2346         return -1;
2347     }
2348 
2349     auto missionId = GetMissionIdByAbilityToken(token);
2350     if (missionId <= 0) {
2351         HILOG_INFO("SetMissionLabel find mission failed.");
2352         return -1;
2353     }
2354 
2355     // store label if not notify mission created.
2356     auto abilityRecord = GetAbilityRecordByToken(token);
2357     if (abilityRecord) {
2358         auto mission = abilityRecord->GetMission();
2359         if (mission && mission->NeedNotify()) {
2360             mission->SetNeedNotifyUpdateLabel(true);
2361         }
2362     }
2363 
2364     auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionLabel(missionId, label);
2365     if (ret == 0 && listenerController_) {
2366         listenerController_->NotifyMissionLabelUpdated(missionId);
2367     }
2368 
2369     return ret;
2370 }
2371 
SetMissionIcon(const sptr<IRemoteObject> & token,const std::shared_ptr<Media::PixelMap> & icon)2372 int MissionListManager::SetMissionIcon(const sptr<IRemoteObject> &token, const std::shared_ptr<Media::PixelMap> &icon)
2373 {
2374     if (!token) {
2375         HILOG_INFO("SetMissionIcon token is nullptr.");
2376         return -1;
2377     }
2378 
2379     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2380     auto missionId = GetMissionIdByAbilityToken(token);
2381     if (missionId <= 0) {
2382         HILOG_ERROR("SetMissionIcon find mission failed.");
2383         return -1;
2384     }
2385     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2386     if (!abilityRecord) {
2387         HILOG_ERROR("SetMissionIcon find ability failed.");
2388         return -1;
2389     }
2390 
2391     if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
2392         listenerController_->NotifyMissionIconChanged(missionId, icon);
2393     }
2394 
2395     return 0;
2396 }
2397 
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & abilityToken) const2398 void MissionListManager::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &abilityToken) const
2399 {
2400     if (!abilityToken) {
2401         HILOG_WARN("%{public}s ability token is nullptr.", __func__);
2402         return;
2403     }
2404 
2405     auto abilityRecord = GetAbilityRecordByToken(abilityToken);
2406     if (!abilityRecord) {
2407         HILOG_WARN("%{public}s get AbilityRecord by token failed.", __func__);
2408         return;
2409     }
2410 
2411     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2412     if (handler == nullptr) {
2413         HILOG_ERROR("Fail to get AbilityEventHandler.");
2414         return;
2415     }
2416 
2417     auto task = [owner = weak_from_this(), abilityRecord] {
2418         auto mgr = owner.lock();
2419         if (mgr == nullptr) {
2420             HILOG_ERROR("MissionListManager is nullptr.");
2421             return;
2422         }
2423         mgr->NotifyMissionCreated(abilityRecord);
2424         mgr->UpdateMissionSnapshot(abilityRecord);
2425     };
2426     handler->PostTask(task, "FirstFrameDrawing");
2427     auto preloadTask = [owner = weak_from_this(), abilityRecord] {
2428         auto mgr = owner.lock();
2429         if (mgr == nullptr) {
2430             HILOG_ERROR("MissionListManager is nullptr.");
2431             return;
2432         }
2433         mgr->ProcessPreload(abilityRecord);
2434     };
2435     handler->PostTask(preloadTask);
2436 }
2437 
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const2438 void MissionListManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
2439 {
2440     auto bms = AbilityUtil::GetBundleManager();
2441     CHECK_POINTER(bms);
2442     auto abilityInfo = record->GetAbilityInfo();
2443     Want want;
2444     want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
2445     auto uid = record->GetUid();
2446     want.SetParam("uid", uid);
2447     bms->ProcessPreload(want);
2448 }
2449 
GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const2450 Closure MissionListManager::GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
2451 {
2452     auto windowHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetWMSHandler();
2453     if (!windowHandler) {
2454         HILOG_ERROR("%{public}s, Get WMS handler failed.", __func__);
2455         return nullptr;
2456     }
2457 
2458     return [windowHandler, abilityRecord] {
2459         if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow()) {
2460             HILOG_INFO("%{public}s, call windowHandler CancelStartingWindow.", __func__);
2461             windowHandler->CancelStartingWindow(abilityRecord->GetToken());
2462             abilityRecord->SetStartingWindow(false);
2463         }
2464     };
2465 }
2466 
PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const2467 void MissionListManager::PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
2468 {
2469     HILOG_INFO("%{public}s was called.", __func__);
2470     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2471     if (!handler) {
2472         HILOG_ERROR("Fail to get AbilityEventHandler.");
2473         return;
2474     }
2475 
2476     auto task = GetCancelStartingWindowTask(abilityRecord);
2477     if (!task) {
2478         HILOG_ERROR("Fail to get CancelStartingWindow task.");
2479         return;
2480     }
2481     handler->PostTask(task, AppExecFwk::EventQueue::Priority::IMMEDIATE);
2482 }
2483 #endif
2484 
Dump(std::vector<std::string> & info)2485 void MissionListManager::Dump(std::vector<std::string> &info)
2486 {
2487     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2488     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2489     info.push_back(dumpInfo);
2490     dumpInfo = " current mission lists:{";
2491     info.push_back(dumpInfo);
2492     for (const auto& missionList : currentMissionLists_) {
2493         if (missionList) {
2494             missionList->Dump(info);
2495         }
2496     }
2497     dumpInfo = " }";
2498     info.push_back(dumpInfo);
2499 
2500     dumpInfo = " default stand mission list:{";
2501     info.push_back(dumpInfo);
2502     if (defaultStandardList_) {
2503         defaultStandardList_->Dump(info);
2504     }
2505     dumpInfo = " }";
2506     info.push_back(dumpInfo);
2507 
2508     dumpInfo = " default single mission list:{";
2509     info.push_back(dumpInfo);
2510     if (defaultSingleList_) {
2511         defaultSingleList_->Dump(info);
2512     }
2513     dumpInfo = " }";
2514     info.push_back(dumpInfo);
2515 
2516     dumpInfo = " launcher mission list:{";
2517     info.push_back(dumpInfo);
2518     if (launcherList_) {
2519         launcherList_->Dump(info);
2520     }
2521     dumpInfo = " }";
2522     info.push_back(dumpInfo);
2523 }
2524 
DumpMissionListByRecordId(std::vector<std::string> & info,bool isClient,int32_t abilityRecordId,const std::vector<std::string> & params)2525 void MissionListManager::DumpMissionListByRecordId(
2526     std::vector<std::string> &info, bool isClient, int32_t abilityRecordId, const std::vector<std::string> &params)
2527 {
2528     std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
2529     std::unique_ptr<MissionList> defaultStandardListBackup;
2530     std::unique_ptr<MissionList> defaultSingleListBackup;
2531     std::unique_ptr<MissionList> launcherListBackup;
2532     {
2533         std::lock_guard<std::recursive_mutex> guard(managerLock_);
2534         for (const auto& missionList : currentMissionLists_) {
2535             if (missionList != nullptr) {
2536                 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
2537             }
2538         }
2539         defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
2540         defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
2541         launcherListBackup = std::make_unique<MissionList>(*launcherList_);
2542     }
2543 
2544     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2545     info.push_back(dumpInfo);
2546     for (const auto& missionList : currentMissionListsBackup) {
2547         if (missionList && missionList != launcherListBackup) {
2548             HILOG_INFO("missionList begin to call DumpMissionListByRecordId %{public}s", __func__);
2549             missionList->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2550         }
2551     }
2552 
2553     if (defaultStandardListBackup) {
2554         HILOG_INFO("defaultStandardList begin to call DumpMissionListByRecordId %{public}s", __func__);
2555         defaultStandardListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2556     }
2557 
2558     if (defaultSingleListBackup) {
2559         HILOG_INFO("defaultSingleList begin to call DumpMissionListByRecordId %{public}s", __func__);
2560         defaultSingleListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2561     }
2562 
2563     if (launcherListBackup) {
2564         HILOG_INFO("launcherList begin to call DumpMissionListByRecordId %{public}s", __func__);
2565         launcherListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2566     }
2567 }
2568 
DumpMissionList(std::vector<std::string> & info,bool isClient,const std::string & args)2569 void MissionListManager::DumpMissionList(std::vector<std::string> &info, bool isClient, const std::string &args)
2570 {
2571     std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
2572     std::unique_ptr<MissionList> defaultStandardListBackup;
2573     std::unique_ptr<MissionList> defaultSingleListBackup;
2574     std::unique_ptr<MissionList> launcherListBackup;
2575     {
2576         std::lock_guard<std::recursive_mutex> guard(managerLock_);
2577         for (const auto& missionList : currentMissionLists_) {
2578             if (missionList != nullptr) {
2579                 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
2580             }
2581         }
2582         defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
2583         defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
2584         launcherListBackup = std::make_unique<MissionList>(*launcherList_);
2585     }
2586 
2587     if (args.size() != 0 &&
2588         args != "NORMAL" &&
2589         args != "DEFAULT_STANDARD" &&
2590         args != "DEFAULT_SINGLE" &&
2591         args != "LAUNCHER") {
2592         info.emplace_back("MissionList Type NORMAL|DEFAULT_STANDARD|DEFAULT_SINGLE|LAUNCHER");
2593         return;
2594     }
2595 
2596     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2597     info.push_back(dumpInfo);
2598     if (args.size() == 0 || args == "NORMAL") {
2599         dumpInfo = "  Current mission lists:";
2600         info.push_back(dumpInfo);
2601         for (const auto& missionList : currentMissionListsBackup) {
2602             if (missionList) {
2603                 missionList->DumpList(info, isClient);
2604             }
2605         }
2606     }
2607 
2608     if (args.size() == 0 || args == "DEFAULT_STANDARD") {
2609         dumpInfo = "  default stand mission list:";
2610         info.push_back(dumpInfo);
2611         if (defaultStandardListBackup) {
2612             defaultStandardListBackup->DumpList(info, isClient);
2613         }
2614     }
2615 
2616     if (args.size() == 0 || args == "DEFAULT_SINGLE") {
2617         dumpInfo = "  default single mission list:";
2618         info.push_back(dumpInfo);
2619         if (defaultSingleListBackup) {
2620             defaultSingleListBackup->DumpList(info, isClient);
2621         }
2622     }
2623     if (args.size() == 0 || args == "LAUNCHER") {
2624         dumpInfo = "  launcher mission list:";
2625         info.push_back(dumpInfo);
2626         if (launcherListBackup) {
2627             launcherListBackup->DumpList(info, isClient);
2628         }
2629     }
2630 }
2631 
DumpMissionInfos(std::vector<std::string> & info)2632 void MissionListManager::DumpMissionInfos(std::vector<std::string> &info)
2633 {
2634     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2635     info.push_back(dumpInfo);
2636     DelayedSingleton<MissionInfoMgr>::GetInstance()->Dump(info);
2637 }
2638 
DumpMission(int missionId,std::vector<std::string> & info)2639 void MissionListManager::DumpMission(int missionId, std::vector<std::string> &info)
2640 {
2641     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2642     info.push_back(dumpInfo);
2643     InnerMissionInfo innerMissionInfo;
2644     if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo) != 0) {
2645         info.push_back("error: invalid mission number, please see 'aa dump --mission-list'.");
2646         return;
2647     }
2648     innerMissionInfo.Dump(info);
2649 }
2650 
ResolveLocked(const AbilityRequest & abilityRequest)2651 int MissionListManager::ResolveLocked(const AbilityRequest &abilityRequest)
2652 {
2653     HILOG_INFO("%{public}s, resolve ability_name:%{public}s",
2654         __func__,
2655         abilityRequest.want.GetElement().GetURI().c_str());
2656 
2657     if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
2658         HILOG_ERROR("%{public}s, resolve ability_name:", __func__);
2659         return RESOLVE_CALL_ABILITY_INNER_ERR;
2660     }
2661 
2662     return CallAbilityLocked(abilityRequest);
2663 }
2664 
CallAbilityLocked(const AbilityRequest & abilityRequest)2665 int MissionListManager::CallAbilityLocked(const AbilityRequest &abilityRequest)
2666 {
2667     HILOG_INFO("call ability.");
2668     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2669 
2670     // allow to start ability by called type without loading ui.
2671     if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
2672         HILOG_ERROR("start ability not by call.");
2673         return ERR_INVALID_VALUE;
2674     }
2675 
2676     // Get target mission and ability record.
2677     std::shared_ptr<AbilityRecord> targetAbilityRecord;
2678     std::shared_ptr<Mission> targetMission;
2679     GetTargetMissionAndAbility(abilityRequest, targetMission, targetAbilityRecord);
2680     if (!targetMission || !targetAbilityRecord) {
2681         HILOG_ERROR("Failed to get mission or record.");
2682         return ERR_INVALID_VALUE;
2683     }
2684 
2685     targetAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode);
2686     targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
2687 
2688     // mission is first created, add mission to default call mission list.
2689     // other keep in current mission list.
2690     if (!targetMission->GetMissionList()) {
2691         defaultSingleList_->AddMissionToTop(targetMission);
2692     }
2693 
2694     // new version started by call type
2695     auto ret = ResolveAbility(targetAbilityRecord, abilityRequest);
2696     if (ret == ResolveResultType::OK_HAS_REMOTE_OBJ) {
2697         HILOG_DEBUG("target ability has been resolved.");
2698         if (targetAbilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
2699             HILOG_DEBUG("target ability needs to be switched to foreground.");
2700             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(targetAbilityRecord->GetToken());
2701         }
2702         return ERR_OK;
2703     } else if (ret == ResolveResultType::NG_INNER_ERROR) {
2704         HILOG_ERROR("resolve failed, error: %{public}d.", RESOLVE_CALL_ABILITY_INNER_ERR);
2705         return RESOLVE_CALL_ABILITY_INNER_ERR;
2706     }
2707 
2708     // schedule target ability
2709     std::string element = targetAbilityRecord->GetWant().GetElement().GetURI();
2710     HILOG_DEBUG("load ability record: %{public}s", element.c_str());
2711 
2712     // flag the first ability.
2713     auto currentTopAbility = GetCurrentTopAbilityLocked();
2714     if (!currentTopAbility) {
2715         if (targetAbilityRecord->GetAbilityInfo().applicationInfo.isLauncherApp) {
2716             targetAbilityRecord->SetLauncherRoot();
2717         }
2718     }
2719 
2720     return targetAbilityRecord->LoadAbility();
2721 }
2722 
ReleaseCallLocked(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)2723 int MissionListManager::ReleaseCallLocked(
2724     const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
2725 {
2726     HILOG_DEBUG("release call ability.");
2727 
2728     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
2729     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
2730 
2731     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2732 
2733     std::shared_ptr<AbilityRecord> abilityRecord = GetAbilityRecordByName(element);
2734     CHECK_POINTER_AND_RETURN(abilityRecord, RELEASE_CALL_ABILITY_INNER_ERR);
2735 
2736     if (!abilityRecord->ReleaseCall(connect)) {
2737         HILOG_ERROR("ability release call record failed.");
2738         return RELEASE_CALL_ABILITY_INNER_ERR;
2739     }
2740     return ERR_OK;
2741 }
2742 
ResolveAbility(const std::shared_ptr<AbilityRecord> & targetAbility,const AbilityRequest & abilityRequest)2743 int MissionListManager::ResolveAbility(
2744     const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest)
2745 {
2746     HILOG_DEBUG("targetAbilityRecord resolve call record.");
2747     CHECK_POINTER_AND_RETURN(targetAbility, ResolveResultType::NG_INNER_ERROR);
2748 
2749     ResolveResultType result = targetAbility->Resolve(abilityRequest);
2750     switch (result) {
2751         case ResolveResultType::NG_INNER_ERROR:
2752         case ResolveResultType::OK_HAS_REMOTE_OBJ:
2753             return result;
2754         default:
2755             break;
2756     }
2757 
2758     if (targetAbility->IsReady()) {
2759         HILOG_DEBUG("targetAbility is ready, directly scheduler call request.");
2760         targetAbility->CallRequest();
2761         return ResolveResultType::OK_HAS_REMOTE_OBJ;
2762     }
2763 
2764     HILOG_DEBUG("targetAbility need to call request after lifecycle.");
2765     return result;
2766 }
2767 
GetAbilityRecordByName(const AppExecFwk::ElementName & element)2768 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByName(const AppExecFwk::ElementName &element)
2769 {
2770     // find in currentMissionLists_
2771     for (auto missionList : currentMissionLists_) {
2772         if (missionList != nullptr) {
2773             auto ability = missionList->GetAbilityRecordByName(element);
2774             if (ability != nullptr) {
2775                 return ability;
2776             }
2777         }
2778     }
2779 
2780     // find in launcherMissionList_
2781     auto ability = launcherList_->GetAbilityRecordByName(element);
2782     if (ability != nullptr) {
2783         return ability;
2784     }
2785 
2786     // find in default singlelist_
2787     return defaultSingleList_->GetAbilityRecordByName(element);
2788 }
2789 
OnCallConnectDied(const std::shared_ptr<CallRecord> & callRecord)2790 void MissionListManager::OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord)
2791 {
2792     HILOG_INFO("On callConnect died.");
2793     CHECK_POINTER(callRecord);
2794     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2795 
2796     AppExecFwk::ElementName element = callRecord->GetTargetServiceName();
2797     auto abilityRecord = GetAbilityRecordByName(element);
2798     CHECK_POINTER(abilityRecord);
2799     abilityRecord->ReleaseCall(callRecord->GetConCallBack());
2800 }
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)2801 void MissionListManager::OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag)
2802 {
2803     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2804     if (waitingAbilityQueue_.empty()) {
2805         return;
2806     }
2807 
2808     AbilityRequest abilityRequest = waitingAbilityQueue_.front();
2809     waitingAbilityQueue_.pop();
2810 
2811     auto currentTopAbility = GetCurrentTopAbilityLocked();
2812     auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
2813 
2814     if (!flag.empty()) {
2815         auto mission = GetMissionBySpecifiedFlag(want, flag);
2816         if (mission) {
2817             auto ability = mission->GetAbilityRecord();
2818             if (!ability) {
2819                 return;
2820             }
2821             ability->SetWant(abilityRequest.want);
2822             ability->SetIsNewWant(true);
2823             if (abilityRequest.IsContinuation()) {
2824                 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_CONTINUATION);
2825             } else if (abilityRequest.IsAppRecovery()) {
2826                 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
2827             } else {
2828                 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
2829             }
2830 
2831             auto isCallerFromLauncher = (callerAbility && callerAbility->IsLauncherAbility());
2832             MoveMissionToFront(mission->GetMissionId(), isCallerFromLauncher);
2833             NotifyRestartSpecifiedAbility(abilityRequest, ability->GetToken());
2834             return;
2835         }
2836     }
2837 
2838     abilityRequest.specifiedFlag = flag;
2839     NotifyStartSpecifiedAbility(abilityRequest, want);
2840     StartAbilityLocked(currentTopAbility, callerAbility, abilityRequest);
2841 }
2842 
NotifyRestartSpecifiedAbility(AbilityRequest & request,const sptr<IRemoteObject> & token)2843 void MissionListManager::NotifyRestartSpecifiedAbility(AbilityRequest &request, const sptr<IRemoteObject> &token)
2844 {
2845     if (request.abilityInfoCallback == nullptr) {
2846         return;
2847     }
2848     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2849         = iface_cast<AppExecFwk::IAbilityInfoCallback> (request.abilityInfoCallback);
2850     if (abilityInfoCallback != nullptr) {
2851         HILOG_DEBUG("%{public}s called.", __func__);
2852         abilityInfoCallback->NotifyRestartSpecifiedAbility(token);
2853     }
2854 }
2855 
NotifyStartSpecifiedAbility(AbilityRequest & abilityRequest,const AAFwk::Want & want)2856 void MissionListManager::NotifyStartSpecifiedAbility(AbilityRequest &abilityRequest, const AAFwk::Want &want)
2857 {
2858     if (abilityRequest.abilityInfoCallback == nullptr) {
2859         return;
2860     }
2861 
2862     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2863         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
2864     if (abilityInfoCallback != nullptr) {
2865         Want newWant = want;
2866         int32_t type = static_cast<int32_t>(abilityRequest.abilityInfo.type);
2867         newWant.SetParam("abilityType", type);
2868         sptr<Want> extraParam = new (std::nothrow) Want();
2869         abilityInfoCallback->NotifyStartSpecifiedAbility(abilityRequest.callerToken, newWant,
2870             abilityRequest.requestCode, extraParam);
2871         int32_t procCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
2872         if (procCode != 0) {
2873             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
2874         }
2875         int32_t tokenCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
2876         if (tokenCode != 0) {
2877             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
2878         }
2879     }
2880 }
2881 
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want)2882 void MissionListManager::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want)
2883 {
2884     HILOG_DEBUG("%{public}s called.", __func__);
2885     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2886     if (waitingAbilityQueue_.empty()) {
2887         return;
2888     }
2889     waitingAbilityQueue_.pop();
2890 
2891     if (waitingAbilityQueue_.empty()) {
2892         return;
2893     }
2894     AbilityRequest abilityRequest = waitingAbilityQueue_.front();
2895     waitingAbilityQueue_.pop();
2896 
2897     auto currentTopAbility = GetCurrentTopAbilityLocked();
2898     auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
2899     StartAbility(currentTopAbility, callerAbility, abilityRequest);
2900 }
2901 
GetMissionBySpecifiedFlag(const AAFwk::Want & want,const std::string & flag) const2902 std::shared_ptr<Mission> MissionListManager::GetMissionBySpecifiedFlag(
2903     const AAFwk::Want &want, const std::string &flag) const
2904 {
2905     std::shared_ptr<Mission> mission = nullptr;
2906     for (auto missionList : currentMissionLists_) {
2907         if (missionList && (mission = missionList->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2908             return mission;
2909         }
2910     }
2911 
2912     if ((mission = defaultSingleList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2913         return mission;
2914     }
2915 
2916     if ((mission = launcherList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2917         return mission;
2918     }
2919 
2920     return defaultStandardList_->GetMissionBySpecifiedFlag(want, flag);
2921 }
2922 
IsReachToLimitLocked(const AbilityRequest & abilityRequest)2923 bool MissionListManager::IsReachToLimitLocked(const AbilityRequest &abilityRequest)
2924 {
2925     auto reUsedMission = GetReusedMission(abilityRequest);
2926     if (reUsedMission) {
2927         return false;
2928     }
2929 
2930     int32_t totalCount = 0;
2931     for (const auto& missionList : currentMissionLists_) {
2932         if (!missionList) {
2933             continue;
2934         }
2935 
2936         totalCount += missionList->GetMissionCountByUid(abilityRequest.uid);
2937         if (totalCount >= MAX_INSTANCE_COUNT) {
2938             return true;
2939         }
2940     }
2941 
2942     totalCount += defaultStandardList_->GetMissionCountByUid(abilityRequest.uid);
2943     if (totalCount >= MAX_INSTANCE_COUNT) {
2944         return true;
2945     }
2946 
2947     totalCount += defaultSingleList_->GetMissionCountByUid(abilityRequest.uid);
2948     return totalCount >= MAX_INSTANCE_COUNT;
2949 }
2950 
2951 bool MissionListManager::MissionDmInitCallback::isInit_ = false;
OnRemoteDied()2952 void MissionListManager::MissionDmInitCallback::OnRemoteDied()
2953 {
2954     isInit_ = false;
2955     HILOG_WARN("DeviceManager died.");
2956 }
2957 
RegisterSnapshotHandler(const sptr<ISnapshotHandler> & handler)2958 void MissionListManager::RegisterSnapshotHandler(const sptr<ISnapshotHandler>& handler)
2959 {
2960     DelayedSingleton<MissionInfoMgr>::GetInstance()->RegisterSnapshotHandler(handler);
2961 }
2962 
GetMissionSnapshot(int32_t missionId,const sptr<IRemoteObject> & abilityToken,MissionSnapshot & missionSnapshot,bool isLowResolution)2963 bool MissionListManager::GetMissionSnapshot(int32_t missionId, const sptr<IRemoteObject>& abilityToken,
2964     MissionSnapshot& missionSnapshot, bool isLowResolution)
2965 {
2966     HILOG_INFO("snapshot: Start get mission snapshot.");
2967     bool forceSnapshot = false;
2968     {
2969         std::lock_guard<std::recursive_mutex> guard(managerLock_);
2970         auto abilityRecord = GetAbilityRecordByToken(abilityToken);
2971         if (abilityRecord && abilityRecord->IsAbilityState(FOREGROUND)) {
2972             forceSnapshot = true;
2973             missionSnapshot.isPrivate = (abilityRecord->GetAppIndex() != 0);
2974         }
2975     }
2976     return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionSnapshot(
2977         missionId, abilityToken, missionSnapshot, isLowResolution, forceSnapshot);
2978 }
2979 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)2980 void MissionListManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
2981 {
2982     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2983 
2984     auto func = [&info, isPerm](const std::shared_ptr<Mission> &mission) {
2985         if (!mission) {
2986             return;
2987         }
2988 
2989         auto ability = mission->GetAbilityRecord();
2990         if (!ability) {
2991             return;
2992         }
2993 
2994         if (isPerm) {
2995             DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, ability);
2996         } else {
2997             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
2998             auto tokenID = ability->GetApplicationInfo().accessTokenId;
2999             if (callingTokenId == tokenID) {
3000                 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, ability);
3001             }
3002         }
3003     };
3004     if (!(defaultStandardList_->GetAllMissions().empty())) {
3005         auto list = defaultStandardList_->GetAllMissions();
3006         std::for_each(list.begin(), list.end(), func);
3007     }
3008     if (!(defaultSingleList_->GetAllMissions().empty())) {
3009         auto list = defaultSingleList_->GetAllMissions();
3010         std::for_each(list.begin(), list.end(), func);
3011     }
3012     for (auto missionList : currentMissionLists_) {
3013         if (!(missionList->GetAllMissions().empty())) {
3014             auto list = missionList->GetAllMissions();
3015             std::for_each(list.begin(), list.end(), func);
3016         }
3017     }
3018 }
3019 
UninstallApp(const std::string & bundleName,int32_t uid)3020 void MissionListManager::UninstallApp(const std::string &bundleName, int32_t uid)
3021 {
3022     HILOG_INFO("Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3023     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
3024     CHECK_POINTER(abilityManagerService);
3025     auto handler = abilityManagerService->GetEventHandler();
3026     CHECK_POINTER(handler);
3027     std::weak_ptr<MissionListManager> wpMgr = shared_from_this();
3028     auto task = [wpMgr, bundleName, uid]() {
3029         HILOG_INFO("Handle Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3030         auto mgr = wpMgr.lock();
3031         if (mgr) {
3032             mgr->AddUninstallTags(bundleName, uid);
3033         }
3034     };
3035     handler->PostTask(task);
3036 }
3037 
AddUninstallTags(const std::string & bundleName,int32_t uid)3038 void MissionListManager::AddUninstallTags(const std::string &bundleName, int32_t uid)
3039 {
3040     HILOG_INFO("AddUninstallTags, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3041     std::lock_guard<std::recursive_mutex> guard(managerLock_);
3042     for (auto it = currentMissionLists_.begin(); it != currentMissionLists_.end();) {
3043         auto missionList = *it;
3044         if (missionList) {
3045             missionList->HandleUnInstallApp(bundleName, uid); // add tag here.
3046             if (missionList->IsEmpty()) {
3047                 currentMissionLists_.erase(it++);
3048                 continue;
3049             }
3050         }
3051         it++;
3052     }
3053     defaultSingleList_->HandleUnInstallApp(bundleName, uid);
3054     defaultStandardList_->HandleUnInstallApp(bundleName, uid);
3055     std::list<int32_t> matchedMissions;
3056     DelayedSingleton<MissionInfoMgr>::GetInstance()->HandleUnInstallApp(bundleName, uid, matchedMissions);
3057     if (listenerController_) {
3058         listenerController_->HandleUnInstallApp(matchedMissions);
3059     }
3060 
3061     EraseWaitingAbility(bundleName, uid);
3062 }
3063 
EraseWaitingAbility(const std::string & bundleName,int32_t uid)3064 void MissionListManager::EraseWaitingAbility(const std::string &bundleName, int32_t uid)
3065 {
3066     std::queue<AbilityRequest> abilityQueue;
3067     waitingAbilityQueue_.swap(abilityQueue);
3068     while (!abilityQueue.empty()) {
3069         AbilityRequest tempAbilityRequest = abilityQueue.front();
3070         abilityQueue.pop();
3071         if (tempAbilityRequest.abilityInfo.bundleName == bundleName && tempAbilityRequest.uid == uid) {
3072             HILOG_INFO("AddUninstallTags, erase AbilityRequest from waitingAbilityQueue.");
3073         } else {
3074             waitingAbilityQueue_.push(tempAbilityRequest);
3075         }
3076     }
3077 }
3078 
IsStarted()3079 bool MissionListManager::IsStarted()
3080 {
3081     std::lock_guard<std::recursive_mutex> guard(managerLock_);
3082     auto launcherRoot = launcherList_->GetLauncherRoot();
3083     return launcherRoot != nullptr;
3084 }
3085 
PauseManager()3086 void MissionListManager::PauseManager()
3087 {
3088     HILOG_INFO("MissionListManager PauseManager. move foreground to background.");
3089     std::lock_guard<std::recursive_mutex> guard(managerLock_);
3090     std::list<std::shared_ptr<AbilityRecord>> foregroundAbilities;
3091     GetAllForegroundAbilities(foregroundAbilities);
3092 
3093     for (auto& abilityRecord : foregroundAbilities) {
3094         if (!abilityRecord) {
3095             continue;
3096         }
3097         abilityRecord->SetSwitchingPause(true);
3098         MoveToBackgroundTask(abilityRecord);
3099     }
3100 }
3101 
ResumeManager()3102 void MissionListManager::ResumeManager()
3103 {
3104     HILOG_INFO("ResumeManager, back to launcher.");
3105     BackToLauncher();
3106 }
3107 
GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3108 void MissionListManager::GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3109 {
3110     for (auto& missionList : currentMissionLists_) {
3111         GetForegroundAbilities(missionList, foregroundList);
3112     }
3113     GetForegroundAbilities(defaultSingleList_, foregroundList);
3114     GetForegroundAbilities(defaultStandardList_, foregroundList);
3115 }
3116 
GetForegroundAbilities(const std::shared_ptr<MissionList> & missionList,std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3117 void MissionListManager::GetForegroundAbilities(const std::shared_ptr<MissionList>& missionList,
3118     std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3119 {
3120     if (!missionList || missionList->IsEmpty()) {
3121         return;
3122     }
3123 
3124     for (auto& mission : missionList->GetAllMissions()) {
3125         if (!mission) {
3126             continue;
3127         }
3128 
3129         auto abilityRecord = mission->GetAbilityRecord();
3130         if (!abilityRecord) {
3131             continue;
3132         }
3133 
3134         if (abilityRecord->IsActiveState()) {
3135             foregroundList.emplace_back(abilityRecord);
3136         }
3137     }
3138 }
3139 
RemoveMissionLocked(int32_t missionId,bool excludeFromMissions)3140 void MissionListManager::RemoveMissionLocked(int32_t missionId, bool excludeFromMissions)
3141 {
3142     if (missionId <= 0) {
3143         return;
3144     }
3145 
3146     DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
3147     if (listenerController_ && !excludeFromMissions) {
3148         listenerController_->NotifyMissionDestroyed(missionId);
3149     }
3150 }
3151 
IsExcludeFromMissions(const std::shared_ptr<Mission> & mission)3152 bool MissionListManager::IsExcludeFromMissions(const std::shared_ptr<Mission> &mission)
3153 {
3154     if (!mission) {
3155         return false;
3156     }
3157 
3158     auto abilityRecord = mission->GetAbilityRecord();
3159     return abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions;
3160 }
3161 
3162 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility(int32_t abilityRecordId)3163 int MissionListManager::BlockAbility(int32_t abilityRecordId)
3164 {
3165     int ret = -1;
3166     for (const auto &missionList : currentMissionLists_) {
3167         if (missionList && missionList != launcherList_) {
3168             HILOG_INFO("missionList begin to call BlockAbilityByRecordId %{public}s", __func__);
3169             if (missionList->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3170                 HILOG_INFO("missionList call BlockAbilityByRecordId success");
3171                 ret = ERR_OK;
3172             }
3173         }
3174     }
3175 
3176     if (defaultStandardList_) {
3177         HILOG_INFO("defaultStandardList begin to call BlockAbilityByRecordId %{public}s", __func__);
3178         if (defaultStandardList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3179             HILOG_INFO("defaultStandardList call BlockAbilityByRecordId success");
3180             ret = ERR_OK;
3181         }
3182     }
3183 
3184     if (defaultSingleList_) {
3185         HILOG_INFO("defaultSingleList begin to call BlockAbilityByRecordId %{public}s", __func__);
3186         if (defaultSingleList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3187             HILOG_INFO("defaultSingleList_ call BlockAbilityByRecordId success");
3188             ret = ERR_OK;
3189         }
3190     }
3191 
3192     if (launcherList_) {
3193         HILOG_INFO("launcherList begin to call BlockAbilityByRecordId %{public}s", __func__);
3194         if (launcherList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3195             HILOG_INFO("launcherList_ call BlockAbilityByRecordId success");
3196             ret = ERR_OK;
3197         }
3198     }
3199     return ret;
3200 }
3201 #endif
3202 
SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> & tokens)3203 void MissionListManager::SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> &tokens)
3204 {
3205     HILOG_INFO("%{public}s", __func__);
3206     for (auto &item : tokens) {
3207         auto abilityRecord = GetAbilityRecordByToken(item);
3208         if (abilityRecord == nullptr) {
3209             HILOG_WARN("abilityRecord is nullptr.");
3210             continue;
3211         }
3212         auto mission = abilityRecord->GetMission();
3213         if (mission == nullptr) {
3214             HILOG_WARN("mission is nullptr.");
3215             continue;
3216         }
3217         mission->SetANRState(true);
3218     }
3219 }
3220 }  // namespace AAFwk
3221 }  // namespace OHOS
3222