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