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