From c6084dbf8d818db00afba22609bb7693d11966f6 Mon Sep 17 00:00:00 2001 From: yuwenze Date: Fri, 2 Jun 2023 02:29:32 +0000 Subject: [PATCH] add SetRootSceneSession Signed-off-by: yuwenze Change-Id: If119f55051ad17c194f28e08aa1c664d4e6f68f4 --- .../include/ability_manager_client.h | 7 +++++ .../include/ability_manager_interface.h | 14 ++++++++++ services/abilitymgr/BUILD.gn | 1 + .../include/ability_manager_proxy.h | 7 +++++ .../include/ability_manager_service.h | 7 +++++ .../abilitymgr/include/ability_manager_stub.h | 1 + .../ui_ability_lifecycle_manager.h | 13 +++++++++ .../abilitymgr/src/ability_manager_client.cpp | 8 ++++++ .../abilitymgr/src/ability_manager_proxy.cpp | 27 +++++++++++++++++++ .../src/ability_manager_service.cpp | 9 +++++++ .../abilitymgr/src/ability_manager_stub.cpp | 13 +++++++++ 11 files changed, 107 insertions(+) diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_client.h b/interfaces/inner_api/ability_manager/include/ability_manager_client.h index f50abd3cef6..926f06d7f8d 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_client.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_client.h @@ -997,6 +997,13 @@ public: const Want &want, const sptr &callerToken); + /** + * Set rootSceneSession by SCB. + * + * @param rootSceneSession Indicates root scene session of SCB. + */ + void SetRootSceneSession(const sptr &rootSceneSession); + private: class AbilityMgrDeathRecipient : public IRemoteObject::DeathRecipient { public: diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_interface.h b/interfaces/inner_api/ability_manager/include/ability_manager_interface.h index ec6733c77b4..372923b2af1 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_interface.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_interface.h @@ -50,6 +50,10 @@ #endif namespace OHOS { +namespace Rosen { +class RootSceneSession; +} // namespace Rosen + namespace AAFwk { constexpr const char* ABILITY_MANAGER_SERVICE_NAME = "AbilityManagerService"; const int DEFAULT_INVAL_VALUE = -1; @@ -937,6 +941,13 @@ public: return 0; } + /** + * Set rootSceneSession by SCB. + * + * @param rootSceneSession Indicates root scene session of SCB. + */ + virtual void SetRootSceneSession(const sptr &rootSceneSession) {} + enum { // ipc id 1-1000 for kit // ipc id for terminating ability (1) @@ -1117,6 +1128,9 @@ public: SEND_ABILITY_RESULT_BY_TOKEN, + // ipc id for set rootSceneSession (64) + SET_ROOTSSCENESESSION, + // ipc id 1001-2000 for DMS // ipc id for starting ability (1001) START_ABILITY = 1001, diff --git a/services/abilitymgr/BUILD.gn b/services/abilitymgr/BUILD.gn index 9968b1788b1..c9ccbd789a8 100644 --- a/services/abilitymgr/BUILD.gn +++ b/services/abilitymgr/BUILD.gn @@ -151,6 +151,7 @@ ohos_shared_library("abilityms") { "safwk:system_ability_fwk", "samgr:samgr_proxy", "window_manager:libwsutils", + "window_manager:scene_session", ] if (background_task_mgr_continuous_task_enable) { diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index 319d53f6268..47e1ed22412 100644 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -775,6 +775,13 @@ public: virtual int32_t ShareDataDone(const sptr &token, const int32_t &resultCode, const int32_t &uniqueId, WantParams &wantParam) override; + /** + * Set rootSceneSession by SCB. + * + * @param rootSceneSession Indicates root scene session of SCB. + */ + virtual void SetRootSceneSession(const sptr &rootSceneSession) override; + private: template int GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos); diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 2b94a687786..cf0a8d3700e 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -1007,6 +1007,13 @@ public: int32_t GetConfiguration(AppExecFwk::Configuration& config); + /** + * Set rootSceneSession by SCB. + * + * @param rootSceneSession Indicates root scene session of SCB. + */ + virtual void SetRootSceneSession(const sptr &rootSceneSession) override; + // MSG 0 - 20 represents timeout message static constexpr uint32_t LOAD_TIMEOUT_MSG = 0; static constexpr uint32_t ACTIVE_TIMEOUT_MSG = 1; diff --git a/services/abilitymgr/include/ability_manager_stub.h b/services/abilitymgr/include/ability_manager_stub.h index 93c264d72eb..c15bc81c5f0 100644 --- a/services/abilitymgr/include/ability_manager_stub.h +++ b/services/abilitymgr/include/ability_manager_stub.h @@ -215,6 +215,7 @@ private: int AcquireShareDataInner(MessageParcel &data, MessageParcel &reply); int ShareDataDoneInner(MessageParcel &data, MessageParcel &reply); int GetAbilityTokenByCalleeObjInner(MessageParcel &data, MessageParcel &reply); + int SetRootSceneSessionInner(MessageParcel &data, MessageParcel &reply); }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h index 0c5157b12a3..6dc68b84afe 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -19,6 +19,7 @@ #include #include "ability_record.h" +#include "session/host/include/root_scene_session.h" #include "session_info.h" namespace OHOS { @@ -95,6 +96,17 @@ public: * @return Returns ERR_OK on success, others on failure. */ int CloseUIAbility(const std::shared_ptr &abilityRecord); + + /** + * Set rootSceneSession by SCB. + * + * @param rootSceneSession Indicates root scene session of SCB. + */ + inline void SetRootSceneSession(const sptr &rootSceneSession) + { + rootSceneSession_ = rootSceneSession; + } + private: std::shared_ptr GetAbilityRecordByToken(const sptr &token) const; void UpdateAbilityRecordLaunchReason(const AbilityRequest &abilityRequest, @@ -116,6 +128,7 @@ private: mutable std::recursive_mutex sessionLock_; std::map> sessionAbilityMap_; std::list> terminateAbilityList_; + sptr rootSceneSession_; }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_client.cpp b/services/abilitymgr/src/ability_manager_client.cpp index 34cfa45b4b2..d14d32ed1af 100644 --- a/services/abilitymgr/src/ability_manager_client.cpp +++ b/services/abilitymgr/src/ability_manager_client.cpp @@ -24,6 +24,7 @@ #include "if_system_ability_manager.h" #include "ipc_skeleton.h" #include "iservice_registry.h" +#include "session/host/include/root_scene_session.h" #include "session_info.h" #include "string_ex.h" #include "system_ability_definition.h" @@ -1035,5 +1036,12 @@ ErrCode AbilityManagerClient::ShareDataDone( return abms->ShareDataDone(token, resultCode, uniqueId, wantParam); } +void AbilityManagerClient::SetRootSceneSession(const sptr &rootSceneSession) +{ + HILOG_INFO("call"); + auto abms = GetAbilityManager(); + CHECK_POINTER_RETURN(abms); + return abms->SetRootSceneSession(rootSceneSession); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index f9100833c47..f00a34e5e1c 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -24,6 +24,7 @@ #include "ability_scheduler_proxy.h" #include "ability_scheduler_stub.h" #include "ability_util.h" +#include "session/host/include/root_scene_session.h" #include "session_info.h" namespace OHOS { @@ -3898,5 +3899,31 @@ int32_t AbilityManagerProxy::ShareDataDone( HILOG_INFO("AbilityManagerProxy::ShareDataDone end."); return reply.ReadInt32(); } + +void AbilityManagerProxy::SetRootSceneSession(const sptr &rootSceneSession) +{ + MessageParcel data; + if (!WriteInterfaceToken(data)) { + HILOG_ERROR("WriteInterfaceToken failed."); + return; + } + if (!data.WriteRemoteObject(rootSceneSession->AsObject())) { + HILOG_ERROR("WriteRemoteObject failed."); + return; + } + + auto remote = Remote(); + if (remote == nullptr) { + HILOG_ERROR("remote is nullptr."); + return; + } + + MessageParcel reply; + MessageOption option(MessageOption::TF_ASYNC); + auto error = remote->SendRequest(IAbilityManager::SET_ROOTSSCENESESSION, data, reply, option); + if (error != NO_ERROR) { + HILOG_ERROR("Send request error: %{public}d", error); + } +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 881c3835fc6..0c4f23db749 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -6916,5 +6916,14 @@ int32_t AbilityManagerService::ShareDataDone( handler_->RemoveEvent(SHAREDATA_TIMEOUT_MSG, uniqueId); return GetShareDataPairAndReturnData(abilityRecord, resultCode, uniqueId, wantParam); } + +void AbilityManagerService::SetRootSceneSession(const sptr &rootSceneSession) +{ + if (!CheckCallingTokenId(BUNDLE_NAME_SCENEBOARD, U0_USER_ID)) { + HILOG_ERROR("Not sceneboard called, not allowed."); + return; + } + uiAbilityLifecycleManager_->SetRootSceneSession(rootSceneSession); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index 87b6c7c7851..a8411868e9c 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -23,6 +23,7 @@ #include "ability_manager_errors.h" #include "ability_scheduler_proxy.h" #include "ability_scheduler_stub.h" +#include "session/host/include/root_scene_session.h" #include "session_info.h" namespace OHOS { @@ -2005,5 +2006,17 @@ int AbilityManagerStub::VerifyPermissionInner(MessageParcel &data, MessageParcel } return NO_ERROR; } + +int AbilityManagerStub::SetRootSceneSessionInner(MessageParcel &data, MessageParcel &reply) +{ + HILOG_DEBUG("Call."); + auto rootSceneSession = iface_cast(data.ReadRemoteObject()); + if (rootSceneSession == nullptr) { + HILOG_ERROR("Read rootSceneSession failed."); + return ERR_INVALID_VALUE; + } + SetRootSceneSession(rootSceneSession); + return NO_ERROR; +} } // namespace AAFwk } // namespace OHOS -- Gitee