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