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