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