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