From 0dfc4e78d97bba843028da8277dbf78bda6a93e9 Mon Sep 17 00:00:00 2001 From: Grady Date: Tue, 25 Jan 2022 20:43:28 +0800 Subject: [PATCH] Add Set/Get ScreenMode methods Signed-off-by: Grady Change-Id: Ia93716e082770217d3bf574dda14fce2b2ceff60 --- dm/include/display_manager_adapter.h | 4 +- dm/src/display_manager_adapter.cpp | 24 +++++++ dm/src/screen_manager.cpp | 10 +++ dm/test/systemtest/screen_manager_test.cpp | 18 ++++++ dmserver/include/abstract_screen_controller.h | 2 + dmserver/include/display_manager_interface.h | 6 +- dmserver/include/display_manager_proxy.h | 3 +- dmserver/include/display_manager_service.h | 2 + dmserver/src/abstract_screen_controller.cpp | 30 +++++++++ dmserver/src/display_manager_proxy.cpp | 63 +++++++++++++++++++ dmserver/src/display_manager_service.cpp | 10 +++ dmserver/src/display_manager_stub.cpp | 16 +++++ interfaces/innerkits/dm/screen_manager.h | 3 + 13 files changed, 188 insertions(+), 3 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index b9de904315..8b926bc178 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "display.h" #include "screen.h" @@ -37,7 +38,8 @@ WM_DECLARE_SINGLE_INSTANCE(DisplayManagerAdapter); public: virtual DisplayId GetDefaultDisplayId(); virtual sptr GetDisplayById(DisplayId displayId); - + virtual DMError SetScreenActiveMode(ScreenId screenId, uint32_t modeId); + virtual std::vector GetScreenSupportedModes(ScreenId screenId); virtual ScreenId CreateVirtualScreen(VirtualScreenOption option); virtual DMError DestroyVirtualScreen(ScreenId screenId); virtual std::shared_ptr GetDisplaySnapshot(DisplayId displayId); diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index a42984f3c7..00290f8bff 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -78,6 +78,30 @@ std::shared_ptr DisplayManagerAdapter::GetDisplaySnapshot(Displ return dispalySnapshot; } +DMError DisplayManagerAdapter::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) +{ + std::lock_guard lock(mutex_); + + if (!InitDMSProxyLocked()) { + WLOGFE("displayManagerAdapter::SetScreenActiveMode: InitDMSProxyLocked failed!"); + return DMError::DM_ERROR_IPC_FAILED; + } + return displayManagerServiceProxy_->SetScreenActiveMode(screenId, modeId); +} + +std::vector DisplayManagerAdapter::GetScreenSupportedModes(ScreenId screenId) +{ + std::lock_guard lock(mutex_); + + std::vector screenSupportedModes; + + if (!InitDMSProxyLocked()) { + WLOGFE("displayManagerAdapter::GetScreenSupportedModes: InitDMSProxyLocked failed!"); + return screenSupportedModes; + } + return displayManagerServiceProxy_->GetScreenSupportedModes(screenId); +} + ScreenId DisplayManagerAdapter::CreateVirtualScreen(VirtualScreenOption option) { if (!InitDMSProxyLocked()) { diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index 5981a1aa82..97606c87c0 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -87,4 +87,14 @@ DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId) { return SingletonContainer::Get().DestroyVirtualScreen(screenId); } + +DMError ScreenManager::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) +{ + return SingletonContainer::Get().SetScreenActiveMode(screenId, modeId); +} + +std::vector ScreenManager::GetScreenSupportedModes(ScreenId screenId) +{ + return SingletonContainer::Get().GetScreenSupportedModes(screenId); +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dm/test/systemtest/screen_manager_test.cpp b/dm/test/systemtest/screen_manager_test.cpp index 725f4193da..5365554579 100644 --- a/dm/test/systemtest/screen_manager_test.cpp +++ b/dm/test/systemtest/screen_manager_test.cpp @@ -171,6 +171,24 @@ HWTEST_F(ScreenManagerTest, ScreenManager05, Function | MediumTest | Level1) ASSERT_GT(utils.successCount_, 0); ASSERT_GT(maxWaitCount_, waitCount_); } + +/** + * @tc.name: ScreenManager06 + * @tc.desc: Get and set screenMode + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, ScreenManager06, Function | MediumTest | Level1) +{ + ScreenId defaultScreenId = static_cast(defaultDisplayId_); + std::vector rsScreenModeInfo = + ScreenManager::GetInstance().GetScreenSupportedModes(defaultScreenId); + + ASSERT_GT(rsScreenModeInfo.size(), 0); + for (auto info : rsScreenModeInfo) { + ASSERT_EQ(DMError::DM_OK, + ScreenManager::GetInstance().SetScreenActiveMode(defaultScreenId, info.GetScreenModeId())); + } +} } } // namespace Rosen } // namespace OHOS diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index e9527f9301..77104804e8 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -48,6 +48,8 @@ public: ScreenId ConvertToRsScreenId(ScreenId dmsScreenId); ScreenId ConvertToDmsScreenId(ScreenId rsScreenId); void RegisterAbstractScreenCallback(sptr cb); + DMError SetScreenActiveMode(ScreenId id, uint32_t modeId); + std::vector GetScreenSupportedModes(ScreenId id) const; ScreenId CreateVirtualScreen(VirtualScreenOption option); DMError DestroyVirtualScreen(ScreenId screenId); diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index 743602d6d2..b8d43f3aef 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "dm_common.h" #include "screen.h" @@ -47,11 +48,14 @@ public: TRANS_ID_CREATE_VIRTUAL_SCREEN = 100000, TRANS_ID_DESTROY_VIRTUAL_SCREEN, TRANS_ID_ADD_MIRROR, + TRANS_ID_SET_SCREEN_ACTIVE_MODE, + TRANS_ID_GET_SCREEN_SUPPORTED_MODES, }; virtual DisplayId GetDefaultDisplayId() = 0; virtual DisplayInfo GetDisplayInfoById(DisplayId displayId) = 0; - + virtual DMError SetScreenActiveMode(ScreenId screenId, uint32_t modeId) = 0; + virtual std::vector GetScreenSupportedModes(ScreenId screenId) = 0; virtual ScreenId CreateVirtualScreen(VirtualScreenOption option) = 0; virtual DMError DestroyVirtualScreen(ScreenId screenId) = 0; virtual std::shared_ptr GetDispalySnapshot(DisplayId displayId) = 0; diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index a3c33988c1..aa035556ce 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -33,7 +33,8 @@ public: DisplayId GetDefaultDisplayId() override; DisplayInfo GetDisplayInfoById(DisplayId displayId) override; - + DMError SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override; + std::vector GetScreenSupportedModes(ScreenId screenId) override; ScreenId CreateVirtualScreen(VirtualScreenOption option) override; DMError DestroyVirtualScreen(ScreenId screenId) override; std::shared_ptr GetDispalySnapshot(DisplayId displayId) override; diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index ca28880fc6..16f236f452 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -39,6 +39,8 @@ WM_DECLARE_SINGLE_INSTANCE_BASE(DisplayManagerService); public: void OnStart() override; void OnStop() override; + DMError SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override; + std::vector GetScreenSupportedModes(ScreenId screenId) override; ScreenId CreateVirtualScreen(VirtualScreenOption option) override; DMError DestroyVirtualScreen(ScreenId screenId) override; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index c21a1d9f59..9ce755f598 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -291,6 +291,36 @@ sptr AbstractScreenController::AddAsSuccedentScreenLocked(s return screenGroup; } +DMError AbstractScreenController::SetScreenActiveMode(ScreenId id, uint32_t modeId) +{ + if (rsInterface_ == nullptr) { + return DMError::DM_ERROR_NULLPTR; + } + WLOGFI("AbstractScreenController::SetScreenActiveMode id: %{public}" PRIu64", mode: %{public}d", id, modeId); + std::vector screenSupportedModes = + rsInterface_->GetScreenSupportedModes(id); + int32_t modeSize = screenSupportedModes.size(); + if (modeSize <= modeId) { + WLOGFE("SetScreenActiveMode failed on modeId %{public}u", modeId); + return DMError::DM_ERROR_INVALID_PARAM; + } + rsInterface_->SetScreenActiveMode(id, modeId); + return DMError::DM_OK; +} + +std::vector AbstractScreenController::GetScreenSupportedModes(ScreenId id) const +{ + if (rsInterface_ == nullptr) { + std::vector screenSupportedModes; + return screenSupportedModes; + } + if (id == SCREEN_ID_INVALID) { + std::vector screenSupportedModes; + return screenSupportedModes; + } + return rsInterface_->GetScreenSupportedModes(id); +} + ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption option) { if (rsInterface_ == nullptr) { diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index be2a7307c5..721513533b 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -81,6 +81,69 @@ DisplayInfo DisplayManagerProxy::GetDisplayInfoById(DisplayId displayId) return *info; } +DMError DisplayManagerProxy::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) +{ + sptr remote = Remote(); + if (remote == nullptr) { + WLOGFW("SetScreenActiveMode: remote is nullptr"); + return DMError::DM_ERROR_NULLPTR; + } + + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("SetScreenActiveMode: WriteInterfaceToken failed"); + return DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED; + } + data.WriteUint64(static_cast(screenId)); + data.WriteUint32(static_cast(modeId)); + if (remote->SendRequest(TRANS_ID_SET_SCREEN_ACTIVE_MODE, data, reply, option) != ERR_NONE) { + WLOGFW("SetScreenActiveMode: SendRequest failed"); + return DMError::DM_ERROR_IPC_FAILED; + } + + DMError res = static_cast(reply.ReadInt32()); + return res; +} + +std::vector DisplayManagerProxy::GetScreenSupportedModes(ScreenId screenId) +{ + std::vector screenSupportedModes; + sptr remote = Remote(); + if (remote == nullptr) { + WLOGFW("GetScreenSupportedModes: remote is nullptr"); + return screenSupportedModes; + } + + MessageParcel data; + MessageParcel reply; + MessageOption option; + + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFW("GetScreenSupportedModes: WriteInterfaceToken failed"); + return screenSupportedModes; + } + option.SetFlags(MessageOption::TF_SYNC); + data.WriteUint64(static_cast(screenId)); + if (remote->SendRequest(TRANS_ID_GET_SCREEN_SUPPORTED_MODES, data, reply, option) != NO_ERROR) { + WLOGFW("GetScreenSupportedModes: SendRequest failed"); + return screenSupportedModes; + } + + uint32_t modeCount = reply.ReadUint32(); + screenSupportedModes.resize(modeCount); + for (uint32_t modeIndex = 0; modeIndex < modeCount; modeIndex++) { + sptr itemScreenMode = reply.ReadParcelable(); + if (itemScreenMode == nullptr) { + break; + } else { + screenSupportedModes[modeIndex] = *itemScreenMode; + } + } + return screenSupportedModes; +} + ScreenId DisplayManagerProxy::CreateVirtualScreen(VirtualScreenOption virtualOption) { sptr remote = Remote(); diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 24e7edec41..822abbafd4 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -89,6 +89,16 @@ DisplayInfo DisplayManagerService::GetDisplayInfoById(DisplayId displayId) return displayInfo; } +DMError DisplayManagerService::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) +{ + return abstractScreenController_->SetScreenActiveMode(screenId, modeId); +} + +std::vector DisplayManagerService::GetScreenSupportedModes(ScreenId screenId) +{ + return abstractScreenController_->GetScreenSupportedModes(screenId); +} + ScreenId DisplayManagerService::CreateVirtualScreen(VirtualScreenOption option) { WM_SCOPED_TRACE("dms:CreateVirtualScreen(%s)", option.name_.c_str()); diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index 927bd23230..8c6ca71294 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -48,6 +48,22 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, reply.WriteParcelable(&info); break; } + case TRANS_ID_SET_SCREEN_ACTIVE_MODE: { + ScreenId screenId = static_cast(data.ReadUint64()); + uint32_t modeId = static_cast(data.ReadUint32()); + DMError res = SetScreenActiveMode(screenId, modeId); + reply.WriteInt32(static_cast(res)); + break; + } + case TRANS_ID_GET_SCREEN_SUPPORTED_MODES: { + ScreenId screenId = static_cast(data.ReadUint64()); + std::vector screenSupportedModes = GetScreenSupportedModes(screenId); + reply.WriteUint32(static_cast(screenSupportedModes.size())); + for (uint32_t modeIndex = 0; modeIndex < screenSupportedModes.size(); modeIndex++) { + reply.WriteParcelable(&screenSupportedModes[modeIndex]); + } + break; + } case TRANS_ID_CREATE_VIRTUAL_SCREEN: { std::string name = data.ReadString(); uint32_t width = data.ReadUint32(); diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index 3310d2fdac..49cd958d31 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -22,6 +22,7 @@ #include "screen_group.h" #include "wm_single_instance.h" #include "wm_single_instance.h" +#include "transaction/rs_interfaces.h" namespace OHOS::Rosen { class IScreenChangeListener : public RefBase { @@ -43,6 +44,8 @@ public: sptr AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId); ScreenId CreateVirtualScreen(VirtualScreenOption option); DMError DestroyVirtualScreen(ScreenId screenId); + DMError SetScreenActiveMode(ScreenId screenId, uint32_t modeId); + std::vector GetScreenSupportedModes(ScreenId screenId); private: ScreenManager(); -- Gitee