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