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 f50abd3cef67576cfb4886ee2888b2701cbe9ab1..926f06d7f8d3884239ae5e7bec8285bb9c19dd38 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 ec6733c77b4e34cb5a3748492fd8f088f64cd491..372923b2af12bc3f4a5fd11b4ad2ce220526c9bd 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 9968b1788b1a874a8c93299da8a76bcc42c62cc4..c9ccbd789a89cdd610156d897b29834443c04c8c 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 319d53f62685b0f280dd1900af9a0f153cb62552..47e1ed2241229aeca242d861ee0d6ab10c4a99d3 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 2b94a687786601166faa4e1106ba6a239233cc68..cf0a8d3700e0ff46cd4442bebe529ef4c078623c 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 93c264d72ebed1116fdc8b9fe72fe75ce1f8d799..c15bc81c5f0a1aaf7bdcca2e8eb16ea033eacb49 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 0c5157b12a3302c0d655194d77941c26f76179cc..6dc68b84afe21d5d03ca5efae7121a1334fcc9d6 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 34cfa45b4b2d77683f36d43e2cd80e7a0cfe8ecb..d14d32ed1af0e490aa7de307f969b36594c5f6c9 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 f9100833c47f3579f78bac45ff53fcd7ec6486d7..f00a34e5e1c4e0877dff41fa4fbe4d8b6cbfe068 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 881c3835fc6f4eae529e85da6dada0607015db5c..0c4f23db749d11ababd2b58f44ac3f420e5fb41e 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 87b6c7c78516a22d589de48ef8bb6e477b5e155f..a8411868e9c855dcee8784625f82ffc07969e7c4 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