diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index b9de904315d0efc6ea0aa6ae6664d2e40a089b59..8b926bc1786bd500c17fb6e15fdc323c46b12ed2 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 a42984f3c71fc53fcdcdff233e70c3d2746c015b..00290f8bff8033d1de513e9d6f2984648dae318b 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 5981a1aa825bf3f9c070fe8198028eb0276424e8..97606c87c0ed6057a10d02ba7b269698c05c181a 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 725f4193da7677cfe9aa8c0d66d8f9263e075d04..53655545796b918d3441740194383026aa34f2c2 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 e9527f9301fbe25a3a31784d464d593a4c968067..77104804e8d5fe32edf4c06a2de3b458e8f0ff77 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 743602d6d20f353ab58b8c0fe28e1ebc648ec706..b8d43f3aef4123e05b771149a786f3cfd3067712 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 a3c33988c18ae792bf617a72ab28396a8d4e01cc..aa035556cef12853f570d07b6bbabdbc85102dda 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 ca28880fc61e14ade49147c5a5833499274dfec9..16f236f452ca818517b9ff13ee2ce7eb6c2c7024 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 c21a1d9f5991d0d267c17328eb060894112958ed..9ce755f598ad7db9622d2c9ec8f89e6565f802bd 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 be2a7307c518fcb123d38e385def72ecc676965f..721513533be2bf1ba9bca3e8595630c1d2cd3a38 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 24e7edec4164788092b9710f240160481af681b5..822abbafd48cee9ca4098b306b1e53b8f84645ad 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 927bd23230b38475f4ceb4d27a0f143ed407fcd7..8c6ca7129458050441bd943a365669166e6abc6b 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 3310d2fdac6131169b4ada81366a231cd61de1c8..49cd958d31f0b9519e3decdf17a44a09b52002ef 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();