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