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