• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef OHOS_ABILITY_RUNTIME_UI_ABILITY_LIFECYCLE_MANAGER_H
17 #define OHOS_ABILITY_RUNTIME_UI_ABILITY_LIFECYCLE_MANAGER_H
18 
19 #include <list>
20 #include <map>
21 #include <memory>
22 #include <queue>
23 #include <unordered_map>
24 #include "cpp/mutex.h"
25 
26 #include "ability_manager_constants.h"
27 #include "ability_record.h"
28 #include "isession_handler_interface.h"
29 
30 namespace OHOS {
31 namespace AAFwk {
32 class SessionInfo;
33 class StatusBarDelegateManager;
34 struct AbilityRunningInfo;
35 struct MissionValidResult;
36 
37 struct SpecifiedRequest {
38     bool preCreateProcessName = false;
39     bool isCold = false;
40     bool isSpecifiedProcess = false;
41     int32_t requestId = 0;
42     int32_t persistentId = 0;
43     uint32_t sceneFlag = 0;
44     uint32_t callingTokenId = 0;
45     AbilityRequest abilityRequest;
46 
SpecifiedRequestSpecifiedRequest47     SpecifiedRequest(int32_t requestId, AbilityRequest request) : requestId(requestId), abilityRequest(request) {}
48 };
49 
50 class UIAbilityLifecycleManager : public std::enable_shared_from_this<UIAbilityLifecycleManager> {
51 public:
52     UIAbilityLifecycleManager() = default;
53     explicit UIAbilityLifecycleManager(int32_t userId);
54     virtual ~UIAbilityLifecycleManager() = default;
55 
56     void SignRestartAppFlag(int32_t uid, bool isAppRecovery = false);
57 
58     /**
59      * StartUIAbility with request.
60      *
61      * @param abilityRequest the request of the service ability to start.
62      * @param sessionInfo the info of scene session
63      * @param isColdStart the session info of the ability is or not cold start.
64      * @return Returns ERR_OK on success, others on failure.
65      */
66     int StartUIAbility(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo, uint32_t sceneFlag,
67         bool &isColdStart);
68 
69     /**
70      * @brief execute after the ability schedule the lifecycle
71      *
72      * @param token the ability token
73      * @param state the ability state
74      * @param saveData the saved data
75      * @return execute error code
76      */
77     int AbilityTransactionDone(const sptr<IRemoteObject> &token, int state, const AppExecFwk::PacMap &saveData);
78 
79     /**
80      * @brief execute after the ability schedule the lifecycle
81      *
82      * @param token the ability token
83      * @param windowConfig the windowconfig
84      * @return execute error code
85      */
86     int AbilityWindowConfigTransactionDone(
87         const sptr<IRemoteObject> &token, const AppExecFwk::WindowConfig &windowConfig);
88 
89     /**
90      * attach ability thread ipc object.
91      *
92      * @param scheduler ability thread ipc object.
93      * @param token the token of ability.
94      * @return Returns ERR_OK on success, others on failure.
95      */
96     int AttachAbilityThread(const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token);
97 
98     /**
99      * app manager service call this interface after ability request done.
100      *
101      * @param token ability's token.
102      * @param state the state of ability lift cycle.
103      */
104     void OnAbilityRequestDone(const sptr<IRemoteObject> &token, int32_t state);
105 
106     /**
107      * Check whether the UIAbility is alive.
108      *
109      * @param token ability's token.
110      * @return Returns true on alive.
111      */
112     bool IsContainsAbility(const sptr<IRemoteObject> &token) const;
113 
114     /**
115      * Notify SCB to minimize UIAbility
116      *
117      * @param token ability's token
118      */
119     int32_t NotifySCBToMinimizeUIAbility(const sptr<IRemoteObject> token);
120 
121     /**
122      * MinimizeUIAbility, minimize the special ability by scb.
123      *
124      * @param abilityRecord, the ability to minimize.
125      * @param fromUser, Whether form user.
126      * @return Returns ERR_OK on success, others on failure.
127      */
128     int MinimizeUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, bool fromUser, uint32_t sceneFlag);
129 
130     /**
131      * GetUIAbilityRecordBySessionInfo.
132      *
133      * @param sessionToken, service ability's session token.
134      * @return Returns AbilityRecord shared_ptr.
135      */
136     std::shared_ptr<AbilityRecord> GetUIAbilityRecordBySessionInfo(const sptr<SessionInfo> &sessionInfo);
137 
138     int32_t BackToCallerAbilityWithResult(std::shared_ptr<AbilityRecord> abilityRecord,
139         int resultCode, const Want *resultWant, int64_t callerRequestCode);
140 
141     /**
142      * CloseUIAbility, close the special ability by scb.
143      *
144      * @param abilityRecord, the ability to close.
145      * @param resultCode, the resultCode of the ability to terminate.
146      * @param resultWant, the Want of the ability to return.
147      * @param isClearSession Indicates whether to close UIAbility because the session is cleared.
148      * @return Returns ERR_OK on success, others on failure.
149      */
150     int CloseUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord,
151         int resultCode, const Want *resultWant, bool isClearSession);
152 
153     /**
154      * Set rootSceneSession by SCB.
155      *
156      * @param rootSceneSession Indicates root scene session of SCB.
157      */
158     void SetRootSceneSession(const sptr<IRemoteObject> &rootSceneSession);
159 
160     int NotifySCBToStartUIAbility(AbilityRequest &abilityRequest);
161 
162     int NotifySCBToPreStartUIAbility(const AbilityRequest &abilityRequest,
163         sptr<SessionInfo> &sessionInfo);
164 
165     int32_t NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest);
166 
167     /**
168      * @brief handle time out event
169      *
170      * @param msgId the msg id in ability record
171      * @param abilityRecordId the id of ability record
172      * @param isHalf is half
173      */
174     void OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf = false);
175 
176     /**
177      * @brief handle when ability died
178      *
179      * @param abilityRecord the died ability
180      */
181     void OnAbilityDied(std::shared_ptr<AbilityRecord> abilityRecord);
182 
183     /**
184      * resolve the call ipc of ability for scheduling oncall.
185      *
186      * @param abilityRequest target ability request.
187      */
188     int ResolveLocked(const AbilityRequest &abilityRequest);
189 
190     /**
191      * Call UIAbility by SCB.
192      *
193      * @param sessionInfo the session info of the ability to be called.
194      * @param isColdStart the session of the ability is or not cold start.
195      */
196     void CallUIAbilityBySCB(const sptr<SessionInfo> &sessionInfo, bool &isColdStart);
197 
198     /**
199      * OnAcceptWantResponse.
200      *
201      * @param want the want of the ability to start.
202      * @param abilityRequest the flag of the ability to start.
203      * @return Returns ERR_OK on success, others on failure.
204      */
205     void OnAcceptWantResponse(const AAFwk::Want &want, const std::string &flag, int32_t requestId = 0);
206 
207     /**
208      * OnStartSpecifiedProcessResponse.
209      *
210      * @param want the want of the ability to start.
211      * @param abilityRequest target ability request.
212      */
213     void OnStartSpecifiedProcessResponse(const AAFwk::Want &want, const std::string &flag, int32_t requestId = 0);
214 
215     /**
216      * OnStartSpecifiedAbilityTimeoutResponse.
217      *
218      * @param want the want of the ability to start.
219      */
220     void OnStartSpecifiedAbilityTimeoutResponse(const AAFwk::Want &want, int32_t requestId = 0);
221 
222     /**
223      * OnStartSpecifiedProcessTimeoutResponse.
224      *
225      * @param want the want of the ability to start.
226      */
227     void OnStartSpecifiedProcessTimeoutResponse(const AAFwk::Want &want, int32_t requestId = 0);
228 
229     /**
230      * Start specified ability by SCB.
231      *
232      * @param want Want information.
233      */
234     void StartSpecifiedAbilityBySCB(const Want &want);
235 
236     /**
237      * CallRequestDone, after invoke callRequest, ability will call this interface to return callee.
238      *
239      * @param abilityRecord ability's record.
240      * @param callStub ability's callee.
241      */
242     void CallRequestDone(const std::shared_ptr<AbilityRecord> &abilityRecord, const sptr<IRemoteObject> &callStub);
243 
244     /**
245      * release the connection of this call.
246      *
247      * @param connect caller callback ipc.
248      * @param element target ability name.
249      */
250     int ReleaseCallLocked(const sptr<IAbilityConnection> &connect, const AppExecFwk::ElementName &element);
251 
252     /**
253      * @brief handle when call connection died
254      *
255      * @param callRecord the died call connection
256      */
257     void OnCallConnectDied(const std::shared_ptr<CallRecord> &callRecord);
258 
259     /**
260      * Get sessionId by ability token.
261      *
262      * @param token the ability token.
263      * @return Returns sessionId on success, zero on failure.
264      */
265     int32_t GetSessionIdByAbilityToken(const sptr<IRemoteObject> &token);
266 
267     void GetActiveAbilityList(int32_t uid, std::vector<std::string> &abilityList, int32_t pid = NO_PID);
268 
269     bool PrepareTerminateAbility(const std::shared_ptr<AbilityRecord> &abilityRecord);
270     void SetSessionHandler(const sptr<ISessionHandler> &handler);
271 
272     /**
273      * Get abilityRecord by session id.
274      *
275      * @param sessionId the session id.
276      * @return Returns abilityRecord on success, nullptr on failure.
277      */
278     std::shared_ptr<AbilityRecord> GetAbilityRecordsById(int32_t sessionId) const;
279 
280     /**
281      * Get check ability number.
282      *
283      * @param bundleName record ability info bundle name.
284      * @param abilityName record ability info ability name.
285      * @param moduleName recode ability info module name.
286      * @return Return find ability number.
287      */
288     int32_t CheckAbilityNumber(
289         const std::string &bundleName, const std::string &abilityName, const std::string &moduleName) const;
290 
291     /**
292      * If ability number more then one, send event info.
293      *
294      * @param userId record ability info user id.
295      * @param bundleName record ability info bundle name.
296      * @param abilityName record ability info ability name.
297      * @param moduleName recode ability info module name.
298      */
299     void MoreAbilityNumbersSendEventInfo(
300         int32_t userId, const std::string &bundleName, const std::string &abilityName, const std::string &moduleName);
301 
302     void OnAppStateChanged(const AppInfo &info);
303 
304     void UninstallApp(const std::string &bundleName, int32_t uid);
305 
306     void GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm) const;
307 
308     /**
309      * @brief dump all abilities
310      *
311      * @param info dump result.
312      */
313     void Dump(std::vector<std::string>& info);
314 
315     /**
316      * @brief dump mission list
317      *
318      * @param info dump result.
319      */
320     void DumpMissionList(std::vector<std::string> &info, bool isClient, const std::string &args = "");
321 
322     /**
323      * @brief dump mission list by id with params
324      *
325      * @param info dump result.
326      * @param params dump params.
327      */
328     void DumpMissionListByRecordId(std::vector<std::string>& info, bool isClient, int32_t abilityRecordId,
329         const std::vector<std::string>& params);
330 
331     int MoveMissionToFront(int32_t sessionId, std::shared_ptr<StartOptions> startOptions = nullptr);
332 
333     bool IsAbilityStarted(AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &targetRecord);
334 
335     /**
336      * @brief Update session info.
337      * @param sessionInfos The vector of session info.
338      */
339     int32_t UpdateSessionInfoBySCB(std::list<SessionInfo> &sessionInfos, std::vector<int32_t> &sessionIds);
340 
341     int32_t RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate);
342     bool IsCallerInStatusBar();
343 
344     int32_t TryPrepareTerminateByPids(const std::vector<int32_t>& pids);
345 
346     int ChangeAbilityVisibility(sptr<IRemoteObject> token, bool isShow);
347 
348     int ChangeUIAbilityVisibilityBySCB(sptr<SessionInfo> sessionInfo, bool isShow);
349 
350     std::vector<std::shared_ptr<AbilityRecord>> GetAbilityRecordsByName(const AppExecFwk::ElementName &element);
351 
352     std::shared_ptr<AbilityRecord> GetAbilityRecordByToken(const sptr<IRemoteObject> &token) const;
353 
354 #ifdef SUPPORT_GRAPHICS
355     void CompleteFirstFrameDrawing(const sptr<IRemoteObject> &token);
356 #endif
357     void CompleteFirstFrameDrawing(int32_t sessionId) const;
358 
359     int32_t GetAbilityStateByPersistentId(int32_t persistentId, bool &state);
360 
361     void NotifySCBToHandleAtomicServiceException(sptr<SessionInfo> sessionInfo, int32_t errorCode,
362         const std::string& errorReason);
363 
364     int32_t CleanUIAbility(const std::shared_ptr<AbilityRecord> &abilityRecord);
365 
366     void EnableListForSCBRecovery();
367 
368 private:
369     int32_t GetPersistentIdByAbilityRequest(const AbilityRequest &abilityRequest, bool &reuse) const;
370     int32_t GetReusedSpecifiedPersistentId(const AbilityRequest &abilityRequest, bool &reuse) const;
371     int32_t GetReusedStandardPersistentId(const AbilityRequest &abilityRequest, bool &reuse) const;
372     int32_t GetReusedCollaboratorPersistentId(const AbilityRequest &abilityRequest, bool &reuse) const;
373     std::string GenerateProcessNameForNewProcessMode(const AppExecFwk::AbilityInfo& abilityInfo);
374     void PreCreateProcessName(AbilityRequest &abilityRequest);
375     void UpdateProcessName(const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &abilityRecord);
376     void UpdateAbilityRecordLaunchReason(const AbilityRequest &abilityRequest,
377         std::shared_ptr<AbilityRecord> &abilityRecord) const;
378     void EraseAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord);
379     int DispatchState(const std::shared_ptr<AbilityRecord> &abilityRecord, int state);
380     int DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord);
381     int DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord);
382     int DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord, bool success,
383         AbilityState state = AbilityState::INITIAL);
384     void CompleteForegroundSuccess(const std::shared_ptr<AbilityRecord> &abilityRecord);
385     void HandleLoadTimeout(const std::shared_ptr<AbilityRecord> &ability);
386     void HandleForegroundFailed(const std::shared_ptr<AbilityRecord> &ability,
387         AbilityState state = AbilityState::INITIAL);
388     void HandleForegroundTimeout(const std::shared_ptr<AbilityRecord> &ability);
389     void NotifySCBToHandleException(const std::shared_ptr<AbilityRecord> &ability, int32_t errorCode,
390         const std::string& errorReason);
391     void MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord);
392     void CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord);
393     void PrintTimeOutLog(std::shared_ptr<AbilityRecord> ability, uint32_t msgId, bool isHalf = false);
394     void DelayCompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord);
395     void CompleteTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord);
396     void CompleteTerminateLocked(const std::shared_ptr<AbilityRecord> &abilityRecord);
397     bool IsContainsAbilityInner(const sptr<IRemoteObject> &token) const;
398     bool CheckProperties(const std::shared_ptr<AbilityRecord> &abilityRecord, const AbilityRequest &abilityRequest,
399         AppExecFwk::LaunchMode launchMode) const;
400     void NotifyAbilityToken(const sptr<IRemoteObject> &token, const AbilityRequest &abilityRequest) const;
401     void PrepareCloseUIAbility(std::shared_ptr<AbilityRecord> abilityRecord,
402         int resultCode, const Want *resultWant, bool isClearSession);
403     int CloseUIAbilityInner(std::shared_ptr<AbilityRecord> abilityRecord);
404     int32_t BackToCallerAbilityWithResultLocked(sptr<SessionInfo> currentSessionInfo,
405         std::shared_ptr<AbilityRecord> callerAbilityRecord);
406 
407     // byCall
408     int CallAbilityLocked(const AbilityRequest &abilityRequest);
409     sptr<SessionInfo> CreateSessionInfo(const AbilityRequest &abilityRequest) const;
410     int NotifySCBPendingActivation(sptr<SessionInfo> &sessionInfo, const AbilityRequest &abilityRequest);
411     int ResolveAbility(const std::shared_ptr<AbilityRecord> &targetAbility, const AbilityRequest &abilityRequest) const;
412     std::vector<std::shared_ptr<AbilityRecord>> GetAbilityRecordsByNameInner(const AppExecFwk::ElementName &element);
413 
414     void NotifyStartSpecifiedAbility(AbilityRequest &request, const AAFwk::Want &want);
415     void NotifyRestartSpecifiedAbility(const AbilityRequest &request, const sptr<IRemoteObject> &token);
416     int MoveAbilityToFront(const AbilityRequest &abilityRequest, const std::shared_ptr<AbilityRecord> &abilityRecord,
417         std::shared_ptr<AbilityRecord> callerAbility, std::shared_ptr<StartOptions> startOptions = nullptr);
418     int SendSessionInfoToSCB(std::shared_ptr<AbilityRecord> &callerAbility, sptr<SessionInfo> &sessionInfo);
419     int StartAbilityBySpecifed(const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &callerAbility,
420         int32_t requestId);
421 
422     void SetLastExitReason(std::shared_ptr<AbilityRecord> &abilityRecord) const;
423     void SetRevicerInfo(const AbilityRequest &abilityRequest, std::shared_ptr<AbilityRecord> &abilityRecord) const;
424 
425     bool CheckPrepareTerminateEnable(const std::shared_ptr<AbilityRecord> &abilityRecord);
426     bool GetContentAndTypeId(uint32_t msgId, std::string &msgContent, int &typeId) const;
427 
428     bool CheckSessionInfo(sptr<SessionInfo> sessionInfo) const;
429     std::shared_ptr<AbilityRecord> CreateAbilityRecord(AbilityRequest &abilityRequest,
430         sptr<SessionInfo> sessionInfo) const;
431     void AddCallerRecord(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
432         std::shared_ptr<AbilityRecord> uiAbilityRecord) const;
433     void CheckSpecified(int32_t requestId, std::shared_ptr<AbilityRecord> uiAbilityRecord);
434     void SendKeyEvent(const AbilityRequest &abilityRequest) const;
435     bool CheckPid(const std::shared_ptr<AbilityRecord> abilityRecord, const int32_t pid) const;
436     std::shared_ptr<StatusBarDelegateManager> GetStatusBarDelegateManager();
437     int32_t DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord);
438     void BatchCloseUIAbility(const std::unordered_set<std::shared_ptr<AbilityRecord>>& abilitySet);
439     void TerminateSession(std::shared_ptr<AbilityRecord> abilityRecord);
440     int StartWithPersistentIdByDistributed(const AbilityRequest &abilityRequest, int32_t persistentId);
441     void CheckCallerFromBackground(std::shared_ptr<AbilityRecord> callerAbility, sptr<SessionInfo> &sessionInfo);
442     std::shared_ptr<AbilityRecord> GenerateAbilityRecord(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo,
443         bool &isColdStart);
GetRequestId()444     inline int32_t GetRequestId()
445     {
446         if (requestId_ == 0 || requestId_ == INT32_MAX) {
447             requestId_ = 1;
448         }
449         return requestId_++;
450     }
451 
452     void AddSpecifiedRequest(std::shared_ptr<SpecifiedRequest> request);
453     void StartSpecifiedRequest(SpecifiedRequest &specifiedRequest);
454     std::shared_ptr<SpecifiedRequest> PopAndGetNextSpecified(int32_t requestId);
455     bool IsSpecifiedModuleLoaded(const AbilityRequest &abilityRequest);
456     bool HandleStartSpecifiedCold(AbilityRequest &abilityRequest, sptr<SessionInfo> sessionInfo, uint32_t sceneFlag);
457     bool HandleColdAcceptWantDone(const AAFwk::Want &want, const std::string &flag,
458         const SpecifiedRequest &specifiedRequest);
459     void HandleLegacyAcceptWantDone(AbilityRequest &abilityRequest, int32_t requestId,
460         const std::string &flag, const AAFwk::Want &want);
461     std::shared_ptr<SpecifiedRequest> GetSpecifiedRequest(int32_t requestId);
462     void PutSpecifiedFlag(int32_t requestId, const std::string &flag);
463 
464     int32_t userId_ = -1;
465     mutable ffrt::mutex sessionLock_;
466     std::unordered_map<int32_t, std::shared_ptr<AbilityRecord>> sessionAbilityMap_;
467     std::unordered_map<int64_t, std::shared_ptr<AbilityRecord>> tmpAbilityMap_;
468     std::list<std::shared_ptr<AbilityRecord>> terminateAbilityList_;
469     sptr<IRemoteObject> rootSceneSession_;
470     int32_t requestId_ = 0;
471     sptr<ISessionHandler> handler_;
472     ffrt::mutex statusBarDelegateManagerLock_;
473     std::shared_ptr<StatusBarDelegateManager> statusBarDelegateManager_;
474     bool isSCBRecovery_ = false;
475     std::unordered_set<int32_t> coldStartInSCBRecovery_;
476 
477     std::map<std::string, std::list<std::shared_ptr<SpecifiedRequest>>> specifiedRequestList_;
478     std::map<int32_t, std::string> specifiedFlagMap_;
479 };
480 }  // namespace AAFwk
481 }  // namespace OHOS
482 #endif  // OHOS_ABILITY_RUNTIME_UI_ABILITY_LIFECYCLE_MANAGER_H