/* * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OHOS_ABILITY_RUNTIME_ABILITY_CONNECT_MANAGER_H #define OHOS_ABILITY_RUNTIME_ABILITY_CONNECT_MANAGER_H #include #include #include #include #include "cpp/mutex.h" #include "ability_cache_manager.h" #include "ability_connect_callback_interface.h" #include "task_handler_wrap.h" #include "event_handler_wrap.h" #include "ability_record.h" #include "ability_running_info.h" #include "event_report.h" #include "extension_config.h" #include "extension_running_info.h" #include "connection_record.h" #include "element_name.h" #include "ui_extension_ability_connect_info.h" #include "extension_record_manager.h" #include "want.h" #include "iremote_object.h" #include "nocopyable.h" namespace OHOS { namespace AAFwk { using OHOS::AppExecFwk::AbilityType; using UIExtensionAbilityConnectInfo = AbilityRuntime::UIExtensionAbilityConnectInfo; using UIExtensionAbilityConnectManager = AbilityRuntime::ExtensionRecordManager; using UIExtensionSessionInfo = AbilityRuntime::UIExtensionSessionInfo; /** * @class AbilityConnectManager * AbilityConnectManager provides a facility for managing service ability connection. */ class AbilityConnectManager : public std::enable_shared_from_this { public: using ConnectMapType = std::map, std::list>>; using ServiceMapType = std::map>; using ConnectListType = std::list>; using RecipientMapType = std::map, sptr>; using UIExtWindowMapValType = std::pair, sptr>; using UIExtensionMapType = std::map, UIExtWindowMapValType>; using WindowExtMapValType = std::pair>; using WindowExtensionMapType = std::map, WindowExtMapValType>; explicit AbilityConnectManager(int userId); virtual ~AbilityConnectManager(); /** * StartAbility with request. * * @param abilityRequest, the request of the service ability to start. * @return Returns ERR_OK on success, others on failure. */ int StartAbility(const AbilityRequest &abilityRequest); /** * TerminateAbility with token and result want. * * @param token, the token of service type's ability to terminate. * @return Returns ERR_OK on success, others on failure. */ int TerminateAbility(const sptr &token); /** * StopServiceAbility with request. * * @param abilityRequest, request. * @return Returns ERR_OK on success, others on failure. */ int StopServiceAbility(const AbilityRequest &abilityRequest); /** * ConnectAbilityLocked, connect session with service ability. * * @param abilityRequest, Special want for service type's ability. * @param connect, Callback used to notify caller the result of connecting or disconnecting. * @param callerToken, caller ability token. * @param sessionInfo the extension session info of the ability to connect. * @param connectInfo the connect info. * @return Returns ERR_OK on success, others on failure. */ int ConnectAbilityLocked(const AbilityRequest &abilityRequest, const sptr &connect, const sptr &callerToken, sptr sessionInfo = nullptr, sptr connectInfo = nullptr); /** * PreloadUIExtensionAbilityInner, preload uiextension ability. * * @param abilityRequest, Special want for service type's ability. * @param hostBundleName, the caller application bundle name. * @return Returns ERR_OK on success, others on failure. */ int PreloadUIExtensionAbilityInner(const AbilityRequest &abilityRequest, std::string &hostBundleName); /** * PreloadUIExtensionAbilityLocked, preload uiextension ability. * * @param abilityRequest, Special want for service type's ability. * @param hostBundleName, the caller application bundle name. * @return Returns ERR_OK on success, others on failure. */ int PreloadUIExtensionAbilityLocked(const AbilityRequest &abilityRequest, std::string &hostBundleName); /** * UnloadUIExtensionAbility, unload uiextension ability. * * @param abilityRecord, uiextension ability record. * @param hostBundleName, the caller application bundle name. * @return Returns ERR_OK on success, others on failure. */ int UnloadUIExtensionAbility(const std::shared_ptr &abilityRecord, std::string &bundleName); /** * ClearPreloadUIExtensionRecord, clear preload uiextension record. * * @param abilityRecord, uiextension ability record. */ void ClearPreloadUIExtensionRecord(const std::shared_ptr &abilityRecord); /** * DisconnectAbilityLocked, disconnect session with callback. * * @param connect, Callback used to notify caller the result of connecting or disconnecting. * @return Returns ERR_OK on success, others on failure. */ int DisconnectAbilityLocked(const sptr &connect); /** * AttachAbilityThreadLocked, ability call this interface after loaded. * * @param scheduler, the interface handler of kit ability. * @param token, ability's token. * @return Returns ERR_OK on success, others on failure. */ int AttachAbilityThreadLocked(const sptr &scheduler, const sptr &token); void OnAbilityRequestDone(const sptr &token, const int32_t state); void OnAppStateChanged(const AppInfo &info); /** * AbilityTransitionDone, ability call this interface after lift cycle was changed. * * @param token, ability's token. * @param state, the state of ability lift cycle. * @return Returns ERR_OK on success, others on failure. */ int AbilityTransitionDone(const sptr &token, int state); /** * @brief execute after the ability schedule the lifecycle * * @param token the ability token * @param windowConfig the windowconfig * @return execute error code */ int AbilityWindowConfigTransactionDone( const sptr &token, const AppExecFwk::WindowConfig &windowConfig); /** * ScheduleConnectAbilityDoneLocked, service ability call this interface while session was connected. * * @param token, service ability's token. * @param remoteObject, the session proxy of service ability. * @return Returns ERR_OK on success, others on failure. */ int ScheduleConnectAbilityDoneLocked(const sptr &token, const sptr &remoteObject); /** * ScheduleDisconnectAbilityDone, service ability call this interface while session was disconnected. * * @param token,service ability's token. * @return Returns ERR_OK on success, others on failure. */ int ScheduleDisconnectAbilityDoneLocked(const sptr &token); /** * ScheduleCommandAbilityDoneLocked, service ability call this interface while session was onCommanded. * * @param token,service ability's token. * @return Returns ERR_OK on success, others on failure. */ int ScheduleCommandAbilityDoneLocked(const sptr &token); int ScheduleCommandAbilityWindowDone( const sptr &token, const sptr &sessionInfo, WindowCommand winCmd, AbilityCommand abilityCmd); /** * GetUIExtensioBySessionInfo. * * @param sessionToken, service ability's session token. * @return Returns AbilityRecord shared_ptr. */ std::shared_ptr GetUIExtensioBySessionInfo(const sptr &sessionInfo); std::shared_ptr GetExtensionByTokenFromServiceMap(const sptr &token); std::shared_ptr GetExtensionByTokenFromAbilityCache(const sptr &token); std::shared_ptr GetExtensionByTokenFromTerminatingMap(const sptr &token); std::shared_ptr GetExtensionByIdFromServiceMap(const int64_t &abilityRecordId); std::shared_ptr GetExtensionByIdFromTerminatingMap(const int64_t &abilityRecordId); ConnectListType GetConnectRecordListByCallback(sptr callback); void GetExtensionRunningInfos(int upperLimit, std::vector &info, const int32_t userId, bool isPerm); void GetAbilityRunningInfos(std::vector &info, bool isPerm); void GetExtensionRunningInfo(std::shared_ptr &abilityRecord, const int32_t userId, std::vector &info); /** * set from ability manager service for sequenced task */ inline void SetTaskHandler(const std::shared_ptr &taskHandler) { taskHandler_ = taskHandler; } /** * SetEventHandler. * * @param handler,EventHandler */ inline void SetEventHandler(const std::shared_ptr &handler) { eventHandler_ = handler; } uint32_t GetSceneBoardTokenId() const { return sceneBoardTokenId_; } /** * @brief Get extensionList by pid. * @param pid Process id. * @param extensionList UIExtensionAbility name list. */ int32_t GetActiveUIExtensionList(const int32_t pid, std::vector &extensionList); /** * @brief Get extensionList by bundleName. * @param bundleName The application bundle name. * @param extensionList UIExtensionAbility name list. */ int32_t GetActiveUIExtensionList(const std::string &bundleName, std::vector &extensionList); /** * OnAbilityDied. * * @param abilityRecord, service ability record. */ void OnAbilityDied(const std::shared_ptr &abilityRecord, int32_t currentUserId); void DumpState(std::vector &info, bool isClient, const std::string &args = ""); void DumpStateByUri(std::vector &info, bool isClient, const std::string &args, std::vector ¶ms); void PauseExtensions(); void OnTimeOut(uint32_t msgId, int64_t abilityRecordId, bool isHalf = false); /** * @brief schedule to background * * @param abilityRecord the ability to move */ void MoveToBackground(const std::shared_ptr &abilityRecord); void CommandAbilityWindow(const std::shared_ptr &abilityRecord, const sptr &sessionInfo, WindowCommand winCmd); bool IsUIExtensionFocused(uint32_t uiExtensionTokenId, const sptr& focusToken); sptr GetUIExtensionSourceToken(const sptr &token); bool IsWindowExtensionFocused(uint32_t extensionTokenId, const sptr& focusToken); void HandleProcessFrozen(const std::vector &pidList, int32_t uid); void ForegroundAbilityWindowLocked(const std::shared_ptr &abilityRecord, const sptr &sessionInfo); void BackgroundAbilityWindowLocked(const std::shared_ptr &abilityRecord, const sptr &sessionInfo); void TerminateAbilityWindowLocked(const std::shared_ptr &abilityRecord, const sptr &sessionInfo); void RemoveLauncherDeathRecipient(); /** * @brief Get ui extension session info * * @param token The ability token. * @param uiExtensionSessionInfo The ui extension session info. * @param userId The user id. * @return int32_t Returns ERR_OK on success, others on failure. */ int32_t GetUIExtensionSessionInfo(const sptr token, UIExtensionSessionInfo &uiExtensionSessionInfo); void GetUIExtensionCallerTokenList(const std::shared_ptr &abilityRecord, std::list> &callerList); void CloseAssertDialog(const std::string &assertSessionId); void SignRestartAppFlag(int32_t uid); std::shared_ptr GetUIExtensionRootHostInfo(const sptr token); void UninstallApp(const std::string &bundleName, int32_t uid); int32_t UpdateKeepAliveEnableState(const std::string &bundleName, const std::string &moduleName, const std::string &mainElement, bool updateEnable); // MSG 0 - 20 represents timeout message static constexpr uint32_t CONNECT_TIMEOUT_MSG = 1; private: /** * StartAbilityLocked with request. * * @param abilityRequest, the request of the service ability to start. * @return Returns ERR_OK on success, others on failure. */ int StartAbilityLocked(const AbilityRequest &abilityRequest); /** * TerminateAbilityLocked with token and result want. * * @param token, the token of service type's ability to terminate. * @param resultCode, the result code of service type's ability to terminate. * @param resultWant, the result want for service type's ability to terminate. * @return Returns ERR_OK on success, others on failure. */ int TerminateAbilityLocked(const sptr &token); /** * StopAbilityLocked with request. * * @param abilityRequest, the request of the service ability to start. * @return Returns ERR_OK on success, others on failure. */ int StopServiceAbilityLocked(const AbilityRequest &abilityRequest); /** * DisconnectAbilityLocked, disconnect session with callback. * * @param connect, Callback used to notify caller the result of connecting or disconnecting. * @param callerDied, bool Indicates if it is caused by the caller's death. * @return Returns ERR_OK on success, others on failure. */ int DisconnectAbilityLocked(const sptr &connect, bool callerDied); /** * LoadAbility. * * @param abilityRecord, the ptr of the ability to load. */ void LoadAbility(const std::shared_ptr &abilityRecord); /** * ConnectAbility.Schedule connect ability * * @param abilityRecord, the ptr of the ability to connect. */ void ConnectAbility(const std::shared_ptr &abilityRecord); /** * ConnectAbility.Schedule connect ability * * @param abilityRecord, the ptr of the ability to connect. */ void ConnectUIServiceExtAbility(const std::shared_ptr &abilityRecord, int connectRecordId, const Want &want); /** * ConnectAbility.Schedule Resume Connect ability * * @param abilityRecord, the ptr of the ability to connect. */ void ResumeConnectAbility(const std::shared_ptr &abilityRecord); /** * CommandAbility. Schedule command ability * * @param abilityRecord, the ptr of the ability to command. */ void CommandAbility(const std::shared_ptr &abilityRecord); /** * CompleteCommandAbility. complete command ability * * @param abilityRecord, the ptr of the ability to command. */ void CompleteCommandAbility(std::shared_ptr abilityRecord); /** * TerminateDone. * * @param abilityRecord, the ptr of the ability to terminate. */ void TerminateDone(const std::shared_ptr &abilityRecord); /** * GetServiceRecordByElementName. * * @param element, service ability's element. * @return Returns AbilityRecord shared_ptr. */ std::shared_ptr GetServiceRecordByElementName(const std::string &element); /** * dispatch service ability life cycle . * * @param abilityRecord. * @param state. */ int DispatchInactive(const std::shared_ptr &abilityRecord, int state); int DispatchForeground(const std::shared_ptr &abilityRecord); int DispatchBackground(const std::shared_ptr &abilityRecord); int DispatchTerminate(const std::shared_ptr &abilityRecord); void HandleStartTimeoutTask(const std::shared_ptr &abilityRecord); void HandleStopTimeoutTask(const std::shared_ptr &abilityRecord); void HandleTerminateDisconnectTask(const ConnectListType& connectlist); void HandleCommandTimeoutTask(const std::shared_ptr &abilityRecord); void HandleCommandWindowTimeoutTask(const std::shared_ptr &abilityRecord, const sptr &sessionInfo, WindowCommand winCmd); void HandleForegroundTimeoutTask(const std::shared_ptr &abilityRecord); void HandleConnectTimeoutTask(std::shared_ptr abilityRecord); void HandleRestartResidentTask(const AbilityRequest &abilityRequest); void HandleActiveAbility(std::shared_ptr &targetService, std::shared_ptr &connectRecord); void HandleCommandDestroy(const sptr &sessionInfo); void TerminateOrCacheAbility(std::shared_ptr abilityRecord); /** * IsAbilityConnected. * * @param abilityRecord, the ptr of the connected ability. * @param connectRecordList, connect record list. * @return true: ability is connected, false: ability is not connected */ bool IsAbilityConnected(const std::shared_ptr &abilityRecord, const std::list> &connectRecordList); /** * RemoveConnectionRecordFromMap. * * @param connect, the ptr of the connect record. */ void RemoveConnectionRecordFromMap(std::shared_ptr connect); /** * RemoveServiceAbility. * * @param service, the ptr of the ability record. */ void RemoveServiceAbility(const std::shared_ptr &service); /** * GetOrCreateServiceRecord. * * @param abilityRequest, Special want for service type's ability. * @param isCreatedByConnect, whether is created by connect ability mode. * @param targetAbilityRecord, the target service ability record. * @param isLoadedAbility, whether the target ability has been loaded. */ void GetOrCreateServiceRecord(const AbilityRequest &abilityRequest, const bool isCreatedByConnect, std::shared_ptr &targetAbilityRecord, bool &isLoadedAbility); /** * GetConnectRecordListFromMap. * * @param connect, callback object. * @param isCreatedByConnect, whether is created by connect ability mode. * @param connectRecordList, the target connectRecordList. * @param isCallbackConnected, whether the callback has been connected. */ void GetConnectRecordListFromMap( const sptr &connect, std::list> &connectRecordList); /** * AddConnectDeathRecipient. * * @param connect, callback object. */ void AddConnectDeathRecipient(sptr connectObject); /** * RemoteConnectDeathRecipient. * * @param connect, callback object. */ void RemoveConnectDeathRecipient(sptr connectObject); /** * RemoteConnectDeathRecipient. * * @param remote, callback object. */ void OnCallBackDied(const wptr &remote); /** * HandleOnCallBackDied. * * @param connect, callback object. */ void HandleCallBackDiedTask(const sptr &connect); /** * HandleOnCallBackDied. * * @param abilityRecord, died ability. */ void HandleAbilityDiedTask(const std::shared_ptr &abilityRecord, int32_t currentUserId); void HandleUIExtensionDied(const std::shared_ptr &abilityRecord); void RestartAbility(const std::shared_ptr &abilityRecord, int32_t currentUserId); /** * PostTimeOutTask. * * @param abilityRecord, ability. * @param messageId, message id. */ void PostTimeOutTask(const std::shared_ptr &abilityRecord, uint32_t messageId); void PostTimeOutTask(const std::shared_ptr &abilityRecord, int connectRecordId, uint32_t messageId); void CompleteForeground(const std::shared_ptr &abilityRecord); void CompleteBackground(const std::shared_ptr &abilityRecord); void PrintTimeOutLog(const std::shared_ptr &ability, uint32_t msgId, bool isHalf = false); void PostRestartResidentTask(const AbilityRequest &abilityRequest); bool IsAbilityNeedKeepAlive(const std::shared_ptr &abilityRecord); void ProcessPreload(const std::shared_ptr &record) const; void HandleInactiveTimeout(const std::shared_ptr &ability); void MoveToTerminatingMap(const std::shared_ptr& abilityRecord); void DoForegroundUIExtension(std::shared_ptr abilityRecord, const AbilityRequest &abilityRequest); void DoBackgroundAbilityWindow(const std::shared_ptr &abilityRecord, const sptr &sessionInfo); /** * When a service is under starting, enque the request and handle it after the service starting completes */ void EnqueueStartServiceReq(const AbilityRequest &abilityRequest, const std::string &serviceUri = ""); /** * After the service starting completes, complete the request list */ void CompleteStartServiceReq(const std::string &serviceUri); void AddUIExtWindowDeathRecipient(const sptr &session); void RemoveUIExtWindowDeathRecipient(const sptr &session); void OnUIExtWindowDied(const wptr &remote); void HandleUIExtWindowDiedTask(const sptr &remote); /** * Post an extension's disconnect task, auto disconnect when extension conected timeout. */ void PostExtensionDelayDisconnectTask(const std::shared_ptr &connectRecord); /** * Remove the extension's disconnect task. */ void RemoveExtensionDelayDisconnectTask(const std::shared_ptr &connectRecord); /** * Handle extension disconnect task. */ void HandleExtensionDisconnectTask(const std::shared_ptr &connectRecord); private: void TerminateRecord(std::shared_ptr abilityRecord); int DisconnectRecordNormal(ConnectListType &list, std::shared_ptr connectRecord, bool callerDied) const; void DisconnectRecordForce(ConnectListType &list, std::shared_ptr connectRecord); int TerminateAbilityInner(const sptr &token); bool IsLauncher(std::shared_ptr serviceExtension) const; void KillProcessesByUserId() const; void SetLastExitReason(const AbilityRequest &abilityRequest, std::shared_ptr &targetService); inline bool IsUIExtensionAbility(const std::shared_ptr &abilityRecord); inline bool IsCacheExtensionAbilityType(const std::shared_ptr &abilityRecord); inline bool CheckUIExtensionAbilityLoaded(const AbilityRequest &abilityRequest); inline bool CheckUIExtensionAbilitySessionExist(const std::shared_ptr &abilityRecord); inline void RemoveUIExtensionAbilityRecord(const std::shared_ptr &abilityRecord); inline void AddUIExtensionAbilityRecordToTerminatedList(const std::shared_ptr &abilityRecord); inline bool IsCallerValid(const std::shared_ptr &abilityRecord); int32_t GetOrCreateExtensionRecord(const AbilityRequest &abilityRequest, bool isCreatedByConnect, const std::string &hostBundleName, std::shared_ptr &extensionRecord, bool &isLoaded); int32_t GetOrCreateTargetServiceRecord( const AbilityRequest &abilityRequest, const sptr &connectInfo, std::shared_ptr &targetService, bool &isLoadedAbility); void HandleNotifyAssertFaultDialogDied(const std::shared_ptr &abilityRecord); EventInfo BuildEventInfo(const std::shared_ptr &abilityRecord); void UpdateUIExtensionInfo(const std::shared_ptr &abilityRecord); std::string GenerateBundleName(const AbilityRequest &abilityRequest) const; bool AddToServiceMap(const std::string &key, std::shared_ptr abilityRecord); ServiceMapType GetServiceMap(); void AddConnectObjectToMap(sptr connectObject, const ConnectListType &connectRecordList, bool updateOnly); void KeepAbilityAlive(const std::shared_ptr &abilityRecord, int32_t currentUserId); void ProcessEliminateAbilityRecord(std::shared_ptr eliminateRecord); std::string GetServiceKey(const std::shared_ptr &service); int32_t ReportXiaoYiToRSSIfNeeded(const AppExecFwk::AbilityInfo &abilityInfo); int32_t ReportAbilityStartInfoToRSS(const AppExecFwk::AbilityInfo &abilityInfo); void ReportEventToRSS(const AppExecFwk::AbilityInfo &abilityInfo, const std::shared_ptr abilityRecord, sptr callerToken); private: const std::string TASK_ON_CALLBACK_DIED = "OnCallbackDiedTask"; const std::string TASK_ON_ABILITY_DIED = "OnAbilityDiedTask"; ffrt::mutex serialMutex_; std::mutex connectMapMutex_; ConnectMapType connectMap_; ffrt::mutex serviceMapMutex_; ServiceMapType serviceMap_; std::list> terminatingExtensionList_; std::mutex recipientMapMutex_; RecipientMapType recipientMap_; std::mutex uiExtRecipientMapMutex_; RecipientMapType uiExtRecipientMap_; std::shared_ptr taskHandler_; std::shared_ptr eventHandler_; int userId_; std::vector restartResidentTaskList_; std::mutex startServiceReqListLock_; std::unordered_map>> startServiceReqList_; std::mutex uiExtensionMapMutex_; UIExtensionMapType uiExtensionMap_; std::mutex windowExtensionMapMutex_; WindowExtensionMapType windowExtensionMap_; std::unique_ptr uiExtensionAbilityRecordMgr_ = nullptr; uint32_t sceneBoardTokenId_ = 0; DISALLOW_COPY_AND_MOVE(AbilityConnectManager); }; } // namespace AAFwk } // namespace OHOS #endif // OHOS_ABILITY_RUNTIME_ABILITY_CONNECT_MANAGER_H