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