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