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 abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1070 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1071 }
1072 return;
1073 }
1074 self->CompleteForegroundFailed(abilityRecord, state);
1075 };
1076 handler->PostTask(task);
1077 }
1078 return ERR_OK;
1079 }
1080
CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> & abilityRecord)1081 void MissionListManager::CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord)
1082 {
1083 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1084 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1085
1086 CHECK_POINTER(abilityRecord);
1087 // ability do not save window mode
1088 abilityRecord->RemoveWindowMode();
1089 std::string element = abilityRecord->GetWant().GetElement().GetURI();
1090 HILOG_DEBUG("ability: %{public}s", element.c_str());
1091
1092 abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
1093
1094 #if BINDER_IPC_32BIT
1095 HILOG_INFO("notify bms ability life status, bundle name:%{public}s, ability name:%{public}s, time:%{public}lld",
1096 abilityRecord->GetAbilityInfo().bundleName.c_str(),
1097 abilityRecord->GetAbilityInfo().name.c_str(),
1098 AbilityUtil::UTCTimeSeconds());
1099 #else
1100 HILOG_INFO("notify bms ability life status, bundle name:%{public}s, ability name:%{public}s, time:%{public}ld",
1101 abilityRecord->GetAbilityInfo().bundleName.c_str(),
1102 abilityRecord->GetAbilityInfo().name.c_str(),
1103 AbilityUtil::UTCTimeSeconds());
1104 #endif
1105
1106 auto mission = abilityRecord->GetMission();
1107 if (mission) {
1108 auto currentTime = GetCurrentTime();
1109 mission->UpdateMissionTime(currentTime);
1110 InnerMissionInfo info;
1111 if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1112 mission->GetMissionId(), info) == 0) {
1113 info.missionInfo.time = currentTime;
1114 info.missionInfo.runningState = 0;
1115 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
1116 }
1117 }
1118
1119 if (mission && mission->IsMovingState()) {
1120 mission->SetMovingState(false);
1121 if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
1122 listenerController_->NotifyMissionMovedToFront(mission->GetMissionId());
1123 }
1124 }
1125 PostStartWaitingAbility();
1126 TerminatePreviousAbility(abilityRecord);
1127
1128 // new version. started by caller, scheduler call request
1129 if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToForeground() && abilityRecord->IsReady()) {
1130 HILOG_DEBUG("call request after completing foreground state");
1131 abilityRecord->CallRequest();
1132 abilityRecord->SetStartToForeground(false);
1133 }
1134
1135 if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1136 abilityRecord->SetMinimizeReason(true);
1137 MoveToBackgroundTask(abilityRecord);
1138 } else if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1139 HILOG_DEBUG("not continuous startup.");
1140 abilityRecord->SetPendingState(AbilityState::INITIAL);
1141 }
1142 }
1143
TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1144 void MissionListManager::TerminatePreviousAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1145 {
1146 auto terminatingAbilityRecord = abilityRecord->GetPreAbilityRecord();
1147 if (!terminatingAbilityRecord) {
1148 HILOG_INFO("%{public}s, terminatingAbilityRecord is nullptr.", __func__);
1149 return;
1150 }
1151 abilityRecord->SetPreAbilityRecord(nullptr);
1152 auto self(shared_from_this());
1153 if (terminatingAbilityRecord->GetAbilityState() == AbilityState::FOREGROUND) {
1154 MoveToBackgroundTask(terminatingAbilityRecord);
1155 }
1156 if (terminatingAbilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1157 auto task = [terminatingAbilityRecord, self]() {
1158 HILOG_INFO("%{public}s, To terminate terminatingAbilityRecord.", __func__);
1159 self->DelayCompleteTerminate(terminatingAbilityRecord);
1160 };
1161 terminatingAbilityRecord->Terminate(task);
1162 }
1163 }
1164
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1165 int MissionListManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1166 {
1167 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1168 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1169 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1170
1171 if (!abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
1172 HILOG_ERROR("Ability transition life state error. actual %{public}d", abilityRecord->GetAbilityState());
1173 return ERR_INVALID_VALUE;
1174 }
1175
1176 // remove background timeout task.
1177 handler->RemoveTask(std::to_string(abilityRecord->GetEventId()));
1178 auto self(shared_from_this());
1179 auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1180 handler->PostTask(task);
1181
1182 return ERR_OK;
1183 }
1184
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1185 void MissionListManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1186 {
1187 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1188 if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1189 HILOG_ERROR("Ability state is %{public}d, it can't complete background.", abilityRecord->GetAbilityState());
1190 return;
1191 }
1192
1193 abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1194 // send application state to AppMS.
1195 // notify AppMS to update application state.
1196 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1197 if (abilityRecord->GetPendingState() == AbilityState::FOREGROUND) {
1198 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(abilityRecord->GetToken());
1199 } else if (abilityRecord->GetPendingState() == AbilityState::BACKGROUND) {
1200 HILOG_DEBUG("not continuous startup.");
1201 abilityRecord->SetPendingState(AbilityState::INITIAL);
1202 }
1203
1204 if (abilityRecord->IsSwitchingPause()) {
1205 abilityRecord->SetSwitchingPause(false);
1206 return;
1207 }
1208
1209 // Abilities ahead of the one started with SingleTask mode were put in terminate list, we need to terminate
1210 // them.
1211 auto self(shared_from_this());
1212 for (auto terminateAbility : terminateAbilityList_) {
1213 if (terminateAbility->GetAbilityState() == AbilityState::BACKGROUND) {
1214 auto timeoutTask = [terminateAbility, self]() {
1215 HILOG_WARN("Terminate ability timeout after background.");
1216 self->DelayCompleteTerminate(terminateAbility);
1217 };
1218 terminateAbility->Terminate(timeoutTask);
1219 }
1220 }
1221
1222 // new version. started by caller, scheduler call request
1223 if (abilityRecord->IsStartedByCall() && abilityRecord->IsStartToBackground() && abilityRecord->IsReady()) {
1224 HILOG_DEBUG("call request after completing background state");
1225 abilityRecord->CallRequest();
1226 abilityRecord->SetStartToBackground(false);
1227 }
1228 }
1229
TerminateAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode,const Want * resultWant,bool flag)1230 int MissionListManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
1231 int resultCode, const Want *resultWant, bool flag)
1232 {
1233 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1234 std::string element = abilityRecord->GetWant().GetElement().GetURI();
1235 HILOG_DEBUG("Terminate ability, ability is %{public}s.", element.c_str());
1236 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1237 if (abilityRecord->IsTerminating() && !abilityRecord->IsForeground()) {
1238 HILOG_ERROR("Ability is on terminating.");
1239 return ERR_OK;
1240 }
1241
1242 if (abilityRecord->IsTerminating() && abilityRecord->IsForeground()) {
1243 HILOG_WARN("Ability is on terminating and ability state is foreground, force close");
1244 flag = false;
1245 }
1246
1247 // double check to avoid the ability has been removed
1248 if (!GetAbilityRecordByToken(abilityRecord->GetToken())) {
1249 HILOG_ERROR("Ability has already been removed");
1250 return ERR_OK;
1251 }
1252
1253 abilityRecord->SetTerminatingState();
1254 // save result to caller AbilityRecord
1255 if (resultWant != nullptr) {
1256 abilityRecord->SaveResultToCallers(resultCode, resultWant);
1257 } else {
1258 Want want;
1259 abilityRecord->SaveResultToCallers(resultCode, &want);
1260 }
1261
1262 return TerminateAbilityLocked(abilityRecord, flag);
1263 }
1264
TerminateAbility(const std::shared_ptr<AbilityRecord> & caller,int requestCode)1265 int MissionListManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &caller, int requestCode)
1266 {
1267 HILOG_DEBUG("Terminate ability with result called.");
1268 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1269
1270 std::shared_ptr<AbilityRecord> targetAbility = GetAbilityRecordByCaller(caller, requestCode);
1271 if (!targetAbility) {
1272 HILOG_ERROR("%{public}s, Can't find target ability", __func__);
1273 return NO_FOUND_ABILITY_BY_CALLER;
1274 }
1275
1276 auto abilityMs = DelayedSingleton<AbilityManagerService>::GetInstance();
1277 CHECK_POINTER_AND_RETURN(abilityMs, GET_ABILITY_SERVICE_FAILED)
1278 int result = abilityMs->JudgeAbilityVisibleControl(targetAbility->GetAbilityInfo());
1279 if (result != ERR_OK) {
1280 HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
1281 return result;
1282 }
1283
1284 return TerminateAbility(targetAbility, DEFAULT_INVAL_VALUE, nullptr, true);
1285 }
1286
TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1287 int MissionListManager::TerminateAbilityLocked(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1288 {
1289 std::string element = abilityRecord->GetWant().GetElement().GetURI();
1290 HILOG_DEBUG("Terminate ability locked, ability is %{public}s.", element.c_str());
1291 // remove AbilityRecord out of stack
1292 RemoveTerminatingAbility(abilityRecord, flag);
1293 abilityRecord->SendResultToCallers();
1294
1295 // 1. if the ability was foreground, first should find wether there is other ability foreground
1296 if (abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING)) {
1297 HILOG_DEBUG("current ability is active");
1298 abilityRecord->SetPendingState(AbilityState::BACKGROUND);
1299 auto nextAbilityRecord = abilityRecord->GetNextAbilityRecord();
1300 if (nextAbilityRecord) {
1301 nextAbilityRecord->SetPreAbilityRecord(abilityRecord);
1302 #ifdef SUPPORT_GRAPHICS
1303 nextAbilityRecord->SetPendingState(AbilityState::FOREGROUND);
1304 nextAbilityRecord->ProcessForegroundAbility(abilityRecord);
1305 } else {
1306 if (!abilityRecord->IsClearMissionFlag()) {
1307 abilityRecord->NotifyAnimationFromTerminatingAbility();
1308 }
1309 #else
1310 nextAbilityRecord->ProcessForegroundAbility();
1311 } else {
1312 #endif
1313 MoveToBackgroundTask(abilityRecord);
1314 }
1315 return ERR_OK;
1316 }
1317
1318 // 2. if the ability was BACKGROUNDING, waiting for completeBackgroundNew
1319
1320 // 3. ability on background, schedule to terminate.
1321 if (abilityRecord->GetAbilityState() == AbilityState::BACKGROUND) {
1322 auto self(shared_from_this());
1323 auto task = [abilityRecord, self]() {
1324 HILOG_WARN("Terminate ability timeout.");
1325 self->DelayCompleteTerminate(abilityRecord);
1326 };
1327 abilityRecord->Terminate(task);
1328 }
1329 return ERR_OK;
1330 }
1331
1332 /**
1333 * @brief This method aims to do things as below
1334 * 1. remove the mission from the current missionList
1335 * 2. if the current missionList is empty after, then remove from the manager
1336 * 3. if the current ability is foreground, then should schedule the next ability to foreground before terminate
1337 *
1338 * @param abilityRecord the ability that was terminating
1339 */
RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,bool flag)1340 void MissionListManager::RemoveTerminatingAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool flag)
1341 {
1342 std::string element = abilityRecord->GetWant().GetElement().GetURI();
1343 HILOG_DEBUG("Remove terminating ability, ability is %{public}s.", element.c_str());
1344 if (GetAbilityFromTerminateList(abilityRecord->GetToken())) {
1345 abilityRecord->SetNextAbilityRecord(nullptr);
1346 HILOG_DEBUG("Find ability in terminating list, return.");
1347 return;
1348 }
1349
1350 auto missionList = abilityRecord->GetOwnedMissionList();
1351 CHECK_POINTER(missionList);
1352
1353 missionList->RemoveMissionByAbilityRecord(abilityRecord);
1354 DelayedSingleton<AppScheduler>::GetInstance()->PrepareTerminate(abilityRecord->GetToken());
1355 terminateAbilityList_.push_back(abilityRecord);
1356
1357 if (missionList->IsEmpty()) {
1358 HILOG_DEBUG("Remove terminating ability, missionList is empty, remove.");
1359 RemoveMissionList(missionList);
1360 }
1361
1362 // 1. clear old
1363 abilityRecord->SetNextAbilityRecord(nullptr);
1364 // 2. if the ability to terminate is background, just background
1365 if (!(abilityRecord->IsAbilityState(FOREGROUND) || abilityRecord->IsAbilityState(FOREGROUNDING))) {
1366 HILOG_DEBUG("Ability state is %{public}d, just return.", abilityRecord->GetAbilityState());
1367 return;
1368 }
1369 // 3. if close ability, noting to do
1370 if (!flag) {
1371 HILOG_DEBUG("Close ability schedule.");
1372 return;
1373 }
1374
1375 // 4. the ability should find the next ability to foreground
1376 std::shared_ptr<AbilityRecord> needTopAbility;
1377 if (!missionList->IsEmpty()) {
1378 needTopAbility = missionList->GetTopAbility();
1379 } else {
1380 HILOG_DEBUG("mission list is empty, no next ability.");
1381 }
1382
1383 if (!needTopAbility) {
1384 HILOG_DEBUG("The ability need to top is null.");
1385 if (!abilityRecord->IsNeedBackToOtherMissionStack()) {
1386 HILOG_INFO("This ability doesn't need back to other mission stack.");
1387 return;
1388 }
1389 needTopAbility = abilityRecord->GetOtherMissionStackAbilityRecord();
1390 if (!needTopAbility) {
1391 HILOG_ERROR("This ability needs back to other mission stack, but needTopAbility is null.");
1392 return;
1393 }
1394 abilityRecord->SetNeedBackToOtherMissionStack(false);
1395 }
1396 AppExecFwk::ElementName elementName = needTopAbility->GetWant().GetElement();
1397 HILOG_DEBUG("Next top ability is %{public}s, state is %{public}d, minimizeReason is %{public}d.",
1398 elementName.GetURI().c_str(), needTopAbility->GetAbilityState(), needTopAbility->IsMinimizeFromUser());
1399
1400 // 5. if caller is recent, close
1401 if (elementName.GetBundleName() == AbilityConfig::LAUNCHER_BUNDLE_NAME
1402 && elementName.GetAbilityName() == AbilityConfig::LAUNCHER_RECENT_ABILITY_NAME) {
1403 HILOG_DEBUG("Next to need is recent, just to launcher.");
1404 needTopAbility = launcherList_->GetLauncherRoot();
1405 }
1406
1407 if (!needTopAbility) {
1408 HILOG_DEBUG("NeedTopAbility of launcherRoot is null.");
1409 return;
1410 }
1411
1412 if (!needTopAbility->IsForeground() && !needTopAbility->IsMinimizeFromUser() && needTopAbility->IsReady()) {
1413 HILOG_DEBUG("%{public}s is need to foreground.", elementName.GetURI().c_str());
1414 abilityRecord->SetNextAbilityRecord(needTopAbility);
1415 }
1416 }
1417
RemoveMissionList(const std::shared_ptr<MissionList> & missionList)1418 void MissionListManager::RemoveMissionList(const std::shared_ptr<MissionList> &missionList)
1419 {
1420 if (missionList == nullptr) {
1421 return;
1422 }
1423
1424 for (auto iter = currentMissionLists_.begin(); iter != currentMissionLists_.end(); iter++) {
1425 if ((*iter) == missionList) {
1426 currentMissionLists_.erase(iter);
1427 return;
1428 }
1429 }
1430 }
1431
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1432 int MissionListManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1433 {
1434 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1435 if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1436 HILOG_ERROR("DispatchTerminate error, ability state is %{public}d", abilityRecord->GetAbilityState());
1437 return INNER_ERR;
1438 }
1439
1440 // remove terminate timeout task.
1441 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1442 CHECK_POINTER_AND_RETURN_LOG(handler, ERR_INVALID_VALUE, "Fail to get AbilityEventHandler.");
1443 handler->RemoveTask(std::to_string(abilityRecord->GetEventId()));
1444 auto self(shared_from_this());
1445 auto task = [self, abilityRecord]() { self->CompleteTerminate(abilityRecord); };
1446 handler->PostTask(task);
1447
1448 return ERR_OK;
1449 }
1450
DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1451 void MissionListManager::DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1452 {
1453 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1454 CHECK_POINTER(handler);
1455
1456 PrintTimeOutLog(abilityRecord, AbilityManagerService::TERMINATE_TIMEOUT_MSG);
1457
1458 auto timeoutTask = [self = shared_from_this(), abilityRecord]() {
1459 HILOG_INFO("emit delay complete terminate task.");
1460 self->CompleteTerminate(abilityRecord);
1461 };
1462 handler->PostTask(timeoutTask, "DELAY_KILL_PROCESS", AbilityManagerService::KILL_TIMEOUT);
1463 }
1464
CompleteTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1465 void MissionListManager::CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1466 {
1467 CHECK_POINTER(abilityRecord);
1468 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1469 if (abilityRecord->GetAbilityState() != AbilityState::TERMINATING) {
1470 HILOG_ERROR("%{public}s, ability is not terminating.", __func__);
1471 return;
1472 }
1473
1474 // notify AppMS terminate
1475 if (abilityRecord->TerminateAbility() != ERR_OK) {
1476 // Don't return here
1477 HILOG_ERROR("AppMS fail to terminate ability.");
1478 }
1479
1480 auto&& preAbilityRecord = abilityRecord->GetPreAbilityRecord();
1481 if (preAbilityRecord != nullptr) {
1482 TerminateAbilityLocked(preAbilityRecord, false);
1483 }
1484
1485 CompleteTerminateAndUpdateMission(abilityRecord);
1486 }
1487
CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> & abilityRecord)1488 void MissionListManager::CompleteTerminateAndUpdateMission(const std::shared_ptr<AbilityRecord> &abilityRecord)
1489 {
1490 CHECK_POINTER(abilityRecord);
1491 for (auto it : terminateAbilityList_) {
1492 if (it == abilityRecord) {
1493 abilityRecord->RemoveUriPermission();
1494 terminateAbilityList_.remove(it);
1495 // update inner mission info time
1496 bool excludeFromMissions = abilityRecord->GetAbilityInfo().excludeFromMissions;
1497 if ((abilityRecord->GetAppIndex() != 0) || abilityRecord->GetAbilityInfo().removeMissionAfterTerminate ||
1498 excludeFromMissions) {
1499 RemoveMissionLocked(abilityRecord->GetMissionId(), excludeFromMissions);
1500 return;
1501 }
1502 InnerMissionInfo innerMissionInfo;
1503 auto missionId = abilityRecord->GetMissionId();
1504 int result = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
1505 missionId, innerMissionInfo);
1506 if (result != 0) {
1507 HILOG_ERROR("Get missionInfo error, result is %{public}d, missionId is %{public}d", result, missionId);
1508 break;
1509 }
1510 innerMissionInfo.missionInfo.time = GetCurrentTime();
1511 innerMissionInfo.missionInfo.runningState = -1;
1512 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
1513 if (listenerController_) {
1514 listenerController_->NotifyMissionClosed(missionId);
1515 }
1516 HILOG_DEBUG("Destroy ability record count %{public}ld", abilityRecord.use_count());
1517 break;
1518 }
1519 HILOG_WARN("Can't find ability in terminate list.");
1520 }
1521 }
1522
GetAbilityFromTerminateList(const sptr<IRemoteObject> & token)1523 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityFromTerminateList(const sptr<IRemoteObject> &token)
1524 {
1525 if (!token) {
1526 return nullptr;
1527 }
1528
1529 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1530 for (auto abilityRecord : terminateAbilityList_) {
1531 // token is type of IRemoteObject, abilityRecord->GetToken() is type of Token extending from IRemoteObject.
1532 if (abilityRecord && abilityRecord->GetToken() && token == abilityRecord->GetToken()->AsObject()) {
1533 return abilityRecord;
1534 }
1535 }
1536 return nullptr;
1537 }
1538
ClearMission(int missionId)1539 int MissionListManager::ClearMission(int missionId)
1540 {
1541 if (missionId < 0) {
1542 HILOG_ERROR("Mission id is invalid.");
1543 return ERR_INVALID_VALUE;
1544 }
1545 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1546 auto mission = GetMissionById(missionId);
1547 if (mission && mission->GetMissionList() && mission->GetMissionList()->GetType() == MissionListType::LAUNCHER) {
1548 HILOG_ERROR("Mission id is launcher, can not clear.");
1549 return ERR_INVALID_VALUE;
1550 }
1551
1552 if (IsExcludeFromMissions(mission)) {
1553 HILOG_WARN("excludeFromMissions is true, not clear by id.");
1554 return ERR_INVALID_VALUE;
1555 }
1556
1557 return ClearMissionLocked(missionId, mission);
1558 }
1559
ClearMissionLocked(int missionId,const std::shared_ptr<Mission> & mission)1560 int MissionListManager::ClearMissionLocked(int missionId, const std::shared_ptr<Mission> &mission)
1561 {
1562 if (missionId != -1) {
1563 DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
1564 if (listenerController_) {
1565 listenerController_->NotifyMissionDestroyed(missionId);
1566 }
1567 }
1568 if (mission == nullptr) {
1569 HILOG_DEBUG("ability has already terminate, just remove mission.");
1570 return ERR_OK;
1571 }
1572
1573 auto abilityRecord = mission->GetAbilityRecord();
1574 if (abilityRecord == nullptr || abilityRecord->IsTerminating()) {
1575 HILOG_WARN("Ability record is not exist or is on terminating.");
1576 return ERR_OK;
1577 }
1578
1579 abilityRecord->SetTerminatingState();
1580 abilityRecord->SetClearMissionFlag(true);
1581 auto ret = TerminateAbilityLocked(abilityRecord, false);
1582 if (ret != ERR_OK) {
1583 HILOG_ERROR("clear mission error: %{public}d.", ret);
1584 return REMOVE_MISSION_FAILED;
1585 }
1586
1587 return ERR_OK;
1588 }
1589
ClearAllMissions()1590 int MissionListManager::ClearAllMissions()
1591 {
1592 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1593 DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteAllMissionInfos(listenerController_);
1594 std::list<std::shared_ptr<Mission>> foregroundAbilities;
1595 ClearAllMissionsLocked(defaultStandardList_->GetAllMissions(), foregroundAbilities, false);
1596 ClearAllMissionsLocked(defaultSingleList_->GetAllMissions(), foregroundAbilities, false);
1597
1598 for (auto listIter = currentMissionLists_.begin(); listIter != currentMissionLists_.end();) {
1599 auto missionList = (*listIter);
1600 listIter++;
1601 if (!missionList || missionList->GetType() == MissionListType::LAUNCHER) {
1602 continue;
1603 }
1604 ClearAllMissionsLocked(missionList->GetAllMissions(), foregroundAbilities, true);
1605 }
1606
1607 ClearAllMissionsLocked(foregroundAbilities, foregroundAbilities, false);
1608 return ERR_OK;
1609 }
1610
ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> & missionList,std::list<std::shared_ptr<Mission>> & foregroundAbilities,bool searchActive)1611 void MissionListManager::ClearAllMissionsLocked(std::list<std::shared_ptr<Mission>> &missionList,
1612 std::list<std::shared_ptr<Mission>> &foregroundAbilities, bool searchActive)
1613 {
1614 for (auto listIter = missionList.begin(); listIter != missionList.end();) {
1615 auto mission = (*listIter);
1616 listIter++;
1617 if (!mission || mission->IsLockedState()) {
1618 continue;
1619 }
1620
1621 auto abilityMs_ = OHOS::DelayedSingleton<AbilityManagerService>::GetInstance();
1622 if (abilityMs_->IsBackgroundTaskUid(mission->GetAbilityRecord()->GetUid())) {
1623 HILOG_INFO("the mission is background task, do not need clear");
1624 continue;
1625 }
1626
1627 if (searchActive && mission->GetAbilityRecord() && mission->GetAbilityRecord()->IsActiveState()) {
1628 foregroundAbilities.push_front(mission);
1629 continue;
1630 }
1631 ClearMissionLocked(-1, mission);
1632 }
1633 }
1634
SetMissionLockedState(int missionId,bool lockedState)1635 int MissionListManager::SetMissionLockedState(int missionId, bool lockedState)
1636 {
1637 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1638 if (missionId < 0) {
1639 HILOG_ERROR("param is invalid");
1640 return MISSION_NOT_FOUND;
1641 }
1642
1643 std::shared_ptr<Mission> mission = GetMissionById(missionId);
1644 if (mission) {
1645 auto abilityRecord = mission->GetAbilityRecord();
1646 if (abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions) {
1647 HILOG_ERROR("excludeFromMissions is true, missionId:%{public}d", missionId);
1648 return MISSION_NOT_FOUND;
1649 }
1650 mission->SetLockedState(lockedState);
1651 }
1652
1653 // update inner mission info time
1654 InnerMissionInfo innerMissionInfo;
1655 auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo);
1656 if (ret != 0) {
1657 HILOG_ERROR("mission is not exist, missionId %{public}d", missionId);
1658 return MISSION_NOT_FOUND;
1659 }
1660 innerMissionInfo.missionInfo.lockedState = lockedState;
1661 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(innerMissionInfo);
1662 return ERR_OK;
1663 }
1664
UpdateSnapShot(const sptr<IRemoteObject> & token)1665 void MissionListManager::UpdateSnapShot(const sptr<IRemoteObject>& token)
1666 {
1667 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1668 auto abilityRecord = GetAbilityRecordByToken(token);
1669 if (!abilityRecord) {
1670 HILOG_ERROR("Cannot find AbilityRecord by Token.");
1671 return;
1672 }
1673 HILOG_INFO("UpdateSnapShot, ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
1674 UpdateMissionSnapshot(abilityRecord);
1675 }
1676
MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> & abilityRecord)1677 void MissionListManager::MoveToBackgroundTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1678 {
1679 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1680 if (abilityRecord == nullptr) {
1681 HILOG_ERROR("Move the ability to background fail, ability record is null.");
1682 return;
1683 }
1684 HILOG_INFO("Move the ability to background, ability:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
1685 abilityRecord->SetIsNewWant(false);
1686 if (abilityRecord->lifeCycleStateInfo_.sceneFlag != SCENE_FLAG_KEYGUARD && !abilityRecord->IsClearMissionFlag()) {
1687 UpdateMissionSnapshot(abilityRecord);
1688 }
1689
1690 auto self(shared_from_this());
1691 auto task = [abilityRecord, self]() {
1692 HILOG_ERROR("Mission list manager move to background timeout.");
1693 self->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
1694 self->CompleteBackground(abilityRecord);
1695 };
1696 abilityRecord->BackgroundAbility(task);
1697 }
1698
NotifyMissionCreated(const std::shared_ptr<AbilityRecord> & abilityRecord) const1699 void MissionListManager::NotifyMissionCreated(const std::shared_ptr<AbilityRecord> &abilityRecord) const
1700 {
1701 CHECK_POINTER(abilityRecord);
1702 auto mission = abilityRecord->GetMission();
1703 if (mission && mission->NeedNotify() && listenerController_ &&
1704 !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
1705 auto missionId = abilityRecord->GetMissionId();
1706 listenerController_->NotifyMissionCreated(missionId);
1707 mission->SetNotifyLabel(false);
1708
1709 if (mission->NeedNotifyUpdateLabel()) {
1710 PostMissionLabelUpdateTask(missionId);
1711 mission->SetNeedNotifyUpdateLabel(false);
1712 }
1713 }
1714 }
1715
PostMissionLabelUpdateTask(int missionId) const1716 void MissionListManager::PostMissionLabelUpdateTask(int missionId) const
1717 {
1718 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
1719 if (handler == nullptr) {
1720 HILOG_ERROR("Fail to get EventHandler, do not post mission label update message.");
1721 return;
1722 }
1723
1724 std::weak_ptr<MissionListenerController> wpController = listenerController_;
1725 auto task = [wpController, missionId] {
1726 auto controller = wpController.lock();
1727 if (controller == nullptr) {
1728 HILOG_ERROR("controller is nullptr.");
1729 return;
1730 }
1731 controller->NotifyMissionLabelUpdated(missionId);
1732 };
1733 handler->PostTask(task, "NotifyMissionLabelUpdated.", DELAY_NOTIFY_LABEL_TIME);
1734 }
1735
PrintTimeOutLog(const std::shared_ptr<AbilityRecord> & ability,uint32_t msgId)1736 void MissionListManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId)
1737 {
1738 if (ability == nullptr) {
1739 HILOG_ERROR("ability is nullptr");
1740 return;
1741 }
1742
1743 AppExecFwk::RunningProcessInfo processInfo = {};
1744 DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
1745 if (processInfo.pid_ == 0) {
1746 HILOG_ERROR("error: the ability[%{public}s], app may fork fail or not running.",
1747 ability->GetAbilityInfo().name.data());
1748 return;
1749 }
1750 std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
1751 switch (msgId) {
1752 case AbilityManagerService::LOAD_TIMEOUT_MSG:
1753 msgContent += "load timeout";
1754 break;
1755 case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1756 msgContent += "active timeout";
1757 break;
1758 case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1759 msgContent += "inactive timeout";
1760 break;
1761 case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1762 msgContent += "foreground timeout";
1763 break;
1764 case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
1765 msgContent += "background timeout";
1766 break;
1767 case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
1768 msgContent += "terminate timeout";
1769 break;
1770 default:
1771 return;
1772 }
1773 std::string eventType = "LIFECYCLE_TIMEOUT";
1774 OHOS::HiviewDFX::HiSysEvent::Write(OHOS::HiviewDFX::HiSysEvent::Domain::AAFWK, eventType,
1775 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
1776 EVENT_KEY_UID, processInfo.uid_,
1777 EVENT_KEY_PID, processInfo.pid_,
1778 EVENT_KEY_PACKAGE_NAME, ability->GetAbilityInfo().bundleName,
1779 EVENT_KEY_PROCESS_NAME, processInfo.processName_,
1780 EVENT_KEY_MESSAGE, msgContent);
1781
1782 HILOG_WARN("LIFECYCLE_TIMEOUT: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
1783 "msg: %{public}s", processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
1784 ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
1785 }
1786
UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord> & abilityRecord) const1787 void MissionListManager::UpdateMissionSnapshot(const std::shared_ptr<AbilityRecord>& abilityRecord) const
1788 {
1789 CHECK_POINTER(abilityRecord);
1790 if (abilityRecord->GetAbilityInfo().excludeFromMissions) {
1791 HILOG_DEBUG("excludeFromMissions is true, no need to update mission snapshot.");
1792 return;
1793 }
1794 int32_t missionId = abilityRecord->GetMissionId();
1795 MissionSnapshot snapshot;
1796 snapshot.isPrivate = (abilityRecord->GetAppIndex() != 0);
1797 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionSnapshot(missionId, abilityRecord->GetToken(),
1798 snapshot);
1799 if (listenerController_) {
1800 listenerController_->NotifyMissionSnapshotChanged(missionId);
1801 }
1802 }
1803
OnTimeOut(uint32_t msgId,int64_t eventId)1804 void MissionListManager::OnTimeOut(uint32_t msgId, int64_t eventId)
1805 {
1806 HILOG_DEBUG("On timeout, msgId is %{public}d", msgId);
1807 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1808 auto abilityRecord = GetAbilityRecordByEventId(eventId);
1809 if (abilityRecord == nullptr) {
1810 HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1811 return;
1812 }
1813 HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId,
1814 abilityRecord->GetAbilityInfo().name.c_str());
1815 abilityRecord->RemoveUriPermission();
1816
1817 #ifdef SUPPORT_GRAPHICS
1818 if (abilityRecord->IsStartingWindow()) {
1819 PostCancelStartingWindowTask(abilityRecord);
1820 }
1821 #endif
1822
1823 PrintTimeOutLog(abilityRecord, msgId);
1824 switch (msgId) {
1825 case AbilityManagerService::LOAD_TIMEOUT_MSG:
1826 HandleLoadTimeout(abilityRecord);
1827 break;
1828 case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1829 break;
1830 case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1831 case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1832 HandleForegroundTimeout(abilityRecord);
1833 break;
1834 default:
1835 break;
1836 }
1837 }
1838
HandleLoadTimeout(const std::shared_ptr<AbilityRecord> & ability)1839 void MissionListManager::HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &ability)
1840 {
1841 if (ability == nullptr) {
1842 HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1843 return;
1844 }
1845 // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
1846 if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
1847 ability->SetRestarting(true);
1848 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1849 HILOG_INFO("Launcher root load timeout, restart.");
1850 DelayedStartLauncher();
1851 return;
1852 }
1853
1854 // other
1855 HandleTimeoutAndResumeAbility(ability);
1856 }
1857
HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> & ability,AbilityState state)1858 void MissionListManager::HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &ability, AbilityState state)
1859 {
1860 if (ability == nullptr) {
1861 HILOG_ERROR("MissionListManager on time out event: ability record is nullptr.");
1862 return;
1863 }
1864
1865 if (ability->GetMission()) {
1866 ability->GetMission()->SetMovingState(false);
1867 }
1868
1869 if (!ability->IsAbilityState(AbilityState::FOREGROUNDING)) {
1870 HILOG_ERROR("this ability is not foregrounding state.");
1871 return;
1872 }
1873
1874 // root launcher load timeout, notify appMs force terminate the ability and restart immediately.
1875 if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) {
1876 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1877 HILOG_INFO("Launcher root load timeout, restart.");
1878 DelayedStartLauncher();
1879 return;
1880 }
1881
1882 // other
1883 HandleTimeoutAndResumeAbility(ability, state);
1884 }
1885
CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> & abilityRecord,AbilityState state)1886 void MissionListManager::CompleteForegroundFailed(const std::shared_ptr<AbilityRecord> &abilityRecord,
1887 AbilityState state)
1888 {
1889 HILOG_DEBUG("CompleteForegroundFailed come, state: %{public}d.", static_cast<int32_t>(state));
1890 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1891 if (abilityRecord == nullptr) {
1892 HILOG_ERROR("CompleteForegroundFailed, ability is nullptr.");
1893 return;
1894 }
1895
1896 #ifdef SUPPORT_GRAPHICS
1897 if (state == AbilityState::FOREGROUND_INVALID_MODE) {
1898 abilityRecord->SetStartingWindow(false);
1899 }
1900 if (abilityRecord->IsStartingWindow()) {
1901 PostCancelStartingWindowTask(abilityRecord);
1902 }
1903 #endif
1904
1905 HandleForegroundTimeout(abilityRecord, state);
1906 TerminatePreviousAbility(abilityRecord);
1907 PostStartWaitingAbility();
1908 }
1909
HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> & timeOutAbilityRecord,AbilityState state)1910 void MissionListManager::HandleTimeoutAndResumeAbility(const std::shared_ptr<AbilityRecord> &timeOutAbilityRecord,
1911 AbilityState state)
1912 {
1913 HILOG_DEBUG("HandleTimeoutAndResumeTopAbility start");
1914 if (timeOutAbilityRecord == nullptr) {
1915 HILOG_ERROR("LoadAndForeGroundCommon: timeOutAbilityRecord is nullptr.");
1916 return;
1917 }
1918
1919 // complete mission list moving
1920 MoveToTerminateList(timeOutAbilityRecord);
1921
1922 // load and foreground timeout, notify appMs force terminate the ability.
1923 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(timeOutAbilityRecord->GetToken());
1924
1925 // caller not exist or caller is service or timeout ability is launcher, back to launcher
1926 auto callerAbility = timeOutAbilityRecord->GetCallerRecord();
1927 if ((callerAbility == nullptr) ||
1928 (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::SERVICE) ||
1929 (callerAbility->GetAbilityInfo().type == AppExecFwk::AbilityType::EXTENSION) ||
1930 timeOutAbilityRecord->IsLauncherAbility() ||
1931 callerAbility->IsLauncherAbility()) {
1932 HILOG_DEBUG("ability timeout, back to launcher.");
1933 DelayedStartLauncher();
1934 return;
1935 }
1936
1937 if (state != AbilityState::FOREGROUND_INVALID_MODE) {
1938 DelayedResumeTimeout(callerAbility);
1939 }
1940
1941 HILOG_INFO("HandleTimeoutAndResumeTopAbility end");
1942 }
1943
DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> & callerAbility)1944 void MissionListManager::DelayedResumeTimeout(const std::shared_ptr<AbilityRecord> &callerAbility)
1945 {
1946 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
1947 CHECK_POINTER(abilityManagerService);
1948 auto handler = abilityManagerService->GetEventHandler();
1949 CHECK_POINTER(handler);
1950 std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
1951 auto timeoutTask = [wpListMgr, callerAbility]() {
1952 HILOG_DEBUG("The caller ability need to resume.");
1953 auto listMgr = wpListMgr.lock();
1954 if (listMgr) {
1955 listMgr->BackToCaller(callerAbility);
1956 }
1957 };
1958 handler->PostTask(timeoutTask, "Caller_Restart");
1959 }
1960
BackToCaller(const std::shared_ptr<AbilityRecord> & callerAbility)1961 void MissionListManager::BackToCaller(const std::shared_ptr<AbilityRecord> &callerAbility)
1962 {
1963 HILOG_INFO("Back to Caller.");
1964 std::lock_guard<std::recursive_mutex> guard(managerLock_);
1965
1966 // caller is already the top ability and foregroundnew.
1967 auto topAbility = GetCurrentTopAbilityLocked();
1968 if (callerAbility == topAbility && topAbility->IsAbilityState(AbilityState::FOREGROUND)) {
1969 HILOG_DEBUG("caller is already the top ability and foregroundnew.");
1970 return;
1971 }
1972
1973 // other , resume caller ability to top and foreground.
1974 MoveMissionToFront(callerAbility->GetMissionId(), false);
1975 }
1976
MoveToTerminateList(const std::shared_ptr<AbilityRecord> & abilityRecord)1977 void MissionListManager::MoveToTerminateList(const std::shared_ptr<AbilityRecord>& abilityRecord)
1978 {
1979 HILOG_INFO("MoveToDefaultList start.");
1980 if (abilityRecord == nullptr) {
1981 HILOG_ERROR("timeout ability record is nullptr.");
1982 return;
1983 }
1984 auto missionList = abilityRecord->GetOwnedMissionList();
1985 if (missionList == nullptr) {
1986 HILOG_ERROR("timeout missionList is nullptr.");
1987 return;
1988 }
1989 auto selMission = abilityRecord->GetMission();
1990 if (selMission == nullptr) {
1991 HILOG_ERROR("timeout mission is nullptr.");
1992 return;
1993 }
1994
1995 missionList->RemoveMission(selMission);
1996 if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
1997 RemoveMissionList(missionList);
1998 }
1999
2000 // load timeout will not wait for died event, directly remove.
2001 if (abilityRecord->IsAbilityState(AbilityState::INITIAL)) {
2002 HILOG_WARN("load timeout will not wait for died event, directly remove.");
2003 // update running state.
2004 InnerMissionInfo info;
2005 auto missionId = selMission->GetMissionId();
2006 if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2007 info.missionInfo.runningState = -1;
2008 if (listenerController_) {
2009 listenerController_->NotifyMissionClosed(missionId);
2010 }
2011 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2012 }
2013 return;
2014 }
2015 HILOG_DEBUG("success move timeout ability to terminate mission list.");
2016 // other remove to terminate list.
2017 abilityRecord->SetTerminatingState();
2018 terminateAbilityList_.push_back(abilityRecord);
2019
2020 HILOG_INFO("MoveToDefaultList end");
2021 }
2022
GetAbilityRecordByCaller(const std::shared_ptr<AbilityRecord> & caller,int requestCode)2023 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByCaller(
2024 const std::shared_ptr<AbilityRecord> &caller, int requestCode)
2025 {
2026 if (!caller) {
2027 return nullptr;
2028 }
2029
2030 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2031 for (auto missionList : currentMissionLists_) {
2032 if (missionList && (abilityRecord = missionList->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2033 return abilityRecord;
2034 }
2035 }
2036
2037 if ((abilityRecord = defaultSingleList_->GetAbilityRecordByCaller(caller, requestCode)) != nullptr) {
2038 return abilityRecord;
2039 }
2040
2041 return defaultStandardList_->GetAbilityRecordByCaller(caller, requestCode);
2042 }
2043
GetAbilityRecordByEventId(int64_t eventId) const2044 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByEventId(int64_t eventId) const
2045 {
2046 std::shared_ptr<AbilityRecord> abilityRecord = nullptr;
2047 for (auto missionList : currentMissionLists_) {
2048 if (missionList && (abilityRecord = missionList->GetAbilityRecordById(eventId)) != nullptr) {
2049 return abilityRecord;
2050 }
2051 }
2052
2053 if ((abilityRecord = defaultSingleList_->GetAbilityRecordById(eventId)) != nullptr) {
2054 return abilityRecord;
2055 }
2056
2057 return defaultStandardList_->GetAbilityRecordById(eventId);
2058 }
2059
OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord,int32_t currentUserId)2060 void MissionListManager::OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord, int32_t currentUserId)
2061 {
2062 HILOG_INFO("On ability died.");
2063 if (!abilityRecord) {
2064 HILOG_ERROR("OnAbilityDied come, abilityRecord is nullptr.");
2065 return;
2066 }
2067 std::string element = abilityRecord->GetWant().GetElement().GetURI();
2068 HILOG_DEBUG("OnAbilityDied come, ability is %{public}s", element.c_str());
2069 if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2070 HILOG_ERROR("Ability type is not page.");
2071 return;
2072 }
2073
2074 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2075 #ifdef SUPPORT_GRAPHICS
2076 if (abilityRecord->IsStartingWindow()) {
2077 PostCancelStartingWindowTask(abilityRecord);
2078 }
2079 #endif
2080
2081 if (abilityRecord->IsLauncherRoot() && currentUserId != userId_) {
2082 HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__);
2083 abilityRecord->SetAbilityState(AbilityState::INITIAL);
2084 abilityRecord->SetRestarting(true);
2085 return;
2086 }
2087
2088 HandleAbilityDied(abilityRecord);
2089 }
2090
GetTargetMissionList(int missionId,std::shared_ptr<Mission> & mission)2091 std::shared_ptr<MissionList> MissionListManager::GetTargetMissionList(int missionId, std::shared_ptr<Mission> &mission)
2092 {
2093 mission = GetMissionById(missionId);
2094 if (mission) {
2095 HILOG_DEBUG("get mission by id successfully, missionId: %{public}d", missionId);
2096 auto missionList = mission->GetMissionList();
2097 if (!missionList) {
2098 // mission is not null ptr, so its missionList ptr should be not null ptr too.
2099 HILOG_ERROR("mission list ptr is null ptr");
2100 return nullptr;
2101 }
2102
2103 auto missionType = missionList->GetType();
2104 std::shared_ptr<MissionList> targetMissionList = nullptr;
2105 switch (missionType) {
2106 case LAUNCHER:
2107 // not support move launcher to front.
2108 HILOG_ERROR("get launcher mission list, missionId: %{public}d", missionId);
2109 break;
2110 case CURRENT:
2111 targetMissionList = mission->GetMissionList();
2112 break;
2113 case DEFAULT_STANDARD:
2114 case DEFAULT_SINGLE:
2115 // generate a new missionList
2116 targetMissionList = std::make_shared<MissionList>();
2117 break;
2118 default:
2119 HILOG_ERROR("invalid missionType: %{public}d", missionType);
2120 }
2121 return targetMissionList;
2122 }
2123
2124 // cannot find mission, may reasons: system restart or mission removed by system.
2125 HILOG_INFO("cannot find mission from MissionList by missionId: %{public}d", missionId);
2126
2127 InnerMissionInfo innerMissionInfo;
2128 int getMission = DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(
2129 missionId, innerMissionInfo);
2130 if (getMission != ERR_OK) {
2131 HILOG_ERROR("cannot find mission info from MissionInfoList by missionId: %{public}d", missionId);
2132 return nullptr;
2133 }
2134
2135 // generate a new mission and missionList
2136 AbilityRequest abilityRequest;
2137 int generateAbility = DelayedSingleton<AbilityManagerService>::GetInstance()->GenerateAbilityRequest(
2138 innerMissionInfo.missionInfo.want, DEFAULT_INVAL_VALUE, abilityRequest, nullptr, userId_);
2139 if (generateAbility != ERR_OK) {
2140 HILOG_ERROR("cannot find generate ability request, missionId: %{public}d", missionId);
2141 return nullptr;
2142 }
2143
2144 auto abilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest);
2145 mission = std::make_shared<Mission>(innerMissionInfo.missionInfo.id, abilityRecord, innerMissionInfo.missionName);
2146 mission->SetLockedState(innerMissionInfo.missionInfo.lockedState);
2147 abilityRecord->SetMission(mission);
2148 abilityRecord->SetOwnerMissionUserId(userId_);
2149 std::shared_ptr<MissionList> newMissionList = std::make_shared<MissionList>();
2150 return newMissionList;
2151 }
2152
GetMissionIdByAbilityToken(const sptr<IRemoteObject> & token)2153 int32_t MissionListManager::GetMissionIdByAbilityToken(const sptr<IRemoteObject> &token)
2154 {
2155 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2156 auto abilityRecord = GetAbilityRecordByToken(token);
2157 if (!abilityRecord) {
2158 return -1;
2159 }
2160 auto mission = abilityRecord->GetMission();
2161 if (!mission) {
2162 return -1;
2163 }
2164 return mission->GetMissionId();
2165 }
2166
GetAbilityTokenByMissionId(int32_t missionId)2167 sptr<IRemoteObject> MissionListManager::GetAbilityTokenByMissionId(int32_t missionId)
2168 {
2169 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2170 sptr<IRemoteObject> result = nullptr;
2171 for (auto missionList : currentMissionLists_) {
2172 if (missionList && (result = missionList->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2173 return result;
2174 }
2175 }
2176
2177 if ((result = defaultSingleList_->GetAbilityTokenByMissionId(missionId)) != nullptr) {
2178 return result;
2179 }
2180
2181 return defaultStandardList_->GetAbilityTokenByMissionId((missionId));
2182 }
2183
PostStartWaitingAbility()2184 void MissionListManager::PostStartWaitingAbility()
2185 {
2186 auto self(shared_from_this());
2187 auto startWaitingAbilityTask = [self]() { self->StartWaitingAbility(); };
2188
2189 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2190 CHECK_POINTER_LOG(handler, "Fail to get AbilityEventHandler.");
2191
2192 /* PostTask to trigger start Ability from waiting queue */
2193 handler->PostTask(startWaitingAbilityTask, "startWaitingAbility");
2194 }
2195
HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)2196 void MissionListManager::HandleAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord)
2197 {
2198 HILOG_INFO("Handle Ability Died.");
2199 CHECK_POINTER(abilityRecord);
2200
2201 if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) {
2202 HILOG_ERROR("Ability type is not page.");
2203 return;
2204 }
2205
2206 if (abilityRecord->IsLauncherAbility()) {
2207 HandleLauncherDied(abilityRecord);
2208 return;
2209 }
2210
2211 HandleAbilityDiedByDefault(abilityRecord);
2212 }
2213
HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)2214 void MissionListManager::HandleLauncherDied(std::shared_ptr<AbilityRecord> ability)
2215 {
2216 HILOG_INFO("Handle launcher Ability Died.");
2217 auto mission = ability->GetMission();
2218 CHECK_POINTER_LOG(mission, "Fail to get launcher mission.");
2219 auto missionList = mission->GetMissionList();
2220 if (launcherList_ != missionList) {
2221 HILOG_ERROR("not launcher missionList.");
2222 return;
2223 }
2224
2225 bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2226 if (ability->IsLauncherRoot()) {
2227 HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__);
2228 ability->SetAbilityState(AbilityState::INITIAL);
2229 ability->SetRestarting(true);
2230 } else {
2231 HILOG_INFO("launcher Ability died, remove, %{public}d", __LINE__);
2232 missionList->RemoveMission(mission);
2233 }
2234 if (isForeground) {
2235 HILOG_INFO("active launcher ability died, start launcher, %{public}d", __LINE__);
2236 DelayedStartLauncher();
2237 }
2238 }
2239
HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)2240 void MissionListManager::HandleAbilityDiedByDefault(std::shared_ptr<AbilityRecord> ability)
2241 {
2242 HILOG_INFO("Handle Ability DiedByDefault.");
2243 CHECK_POINTER_LOG(ability, "ability is null.");
2244 if (ability->IsTerminating()) {
2245 HILOG_INFO("Handle Ability DiedByTerminating.");
2246 CompleteTerminateAndUpdateMission(ability);
2247 return;
2248 }
2249
2250 auto mission = ability->GetMission();
2251 CHECK_POINTER_LOG(mission, "Fail to get mission.");
2252 auto missionList = mission->GetMissionList();
2253 CHECK_POINTER_LOG(missionList, "Fail to get mission list.");
2254
2255 std::shared_ptr<AbilityRecord> launcherRoot = launcherList_->GetLauncherRoot();
2256 bool isLauncherActive = (launcherRoot &&
2257 (launcherRoot->IsAbilityState(FOREGROUND) || launcherRoot->IsAbilityState(FOREGROUNDING)));
2258 bool isForeground = ability->IsAbilityState(FOREGROUND) || ability->IsAbilityState(FOREGROUNDING);
2259
2260 // remove from mission list.
2261 missionList->RemoveMission(mission);
2262 if (missionList->GetType() == MissionListType::CURRENT && missionList->IsEmpty()) {
2263 RemoveMissionList(missionList);
2264 }
2265
2266 // update running state.
2267 auto missionId = mission->GetMissionId();
2268 if (!ability->IsUninstallAbility()) {
2269 if ((ability->GetAppIndex() != 0) || ability->GetAbilityInfo().removeMissionAfterTerminate ||
2270 ability->GetAbilityInfo().excludeFromMissions) {
2271 RemoveMissionLocked(missionId, ability->GetAbilityInfo().excludeFromMissions);
2272 } else {
2273 InnerMissionInfo info;
2274 if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, info) == 0) {
2275 info.missionInfo.runningState = -1;
2276 DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionInfo(info);
2277 }
2278
2279 if (listenerController_) {
2280 listenerController_->NotifyMissionClosed(missionId);
2281 }
2282 }
2283 }
2284
2285 // start launcher
2286 if (isForeground && !isLauncherActive) {
2287 HILOG_INFO("active ability died, start launcher later, %{public}d", __LINE__);
2288 DelayedStartLauncher();
2289 }
2290 }
2291
DelayedStartLauncher()2292 void MissionListManager::DelayedStartLauncher()
2293 {
2294 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
2295 CHECK_POINTER(abilityManagerService);
2296 auto handler = abilityManagerService->GetEventHandler();
2297 CHECK_POINTER(handler);
2298 std::weak_ptr<MissionListManager> wpListMgr = shared_from_this();
2299 auto timeoutTask = [wpListMgr]() {
2300 HILOG_DEBUG("The launcher needs to be restarted.");
2301 auto listMgr = wpListMgr.lock();
2302 if (listMgr) {
2303 listMgr->BackToLauncher();
2304 }
2305 };
2306 handler->PostTask(timeoutTask, "Launcher_Restart");
2307 }
2308
BackToLauncher()2309 void MissionListManager::BackToLauncher()
2310 {
2311 HILOG_INFO("Back to launcher.");
2312 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2313 CHECK_POINTER(launcherList_);
2314
2315 auto launcherRootAbility = launcherList_->GetLauncherRoot();
2316 if (!launcherRootAbility) {
2317 HILOG_WARN("no root launcher ability, no need back to launcher.");
2318 return;
2319 }
2320
2321 if (launcherRootAbility->GetAbilityInfo().bundleName != AbilityConfig::LAUNCHER_BUNDLE_NAME) {
2322 HILOG_WARN("not launcher mission, no need back to launcher.");
2323 return;
2324 }
2325
2326 auto launcherRootMission = launcherRootAbility->GetMission();
2327 if (!launcherRootMission) {
2328 HILOG_WARN("no root launcher mission, no need back to launcher.");
2329 return;
2330 }
2331
2332 std::queue<AbilityRequest> emptyQueue;
2333 std::swap(waitingAbilityQueue_, emptyQueue);
2334
2335 launcherList_->AddMissionToTop(launcherRootMission);
2336 MoveMissionListToTop(launcherList_);
2337 launcherRootAbility->ProcessForegroundAbility();
2338 }
2339
2340 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(const sptr<IRemoteObject> & token,const std::string & label)2341 int MissionListManager::SetMissionLabel(const sptr<IRemoteObject> &token, const std::string &label)
2342 {
2343 if (!token) {
2344 HILOG_INFO("SetMissionLabel token is nullptr.");
2345 return -1;
2346 }
2347
2348 auto missionId = GetMissionIdByAbilityToken(token);
2349 if (missionId <= 0) {
2350 HILOG_INFO("SetMissionLabel find mission failed.");
2351 return -1;
2352 }
2353
2354 // store label if not notify mission created.
2355 auto abilityRecord = GetAbilityRecordByToken(token);
2356 if (abilityRecord) {
2357 auto mission = abilityRecord->GetMission();
2358 if (mission && mission->NeedNotify()) {
2359 mission->SetNeedNotifyUpdateLabel(true);
2360 }
2361 }
2362
2363 auto ret = DelayedSingleton<MissionInfoMgr>::GetInstance()->UpdateMissionLabel(missionId, label);
2364 if (ret == 0 && listenerController_) {
2365 listenerController_->NotifyMissionLabelUpdated(missionId);
2366 }
2367
2368 return ret;
2369 }
2370
SetMissionIcon(const sptr<IRemoteObject> & token,const std::shared_ptr<Media::PixelMap> & icon)2371 int MissionListManager::SetMissionIcon(const sptr<IRemoteObject> &token, const std::shared_ptr<Media::PixelMap> &icon)
2372 {
2373 if (!token) {
2374 HILOG_INFO("SetMissionIcon token is nullptr.");
2375 return -1;
2376 }
2377
2378 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2379 auto missionId = GetMissionIdByAbilityToken(token);
2380 if (missionId <= 0) {
2381 HILOG_ERROR("SetMissionIcon find mission failed.");
2382 return -1;
2383 }
2384 auto abilityRecord = Token::GetAbilityRecordByToken(token);
2385 if (!abilityRecord) {
2386 HILOG_ERROR("SetMissionIcon find ability failed.");
2387 return -1;
2388 }
2389
2390 if (listenerController_ && !(abilityRecord->GetAbilityInfo().excludeFromMissions)) {
2391 listenerController_->NotifyMissionIconChanged(missionId, icon);
2392 }
2393
2394 return 0;
2395 }
2396
CompleteFirstFrameDrawing(const sptr<IRemoteObject> & abilityToken) const2397 void MissionListManager::CompleteFirstFrameDrawing(const sptr<IRemoteObject> &abilityToken) const
2398 {
2399 if (!abilityToken) {
2400 HILOG_WARN("%{public}s ability token is nullptr.", __func__);
2401 return;
2402 }
2403
2404 auto abilityRecord = GetAbilityRecordByToken(abilityToken);
2405 if (!abilityRecord) {
2406 HILOG_WARN("%{public}s get AbilityRecord by token failed.", __func__);
2407 return;
2408 }
2409
2410 if (abilityRecord->IsCompleteFirstFrameDrawing()) {
2411 HILOG_DEBUG("First frame drawing has completed.");
2412 return;
2413 }
2414 abilityRecord->SetCompleteFirstFrameDrawing(true);
2415
2416 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2417 if (handler == nullptr) {
2418 HILOG_ERROR("Fail to get AbilityEventHandler.");
2419 return;
2420 }
2421
2422 auto task = [owner = weak_from_this(), abilityRecord] {
2423 auto mgr = owner.lock();
2424 if (mgr == nullptr) {
2425 HILOG_ERROR("MissionListManager is nullptr.");
2426 return;
2427 }
2428 mgr->NotifyMissionCreated(abilityRecord);
2429 mgr->UpdateMissionSnapshot(abilityRecord);
2430 };
2431 handler->PostTask(task, "FirstFrameDrawing");
2432 auto preloadTask = [owner = weak_from_this(), abilityRecord] {
2433 auto mgr = owner.lock();
2434 if (mgr == nullptr) {
2435 HILOG_ERROR("MissionListManager is nullptr.");
2436 return;
2437 }
2438 mgr->ProcessPreload(abilityRecord);
2439 };
2440 handler->PostTask(preloadTask);
2441 }
2442
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const2443 void MissionListManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
2444 {
2445 auto bms = AbilityUtil::GetBundleManager();
2446 CHECK_POINTER(bms);
2447 auto abilityInfo = record->GetAbilityInfo();
2448 Want want;
2449 want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
2450 auto uid = record->GetUid();
2451 want.SetParam("uid", uid);
2452 bms->ProcessPreload(want);
2453 }
2454
GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const2455 Closure MissionListManager::GetCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
2456 {
2457 auto windowHandler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetWMSHandler();
2458 if (!windowHandler) {
2459 HILOG_ERROR("%{public}s, Get WMS handler failed.", __func__);
2460 return nullptr;
2461 }
2462
2463 return [windowHandler, abilityRecord] {
2464 if (windowHandler && abilityRecord && abilityRecord->IsStartingWindow()) {
2465 HILOG_INFO("%{public}s, call windowHandler CancelStartingWindow.", __func__);
2466 windowHandler->CancelStartingWindow(abilityRecord->GetToken());
2467 abilityRecord->SetStartingWindow(false);
2468 }
2469 };
2470 }
2471
PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> & abilityRecord) const2472 void MissionListManager::PostCancelStartingWindowTask(const std::shared_ptr<AbilityRecord> &abilityRecord) const
2473 {
2474 HILOG_INFO("%{public}s was called.", __func__);
2475 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
2476 if (!handler) {
2477 HILOG_ERROR("Fail to get AbilityEventHandler.");
2478 return;
2479 }
2480
2481 auto task = GetCancelStartingWindowTask(abilityRecord);
2482 if (!task) {
2483 HILOG_ERROR("Fail to get CancelStartingWindow task.");
2484 return;
2485 }
2486 handler->PostTask(task, AppExecFwk::EventQueue::Priority::IMMEDIATE);
2487 }
2488 #endif
2489
Dump(std::vector<std::string> & info)2490 void MissionListManager::Dump(std::vector<std::string> &info)
2491 {
2492 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2493 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2494 info.push_back(dumpInfo);
2495 dumpInfo = " current mission lists:{";
2496 info.push_back(dumpInfo);
2497 for (const auto& missionList : currentMissionLists_) {
2498 if (missionList) {
2499 missionList->Dump(info);
2500 }
2501 }
2502 dumpInfo = " }";
2503 info.push_back(dumpInfo);
2504
2505 dumpInfo = " default stand mission list:{";
2506 info.push_back(dumpInfo);
2507 if (defaultStandardList_) {
2508 defaultStandardList_->Dump(info);
2509 }
2510 dumpInfo = " }";
2511 info.push_back(dumpInfo);
2512
2513 dumpInfo = " default single mission list:{";
2514 info.push_back(dumpInfo);
2515 if (defaultSingleList_) {
2516 defaultSingleList_->Dump(info);
2517 }
2518 dumpInfo = " }";
2519 info.push_back(dumpInfo);
2520
2521 dumpInfo = " launcher mission list:{";
2522 info.push_back(dumpInfo);
2523 if (launcherList_) {
2524 launcherList_->Dump(info);
2525 }
2526 dumpInfo = " }";
2527 info.push_back(dumpInfo);
2528 }
2529
DumpMissionListByRecordId(std::vector<std::string> & info,bool isClient,int32_t abilityRecordId,const std::vector<std::string> & params)2530 void MissionListManager::DumpMissionListByRecordId(
2531 std::vector<std::string> &info, bool isClient, int32_t abilityRecordId, const std::vector<std::string> ¶ms)
2532 {
2533 std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
2534 std::unique_ptr<MissionList> defaultStandardListBackup;
2535 std::unique_ptr<MissionList> defaultSingleListBackup;
2536 std::unique_ptr<MissionList> launcherListBackup;
2537 {
2538 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2539 for (const auto& missionList : currentMissionLists_) {
2540 if (missionList != nullptr) {
2541 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
2542 }
2543 }
2544 defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
2545 defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
2546 launcherListBackup = std::make_unique<MissionList>(*launcherList_);
2547 }
2548
2549 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2550 info.push_back(dumpInfo);
2551 for (const auto& missionList : currentMissionListsBackup) {
2552 if (missionList && missionList != launcherListBackup) {
2553 HILOG_INFO("missionList begin to call DumpMissionListByRecordId %{public}s", __func__);
2554 missionList->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2555 }
2556 }
2557
2558 if (defaultStandardListBackup) {
2559 HILOG_INFO("defaultStandardList begin to call DumpMissionListByRecordId %{public}s", __func__);
2560 defaultStandardListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2561 }
2562
2563 if (defaultSingleListBackup) {
2564 HILOG_INFO("defaultSingleList begin to call DumpMissionListByRecordId %{public}s", __func__);
2565 defaultSingleListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2566 }
2567
2568 if (launcherListBackup) {
2569 HILOG_INFO("launcherList begin to call DumpMissionListByRecordId %{public}s", __func__);
2570 launcherListBackup->DumpStateByRecordId(info, isClient, abilityRecordId, params);
2571 }
2572 }
2573
DumpMissionList(std::vector<std::string> & info,bool isClient,const std::string & args)2574 void MissionListManager::DumpMissionList(std::vector<std::string> &info, bool isClient, const std::string &args)
2575 {
2576 std::list<std::unique_ptr<MissionList>> currentMissionListsBackup;
2577 std::unique_ptr<MissionList> defaultStandardListBackup;
2578 std::unique_ptr<MissionList> defaultSingleListBackup;
2579 std::unique_ptr<MissionList> launcherListBackup;
2580 {
2581 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2582 for (const auto& missionList : currentMissionLists_) {
2583 if (missionList != nullptr) {
2584 currentMissionListsBackup.emplace_back(std::make_unique<MissionList>(*missionList));
2585 }
2586 }
2587 defaultStandardListBackup = std::make_unique<MissionList>(*defaultStandardList_);
2588 defaultSingleListBackup = std::make_unique<MissionList>(*defaultSingleList_);
2589 launcherListBackup = std::make_unique<MissionList>(*launcherList_);
2590 }
2591
2592 if (args.size() != 0 &&
2593 args != "NORMAL" &&
2594 args != "DEFAULT_STANDARD" &&
2595 args != "DEFAULT_SINGLE" &&
2596 args != "LAUNCHER") {
2597 info.emplace_back("MissionList Type NORMAL|DEFAULT_STANDARD|DEFAULT_SINGLE|LAUNCHER");
2598 return;
2599 }
2600
2601 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2602 info.push_back(dumpInfo);
2603 if (args.size() == 0 || args == "NORMAL") {
2604 dumpInfo = " Current mission lists:";
2605 info.push_back(dumpInfo);
2606 for (const auto& missionList : currentMissionListsBackup) {
2607 if (missionList) {
2608 missionList->DumpList(info, isClient);
2609 }
2610 }
2611 }
2612
2613 if (args.size() == 0 || args == "DEFAULT_STANDARD") {
2614 dumpInfo = " default stand mission list:";
2615 info.push_back(dumpInfo);
2616 if (defaultStandardListBackup) {
2617 defaultStandardListBackup->DumpList(info, isClient);
2618 }
2619 }
2620
2621 if (args.size() == 0 || args == "DEFAULT_SINGLE") {
2622 dumpInfo = " default single mission list:";
2623 info.push_back(dumpInfo);
2624 if (defaultSingleListBackup) {
2625 defaultSingleListBackup->DumpList(info, isClient);
2626 }
2627 }
2628 if (args.size() == 0 || args == "LAUNCHER") {
2629 dumpInfo = " launcher mission list:";
2630 info.push_back(dumpInfo);
2631 if (launcherListBackup) {
2632 launcherListBackup->DumpList(info, isClient);
2633 }
2634 }
2635 }
2636
DumpMissionInfos(std::vector<std::string> & info)2637 void MissionListManager::DumpMissionInfos(std::vector<std::string> &info)
2638 {
2639 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2640 info.push_back(dumpInfo);
2641 DelayedSingleton<MissionInfoMgr>::GetInstance()->Dump(info);
2642 }
2643
DumpMission(int missionId,std::vector<std::string> & info)2644 void MissionListManager::DumpMission(int missionId, std::vector<std::string> &info)
2645 {
2646 std::string dumpInfo = "User ID #" + std::to_string(userId_);
2647 info.push_back(dumpInfo);
2648 InnerMissionInfo innerMissionInfo;
2649 if (DelayedSingleton<MissionInfoMgr>::GetInstance()->GetInnerMissionInfoById(missionId, innerMissionInfo) != 0) {
2650 info.push_back("error: invalid mission number, please see 'aa dump --mission-list'.");
2651 return;
2652 }
2653 innerMissionInfo.Dump(info);
2654 }
2655
ResolveLocked(const AbilityRequest & abilityRequest)2656 int MissionListManager::ResolveLocked(const AbilityRequest &abilityRequest)
2657 {
2658 HILOG_INFO("%{public}s, resolve ability_name:%{public}s",
2659 __func__,
2660 abilityRequest.want.GetElement().GetURI().c_str());
2661
2662 if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
2663 HILOG_ERROR("%{public}s, resolve ability_name:", __func__);
2664 return RESOLVE_CALL_ABILITY_INNER_ERR;
2665 }
2666
2667 return CallAbilityLocked(abilityRequest);
2668 }
2669
CallAbilityLocked(const AbilityRequest & abilityRequest)2670 int MissionListManager::CallAbilityLocked(const AbilityRequest &abilityRequest)
2671 {
2672 HILOG_INFO("call ability.");
2673 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2674
2675 // allow to start ability by called type without loading ui.
2676 if (!abilityRequest.IsCallType(AbilityCallType::CALL_REQUEST_TYPE)) {
2677 HILOG_ERROR("start ability not by call.");
2678 return ERR_INVALID_VALUE;
2679 }
2680
2681 // Get target mission and ability record.
2682 std::shared_ptr<AbilityRecord> targetAbilityRecord;
2683 std::shared_ptr<Mission> targetMission;
2684 GetTargetMissionAndAbility(abilityRequest, targetMission, targetAbilityRecord);
2685 if (!targetMission || !targetAbilityRecord) {
2686 HILOG_ERROR("Failed to get mission or record.");
2687 return ERR_INVALID_VALUE;
2688 }
2689
2690 targetAbilityRecord->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode);
2691 targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CALL);
2692
2693 // mission is first created, add mission to default call mission list.
2694 // other keep in current mission list.
2695 if (!targetMission->GetMissionList()) {
2696 defaultSingleList_->AddMissionToTop(targetMission);
2697 }
2698
2699 NotifyAbilityToken(targetAbilityRecord->GetToken(), abilityRequest);
2700
2701 // new version started by call type
2702 auto ret = ResolveAbility(targetAbilityRecord, abilityRequest);
2703 if (ret == ResolveResultType::OK_HAS_REMOTE_OBJ) {
2704 HILOG_DEBUG("target ability has been resolved.");
2705 if (targetAbilityRecord->GetWant().GetBoolParam(Want::PARAM_RESV_CALL_TO_FOREGROUND, false)) {
2706 HILOG_DEBUG("target ability needs to be switched to foreground.");
2707 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(targetAbilityRecord->GetToken());
2708 }
2709 return ERR_OK;
2710 } else if (ret == ResolveResultType::NG_INNER_ERROR) {
2711 HILOG_ERROR("resolve failed, error: %{public}d.", RESOLVE_CALL_ABILITY_INNER_ERR);
2712 return RESOLVE_CALL_ABILITY_INNER_ERR;
2713 }
2714
2715 // schedule target ability
2716 std::string element = targetAbilityRecord->GetWant().GetElement().GetURI();
2717 HILOG_DEBUG("load ability record: %{public}s", element.c_str());
2718
2719 // flag the first ability.
2720 auto currentTopAbility = GetCurrentTopAbilityLocked();
2721 if (!currentTopAbility) {
2722 if (targetAbilityRecord->GetAbilityInfo().applicationInfo.isLauncherApp) {
2723 targetAbilityRecord->SetLauncherRoot();
2724 }
2725 }
2726
2727 return targetAbilityRecord->LoadAbility();
2728 }
2729
ReleaseCallLocked(const sptr<IAbilityConnection> & connect,const AppExecFwk::ElementName & element)2730 int MissionListManager::ReleaseCallLocked(
2731 const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element)
2732 {
2733 HILOG_DEBUG("release call ability.");
2734
2735 CHECK_POINTER_AND_RETURN(connect, ERR_INVALID_VALUE);
2736 CHECK_POINTER_AND_RETURN(connect->AsObject(), ERR_INVALID_VALUE);
2737
2738 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2739
2740 std::shared_ptr<AbilityRecord> abilityRecord = GetAbilityRecordByName(element);
2741 CHECK_POINTER_AND_RETURN(abilityRecord, RELEASE_CALL_ABILITY_INNER_ERR);
2742
2743 if (!abilityRecord->ReleaseCall(connect)) {
2744 HILOG_ERROR("ability release call record failed.");
2745 return RELEASE_CALL_ABILITY_INNER_ERR;
2746 }
2747 return ERR_OK;
2748 }
2749
ResolveAbility(const std::shared_ptr<AbilityRecord> & targetAbility,const AbilityRequest & abilityRequest)2750 int MissionListManager::ResolveAbility(
2751 const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest)
2752 {
2753 HILOG_DEBUG("targetAbilityRecord resolve call record.");
2754 CHECK_POINTER_AND_RETURN(targetAbility, ResolveResultType::NG_INNER_ERROR);
2755
2756 ResolveResultType result = targetAbility->Resolve(abilityRequest);
2757 switch (result) {
2758 case ResolveResultType::NG_INNER_ERROR:
2759 case ResolveResultType::OK_HAS_REMOTE_OBJ:
2760 return result;
2761 default:
2762 break;
2763 }
2764
2765 if (targetAbility->IsReady()) {
2766 HILOG_DEBUG("targetAbility is ready, directly scheduler call request.");
2767 targetAbility->CallRequest();
2768 return ResolveResultType::OK_HAS_REMOTE_OBJ;
2769 }
2770
2771 HILOG_DEBUG("targetAbility need to call request after lifecycle.");
2772 return result;
2773 }
2774
GetAbilityRecordByName(const AppExecFwk::ElementName & element)2775 std::shared_ptr<AbilityRecord> MissionListManager::GetAbilityRecordByName(const AppExecFwk::ElementName &element)
2776 {
2777 // find in currentMissionLists_
2778 for (auto missionList : currentMissionLists_) {
2779 if (missionList != nullptr) {
2780 auto ability = missionList->GetAbilityRecordByName(element);
2781 if (ability != nullptr) {
2782 return ability;
2783 }
2784 }
2785 }
2786
2787 // find in launcherMissionList_
2788 auto ability = launcherList_->GetAbilityRecordByName(element);
2789 if (ability != nullptr) {
2790 return ability;
2791 }
2792
2793 // find in default singlelist_
2794 return defaultSingleList_->GetAbilityRecordByName(element);
2795 }
2796
OnCallConnectDied(const std::shared_ptr<CallRecord> & callRecord)2797 void MissionListManager::OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord)
2798 {
2799 HILOG_INFO("On callConnect died.");
2800 CHECK_POINTER(callRecord);
2801 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2802
2803 AppExecFwk::ElementName element = callRecord->GetTargetServiceName();
2804 auto abilityRecord = GetAbilityRecordByName(element);
2805 CHECK_POINTER(abilityRecord);
2806 abilityRecord->ReleaseCall(callRecord->GetConCallBack());
2807 }
OnAcceptWantResponse(const AAFwk::Want & want,const std::string & flag)2808 void MissionListManager::OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag)
2809 {
2810 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2811 if (waitingAbilityQueue_.empty()) {
2812 return;
2813 }
2814
2815 AbilityRequest abilityRequest = waitingAbilityQueue_.front();
2816 waitingAbilityQueue_.pop();
2817
2818 auto currentTopAbility = GetCurrentTopAbilityLocked();
2819 auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
2820
2821 if (!flag.empty()) {
2822 auto mission = GetMissionBySpecifiedFlag(want, flag);
2823 if (mission) {
2824 auto ability = mission->GetAbilityRecord();
2825 if (!ability) {
2826 return;
2827 }
2828 ability->SetWant(abilityRequest.want);
2829 ability->SetIsNewWant(true);
2830 if (abilityRequest.IsContinuation()) {
2831 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_CONTINUATION);
2832 } else if (abilityRequest.IsAppRecovery()) {
2833 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_APP_RECOVERY);
2834 } else {
2835 ability->SetLaunchReason(LaunchReason::LAUNCHREASON_START_ABILITY);
2836 }
2837
2838 auto isCallerFromLauncher = (callerAbility && callerAbility->IsLauncherAbility());
2839 MoveMissionToFront(mission->GetMissionId(), isCallerFromLauncher);
2840 NotifyRestartSpecifiedAbility(abilityRequest, ability->GetToken());
2841 return;
2842 }
2843 }
2844
2845 abilityRequest.specifiedFlag = flag;
2846 NotifyStartSpecifiedAbility(abilityRequest, want);
2847 StartAbilityLocked(currentTopAbility, callerAbility, abilityRequest);
2848 }
2849
NotifyRestartSpecifiedAbility(AbilityRequest & request,const sptr<IRemoteObject> & token)2850 void MissionListManager::NotifyRestartSpecifiedAbility(AbilityRequest &request, const sptr<IRemoteObject> &token)
2851 {
2852 if (request.abilityInfoCallback == nullptr) {
2853 return;
2854 }
2855 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2856 = iface_cast<AppExecFwk::IAbilityInfoCallback> (request.abilityInfoCallback);
2857 if (abilityInfoCallback != nullptr) {
2858 HILOG_DEBUG("%{public}s called.", __func__);
2859 abilityInfoCallback->NotifyRestartSpecifiedAbility(token);
2860 }
2861 }
2862
NotifyStartSpecifiedAbility(AbilityRequest & abilityRequest,const AAFwk::Want & want)2863 void MissionListManager::NotifyStartSpecifiedAbility(AbilityRequest &abilityRequest, const AAFwk::Want &want)
2864 {
2865 if (abilityRequest.abilityInfoCallback == nullptr) {
2866 return;
2867 }
2868
2869 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
2870 = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
2871 if (abilityInfoCallback != nullptr) {
2872 Want newWant = want;
2873 int32_t type = static_cast<int32_t>(abilityRequest.abilityInfo.type);
2874 newWant.SetParam("abilityType", type);
2875 sptr<Want> extraParam = new (std::nothrow) Want();
2876 abilityInfoCallback->NotifyStartSpecifiedAbility(abilityRequest.callerToken, newWant,
2877 abilityRequest.requestCode, extraParam);
2878 int32_t procCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_PROC_CODE, 0);
2879 if (procCode != 0) {
2880 abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_PROC_CODE, procCode);
2881 }
2882 int32_t tokenCode = extraParam->GetIntParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, 0);
2883 if (tokenCode != 0) {
2884 abilityRequest.want.SetParam(Want::PARAM_RESV_REQUEST_TOKEN_CODE, tokenCode);
2885 }
2886 }
2887 }
2888
OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want & want)2889 void MissionListManager::OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want)
2890 {
2891 HILOG_DEBUG("%{public}s called.", __func__);
2892 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2893 if (waitingAbilityQueue_.empty()) {
2894 return;
2895 }
2896 waitingAbilityQueue_.pop();
2897
2898 if (waitingAbilityQueue_.empty()) {
2899 return;
2900 }
2901 AbilityRequest abilityRequest = waitingAbilityQueue_.front();
2902 waitingAbilityQueue_.pop();
2903
2904 auto currentTopAbility = GetCurrentTopAbilityLocked();
2905 auto callerAbility = GetAbilityRecordByToken(abilityRequest.callerToken);
2906 StartAbility(currentTopAbility, callerAbility, abilityRequest);
2907 }
2908
GetMissionBySpecifiedFlag(const AAFwk::Want & want,const std::string & flag) const2909 std::shared_ptr<Mission> MissionListManager::GetMissionBySpecifiedFlag(
2910 const AAFwk::Want &want, const std::string &flag) const
2911 {
2912 std::shared_ptr<Mission> mission = nullptr;
2913 for (auto missionList : currentMissionLists_) {
2914 if (missionList && (mission = missionList->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2915 return mission;
2916 }
2917 }
2918
2919 if ((mission = defaultSingleList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2920 return mission;
2921 }
2922
2923 if ((mission = launcherList_->GetMissionBySpecifiedFlag(want, flag)) != nullptr) {
2924 return mission;
2925 }
2926
2927 return defaultStandardList_->GetMissionBySpecifiedFlag(want, flag);
2928 }
2929
IsReachToLimitLocked(const AbilityRequest & abilityRequest)2930 bool MissionListManager::IsReachToLimitLocked(const AbilityRequest &abilityRequest)
2931 {
2932 auto reUsedMission = GetReusedMission(abilityRequest);
2933 if (reUsedMission) {
2934 return false;
2935 }
2936
2937 int32_t totalCount = 0;
2938 for (const auto& missionList : currentMissionLists_) {
2939 if (!missionList) {
2940 continue;
2941 }
2942
2943 totalCount += missionList->GetMissionCountByUid(abilityRequest.uid);
2944 if (totalCount >= MAX_INSTANCE_COUNT) {
2945 return true;
2946 }
2947 }
2948
2949 totalCount += defaultStandardList_->GetMissionCountByUid(abilityRequest.uid);
2950 if (totalCount >= MAX_INSTANCE_COUNT) {
2951 return true;
2952 }
2953
2954 totalCount += defaultSingleList_->GetMissionCountByUid(abilityRequest.uid);
2955 return totalCount >= MAX_INSTANCE_COUNT;
2956 }
2957
2958 bool MissionListManager::MissionDmInitCallback::isInit_ = false;
OnRemoteDied()2959 void MissionListManager::MissionDmInitCallback::OnRemoteDied()
2960 {
2961 isInit_ = false;
2962 HILOG_WARN("DeviceManager died.");
2963 }
2964
RegisterSnapshotHandler(const sptr<ISnapshotHandler> & handler)2965 void MissionListManager::RegisterSnapshotHandler(const sptr<ISnapshotHandler>& handler)
2966 {
2967 DelayedSingleton<MissionInfoMgr>::GetInstance()->RegisterSnapshotHandler(handler);
2968 }
2969
GetMissionSnapshot(int32_t missionId,const sptr<IRemoteObject> & abilityToken,MissionSnapshot & missionSnapshot,bool isLowResolution)2970 bool MissionListManager::GetMissionSnapshot(int32_t missionId, const sptr<IRemoteObject>& abilityToken,
2971 MissionSnapshot& missionSnapshot, bool isLowResolution)
2972 {
2973 HILOG_INFO("snapshot: Start get mission snapshot.");
2974 bool forceSnapshot = false;
2975 {
2976 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2977 auto abilityRecord = GetAbilityRecordByToken(abilityToken);
2978 if (abilityRecord && abilityRecord->IsAbilityState(FOREGROUND)) {
2979 forceSnapshot = true;
2980 missionSnapshot.isPrivate = (abilityRecord->GetAppIndex() != 0);
2981 }
2982 }
2983 return DelayedSingleton<MissionInfoMgr>::GetInstance()->GetMissionSnapshot(
2984 missionId, abilityToken, missionSnapshot, isLowResolution, forceSnapshot);
2985 }
2986
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)2987 void MissionListManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
2988 {
2989 std::lock_guard<std::recursive_mutex> guard(managerLock_);
2990
2991 auto func = [&info, isPerm](const std::shared_ptr<Mission> &mission) {
2992 if (!mission) {
2993 return;
2994 }
2995
2996 auto ability = mission->GetAbilityRecord();
2997 if (!ability) {
2998 return;
2999 }
3000
3001 if (isPerm) {
3002 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, ability);
3003 } else {
3004 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
3005 auto tokenID = ability->GetApplicationInfo().accessTokenId;
3006 if (callingTokenId == tokenID) {
3007 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, ability);
3008 }
3009 }
3010 };
3011 if (!(defaultStandardList_->GetAllMissions().empty())) {
3012 auto list = defaultStandardList_->GetAllMissions();
3013 std::for_each(list.begin(), list.end(), func);
3014 }
3015 if (!(defaultSingleList_->GetAllMissions().empty())) {
3016 auto list = defaultSingleList_->GetAllMissions();
3017 std::for_each(list.begin(), list.end(), func);
3018 }
3019 for (auto missionList : currentMissionLists_) {
3020 if (!(missionList->GetAllMissions().empty())) {
3021 auto list = missionList->GetAllMissions();
3022 std::for_each(list.begin(), list.end(), func);
3023 }
3024 }
3025 }
3026
UninstallApp(const std::string & bundleName,int32_t uid)3027 void MissionListManager::UninstallApp(const std::string &bundleName, int32_t uid)
3028 {
3029 HILOG_INFO("Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3030 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
3031 CHECK_POINTER(abilityManagerService);
3032 auto handler = abilityManagerService->GetEventHandler();
3033 CHECK_POINTER(handler);
3034 std::weak_ptr<MissionListManager> wpMgr = shared_from_this();
3035 auto task = [wpMgr, bundleName, uid]() {
3036 HILOG_INFO("Handle Uninstall app, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3037 auto mgr = wpMgr.lock();
3038 if (mgr) {
3039 mgr->AddUninstallTags(bundleName, uid);
3040 }
3041 };
3042 handler->PostTask(task);
3043 }
3044
AddUninstallTags(const std::string & bundleName,int32_t uid)3045 void MissionListManager::AddUninstallTags(const std::string &bundleName, int32_t uid)
3046 {
3047 HILOG_INFO("AddUninstallTags, bundleName: %{public}s, uid:%{public}d", bundleName.c_str(), uid);
3048 std::lock_guard<std::recursive_mutex> guard(managerLock_);
3049 for (auto it = currentMissionLists_.begin(); it != currentMissionLists_.end();) {
3050 auto missionList = *it;
3051 if (missionList) {
3052 missionList->HandleUnInstallApp(bundleName, uid); // add tag here.
3053 if (missionList->IsEmpty()) {
3054 currentMissionLists_.erase(it++);
3055 continue;
3056 }
3057 }
3058 it++;
3059 }
3060 defaultSingleList_->HandleUnInstallApp(bundleName, uid);
3061 defaultStandardList_->HandleUnInstallApp(bundleName, uid);
3062 std::list<int32_t> matchedMissions;
3063 DelayedSingleton<MissionInfoMgr>::GetInstance()->HandleUnInstallApp(bundleName, uid, matchedMissions);
3064 if (listenerController_) {
3065 listenerController_->HandleUnInstallApp(matchedMissions);
3066 }
3067
3068 EraseWaitingAbility(bundleName, uid);
3069 }
3070
EraseWaitingAbility(const std::string & bundleName,int32_t uid)3071 void MissionListManager::EraseWaitingAbility(const std::string &bundleName, int32_t uid)
3072 {
3073 std::queue<AbilityRequest> abilityQueue;
3074 waitingAbilityQueue_.swap(abilityQueue);
3075 while (!abilityQueue.empty()) {
3076 AbilityRequest tempAbilityRequest = abilityQueue.front();
3077 abilityQueue.pop();
3078 if (tempAbilityRequest.abilityInfo.bundleName == bundleName && tempAbilityRequest.uid == uid) {
3079 HILOG_INFO("AddUninstallTags, erase AbilityRequest from waitingAbilityQueue.");
3080 } else {
3081 waitingAbilityQueue_.push(tempAbilityRequest);
3082 }
3083 }
3084 }
3085
IsStarted()3086 bool MissionListManager::IsStarted()
3087 {
3088 std::lock_guard<std::recursive_mutex> guard(managerLock_);
3089 auto launcherRoot = launcherList_->GetLauncherRoot();
3090 return launcherRoot != nullptr;
3091 }
3092
PauseManager()3093 void MissionListManager::PauseManager()
3094 {
3095 HILOG_INFO("MissionListManager PauseManager. move foreground to background.");
3096 std::lock_guard<std::recursive_mutex> guard(managerLock_);
3097 std::list<std::shared_ptr<AbilityRecord>> foregroundAbilities;
3098 GetAllForegroundAbilities(foregroundAbilities);
3099
3100 for (auto& abilityRecord : foregroundAbilities) {
3101 if (!abilityRecord) {
3102 continue;
3103 }
3104 abilityRecord->SetSwitchingPause(true);
3105 MoveToBackgroundTask(abilityRecord);
3106 }
3107 }
3108
ResumeManager()3109 void MissionListManager::ResumeManager()
3110 {
3111 HILOG_INFO("ResumeManager, back to launcher.");
3112 BackToLauncher();
3113 }
3114
GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3115 void MissionListManager::GetAllForegroundAbilities(std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3116 {
3117 for (auto& missionList : currentMissionLists_) {
3118 GetForegroundAbilities(missionList, foregroundList);
3119 }
3120 GetForegroundAbilities(defaultSingleList_, foregroundList);
3121 GetForegroundAbilities(defaultStandardList_, foregroundList);
3122 }
3123
GetForegroundAbilities(const std::shared_ptr<MissionList> & missionList,std::list<std::shared_ptr<AbilityRecord>> & foregroundList)3124 void MissionListManager::GetForegroundAbilities(const std::shared_ptr<MissionList>& missionList,
3125 std::list<std::shared_ptr<AbilityRecord>>& foregroundList)
3126 {
3127 if (!missionList || missionList->IsEmpty()) {
3128 return;
3129 }
3130
3131 for (auto& mission : missionList->GetAllMissions()) {
3132 if (!mission) {
3133 continue;
3134 }
3135
3136 auto abilityRecord = mission->GetAbilityRecord();
3137 if (!abilityRecord) {
3138 continue;
3139 }
3140
3141 if (abilityRecord->IsActiveState()) {
3142 foregroundList.emplace_back(abilityRecord);
3143 }
3144 }
3145 }
3146
RemoveMissionLocked(int32_t missionId,bool excludeFromMissions)3147 void MissionListManager::RemoveMissionLocked(int32_t missionId, bool excludeFromMissions)
3148 {
3149 if (missionId <= 0) {
3150 return;
3151 }
3152
3153 DelayedSingleton<MissionInfoMgr>::GetInstance()->DeleteMissionInfo(missionId);
3154 if (listenerController_ && !excludeFromMissions) {
3155 listenerController_->NotifyMissionDestroyed(missionId);
3156 }
3157 }
3158
IsExcludeFromMissions(const std::shared_ptr<Mission> & mission)3159 bool MissionListManager::IsExcludeFromMissions(const std::shared_ptr<Mission> &mission)
3160 {
3161 if (!mission) {
3162 return false;
3163 }
3164
3165 auto abilityRecord = mission->GetAbilityRecord();
3166 return abilityRecord && abilityRecord->GetAbilityInfo().excludeFromMissions;
3167 }
3168
3169 #ifdef ABILITY_COMMAND_FOR_TEST
BlockAbility(int32_t abilityRecordId)3170 int MissionListManager::BlockAbility(int32_t abilityRecordId)
3171 {
3172 int ret = -1;
3173 for (const auto &missionList : currentMissionLists_) {
3174 if (missionList && missionList != launcherList_) {
3175 HILOG_INFO("missionList begin to call BlockAbilityByRecordId %{public}s", __func__);
3176 if (missionList->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3177 HILOG_INFO("missionList call BlockAbilityByRecordId success");
3178 ret = ERR_OK;
3179 }
3180 }
3181 }
3182
3183 if (defaultStandardList_) {
3184 HILOG_INFO("defaultStandardList begin to call BlockAbilityByRecordId %{public}s", __func__);
3185 if (defaultStandardList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3186 HILOG_INFO("defaultStandardList call BlockAbilityByRecordId success");
3187 ret = ERR_OK;
3188 }
3189 }
3190
3191 if (defaultSingleList_) {
3192 HILOG_INFO("defaultSingleList begin to call BlockAbilityByRecordId %{public}s", __func__);
3193 if (defaultSingleList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3194 HILOG_INFO("defaultSingleList_ call BlockAbilityByRecordId success");
3195 ret = ERR_OK;
3196 }
3197 }
3198
3199 if (launcherList_) {
3200 HILOG_INFO("launcherList begin to call BlockAbilityByRecordId %{public}s", __func__);
3201 if (launcherList_->BlockAbilityByRecordId(abilityRecordId) == ERR_OK) {
3202 HILOG_INFO("launcherList_ call BlockAbilityByRecordId success");
3203 ret = ERR_OK;
3204 }
3205 }
3206 return ret;
3207 }
3208 #endif
3209
SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> & tokens)3210 void MissionListManager::SetMissionANRStateByTokens(const std::vector<sptr<IRemoteObject>> &tokens)
3211 {
3212 HILOG_INFO("%{public}s", __func__);
3213 for (auto &item : tokens) {
3214 auto abilityRecord = GetAbilityRecordByToken(item);
3215 if (abilityRecord == nullptr) {
3216 HILOG_WARN("abilityRecord is nullptr.");
3217 continue;
3218 }
3219 auto mission = abilityRecord->GetMission();
3220 if (mission == nullptr) {
3221 HILOG_WARN("mission is nullptr.");
3222 continue;
3223 }
3224 mission->SetANRState(true);
3225 }
3226 }
NotifyAbilityToken(const sptr<IRemoteObject> & token,const AbilityRequest & abilityRequest)3227 void MissionListManager::NotifyAbilityToken(const sptr<IRemoteObject> &token, const AbilityRequest &abilityRequest)
3228 {
3229 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
3230 = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
3231 if (abilityInfoCallback != nullptr) {
3232 abilityInfoCallback->NotifyAbilityToken(token, abilityRequest.want);
3233 }
3234 }
3235
NotifyStartAbilityResult(const AbilityRequest & abilityRequest,int result)3236 void MissionListManager::NotifyStartAbilityResult(const AbilityRequest &abilityRequest, int result)
3237 {
3238 sptr<AppExecFwk::IAbilityInfoCallback> abilityInfoCallback
3239 = iface_cast<AppExecFwk::IAbilityInfoCallback> (abilityRequest.abilityInfoCallback);
3240 if (abilityInfoCallback != nullptr) {
3241 abilityInfoCallback->NotifyStartAbilityResult(abilityRequest.want, result);
3242 }
3243 }
3244 } // namespace AAFwk
3245 } // namespace OHOS
3246