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