• 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                     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1070                     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1071                 }
1072                 return;
1073             }
1074             self->CompleteForegroundFailed(abilityRecord, state);
1075         };
1076         handler->PostTask(task);
1077     }
1078     return ERR_OK;
1079 }
1080 
CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> & abilityRecord)1081 void MissionListManager::CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord)
1082 {
1083     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1084     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1085 
1086     CHECK_POINTER(abilityRecord);
1087     // ability do not save window mode
1088     abilityRecord->RemoveWindowMode();
1089     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1090     HILOG_DEBUG("ability: %{public}s", element.c_str());
1091 
1092     abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
1093 
1094 #if BINDER_IPC_32BIT
1095     HILOG_INFO("notify bms ability life status, bundle name:%{public}s, ability name:%{public}s, time:%{public}lld",
1096         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1097         abilityRecord->GetAbilityInfo().name.c_str(),
1098         AbilityUtil::UTCTimeSeconds());
1099 #else
1100     HILOG_INFO("notify bms ability life status, bundle name:%{public}s, ability name:%{public}s, time:%{public}ld",
1101         abilityRecord->GetAbilityInfo().bundleName.c_str(),
1102         abilityRecord->GetAbilityInfo().name.c_str(),
1103         AbilityUtil::UTCTimeSeconds());
1104 #endif
1105 
1106     auto mission = abilityRecord->GetMission();
1107     if (mission) {
1108         auto currentTime = GetCurrentTime();
1109         mission->UpdateMissionTime(currentTime);
1110         InnerMissionInfo info;
1111         if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1112             mission->GetMissionId(), info) == 0) {
1113             info.missionInfo.time = currentTime;
1114             info.missionInfo.runningState = 0;
1115             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
1116         }
1117     }
1118 
1119     if (mission && mission->IsMovingState()) {
1120         mission->SetMovingState(false);
1121         if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
1122             listenerController_->NotifyMissionMovedToFront(mission->GetMissionId());
1123         }
1124     }
1125     PostStartWaitingAbility();
1126     TerminatePreviousAbility(abilityRecord);
1127 
1128     // new version. started by caller, scheduler call request
1129     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToForeground() && abilityRecord->IsReady()) {
1130         HILOG_DEBUG("call request after completing foreground state");
1131         abilityRecord->CallRequest();
1132         abilityRecord->SetStartToForeground(false);
1133     }
1134 
1135     if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1136         abilityRecord->SetMinimizeReason(true);
1137         MoveToBackgroundTask(abilityRecord);
1138     } else if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1139         HILOG_DEBUG("not continuous startup.");
1140         abilityRecord->SetPendingState(AbilityState::INITIAL);
1141     }
1142 }
1143 
TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1144 void MissionListManager::TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1145 {
1146     auto terminatingAbilityRecord = abilityRecord->GetPreAbilityRecord();
1147     if (!terminatingAbilityRecord) {
1148         HILOG_INFO("%{public}s, terminatingAbilityRecord is nullptr.", __func__);
1149         return;
1150     }
1151     abilityRecord->SetPreAbilityRecord(nullptr);
1152     auto self(shared_from_this());
1153     if (terminatingAbilityRecord->GetAbilityState() == AbilityState::FOREGROUND) {
1154         MoveToBackgroundTask(terminatingAbilityRecord);
1155     }
1156     if (terminatingAbilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1157         auto task = [terminatingAbilityRecord, self]() {
1158             HILOG_INFO("%{public}s, To terminate terminatingAbilityRecord.", __func__);
1159             self->DelayCompleteTerminate(terminatingAbilityRecord);
1160         };
1161         terminatingAbilityRecord->Terminate(task);
1162     }
1163 }
1164 
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1165 int MissionListManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1166 {
1167     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1168     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1169     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1170 
1171     if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
1172         HILOG_ERROR("Ability transition life state error. actual %{public}d", abilityRecord->GetAbilityState());
1173         return ERR_INVALID_VALUE;
1174     }
1175 
1176     // remove background timeout task.
1177     handler->RemoveTask(std::to_string(abilityRecord->GetEventId()));
1178     auto self(shared_from_this());
1179     auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1180     handler->PostTask(task);
1181 
1182     return ERR_OK;
1183 }
1184 
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1185 void MissionListManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1186 {
1187     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1188     if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1189         HILOG_ERROR("Ability state is %{public}d, it can't complete background.", abilityRecord->GetAbilityState());
1190         return;
1191     }
1192 
1193     abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1194     // send application state to AppMS.
1195     // notify AppMS to update application state.
1196     DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1197     if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1198         DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
1199     } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1200         HILOG_DEBUG("not continuous startup.");
1201         abilityRecord->SetPendingState(AbilityState::INITIAL);
1202     }
1203 
1204     if (abilityRecord->IsSwitchingPause()) {
1205         abilityRecord->SetSwitchingPause(false);
1206         return;
1207     }
1208 
1209     // Abilities ahead of the one started with SingleTask mode were put in terminate list, we need to terminate
1210     // them.
1211     auto self(shared_from_this());
1212     for (auto terminateAbility : terminateAbilityList_) {
1213         if (terminateAbility->GetAbilityState() == AbilityState::BACKGROUND) {
1214             auto timeoutTask = [terminateAbility, self]() {
1215                 HILOG_WARN("Terminate ability timeout after background.");
1216                 self->DelayCompleteTerminate(terminateAbility);
1217             };
1218             terminateAbility->Terminate(timeoutTask);
1219         }
1220     }
1221 
1222     // new version. started by caller, scheduler call request
1223     if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToBackground() && abilityRecord->IsReady()) {
1224         HILOG_DEBUG("call request after completing background state");
1225         abilityRecord->CallRequest();
1226         abilityRecord->SetStartToBackground(false);
1227     }
1228 }
1229 
TerminateAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool flag)1230 int MissionListManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1231     int resultCode, const Want *resultWant, bool flag)
1232 {
1233     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1234     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1235     HILOG_DEBUG("Terminate ability, ability is %{public}s.", element.c_str());
1236     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1237     if (abilityRecord->IsTerminating() && !abilityRecord->IsForeground()) {
1238         HILOG_ERROR("Ability is on terminating.");
1239         return ERR_OK;
1240     }
1241 
1242     if (abilityRecord->IsTerminating() && abilityRecord->IsForeground()) {
1243         HILOG_WARN("Ability is on terminating and ability state is foreground, force close");
1244         flag = false;
1245     }
1246 
1247     // double check to avoid the ability has been removed
1248     if (!GetAbilityRecordByToken(abilityRecord->GetToken())) {
1249         HILOG_ERROR("Ability has already been removed");
1250         return ERR_OK;
1251     }
1252 
1253     abilityRecord->SetTerminatingState();
1254     // save result to caller AbilityRecord
1255     if (resultWant != nullptr) {
1256         abilityRecord->SaveResultToCallers(resultCode, resultWant);
1257     } else {
1258         Want want;
1259         abilityRecord->SaveResultToCallers(resultCode, &want);
1260     }
1261 
1262     return TerminateAbilityLocked(abilityRecord, flag);
1263 }
1264 
TerminateAbility(const std::shared_ptr<AbilityRecord> & caller,int requestCode)1265 int MissionListManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &caller, int requestCode)
1266 {
1267     HILOG_DEBUG("Terminate ability with result called.");
1268     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1269 
1270     std::shared_ptr<AbilityRecord> targetAbility = GetAbilityRecordByCaller(caller, requestCode);
1271     if (!targetAbility) {
1272         HILOG_ERROR("%{public}s, Can't find target ability", __func__);
1273         return NO_FOUND_ABILITY_BY_CALLER;
1274     }
1275 
1276     auto abilityMs = DelayedSingleton<AbilityManagerService>::GetInstance();
1277     CHECK_POINTER_AND_RETURN(abilityMs, GET_ABILITY_SERVICE_FAILED)
1278     int result = abilityMs->JudgeAbilityVisibleControl(targetAbility->GetAbilityInfo());
1279     if (result != ERR_OK) {
1280         HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
1281         return result;
1282     }
1283 
1284     return TerminateAbility(targetAbility, DEFAULT_INVAL_VALUE, nullptr, true);
1285 }
1286 
TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1287 int MissionListManager::TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1288 {
1289     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1290     HILOG_DEBUG("Terminate ability locked, ability is %{public}s.", element.c_str());
1291     // remove AbilityRecord out of stack
1292     RemoveTerminatingAbility(abilityRecord, flag);
1293     abilityRecord->SendResultToCallers();
1294 
1295     // 1. if the ability was foreground, first should find wether there is other ability foreground
1296     if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) {
1297         HILOG_DEBUG("current ability is active");
1298         abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1299         auto nextAbilityRecord = abilityRecord->GetNextAbilityRecord();
1300         if (nextAbilityRecord) {
1301             nextAbilityRecord->SetPreAbilityRecord(abilityRecord);
1302 #ifdef SUPPORT_GRAPHICS
1303             nextAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1304             nextAbilityRecord->ProcessForegroundAbility(abilityRecord);
1305         } else {
1306             if (!abilityRecord->IsClearMissionFlag()) {
1307                 abilityRecord->NotifyAnimationFromTerminatingAbility();
1308             }
1309 #else
1310             nextAbilityRecord->ProcessForegroundAbility();
1311         } else {
1312 #endif
1313             MoveToBackgroundTask(abilityRecord);
1314         }
1315         return ERR_OK;
1316     }
1317 
1318     // 2. if the ability was BACKGROUNDING, waiting for completeBackgroundNew
1319 
1320     // 3. ability on background, schedule to terminate.
1321     if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1322         auto self(shared_from_this());
1323         auto task = [abilityRecord, self]() {
1324             HILOG_WARN("Terminate ability timeout.");
1325             self->DelayCompleteTerminate(abilityRecord);
1326         };
1327         abilityRecord->Terminate(task);
1328     }
1329     return ERR_OK;
1330 }
1331 
1332 /**
1333  * @brief This method aims to do things as below
1334  * 1. remove the mission from the current missionList
1335  * 2. if the current missionList is empty after, then remove from the manager
1336  * 3. if the current ability is foreground, then should schedule the next ability to foreground before terminate
1337  *
1338  * @param abilityRecord the ability that was terminating
1339  */
RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1340 void MissionListManager::RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1341 {
1342     std::string element = abilityRecord->GetWant().GetElement().GetURI();
1343     HILOG_DEBUG("Remove terminating ability, ability is %{public}s.", element.c_str());
1344     if (GetAbilityFromTerminateList(abilityRecord->GetToken())) {
1345         abilityRecord->SetNextAbilityRecord(nullptr);
1346         HILOG_DEBUG("Find ability in terminating list, return.");
1347         return;
1348     }
1349 
1350     auto missionList = abilityRecord->GetOwnedMissionList();
1351     CHECK_POINTER(missionList);
1352 
1353     missionList->RemoveMissionByAbilityRecord(abilityRecord);
1354     DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminate(abilityRecord->GetToken());
1355     terminateAbilityList_.push_back(abilityRecord);
1356 
1357     if (missionList->IsEmpty()) {
1358         HILOG_DEBUG("Remove terminating ability, missionList is empty, remove.");
1359         RemoveMissionList(missionList);
1360     }
1361 
1362     // 1. clear old
1363     abilityRecord->SetNextAbilityRecord(nullptr);
1364     // 2. if the ability to terminate is background, just background
1365     if (!(abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING))) {
1366         HILOG_DEBUG("Ability state is %{public}d, just return.", abilityRecord->GetAbilityState());
1367         return;
1368     }
1369     // 3. if close ability, noting to do
1370     if (!flag) {
1371         HILOG_DEBUG("Close ability schedule.");
1372         return;
1373     }
1374 
1375     // 4. the ability should find the next ability to foreground
1376     std::shared_ptr<AbilityRecord> needTopAbility;
1377     if (!missionList->IsEmpty()) {
1378         needTopAbility = missionList->GetTopAbility();
1379     } else {
1380         HILOG_DEBUG("mission list is empty, no next ability.");
1381     }
1382 
1383     if (!needTopAbility) {
1384         HILOG_DEBUG("The ability need to top is null.");
1385         if (!abilityRecord->IsNeedBackToOtherMissionStack()) {
1386             HILOG_INFO("This ability doesn't need back to other mission stack.");
1387             return;
1388         }
1389         needTopAbility = abilityRecord->GetOtherMissionStackAbilityRecord();
1390         if (!needTopAbility) {
1391             HILOG_ERROR("This ability needs back to other mission stack, but needTopAbility is null.");
1392             return;
1393         }
1394         abilityRecord->SetNeedBackToOtherMissionStack(false);
1395     }
1396     AppExecFwk::ElementName elementName = needTopAbility->GetWant().GetElement();
1397     HILOG_DEBUG("Next top ability is %{public}s, state is %{public}d, minimizeReason is %{public}d.",
1398         elementName.GetURI().c_str(), needTopAbility->GetAbilityState(), needTopAbility->IsMinimizeFromUser());
1399 
1400     // 5. if caller is recent, close
1401     if (elementName.GetBundleName() == AbilityConfig::LAUNCHER_BUNDLE_NAME
1402         && elementName.GetAbilityName() == AbilityConfig::LAUNCHER_RECENT_ABILITY_NAME) {
1403         HILOG_DEBUG("Next to need is recent, just to launcher.");
1404         needTopAbility = launcherList_->GetLauncherRoot();
1405     }
1406 
1407     if (!needTopAbility) {
1408         HILOG_DEBUG("NeedTopAbility of launcherRoot is null.");
1409         return;
1410     }
1411 
1412     if (!needTopAbility->IsForeground() && !needTopAbility->IsMinimizeFromUser() && needTopAbility->IsReady()) {
1413         HILOG_DEBUG("%{public}s is need to foreground.", elementName.GetURI().c_str());
1414         abilityRecord->SetNextAbilityRecord(needTopAbility);
1415     }
1416 }
1417 
RemoveMissionList(const std::shared_ptr<MissionList> & missionList)1418 void MissionListManager::RemoveMissionList(const std::shared_ptr<MissionList> &missionList)
1419 {
1420     if (missionList == nullptr) {
1421         return;
1422     }
1423 
1424     for (auto iter = currentMissionLists_.begin(); iter != currentMissionLists_.end(); iter++) {
1425         if ((*iter) == missionList) {
1426             currentMissionLists_.erase(iter);
1427             return;
1428         }
1429     }
1430 }
1431 
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1432 int MissionListManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1433 {
1434     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1435     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1436         HILOG_ERROR("DispatchTerminate error, ability state is %{public}d", abilityRecord->GetAbilityState());
1437         return INNER_ERR;
1438     }
1439 
1440     // remove terminate timeout task.
1441     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1442     CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1443     handler->RemoveTask(std::to_string(abilityRecord->GetEventId()));
1444     auto self(shared_from_this());
1445     auto task = [self, abilityRecord]() { self->CompleteTerminate(abilityRecord); };
1446     handler->PostTask(task);
1447 
1448     return ERR_OK;
1449 }
1450 
DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1451 void MissionListManager::DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1452 {
1453     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1454     CHECK_POINTER(handler);
1455 
1456     PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1457 
1458     auto timeoutTask = [self = shared_from_this(), abilityRecord]() {
1459         HILOG_INFO("emit delay complete terminate task.");
1460         self->CompleteTerminate(abilityRecord);
1461     };
1462     handler->PostTask(timeoutTask, "DELAY_KILL_PROCESS", AbilityManagerService::KILL_TIMEOUT);
1463 }
1464 
CompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1465 void MissionListManager::CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1466 {
1467     CHECK_POINTER(abilityRecord);
1468     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1469     if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1470         HILOG_ERROR("%{public}s, ability is not terminating.", __func__);
1471         return;
1472     }
1473 
1474     // notify AppMS terminate
1475     if (abilityRecord->TerminateAbility() != ERR_OK) {
1476         // Don't return here
1477         HILOG_ERROR("AppMS fail to terminate ability.");
1478     }
1479 
1480     auto&& preAbilityRecord = abilityRecord->GetPreAbilityRecord();
1481     if (preAbilityRecord != nullptr) {
1482         TerminateAbilityLocked(preAbilityRecord, false);
1483     }
1484 
1485     CompleteTerminateAndUpdateMission(abilityRecord);
1486 }
1487 
CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> & abilityRecord)1488 void MissionListManager::CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> &abilityRecord)
1489 {
1490     CHECK_POINTER(abilityRecord);
1491     for (auto it : terminateAbilityList_) {
1492         if (it == abilityRecord) {
1493             abilityRecord->RemoveUriPermission();
1494             terminateAbilityList_.remove(it);
1495             // update inner mission info time
1496             bool excludeFromMissions = abilityRecord->GetAbilityInfo().excludeFromMissions;
1497             if ((abilityRecord->GetAppIndex() != 0) || abilityRecord->GetAbilityInfo().removeMissionAfterTerminate ||
1498                 excludeFromMissions) {
1499                 RemoveMissionLocked(abilityRecord->GetMissionId(), excludeFromMissions);
1500                 return;
1501             }
1502             InnerMissionInfo innerMissionInfo;
1503             auto missionId = abilityRecord->GetMissionId();
1504             int result = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1505                 missionId, innerMissionInfo);
1506             if (result != 0) {
1507                 HILOG_ERROR("Get missionInfo error, result is %{public}d, missionId is %{public}d", result, missionId);
1508                 break;
1509             }
1510             innerMissionInfo.missionInfo.time = GetCurrentTime();
1511             innerMissionInfo.missionInfo.runningState = -1;
1512             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
1513             if (listenerController_) {
1514                 listenerController_->NotifyMissionClosed(missionId);
1515             }
1516             HILOG_DEBUG("Destroy ability record count %{public}ld", abilityRecord.use_count());
1517             break;
1518         }
1519         HILOG_WARN("Can't find ability in terminate list.");
1520     }
1521 }
1522 
GetAbilityFromTerminateList(const sptr<IRemoteObject> & token)1523 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityFromTerminateList(const sptr<IRemoteObject> &token)
1524 {
1525     if (!token) {
1526         return nullptr;
1527     }
1528 
1529     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1530     for (auto abilityRecord : terminateAbilityList_) {
1531         // token is type of IRemoteObject, abilityRecord->GetToken() is type of Token extending from IRemoteObject.
1532         if (abilityRecord && abilityRecord->GetToken() && token == abilityRecord->GetToken()->AsObject()) {
1533             return abilityRecord;
1534         }
1535     }
1536     return nullptr;
1537 }
1538 
ClearMission(int missionId)1539 int MissionListManager::ClearMission(int missionId)
1540 {
1541     if (missionId < 0) {
1542         HILOG_ERROR("Mission id is invalid.");
1543         return ERR_INVALID_VALUE;
1544     }
1545     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1546     auto mission = GetMissionById(missionId);
1547     if (mission && mission->GetMissionList() && mission->GetMissionList()->GetType() == MissionListType::LAUNCHER) {
1548         HILOG_ERROR("Mission id is launcher, can not clear.");
1549         return ERR_INVALID_VALUE;
1550     }
1551 
1552     if (IsExcludeFromMissions(mission)) {
1553         HILOG_WARN("excludeFromMissions is true, not clear by id.");
1554         return ERR_INVALID_VALUE;
1555     }
1556 
1557     return ClearMissionLocked(missionId, mission);
1558 }
1559 
ClearMissionLocked(int missionId,const std::shared_ptr<Mission> & mission)1560 int MissionListManager::ClearMissionLocked(int missionId, const std::shared_ptr<Mission> &mission)
1561 {
1562     if (missionId != -1) {
1563         DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
1564         if (listenerController_) {
1565             listenerController_->NotifyMissionDestroyed(missionId);
1566         }
1567     }
1568     if (mission == nullptr) {
1569         HILOG_DEBUG("ability has already terminate, just remove mission.");
1570         return ERR_OK;
1571     }
1572 
1573     auto abilityRecord = mission->GetAbilityRecord();
1574     if (abilityRecord == nullptr || abilityRecord->IsTerminating()) {
1575         HILOG_WARN("Ability record is not exist or is on terminating.");
1576         return ERR_OK;
1577     }
1578 
1579     abilityRecord->SetTerminatingState();
1580     abilityRecord->SetClearMissionFlag(true);
1581     auto ret = TerminateAbilityLocked(abilityRecord, false);
1582     if (ret != ERR_OK) {
1583         HILOG_ERROR("clear mission error: %{public}d.", ret);
1584         return REMOVE_MISSION_FAILED;
1585     }
1586 
1587     return ERR_OK;
1588 }
1589 
ClearAllMissions()1590 int MissionListManager::ClearAllMissions()
1591 {
1592     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1593     DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteAllMissionInfos(listenerController_);
1594     std::list<std::shared_ptr<Mission>> foregroundAbilities;
1595     ClearAllMissionsLocked(defaultStandardList_->GetAllMissions(), foregroundAbilities, false);
1596     ClearAllMissionsLocked(defaultSingleList_->GetAllMissions(), foregroundAbilities, false);
1597 
1598     for (auto listIter = currentMissionLists_.begin(); listIter != currentMissionLists_.end();) {
1599         auto missionList = (*listIter);
1600         listIter++;
1601         if (!missionList || missionList->GetType() == MissionListType::LAUNCHER) {
1602             continue;
1603         }
1604         ClearAllMissionsLocked(missionList->GetAllMissions(), foregroundAbilities, true);
1605     }
1606 
1607     ClearAllMissionsLocked(foregroundAbilities, foregroundAbilities, false);
1608     return ERR_OK;
1609 }
1610 
ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> & missionList,std::list<std::shared_ptr<Mission>> & foregroundAbilities,bool searchActive)1611 void MissionListManager::ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> &missionList,
1612     std::list<std::shared_ptr<Mission>> &foregroundAbilities, bool searchActive)
1613 {
1614     for (auto listIter = missionList.begin(); listIter != missionList.end();) {
1615         auto mission = (*listIter);
1616         listIter++;
1617         if (!mission || mission->IsLockedState()) {
1618             continue;
1619         }
1620 
1621         auto abilityMs_ = OHOS::DelayedSingleton<AbilityManagerService>::GetInstance();
1622         if (abilityMs_->IsBackgroundTaskUid(mission->GetAbilityRecord()->GetUid())) {
1623             HILOG_INFO("the mission is background task, do not need clear");
1624             continue;
1625         }
1626 
1627         if (searchActive && mission->GetAbilityRecord() && mission->GetAbilityRecord()->IsActiveState()) {
1628             foregroundAbilities.push_front(mission);
1629             continue;
1630         }
1631         ClearMissionLocked(-1, mission);
1632     }
1633 }
1634 
SetMissionLockedState(int missionId,bool lockedState)1635 int MissionListManager::SetMissionLockedState(int missionId, bool lockedState)
1636 {
1637     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1638     if (missionId < 0) {
1639         HILOG_ERROR("param is invalid");
1640         return MISSION_NOT_FOUND;
1641     }
1642 
1643     std::shared_ptr<Mission> mission = GetMissionById(missionId);
1644     if (mission) {
1645         auto abilityRecord = mission->GetAbilityRecord();
1646         if (abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions) {
1647             HILOG_ERROR("excludeFromMissions is true, missionId:%{public}d", missionId);
1648             return MISSION_NOT_FOUND;
1649         }
1650         mission->SetLockedState(lockedState);
1651     }
1652 
1653     // update inner mission info time
1654     InnerMissionInfo innerMissionInfo;
1655     auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo);
1656     if (ret != 0) {
1657         HILOG_ERROR("mission is not exist, missionId %{public}d", missionId);
1658         return MISSION_NOT_FOUND;
1659     }
1660     innerMissionInfo.missionInfo.lockedState = lockedState;
1661     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
1662     return ERR_OK;
1663 }
1664 
UpdateSnapShot(const sptr<IRemoteObject> & token)1665 void MissionListManager::UpdateSnapShot(const sptr<IRemoteObject>& token)
1666 {
1667     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1668     auto abilityRecord = GetAbilityRecordByToken(token);
1669     if (!abilityRecord) {
1670         HILOG_ERROR("Cannot find AbilityRecord by Token.");
1671         return;
1672     }
1673     HILOG_INFO("UpdateSnapShot, ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
1674     UpdateMissionSnapshot(abilityRecord);
1675 }
1676 
MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> & abilityRecord)1677 void MissionListManager::MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1678 {
1679     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1680     if (abilityRecord == nullptr) {
1681         HILOG_ERROR("Move the ability to background fail, ability record is null.");
1682         return;
1683     }
1684     HILOG_INFO("Move the ability to background, ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
1685     abilityRecord->SetIsNewWant(false);
1686     if (abilityRecord->lifeCycleStateInfo_.sceneFlag != SCENE_FLAG_KEYGUARD && !abilityRecord->IsClearMissionFlag()) {
1687         UpdateMissionSnapshot(abilityRecord);
1688     }
1689 
1690     auto self(shared_from_this());
1691     auto task = [abilityRecord, self]() {
1692         HILOG_ERROR("Mission list manager move to background timeout.");
1693         self->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
1694         self->CompleteBackground(abilityRecord);
1695     };
1696     abilityRecord->BackgroundAbility(task);
1697 }
1698 
NotifyMissionCreated(const std::shared_ptr<AbilityRecord> & abilityRecord) const1699 void  MissionListManager::NotifyMissionCreated(const std::shared_ptr<AbilityRecord> &abilityRecord) const
1700 {
1701     CHECK_POINTER(abilityRecord);
1702     auto mission = abilityRecord->GetMission();
1703     if (mission && mission->NeedNotify() && listenerController_ &&
1704         !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
1705         auto missionId = abilityRecord->GetMissionId();
1706         listenerController_->NotifyMissionCreated(missionId);
1707         mission->SetNotifyLabel(false);
1708 
1709         if (mission->NeedNotifyUpdateLabel()) {
1710             PostMissionLabelUpdateTask(missionId);
1711             mission->SetNeedNotifyUpdateLabel(false);
1712         }
1713     }
1714 }
1715 
PostMissionLabelUpdateTask(int missionId) const1716 void MissionListManager::PostMissionLabelUpdateTask(int missionId) const
1717 {
1718     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1719     if (handler == nullptr) {
1720         HILOG_ERROR("Fail to get EventHandler, do not post mission label update message.");
1721         return;
1722     }
1723 
1724     std::weak_ptr<MissionListenerController> wpController = listenerController_;
1725     auto task = [wpController, missionId] {
1726         auto controller = wpController.lock();
1727         if (controller == nullptr) {
1728             HILOG_ERROR("controller is nullptr.");
1729             return;
1730         }
1731         controller->NotifyMissionLabelUpdated(missionId);
1732     };
1733     handler->PostTask(task, "NotifyMissionLabelUpdated.", DELAY_NOTIFY_LABEL_TIME);
1734 }
1735 
PrintTimeOutLog(const std::shared_ptr<AbilityRecord> & ability,uint32_t msgId)1736 void MissionListManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId)
1737 {
1738     if (ability == nullptr) {
1739         HILOG_ERROR("ability is nullptr");
1740         return;
1741     }
1742 
1743     AppExecFwk::RunningProcessInfo processInfo = {};
1744     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
1745     if (processInfo.pid_ == 0) {
1746         HILOG_ERROR("error: the ability[%{public}s], app may fork fail or not running.",
1747             ability->GetAbilityInfo().name.data());
1748         return;
1749     }
1750     std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
1751     switch (msgId) {
1752         case AbilityManagerService::LOAD_TIMEOUT_MSG:
1753             msgContent += "load timeout";
1754             break;
1755         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1756             msgContent += "active timeout";
1757             break;
1758         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1759             msgContent += "inactive timeout";
1760             break;
1761         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1762             msgContent += "foreground timeout";
1763             break;
1764         case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
1765             msgContent += "background timeout";
1766             break;
1767         case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
1768             msgContent += "terminate timeout";
1769             break;
1770         default:
1771             return;
1772     }
1773     std::string eventType = "LIFECYCLE_TIMEOUT";
1774     OHOS::HiviewDFX::HiSysEvent::Write(OHOS::HiviewDFX::HiSysEvent::Domain::AAFWK, eventType,
1775         OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
1776         EVENT_KEY_UID, processInfo.uid_,
1777         EVENT_KEY_PID, processInfo.pid_,
1778         EVENT_KEY_PACKAGE_NAME, ability->GetAbilityInfo().bundleName,
1779         EVENT_KEY_PROCESS_NAME, processInfo.processName_,
1780         EVENT_KEY_MESSAGE, msgContent);
1781 
1782     HILOG_WARN("LIFECYCLE_TIMEOUT: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
1783         "msg: %{public}s", processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
1784         ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
1785 }
1786 
UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord> & abilityRecord) const1787 void MissionListManager::UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord>& abilityRecord) const
1788 {
1789     CHECK_POINTER(abilityRecord);
1790     if (abilityRecord->GetAbilityInfo().excludeFromMissions) {
1791         HILOG_DEBUG("excludeFromMissions is true, no need to update mission snapshot.");
1792         return;
1793     }
1794     int32_t missionId = abilityRecord->GetMissionId();
1795     MissionSnapshot snapshot;
1796     snapshot.isPrivate = (abilityRecord->GetAppIndex() != 0);
1797     DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionSnapshot(missionId, abilityRecord->GetToken(),
1798         snapshot);
1799     if (listenerController_) {
1800         listenerController_->NotifyMissionSnapshotChanged(missionId);
1801     }
1802 }
1803 
OnTimeOut(uint32_t msgId,int64_t eventId)1804 void MissionListManager::OnTimeOut(uint32_t msgId, int64_t eventId)
1805 {
1806     HILOG_DEBUG("On timeout, msgId is %{public}d", msgId);
1807     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1808     auto abilityRecord = GetAbilityRecordByEventId(eventId);
1809     if (abilityRecord == nullptr) {
1810         HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1811         return;
1812     }
1813     HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId,
1814         abilityRecord->GetAbilityInfo().name.c_str());
1815     abilityRecord->RemoveUriPermission();
1816 
1817 #ifdef SUPPORT_GRAPHICS
1818     if (abilityRecord->IsStartingWindow()) {
1819         PostCancelStartingWindowTask(abilityRecord);
1820     }
1821 #endif
1822 
1823     PrintTimeOutLog(abilityRecord, msgId);
1824     switch (msgId) {
1825         case AbilityManagerService::LOAD_TIMEOUT_MSG:
1826             HandleLoadTimeout(abilityRecord);
1827             break;
1828         case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1829             break;
1830         case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1831         case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1832             HandleForegroundTimeout(abilityRecord);
1833             break;
1834         default:
1835             break;
1836     }
1837 }
1838 
HandleLoadTimeout(const std::shared_ptr<AbilityRecord> & ability)1839 void MissionListManager::HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &ability)
1840 {
1841     if (ability == nullptr) {
1842         HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1843         return;
1844     }
1845     // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
1846     if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
1847         ability->SetRestarting(true);
1848         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1849         HILOG_INFO("Launcher root load timeout, restart.");
1850         DelayedStartLauncher();
1851         return;
1852     }
1853 
1854     // other
1855     HandleTimeoutAndResumeAbility(ability);
1856 }
1857 
HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> & ability,AbilityState state)1858 void MissionListManager::HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &ability, AbilityState state)
1859 {
1860     if (ability == nullptr) {
1861         HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1862         return;
1863     }
1864 
1865     if (ability->GetMission()) {
1866         ability->GetMission()->SetMovingState(false);
1867     }
1868 
1869     if (!ability->IsAbilityState(AbilityState::FOREGROUNDING)) {
1870         HILOG_ERROR("this ability is not foregrounding state.");
1871         return;
1872     }
1873 
1874     // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
1875     if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
1876         DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1877         HILOG_INFO("Launcher root load timeout, restart.");
1878         DelayedStartLauncher();
1879         return;
1880     }
1881 
1882     // other
1883     HandleTimeoutAndResumeAbility(ability, state);
1884 }
1885 
CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> & abilityRecord,AbilityState state)1886 void MissionListManager::CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> &abilityRecord,
1887     AbilityState state)
1888 {
1889     HILOG_DEBUG("CompleteForegroundFailed come, state: %{public}d.", static_cast<int32_t>(state));
1890     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1891     if (abilityRecord == nullptr) {
1892         HILOG_ERROR("CompleteForegroundFailed, ability is nullptr.");
1893         return;
1894     }
1895 
1896 #ifdef SUPPORT_GRAPHICS
1897     if (state == AbilityState::FOREGROUND_INVALID_MODE) {
1898         abilityRecord->SetStartingWindow(false);
1899     }
1900     if (abilityRecord->IsStartingWindow()) {
1901         PostCancelStartingWindowTask(abilityRecord);
1902     }
1903 #endif
1904 
1905     HandleForegroundTimeout(abilityRecord, state);
1906     TerminatePreviousAbility(abilityRecord);
1907     PostStartWaitingAbility();
1908 }
1909 
HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> & timeOutAbilityRecord,AbilityState state)1910 void MissionListManager::HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> &timeOutAbilityRecord,
1911     AbilityState state)
1912 {
1913     HILOG_DEBUG("HandleTimeoutAndResumeTopAbility start");
1914     if (timeOutAbilityRecord == nullptr) {
1915         HILOG_ERROR("LoadAndForeGroundCommon: timeOutAbilityRecord is nullptr.");
1916         return;
1917     }
1918 
1919     // complete mission list moving
1920     MoveToTerminateList(timeOutAbilityRecord);
1921 
1922     // load and foreground timeout, notify appMs force terminate the ability.
1923     DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(timeOutAbilityRecord->GetToken());
1924 
1925     // caller not exist or caller is service or timeout ability is launcher, back to launcher
1926     auto callerAbility = timeOutAbilityRecord->GetCallerRecord();
1927     if ((callerAbility == nullptr) ||
1928         (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::SERVICE) ||
1929         (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::EXTENSION) ||
1930         timeOutAbilityRecord->IsLauncherAbility() ||
1931         callerAbility->IsLauncherAbility()) {
1932         HILOG_DEBUG("ability timeout, back to launcher.");
1933         DelayedStartLauncher();
1934         return;
1935     }
1936 
1937     if (state != AbilityState::FOREGROUND_INVALID_MODE) {
1938         DelayedResumeTimeout(callerAbility);
1939     }
1940 
1941     HILOG_INFO("HandleTimeoutAndResumeTopAbility end");
1942 }
1943 
DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> & callerAbility)1944 void MissionListManager::DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> &callerAbility)
1945 {
1946     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1947     CHECK_POINTER(abilityManagerService);
1948     auto handler = abilityManagerService->GetEventHandler();
1949     CHECK_POINTER(handler);
1950     std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
1951     auto timeoutTask = [wpListMgr, callerAbility]() {
1952         HILOG_DEBUG("The caller ability need to resume.");
1953         auto listMgr = wpListMgr.lock();
1954         if (listMgr) {
1955             listMgr->BackToCaller(callerAbility);
1956         }
1957     };
1958     handler->PostTask(timeoutTask, "Caller_Restart");
1959 }
1960 
BackToCaller(const std::shared_ptr<AbilityRecord> & callerAbility)1961 void MissionListManager::BackToCaller(const std::shared_ptr<AbilityRecord> &callerAbility)
1962 {
1963     HILOG_INFO("Back to Caller.");
1964     std::lock_guard<std::recursive_mutex> guard(managerLock_);
1965 
1966     // caller is already the top ability and foregroundnew.
1967     auto topAbility = GetCurrentTopAbilityLocked();
1968     if (callerAbility == topAbility && topAbility->IsAbilityState(AbilityState::FOREGROUND)) {
1969         HILOG_DEBUG("caller is already the top ability and foregroundnew.");
1970         return;
1971     }
1972 
1973     // other , resume caller ability to top and foreground.
1974     MoveMissionToFront(callerAbility->GetMissionId(), false);
1975 }
1976 
MoveToTerminateList(const std::shared_ptr<AbilityRecord> & abilityRecord)1977 void MissionListManager::MoveToTerminateList(const std::shared_ptr<AbilityRecord>& abilityRecord)
1978 {
1979     HILOG_INFO("MoveToDefaultList start.");
1980     if (abilityRecord == nullptr) {
1981         HILOG_ERROR("timeout ability record is nullptr.");
1982         return;
1983     }
1984     auto missionList = abilityRecord->GetOwnedMissionList();
1985     if (missionList == nullptr) {
1986         HILOG_ERROR("timeout missionList is nullptr.");
1987         return;
1988     }
1989     auto selMission = abilityRecord->GetMission();
1990     if (selMission == nullptr) {
1991         HILOG_ERROR("timeout mission is nullptr.");
1992         return;
1993     }
1994 
1995     missionList->RemoveMission(selMission);
1996     if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
1997         RemoveMissionList(missionList);
1998     }
1999 
2000     // load timeout will not wait for died event, directly remove.
2001     if (abilityRecord->IsAbilityState(AbilityState::INITIAL)) {
2002         HILOG_WARN("load timeout will not wait for died event, directly remove.");
2003         // update running state.
2004         InnerMissionInfo info;
2005         auto missionId = selMission->GetMissionId();
2006         if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2007             info.missionInfo.runningState = -1;
2008             if (listenerController_) {
2009                 listenerController_->NotifyMissionClosed(missionId);
2010             }
2011             DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2012         }
2013         return;
2014     }
2015     HILOG_DEBUG("success move timeout ability to terminate mission list.");
2016     // other remove to terminate list.
2017     abilityRecord->SetTerminatingState();
2018     terminateAbilityList_.push_back(abilityRecord);
2019 
2020     HILOG_INFO("MoveToDefaultList end");
2021 }
2022 
GetAbilityRecordByCaller(const std::shared_ptr<AbilityRecord> & caller,int requestCode)2023 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByCaller(
2024     const std::shared_ptr<AbilityRecord> &caller, int requestCode)
2025 {
2026     if (!caller) {
2027         return nullptr;
2028     }
2029 
2030     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2031     for (auto missionList : currentMissionLists_) {
2032         if (missionList && (abilityRecord = missionList->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2033             return abilityRecord;
2034         }
2035     }
2036 
2037     if ((abilityRecord = defaultSingleList_->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2038         return abilityRecord;
2039     }
2040 
2041     return defaultStandardList_->GetAbilityRecordByCaller(caller, requestCode);
2042 }
2043 
GetAbilityRecordByEventId(int64_t eventId) const2044 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByEventId(int64_t eventId) const
2045 {
2046     std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2047     for (auto missionList : currentMissionLists_) {
2048         if (missionList && (abilityRecord = missionList->GetAbilityRecordById(eventId)) != nullptr) {
2049             return abilityRecord;
2050         }
2051     }
2052 
2053     if ((abilityRecord = defaultSingleList_->GetAbilityRecordById(eventId)) != nullptr) {
2054         return abilityRecord;
2055     }
2056 
2057     return defaultStandardList_->GetAbilityRecordById(eventId);
2058 }
2059 
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord,int32_t currentUserId)2060 void MissionListManager::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord, int32_t currentUserId)
2061 {
2062     HILOG_INFO("On ability died.");
2063     if (!abilityRecord) {
2064         HILOG_ERROR("OnAbilityDied come, abilityRecord is nullptr.");
2065         return;
2066     }
2067     std::string element = abilityRecord->GetWant().GetElement().GetURI();
2068     HILOG_DEBUG("OnAbilityDied come, ability is %{public}s", element.c_str());
2069     if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2070         HILOG_ERROR("Ability type is not page.");
2071         return;
2072     }
2073 
2074     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2075 #ifdef SUPPORT_GRAPHICS
2076     if (abilityRecord->IsStartingWindow()) {
2077         PostCancelStartingWindowTask(abilityRecord);
2078     }
2079 #endif
2080 
2081     if (abilityRecord->IsLauncherRoot() && currentUserId != userId_) {
2082         HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__);
2083         abilityRecord->SetAbilityState(AbilityState::INITIAL);
2084         abilityRecord->SetRestarting(true);
2085         return;
2086     }
2087 
2088     HandleAbilityDied(abilityRecord);
2089 }
2090 
GetTargetMissionList(int missionId,std::shared_ptr<Mission> & mission)2091 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionList(int missionId, std::shared_ptr<Mission> &mission)
2092 {
2093     mission = GetMissionById(missionId);
2094     if (mission) {
2095         HILOG_DEBUG("get mission by id successfully, missionId: %{public}d", missionId);
2096         auto missionList = mission->GetMissionList();
2097         if (!missionList) {
2098             // mission is not null ptr, so its missionList ptr should be not null ptr too.
2099             HILOG_ERROR("mission list ptr is null ptr");
2100             return nullptr;
2101         }
2102 
2103         auto missionType = missionList->GetType();
2104         std::shared_ptr<MissionList> targetMissionList = nullptr;
2105         switch (missionType) {
2106             case LAUNCHER:
2107                 // not support move launcher to front.
2108                 HILOG_ERROR("get launcher mission list, missionId: %{public}d", missionId);
2109                 break;
2110             case CURRENT:
2111                 targetMissionList = mission->GetMissionList();
2112                 break;
2113             case DEFAULT_STANDARD:
2114             case DEFAULT_SINGLE:
2115                 // generate a new missionList
2116                 targetMissionList = std::make_shared<MissionList>();
2117                 break;
2118             default:
2119                 HILOG_ERROR("invalid missionType: %{public}d", missionType);
2120         }
2121         return targetMissionList;
2122     }
2123 
2124     // cannot find mission, may reasons: system restart or mission removed by system.
2125     HILOG_INFO("cannot find mission from MissionList by missionId: %{public}d", missionId);
2126 
2127     InnerMissionInfo innerMissionInfo;
2128     int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
2129         missionId, innerMissionInfo);
2130     if (getMission != ERR_OK) {
2131         HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId);
2132         return nullptr;
2133     }
2134 
2135     // generate a new mission and missionList
2136     AbilityRequest abilityRequest;
2137     int generateAbility = DelayedSingleton<AbilityManagerService>::GetInstance()->GenerateAbilityRequest(
2138         innerMissionInfo.missionInfo.want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, userId_);
2139     if (generateAbility != ERR_OK) {
2140         HILOG_ERROR("cannot find generate ability request, missionId: %{public}d", missionId);
2141         return nullptr;
2142     }
2143 
2144     auto abilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
2145     mission = std::make_shared<Mission>(innerMissionInfo.missionInfo.id, abilityRecord, innerMissionInfo.missionName);
2146     mission->SetLockedState(innerMissionInfo.missionInfo.lockedState);
2147     abilityRecord->SetMission(mission);
2148     abilityRecord->SetOwnerMissionUserId(userId_);
2149     std::shared_ptr<MissionList> newMissionList = std::make_shared<MissionList>();
2150     return newMissionList;
2151 }
2152 
GetMissionIdByAbilityToken(const sptr<IRemoteObject> & token)2153 int32_t MissionListManager::GetMissionIdByAbilityToken(const sptr<IRemoteObject> &token)
2154 {
2155     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2156     auto abilityRecord = GetAbilityRecordByToken(token);
2157     if (!abilityRecord) {
2158         return -1;
2159     }
2160     auto mission = abilityRecord->GetMission();
2161     if (!mission) {
2162         return -1;
2163     }
2164     return mission->GetMissionId();
2165 }
2166 
GetAbilityTokenByMissionId(int32_t missionId)2167 sptr<IRemoteObject> MissionListManager::GetAbilityTokenByMissionId(int32_t missionId)
2168 {
2169     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2170     sptr<IRemoteObject> result = nullptr;
2171     for (auto missionList : currentMissionLists_) {
2172         if (missionList && (result = missionList->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2173             return result;
2174         }
2175     }
2176 
2177     if ((result = defaultSingleList_->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2178         return result;
2179     }
2180 
2181     return defaultStandardList_->GetAbilityTokenByMissionId((missionId));
2182 }
2183 
PostStartWaitingAbility()2184 void MissionListManager::PostStartWaitingAbility()
2185 {
2186     auto self(shared_from_this());
2187     auto startWaitingAbilityTask = [self]() { self->StartWaitingAbility(); };
2188 
2189     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2190     CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
2191 
2192     /* PostTask to trigger start Ability from waiting queue */
2193     handler->PostTask(startWaitingAbilityTask, "startWaitingAbility");
2194 }
2195 
HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)2196 void MissionListManager::HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
2197 {
2198     HILOG_INFO("Handle Ability Died.");
2199     CHECK_POINTER(abilityRecord);
2200 
2201     if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2202         HILOG_ERROR("Ability type is not page.");
2203         return;
2204     }
2205 
2206     if (abilityRecord->IsLauncherAbility()) {
2207         HandleLauncherDied(abilityRecord);
2208         return;
2209     }
2210 
2211     HandleAbilityDiedByDefault(abilityRecord);
2212 }
2213 
HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)2214 void MissionListManager::HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)
2215 {
2216     HILOG_INFO("Handle launcher Ability Died.");
2217     auto mission = ability->GetMission();
2218     CHECK_POINTER_LOG(mission, "Fail to get launcher mission.");
2219     auto missionList = mission->GetMissionList();
2220     if (launcherList_ != missionList) {
2221         HILOG_ERROR("not launcher missionList.");
2222         return;
2223     }
2224 
2225     bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2226     if (ability->IsLauncherRoot()) {
2227         HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__);
2228         ability->SetAbilityState(AbilityState::INITIAL);
2229         ability->SetRestarting(true);
2230     } else {
2231         HILOG_INFO("launcher Ability died, remove, %{public}d", __LINE__);
2232         missionList->RemoveMission(mission);
2233     }
2234     if (isForeground) {
2235         HILOG_INFO("active launcher ability died, start launcher, %{public}d", __LINE__);
2236         DelayedStartLauncher();
2237     }
2238 }
2239 
HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)2240 void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)
2241 {
2242     HILOG_INFO("Handle Ability DiedByDefault.");
2243     CHECK_POINTER_LOG(ability, "ability is null.");
2244     if (ability->IsTerminating()) {
2245         HILOG_INFO("Handle Ability DiedByTerminating.");
2246         CompleteTerminateAndUpdateMission(ability);
2247         return;
2248     }
2249 
2250     auto mission = ability->GetMission();
2251     CHECK_POINTER_LOG(mission, "Fail to get mission.");
2252     auto missionList = mission->GetMissionList();
2253     CHECK_POINTER_LOG(missionList, "Fail to get mission list.");
2254 
2255     std::shared_ptr<AbilityRecord> launcherRoot = launcherList_->GetLauncherRoot();
2256     bool isLauncherActive = (launcherRoot &&
2257         (launcherRoot->IsAbilityState(FOREGROUND) || launcherRoot->IsAbilityState(FOREGROUNDING)));
2258     bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2259 
2260     // remove from mission list.
2261     missionList->RemoveMission(mission);
2262     if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
2263         RemoveMissionList(missionList);
2264     }
2265 
2266     // update running state.
2267     auto missionId = mission->GetMissionId();
2268     if (!ability->IsUninstallAbility()) {
2269         if ((ability->GetAppIndex() != 0) || ability->GetAbilityInfo().removeMissionAfterTerminate ||
2270             ability->GetAbilityInfo().excludeFromMissions) {
2271             RemoveMissionLocked(missionId, ability->GetAbilityInfo().excludeFromMissions);
2272         } else {
2273             InnerMissionInfo info;
2274             if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2275                 info.missionInfo.runningState = -1;
2276                 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2277             }
2278 
2279             if (listenerController_) {
2280                 listenerController_->NotifyMissionClosed(missionId);
2281             }
2282         }
2283     }
2284 
2285     // start launcher
2286     if (isForeground && !isLauncherActive) {
2287         HILOG_INFO("active ability died, start launcher later, %{public}d", __LINE__);
2288         DelayedStartLauncher();
2289     }
2290 }
2291 
DelayedStartLauncher()2292 void MissionListManager::DelayedStartLauncher()
2293 {
2294     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
2295     CHECK_POINTER(abilityManagerService);
2296     auto handler = abilityManagerService->GetEventHandler();
2297     CHECK_POINTER(handler);
2298     std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
2299     auto timeoutTask = [wpListMgr]() {
2300         HILOG_DEBUG("The launcher needs to be restarted.");
2301         auto listMgr = wpListMgr.lock();
2302         if (listMgr) {
2303             listMgr->BackToLauncher();
2304         }
2305     };
2306     handler->PostTask(timeoutTask, "Launcher_Restart");
2307 }
2308 
BackToLauncher()2309 void MissionListManager::BackToLauncher()
2310 {
2311     HILOG_INFO("Back to launcher.");
2312     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2313     CHECK_POINTER(launcherList_);
2314 
2315     auto launcherRootAbility = launcherList_->GetLauncherRoot();
2316     if (!launcherRootAbility) {
2317         HILOG_WARN("no root launcher ability, no need back to launcher.");
2318         return;
2319     }
2320 
2321     if (launcherRootAbility->GetAbilityInfo().bundleName != AbilityConfig::LAUNCHER_BUNDLE_NAME) {
2322         HILOG_WARN("not launcher mission, no need back to launcher.");
2323         return;
2324     }
2325 
2326     auto launcherRootMission = launcherRootAbility->GetMission();
2327     if (!launcherRootMission) {
2328         HILOG_WARN("no root launcher mission, no need back to launcher.");
2329         return;
2330     }
2331 
2332     std::queue<AbilityRequest> emptyQueue;
2333     std::swap(waitingAbilityQueue_, emptyQueue);
2334 
2335     launcherList_->AddMissionToTop(launcherRootMission);
2336     MoveMissionListToTop(launcherList_);
2337     launcherRootAbility->ProcessForegroundAbility();
2338 }
2339 
2340 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const sptr<IRemoteObject> & token,const std::string & label)2341 int MissionListManager::SetMissionLabel(const sptr<IRemoteObject> &token, const std::string &label)
2342 {
2343     if (!token) {
2344         HILOG_INFO("SetMissionLabel token is nullptr.");
2345         return -1;
2346     }
2347 
2348     auto missionId = GetMissionIdByAbilityToken(token);
2349     if (missionId <= 0) {
2350         HILOG_INFO("SetMissionLabel find mission failed.");
2351         return -1;
2352     }
2353 
2354     // store label if not notify mission created.
2355     auto abilityRecord = GetAbilityRecordByToken(token);
2356     if (abilityRecord) {
2357         auto mission = abilityRecord->GetMission();
2358         if (mission && mission->NeedNotify()) {
2359             mission->SetNeedNotifyUpdateLabel(true);
2360         }
2361     }
2362 
2363     auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionLabel(missionId, label);
2364     if (ret == 0 && listenerController_) {
2365         listenerController_->NotifyMissionLabelUpdated(missionId);
2366     }
2367 
2368     return ret;
2369 }
2370 
SetMissionIcon(const sptr<IRemoteObject> & token,const std::shared_ptr<Media::PixelMap> & icon)2371 int MissionListManager::SetMissionIcon(const sptr<IRemoteObject> &token, const std::shared_ptr<Media::PixelMap> &icon)
2372 {
2373     if (!token) {
2374         HILOG_INFO("SetMissionIcon token is nullptr.");
2375         return -1;
2376     }
2377 
2378     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2379     auto missionId = GetMissionIdByAbilityToken(token);
2380     if (missionId <= 0) {
2381         HILOG_ERROR("SetMissionIcon find mission failed.");
2382         return -1;
2383     }
2384     auto abilityRecord = Token::GetAbilityRecordByToken(token);
2385     if (!abilityRecord) {
2386         HILOG_ERROR("SetMissionIcon find ability failed.");
2387         return -1;
2388     }
2389 
2390     if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
2391         listenerController_->NotifyMissionIconChanged(missionId, icon);
2392     }
2393 
2394     return 0;
2395 }
2396 
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & abilityToken) const2397 void MissionListManager::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &abilityToken) const
2398 {
2399     if (!abilityToken) {
2400         HILOG_WARN("%{public}s ability token is nullptr.", __func__);
2401         return;
2402     }
2403 
2404     auto abilityRecord = GetAbilityRecordByToken(abilityToken);
2405     if (!abilityRecord) {
2406         HILOG_WARN("%{public}s get AbilityRecord by token failed.", __func__);
2407         return;
2408     }
2409 
2410     if (abilityRecord->IsCompleteFirstFrameDrawing()) {
2411         HILOG_DEBUG("First frame drawing has completed.");
2412         return;
2413     }
2414     abilityRecord->SetCompleteFirstFrameDrawing(true);
2415 
2416     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2417     if (handler == nullptr) {
2418         HILOG_ERROR("Fail to get AbilityEventHandler.");
2419         return;
2420     }
2421 
2422     auto task = [owner = weak_from_this(), abilityRecord] {
2423         auto mgr = owner.lock();
2424         if (mgr == nullptr) {
2425             HILOG_ERROR("MissionListManager is nullptr.");
2426             return;
2427         }
2428         mgr->NotifyMissionCreated(abilityRecord);
2429         mgr->UpdateMissionSnapshot(abilityRecord);
2430     };
2431     handler->PostTask(task, "FirstFrameDrawing");
2432     auto preloadTask = [owner = weak_from_this(), abilityRecord] {
2433         auto mgr = owner.lock();
2434         if (mgr == nullptr) {
2435             HILOG_ERROR("MissionListManager is nullptr.");
2436             return;
2437         }
2438         mgr->ProcessPreload(abilityRecord);
2439     };
2440     handler->PostTask(preloadTask);
2441 }
2442 
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const2443 void MissionListManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
2444 {
2445     auto bms = AbilityUtil::GetBundleManager();
2446     CHECK_POINTER(bms);
2447     auto abilityInfo = record->GetAbilityInfo();
2448     Want want;
2449     want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
2450     auto uid = record->GetUid();
2451     want.SetParam("uid", uid);
2452     bms->ProcessPreload(want);
2453 }
2454 
GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const2455 Closure MissionListManager::GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
2456 {
2457     auto windowHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetWMSHandler();
2458     if (!windowHandler) {
2459         HILOG_ERROR("%{public}s, Get WMS handler failed.", __func__);
2460         return nullptr;
2461     }
2462 
2463     return [windowHandler, abilityRecord] {
2464         if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow()) {
2465             HILOG_INFO("%{public}s, call windowHandler CancelStartingWindow.", __func__);
2466             windowHandler->CancelStartingWindow(abilityRecord->GetToken());
2467             abilityRecord->SetStartingWindow(false);
2468         }
2469     };
2470 }
2471 
PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const2472 void MissionListManager::PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
2473 {
2474     HILOG_INFO("%{public}s was called.", __func__);
2475     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2476     if (!handler) {
2477         HILOG_ERROR("Fail to get AbilityEventHandler.");
2478         return;
2479     }
2480 
2481     auto task = GetCancelStartingWindowTask(abilityRecord);
2482     if (!task) {
2483         HILOG_ERROR("Fail to get CancelStartingWindow task.");
2484         return;
2485     }
2486     handler->PostTask(task, AppExecFwk::EventQueue::Priority::IMMEDIATE);
2487 }
2488 #endif
2489 
Dump(std::vector<std::string> & info)2490 void MissionListManager::Dump(std::vector<std::string> &info)
2491 {
2492     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2493     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2494     info.push_back(dumpInfo);
2495     dumpInfo = " current mission lists:{";
2496     info.push_back(dumpInfo);
2497     for (const auto& missionList : currentMissionLists_) {
2498         if (missionList) {
2499             missionList->Dump(info);
2500         }
2501     }
2502     dumpInfo = " }";
2503     info.push_back(dumpInfo);
2504 
2505     dumpInfo = " default stand mission list:{";
2506     info.push_back(dumpInfo);
2507     if (defaultStandardList_) {
2508         defaultStandardList_->Dump(info);
2509     }
2510     dumpInfo = " }";
2511     info.push_back(dumpInfo);
2512 
2513     dumpInfo = " default single mission list:{";
2514     info.push_back(dumpInfo);
2515     if (defaultSingleList_) {
2516         defaultSingleList_->Dump(info);
2517     }
2518     dumpInfo = " }";
2519     info.push_back(dumpInfo);
2520 
2521     dumpInfo = " launcher mission list:{";
2522     info.push_back(dumpInfo);
2523     if (launcherList_) {
2524         launcherList_->Dump(info);
2525     }
2526     dumpInfo = " }";
2527     info.push_back(dumpInfo);
2528 }
2529 
DumpMissionListByRecordId(std::vector<std::string> & info,bool isClient,int32_t abilityRecordId,const std::vector<std::string> & params)2530 void MissionListManager::DumpMissionListByRecordId(
2531     std::vector<std::string> &info, bool isClient, int32_t abilityRecordId, const std::vector<std::string> &params)
2532 {
2533     std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
2534     std::unique_ptr<MissionList> defaultStandardListBackup;
2535     std::unique_ptr<MissionList> defaultSingleListBackup;
2536     std::unique_ptr<MissionList> launcherListBackup;
2537     {
2538         std::lock_guard<std::recursive_mutex> guard(managerLock_);
2539         for (const auto& missionList : currentMissionLists_) {
2540             if (missionList != nullptr) {
2541                 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
2542             }
2543         }
2544         defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
2545         defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
2546         launcherListBackup = std::make_unique<MissionList>(*launcherList_);
2547     }
2548 
2549     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2550     info.push_back(dumpInfo);
2551     for (const auto& missionList : currentMissionListsBackup) {
2552         if (missionList && missionList != launcherListBackup) {
2553             HILOG_INFO("missionList begin to call DumpMissionListByRecordId %{public}s", __func__);
2554             missionList->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2555         }
2556     }
2557 
2558     if (defaultStandardListBackup) {
2559         HILOG_INFO("defaultStandardList begin to call DumpMissionListByRecordId %{public}s", __func__);
2560         defaultStandardListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2561     }
2562 
2563     if (defaultSingleListBackup) {
2564         HILOG_INFO("defaultSingleList begin to call DumpMissionListByRecordId %{public}s", __func__);
2565         defaultSingleListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2566     }
2567 
2568     if (launcherListBackup) {
2569         HILOG_INFO("launcherList begin to call DumpMissionListByRecordId %{public}s", __func__);
2570         launcherListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2571     }
2572 }
2573 
DumpMissionList(std::vector<std::string> & info,bool isClient,const std::string & args)2574 void MissionListManager::DumpMissionList(std::vector<std::string> &info, bool isClient, const std::string &args)
2575 {
2576     std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
2577     std::unique_ptr<MissionList> defaultStandardListBackup;
2578     std::unique_ptr<MissionList> defaultSingleListBackup;
2579     std::unique_ptr<MissionList> launcherListBackup;
2580     {
2581         std::lock_guard<std::recursive_mutex> guard(managerLock_);
2582         for (const auto& missionList : currentMissionLists_) {
2583             if (missionList != nullptr) {
2584                 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
2585             }
2586         }
2587         defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
2588         defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
2589         launcherListBackup = std::make_unique<MissionList>(*launcherList_);
2590     }
2591 
2592     if (args.size() != 0 &&
2593         args != "NORMAL" &&
2594         args != "DEFAULT_STANDARD" &&
2595         args != "DEFAULT_SINGLE" &&
2596         args != "LAUNCHER") {
2597         info.emplace_back("MissionList Type NORMAL|DEFAULT_STANDARD|DEFAULT_SINGLE|LAUNCHER");
2598         return;
2599     }
2600 
2601     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2602     info.push_back(dumpInfo);
2603     if (args.size() == 0 || args == "NORMAL") {
2604         dumpInfo = "  Current mission lists:";
2605         info.push_back(dumpInfo);
2606         for (const auto& missionList : currentMissionListsBackup) {
2607             if (missionList) {
2608                 missionList->DumpList(info, isClient);
2609             }
2610         }
2611     }
2612 
2613     if (args.size() == 0 || args == "DEFAULT_STANDARD") {
2614         dumpInfo = "  default stand mission list:";
2615         info.push_back(dumpInfo);
2616         if (defaultStandardListBackup) {
2617             defaultStandardListBackup->DumpList(info, isClient);
2618         }
2619     }
2620 
2621     if (args.size() == 0 || args == "DEFAULT_SINGLE") {
2622         dumpInfo = "  default single mission list:";
2623         info.push_back(dumpInfo);
2624         if (defaultSingleListBackup) {
2625             defaultSingleListBackup->DumpList(info, isClient);
2626         }
2627     }
2628     if (args.size() == 0 || args == "LAUNCHER") {
2629         dumpInfo = "  launcher mission list:";
2630         info.push_back(dumpInfo);
2631         if (launcherListBackup) {
2632             launcherListBackup->DumpList(info, isClient);
2633         }
2634     }
2635 }
2636 
DumpMissionInfos(std::vector<std::string> & info)2637 void MissionListManager::DumpMissionInfos(std::vector<std::string> &info)
2638 {
2639     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2640     info.push_back(dumpInfo);
2641     DelayedSingleton<MissionInfoMgr>::GetInstance()->Dump(info);
2642 }
2643 
DumpMission(int missionId,std::vector<std::string> & info)2644 void MissionListManager::DumpMission(int missionId, std::vector<std::string> &info)
2645 {
2646     std::string dumpInfo = "User ID #" + std::to_string(userId_);
2647     info.push_back(dumpInfo);
2648     InnerMissionInfo innerMissionInfo;
2649     if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo) != 0) {
2650         info.push_back("error: invalid mission number, please see 'aa dump --mission-list'.");
2651         return;
2652     }
2653     innerMissionInfo.Dump(info);
2654 }
2655 
ResolveLocked(const AbilityRequest & abilityRequest)2656 int MissionListManager::ResolveLocked(const AbilityRequest &abilityRequest)
2657 {
2658     HILOG_INFO("%{public}s, resolve ability_name:%{public}s",
2659         __func__,
2660         abilityRequest.want.GetElement().GetURI().c_str());
2661 
2662     if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
2663         HILOG_ERROR("%{public}s, resolve ability_name:", __func__);
2664         return RESOLVE_CALL_ABILITY_INNER_ERR;
2665     }
2666 
2667     return CallAbilityLocked(abilityRequest);
2668 }
2669 
CallAbilityLocked(const AbilityRequest & abilityRequest)2670 int MissionListManager::CallAbilityLocked(const AbilityRequest &abilityRequest)
2671 {
2672     HILOG_INFO("call ability.");
2673     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2674 
2675     // allow to start ability by called type without loading ui.
2676     if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
2677         HILOG_ERROR("start ability not by call.");
2678         return ERR_INVALID_VALUE;
2679     }
2680 
2681     // Get target mission and ability record.
2682     std::shared_ptr<AbilityRecord> targetAbilityRecord;
2683     std::shared_ptr<Mission> targetMission;
2684     GetTargetMissionAndAbility(abilityRequest, targetMission, targetAbilityRecord);
2685     if (!targetMission || !targetAbilityRecord) {
2686         HILOG_ERROR("Failed to get mission or record.");
2687         return ERR_INVALID_VALUE;
2688     }
2689 
2690     targetAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode);
2691     targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
2692 
2693     // mission is first created, add mission to default call mission list.
2694     // other keep in current mission list.
2695     if (!targetMission->GetMissionList()) {
2696         defaultSingleList_->AddMissionToTop(targetMission);
2697     }
2698 
2699     NotifyAbilityToken(targetAbilityRecord->GetToken(), abilityRequest);
2700 
2701     // new version started by call type
2702     auto ret = ResolveAbility(targetAbilityRecord, abilityRequest);
2703     if (ret == ResolveResultType::OK_HAS_REMOTE_OBJ) {
2704         HILOG_DEBUG("target ability has been resolved.");
2705         if (targetAbilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
2706             HILOG_DEBUG("target ability needs to be switched to foreground.");
2707             DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(targetAbilityRecord->GetToken());
2708         }
2709         return ERR_OK;
2710     } else if (ret == ResolveResultType::NG_INNER_ERROR) {
2711         HILOG_ERROR("resolve failed, error: %{public}d.", RESOLVE_CALL_ABILITY_INNER_ERR);
2712         return RESOLVE_CALL_ABILITY_INNER_ERR;
2713     }
2714 
2715     // schedule target ability
2716     std::string element = targetAbilityRecord->GetWant().GetElement().GetURI();
2717     HILOG_DEBUG("load ability record: %{public}s", element.c_str());
2718 
2719     // flag the first ability.
2720     auto currentTopAbility = GetCurrentTopAbilityLocked();
2721     if (!currentTopAbility) {
2722         if (targetAbilityRecord->GetAbilityInfo().applicationInfo.isLauncherApp) {
2723             targetAbilityRecord->SetLauncherRoot();
2724         }
2725     }
2726 
2727     return targetAbilityRecord->LoadAbility();
2728 }
2729 
ReleaseCallLocked(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)2730 int MissionListManager::ReleaseCallLocked(
2731     const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
2732 {
2733     HILOG_DEBUG("release call ability.");
2734 
2735     CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
2736     CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
2737 
2738     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2739 
2740     std::shared_ptr<AbilityRecord> abilityRecord = GetAbilityRecordByName(element);
2741     CHECK_POINTER_AND_RETURN(abilityRecord, RELEASE_CALL_ABILITY_INNER_ERR);
2742 
2743     if (!abilityRecord->ReleaseCall(connect)) {
2744         HILOG_ERROR("ability release call record failed.");
2745         return RELEASE_CALL_ABILITY_INNER_ERR;
2746     }
2747     return ERR_OK;
2748 }
2749 
ResolveAbility(const std::shared_ptr<AbilityRecord> & targetAbility,const AbilityRequest & abilityRequest)2750 int MissionListManager::ResolveAbility(
2751     const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest)
2752 {
2753     HILOG_DEBUG("targetAbilityRecord resolve call record.");
2754     CHECK_POINTER_AND_RETURN(targetAbility, ResolveResultType::NG_INNER_ERROR);
2755 
2756     ResolveResultType result = targetAbility->Resolve(abilityRequest);
2757     switch (result) {
2758         case ResolveResultType::NG_INNER_ERROR:
2759         case ResolveResultType::OK_HAS_REMOTE_OBJ:
2760             return result;
2761         default:
2762             break;
2763     }
2764 
2765     if (targetAbility->IsReady()) {
2766         HILOG_DEBUG("targetAbility is ready, directly scheduler call request.");
2767         targetAbility->CallRequest();
2768         return ResolveResultType::OK_HAS_REMOTE_OBJ;
2769     }
2770 
2771     HILOG_DEBUG("targetAbility need to call request after lifecycle.");
2772     return result;
2773 }
2774 
GetAbilityRecordByName(const AppExecFwk::ElementName & element)2775 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByName(const AppExecFwk::ElementName &element)
2776 {
2777     // find in currentMissionLists_
2778     for (auto missionList : currentMissionLists_) {
2779         if (missionList != nullptr) {
2780             auto ability = missionList->GetAbilityRecordByName(element);
2781             if (ability != nullptr) {
2782                 return ability;
2783             }
2784         }
2785     }
2786 
2787     // find in launcherMissionList_
2788     auto ability = launcherList_->GetAbilityRecordByName(element);
2789     if (ability != nullptr) {
2790         return ability;
2791     }
2792 
2793     // find in default singlelist_
2794     return defaultSingleList_->GetAbilityRecordByName(element);
2795 }
2796 
OnCallConnectDied(const std::shared_ptr<CallRecord> & callRecord)2797 void MissionListManager::OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord)
2798 {
2799     HILOG_INFO("On callConnect died.");
2800     CHECK_POINTER(callRecord);
2801     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2802 
2803     AppExecFwk::ElementName element = callRecord->GetTargetServiceName();
2804     auto abilityRecord = GetAbilityRecordByName(element);
2805     CHECK_POINTER(abilityRecord);
2806     abilityRecord->ReleaseCall(callRecord->GetConCallBack());
2807 }
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)2808 void MissionListManager::OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag)
2809 {
2810     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2811     if (waitingAbilityQueue_.empty()) {
2812         return;
2813     }
2814 
2815     AbilityRequest abilityRequest = waitingAbilityQueue_.front();
2816     waitingAbilityQueue_.pop();
2817 
2818     auto currentTopAbility = GetCurrentTopAbilityLocked();
2819     auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
2820 
2821     if (!flag.empty()) {
2822         auto mission = GetMissionBySpecifiedFlag(want, flag);
2823         if (mission) {
2824             auto ability = mission->GetAbilityRecord();
2825             if (!ability) {
2826                 return;
2827             }
2828             ability->SetWant(abilityRequest.want);
2829             ability->SetIsNewWant(true);
2830             if (abilityRequest.IsContinuation()) {
2831                 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_CONTINUATION);
2832             } else if (abilityRequest.IsAppRecovery()) {
2833                 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
2834             } else {
2835                 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
2836             }
2837 
2838             auto isCallerFromLauncher = (callerAbility && callerAbility->IsLauncherAbility());
2839             MoveMissionToFront(mission->GetMissionId(), isCallerFromLauncher);
2840             NotifyRestartSpecifiedAbility(abilityRequest, ability->GetToken());
2841             return;
2842         }
2843     }
2844 
2845     abilityRequest.specifiedFlag = flag;
2846     NotifyStartSpecifiedAbility(abilityRequest, want);
2847     StartAbilityLocked(currentTopAbility, callerAbility, abilityRequest);
2848 }
2849 
NotifyRestartSpecifiedAbility(AbilityRequest & request,const sptr<IRemoteObject> & token)2850 void MissionListManager::NotifyRestartSpecifiedAbility(AbilityRequest &request, const sptr<IRemoteObject> &token)
2851 {
2852     if (request.abilityInfoCallback == nullptr) {
2853         return;
2854     }
2855     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2856         = iface_cast<AppExecFwk::IAbilityInfoCallback> (request.abilityInfoCallback);
2857     if (abilityInfoCallback != nullptr) {
2858         HILOG_DEBUG("%{public}s called.", __func__);
2859         abilityInfoCallback->NotifyRestartSpecifiedAbility(token);
2860     }
2861 }
2862 
NotifyStartSpecifiedAbility(AbilityRequest & abilityRequest,const AAFwk::Want & want)2863 void MissionListManager::NotifyStartSpecifiedAbility(AbilityRequest &abilityRequest, const AAFwk::Want &want)
2864 {
2865     if (abilityRequest.abilityInfoCallback == nullptr) {
2866         return;
2867     }
2868 
2869     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2870         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
2871     if (abilityInfoCallback != nullptr) {
2872         Want newWant = want;
2873         int32_t type = static_cast<int32_t>(abilityRequest.abilityInfo.type);
2874         newWant.SetParam("abilityType", type);
2875         sptr<Want> extraParam = new (std::nothrow) Want();
2876         abilityInfoCallback->NotifyStartSpecifiedAbility(abilityRequest.callerToken, newWant,
2877             abilityRequest.requestCode, extraParam);
2878         int32_t procCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
2879         if (procCode != 0) {
2880             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
2881         }
2882         int32_t tokenCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
2883         if (tokenCode != 0) {
2884             abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
2885         }
2886     }
2887 }
2888 
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want)2889 void MissionListManager::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want)
2890 {
2891     HILOG_DEBUG("%{public}s called.", __func__);
2892     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2893     if (waitingAbilityQueue_.empty()) {
2894         return;
2895     }
2896     waitingAbilityQueue_.pop();
2897 
2898     if (waitingAbilityQueue_.empty()) {
2899         return;
2900     }
2901     AbilityRequest abilityRequest = waitingAbilityQueue_.front();
2902     waitingAbilityQueue_.pop();
2903 
2904     auto currentTopAbility = GetCurrentTopAbilityLocked();
2905     auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
2906     StartAbility(currentTopAbility, callerAbility, abilityRequest);
2907 }
2908 
GetMissionBySpecifiedFlag(const AAFwk::Want & want,const std::string & flag) const2909 std::shared_ptr<Mission> MissionListManager::GetMissionBySpecifiedFlag(
2910     const AAFwk::Want &want, const std::string &flag) const
2911 {
2912     std::shared_ptr<Mission> mission = nullptr;
2913     for (auto missionList : currentMissionLists_) {
2914         if (missionList && (mission = missionList->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2915             return mission;
2916         }
2917     }
2918 
2919     if ((mission = defaultSingleList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2920         return mission;
2921     }
2922 
2923     if ((mission = launcherList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2924         return mission;
2925     }
2926 
2927     return defaultStandardList_->GetMissionBySpecifiedFlag(want, flag);
2928 }
2929 
IsReachToLimitLocked(const AbilityRequest & abilityRequest)2930 bool MissionListManager::IsReachToLimitLocked(const AbilityRequest &abilityRequest)
2931 {
2932     auto reUsedMission = GetReusedMission(abilityRequest);
2933     if (reUsedMission) {
2934         return false;
2935     }
2936 
2937     int32_t totalCount = 0;
2938     for (const auto& missionList : currentMissionLists_) {
2939         if (!missionList) {
2940             continue;
2941         }
2942 
2943         totalCount += missionList->GetMissionCountByUid(abilityRequest.uid);
2944         if (totalCount >= MAX_INSTANCE_COUNT) {
2945             return true;
2946         }
2947     }
2948 
2949     totalCount += defaultStandardList_->GetMissionCountByUid(abilityRequest.uid);
2950     if (totalCount >= MAX_INSTANCE_COUNT) {
2951         return true;
2952     }
2953 
2954     totalCount += defaultSingleList_->GetMissionCountByUid(abilityRequest.uid);
2955     return totalCount >= MAX_INSTANCE_COUNT;
2956 }
2957 
2958 bool MissionListManager::MissionDmInitCallback::isInit_ = false;
OnRemoteDied()2959 void MissionListManager::MissionDmInitCallback::OnRemoteDied()
2960 {
2961     isInit_ = false;
2962     HILOG_WARN("DeviceManager died.");
2963 }
2964 
RegisterSnapshotHandler(const sptr<ISnapshotHandler> & handler)2965 void MissionListManager::RegisterSnapshotHandler(const sptr<ISnapshotHandler>& handler)
2966 {
2967     DelayedSingleton<MissionInfoMgr>::GetInstance()->RegisterSnapshotHandler(handler);
2968 }
2969 
GetMissionSnapshot(int32_t missionId,const sptr<IRemoteObject> & abilityToken,MissionSnapshot & missionSnapshot,bool isLowResolution)2970 bool MissionListManager::GetMissionSnapshot(int32_t missionId, const sptr<IRemoteObject>& abilityToken,
2971     MissionSnapshot& missionSnapshot, bool isLowResolution)
2972 {
2973     HILOG_INFO("snapshot: Start get mission snapshot.");
2974     bool forceSnapshot = false;
2975     {
2976         std::lock_guard<std::recursive_mutex> guard(managerLock_);
2977         auto abilityRecord = GetAbilityRecordByToken(abilityToken);
2978         if (abilityRecord && abilityRecord->IsAbilityState(FOREGROUND)) {
2979             forceSnapshot = true;
2980             missionSnapshot.isPrivate = (abilityRecord->GetAppIndex() != 0);
2981         }
2982     }
2983     return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionSnapshot(
2984         missionId, abilityToken, missionSnapshot, isLowResolution, forceSnapshot);
2985 }
2986 
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)2987 void MissionListManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
2988 {
2989     std::lock_guard<std::recursive_mutex> guard(managerLock_);
2990 
2991     auto func = [&info, isPerm](const std::shared_ptr<Mission> &mission) {
2992         if (!mission) {
2993             return;
2994         }
2995 
2996         auto ability = mission->GetAbilityRecord();
2997         if (!ability) {
2998             return;
2999         }
3000 
3001         if (isPerm) {
3002             DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, ability);
3003         } else {
3004             auto callingTokenId = IPCSkeleton::GetCallingTokenID();
3005             auto tokenID = ability->GetApplicationInfo().accessTokenId;
3006             if (callingTokenId == tokenID) {
3007                 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, ability);
3008             }
3009         }
3010     };
3011     if (!(defaultStandardList_->GetAllMissions().empty())) {
3012         auto list = defaultStandardList_->GetAllMissions();
3013         std::for_each(list.begin(), list.end(), func);
3014     }
3015     if (!(defaultSingleList_->GetAllMissions().empty())) {
3016         auto list = defaultSingleList_->GetAllMissions();
3017         std::for_each(list.begin(), list.end(), func);
3018     }
3019     for (auto missionList : currentMissionLists_) {
3020         if (!(missionList->GetAllMissions().empty())) {
3021             auto list = missionList->GetAllMissions();
3022             std::for_each(list.begin(), list.end(), func);
3023         }
3024     }
3025 }
3026 
UninstallApp(const std::string & bundleName,int32_t uid)3027 void MissionListManager::UninstallApp(const std::string &bundleName, int32_t uid)
3028 {
3029     HILOG_INFO("Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3030     auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
3031     CHECK_POINTER(abilityManagerService);
3032     auto handler = abilityManagerService->GetEventHandler();
3033     CHECK_POINTER(handler);
3034     std::weak_ptr<MissionListManager> wpMgr = shared_from_this();
3035     auto task = [wpMgr, bundleName, uid]() {
3036         HILOG_INFO("Handle Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3037         auto mgr = wpMgr.lock();
3038         if (mgr) {
3039             mgr->AddUninstallTags(bundleName, uid);
3040         }
3041     };
3042     handler->PostTask(task);
3043 }
3044 
AddUninstallTags(const std::string & bundleName,int32_t uid)3045 void MissionListManager::AddUninstallTags(const std::string &bundleName, int32_t uid)
3046 {
3047     HILOG_INFO("AddUninstallTags, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3048     std::lock_guard<std::recursive_mutex> guard(managerLock_);
3049     for (auto it = currentMissionLists_.begin(); it != currentMissionLists_.end();) {
3050         auto missionList = *it;
3051         if (missionList) {
3052             missionList->HandleUnInstallApp(bundleName, uid); // add tag here.
3053             if (missionList->IsEmpty()) {
3054                 currentMissionLists_.erase(it++);
3055                 continue;
3056             }
3057         }
3058         it++;
3059     }
3060     defaultSingleList_->HandleUnInstallApp(bundleName, uid);
3061     defaultStandardList_->HandleUnInstallApp(bundleName, uid);
3062     std::list<int32_t> matchedMissions;
3063     DelayedSingleton<MissionInfoMgr>::GetInstance()->HandleUnInstallApp(bundleName, uid, matchedMissions);
3064     if (listenerController_) {
3065         listenerController_->HandleUnInstallApp(matchedMissions);
3066     }
3067 
3068     EraseWaitingAbility(bundleName, uid);
3069 }
3070 
EraseWaitingAbility(const std::string & bundleName,int32_t uid)3071 void MissionListManager::EraseWaitingAbility(const std::string &bundleName, int32_t uid)
3072 {
3073     std::queue<AbilityRequest> abilityQueue;
3074     waitingAbilityQueue_.swap(abilityQueue);
3075     while (!abilityQueue.empty()) {
3076         AbilityRequest tempAbilityRequest = abilityQueue.front();
3077         abilityQueue.pop();
3078         if (tempAbilityRequest.abilityInfo.bundleName == bundleName && tempAbilityRequest.uid == uid) {
3079             HILOG_INFO("AddUninstallTags, erase AbilityRequest from waitingAbilityQueue.");
3080         } else {
3081             waitingAbilityQueue_.push(tempAbilityRequest);
3082         }
3083     }
3084 }
3085 
IsStarted()3086 bool MissionListManager::IsStarted()
3087 {
3088     std::lock_guard<std::recursive_mutex> guard(managerLock_);
3089     auto launcherRoot = launcherList_->GetLauncherRoot();
3090     return launcherRoot != nullptr;
3091 }
3092 
PauseManager()3093 void MissionListManager::PauseManager()
3094 {
3095     HILOG_INFO("MissionListManager PauseManager. move foreground to background.");
3096     std::lock_guard<std::recursive_mutex> guard(managerLock_);
3097     std::list<std::shared_ptr<AbilityRecord>> foregroundAbilities;
3098     GetAllForegroundAbilities(foregroundAbilities);
3099 
3100     for (auto& abilityRecord : foregroundAbilities) {
3101         if (!abilityRecord) {
3102             continue;
3103         }
3104         abilityRecord->SetSwitchingPause(true);
3105         MoveToBackgroundTask(abilityRecord);
3106     }
3107 }
3108 
ResumeManager()3109 void MissionListManager::ResumeManager()
3110 {
3111     HILOG_INFO("ResumeManager, back to launcher.");
3112     BackToLauncher();
3113 }
3114 
GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3115 void MissionListManager::GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3116 {
3117     for (auto& missionList : currentMissionLists_) {
3118         GetForegroundAbilities(missionList, foregroundList);
3119     }
3120     GetForegroundAbilities(defaultSingleList_, foregroundList);
3121     GetForegroundAbilities(defaultStandardList_, foregroundList);
3122 }
3123 
GetForegroundAbilities(const std::shared_ptr<MissionList> & missionList,std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3124 void MissionListManager::GetForegroundAbilities(const std::shared_ptr<MissionList>& missionList,
3125     std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3126 {
3127     if (!missionList || missionList->IsEmpty()) {
3128         return;
3129     }
3130 
3131     for (auto& mission : missionList->GetAllMissions()) {
3132         if (!mission) {
3133             continue;
3134         }
3135 
3136         auto abilityRecord = mission->GetAbilityRecord();
3137         if (!abilityRecord) {
3138             continue;
3139         }
3140 
3141         if (abilityRecord->IsActiveState()) {
3142             foregroundList.emplace_back(abilityRecord);
3143         }
3144     }
3145 }
3146 
RemoveMissionLocked(int32_t missionId,bool excludeFromMissions)3147 void MissionListManager::RemoveMissionLocked(int32_t missionId, bool excludeFromMissions)
3148 {
3149     if (missionId <= 0) {
3150         return;
3151     }
3152 
3153     DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
3154     if (listenerController_ && !excludeFromMissions) {
3155         listenerController_->NotifyMissionDestroyed(missionId);
3156     }
3157 }
3158 
IsExcludeFromMissions(const std::shared_ptr<Mission> & mission)3159 bool MissionListManager::IsExcludeFromMissions(const std::shared_ptr<Mission> &mission)
3160 {
3161     if (!mission) {
3162         return false;
3163     }
3164 
3165     auto abilityRecord = mission->GetAbilityRecord();
3166     return abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions;
3167 }
3168 
3169 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility(int32_t abilityRecordId)3170 int MissionListManager::BlockAbility(int32_t abilityRecordId)
3171 {
3172     int ret = -1;
3173     for (const auto &missionList : currentMissionLists_) {
3174         if (missionList && missionList != launcherList_) {
3175             HILOG_INFO("missionList begin to call BlockAbilityByRecordId %{public}s", __func__);
3176             if (missionList->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3177                 HILOG_INFO("missionList call BlockAbilityByRecordId success");
3178                 ret = ERR_OK;
3179             }
3180         }
3181     }
3182 
3183     if (defaultStandardList_) {
3184         HILOG_INFO("defaultStandardList begin to call BlockAbilityByRecordId %{public}s", __func__);
3185         if (defaultStandardList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3186             HILOG_INFO("defaultStandardList call BlockAbilityByRecordId success");
3187             ret = ERR_OK;
3188         }
3189     }
3190 
3191     if (defaultSingleList_) {
3192         HILOG_INFO("defaultSingleList begin to call BlockAbilityByRecordId %{public}s", __func__);
3193         if (defaultSingleList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3194             HILOG_INFO("defaultSingleList_ call BlockAbilityByRecordId success");
3195             ret = ERR_OK;
3196         }
3197     }
3198 
3199     if (launcherList_) {
3200         HILOG_INFO("launcherList begin to call BlockAbilityByRecordId %{public}s", __func__);
3201         if (launcherList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3202             HILOG_INFO("launcherList_ call BlockAbilityByRecordId success");
3203             ret = ERR_OK;
3204         }
3205     }
3206     return ret;
3207 }
3208 #endif
3209 
SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> & tokens)3210 void MissionListManager::SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> &tokens)
3211 {
3212     HILOG_INFO("%{public}s", __func__);
3213     for (auto &item : tokens) {
3214         auto abilityRecord = GetAbilityRecordByToken(item);
3215         if (abilityRecord == nullptr) {
3216             HILOG_WARN("abilityRecord is nullptr.");
3217             continue;
3218         }
3219         auto mission = abilityRecord->GetMission();
3220         if (mission == nullptr) {
3221             HILOG_WARN("mission is nullptr.");
3222             continue;
3223         }
3224         mission->SetANRState(true);
3225     }
3226 }
NotifyAbilityToken(const sptr<IRemoteObject> & token,const AbilityRequest & abilityRequest)3227 void MissionListManager::NotifyAbilityToken(const sptr<IRemoteObject> &token, const AbilityRequest &abilityRequest)
3228 {
3229     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
3230         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
3231     if (abilityInfoCallback != nullptr) {
3232         abilityInfoCallback->NotifyAbilityToken(token, abilityRequest.want);
3233     }
3234 }
3235 
NotifyStartAbilityResult(const AbilityRequest & abilityRequest,int result)3236 void MissionListManager::NotifyStartAbilityResult(const AbilityRequest &abilityRequest, int result)
3237 {
3238     sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
3239         = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
3240     if (abilityInfoCallback != nullptr) {
3241         abilityInfoCallback->NotifyStartAbilityResult(abilityRequest.want, result);
3242     }
3243 }
3244 }  // namespace AAFwk
3245 }  // namespace OHOS
3246