From 2359b8139b60abfafa48acf2c3054e8c610e9340 Mon Sep 17 00:00:00 2001 From: huangji731 Date: Mon, 25 Mar 2024 14:35:04 +0800 Subject: [PATCH] https://gitee.com/openharmony/window_window_manager/issues/I9BBZ8 Signed-off-by: huangji731 --- dm/include/display_manager_adapter.h | 1 + dm/src/display_manager_adapter.cpp | 7 ++++ dm/src/screen_manager.cpp | 5 +++ dm/test/unittest/screen_manager_test.cpp | 34 +++++++++++++++++++ dmserver/include/display_manager_interface.h | 5 +++ interfaces/innerkits/dm/screen_manager.h | 9 +++++ .../src/screen_session_manager_client.cpp | 4 +-- .../include/screen_session_manager.h | 1 + .../zidl/screen_session_manager_proxy.h | 2 ++ .../src/screen_session_manager.cpp | 19 +++++++++++ .../src/zidl/screen_session_manager_proxy.cpp | 25 ++++++++++++++ .../src/zidl/screen_session_manager_stub.cpp | 7 ++++ 12 files changed, 117 insertions(+), 2 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index 5f0c05573a..bf83296bf2 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -100,6 +100,7 @@ public: virtual DMError DestroyVirtualScreen(ScreenId screenId); virtual DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface); virtual DMError SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool canvasRotation); + virtual DMError SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode); virtual bool SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason); virtual bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason); virtual ScreenPowerState GetScreenPower(ScreenId dmsScreenId); diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index ad52a141e4..3f00521cb4 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -225,6 +225,13 @@ DMError ScreenManagerAdapter::SetVirtualMirrorScreenCanvasRotation(ScreenId scre return displayManagerServiceProxy_->SetVirtualMirrorScreenCanvasRotation(screenId, canvasRotation); } +DMError ScreenManagerAdapter::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode) +{ + INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED); + WLOGFI("DisplayManagerAdapter::SetVirtualMirrorScreenScaleMode"); + return displayManagerServiceProxy_->SetVirtualMirrorScreenScaleMode(screenId, scaleMode); +} + DMError ScreenManagerAdapter::SetScreenRotationLocked(bool isLocked) { INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED); diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index e4cc2d970a..d3a3aae5dc 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -563,6 +563,11 @@ DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, b return SingletonContainer::Get().SetVirtualMirrorScreenCanvasRotation(screenId, rotation); } +DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode) +{ + return SingletonContainer::Get().SetVirtualMirrorScreenScaleMode(screenId, scaleMode); +} + VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId) { return SingletonContainer::Get().GetVirtualScreenFlag(screenId); diff --git a/dm/test/unittest/screen_manager_test.cpp b/dm/test/unittest/screen_manager_test.cpp index c1cc5d3550..6d59bdcbb4 100644 --- a/dm/test/unittest/screen_manager_test.cpp +++ b/dm/test/unittest/screen_manager_test.cpp @@ -541,6 +541,40 @@ HWTEST_F(ScreenManagerTest, SetVirtualScreenFlag02, Function | SmallTest | Level ret = ScreenManager::GetInstance().DestroyVirtualScreen(screenId); ASSERT_EQ(DMError::DM_OK, ret); } + +/** + * @tc.name: SetVirtualMirrorScreenScaleMode01 + * @tc.desc: SetVirtualMirrorScreenScaleMode01 fun + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, SetVirtualMirrorScreenScaleMode01, Function | SmallTest | Level1) +{ + VirtualScreenOption defaultOption = {defaultName_, defaultWidth_, defaultHeight_, + defaultDensity_, nullptr, defaultFlags_}; + ScreenId screenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption); + DMError ret = ScreenManager::GetInstance().SetVirtualMirrorScreenScaleMode(screenId, + ScreenScaleMode::FILL_MODE); + ASSERT_EQ(DMError::DM_OK, ret); + ret = ScreenManager::GetInstance().DestroyVirtualScreen(screenId); + ASSERT_EQ(DMError::DM_OK, ret); +} + +/** + * @tc.name: SetVirtualMirrorScreenScaleMode02 + * @tc.desc: SetVirtualMirrorScreenScaleMode02 fun + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, SetVirtualMirrorScreenScaleMode02, Function | SmallTest | Level1) +{ + VirtualScreenOption defaultOption = {defaultName_, defaultWidth_, defaultHeight_, + defaultDensity_, nullptr, defaultFlags_}; + ScreenId screenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption); + DMError ret = ScreenManager::GetInstance().SetVirtualMirrorScreenScaleMode(screenId, + ScreenScaleMode::UNISCALE_MODE); + ASSERT_EQ(DMError::DM_OK, ret); + ret = ScreenManager::GetInstance().DestroyVirtualScreen(screenId); + ASSERT_EQ(DMError::DM_OK, ret); +} } } // namespace Rosen } // namespace OHOS \ No newline at end of file diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index 4ce610ae4c..dbb791b8d6 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -121,6 +121,7 @@ public: TRANS_ID_CONVERT_SCREENID_TO_RSSCREENID, TRANS_ID_GET_VIRTUAL_SCREEN_FLAG, TRANS_ID_SET_VIRTUAL_SCREEN_FLAG, + TRANS_ID_SET_VIRTUAL_SCREEN_SCALE_MODE, }; virtual sptr GetDefaultDisplayInfo() = 0; @@ -134,6 +135,10 @@ public: virtual DMError DestroyVirtualScreen(ScreenId screenId) = 0; virtual DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface) = 0; virtual DMError SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotate) { return DMError::DM_OK; } + virtual DMError SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode) + { + return DMError::DM_ERROR_DEVICE_NOT_SUPPORT; + } virtual DMError SetOrientation(ScreenId screenId, Orientation orientation) = 0; virtual std::shared_ptr GetDisplaySnapshot(DisplayId displayId, DmErrorCode* errorCode = nullptr) = 0; diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index eb7149e018..8347a61621 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -205,6 +205,15 @@ public: */ DMError SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool canvasRotation); + /** + * @brief Set virtual screen scale mode + * + * @param screenId Screen id. + * @param scaleMode scale mode + * @return DM_OK means set success, others means set failed. + */ + DMError SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode); + /** * @brief Set the screen power state on the specified screen. * diff --git a/window_scene/screen_session_manager/src/screen_session_manager_client.cpp b/window_scene/screen_session_manager/src/screen_session_manager_client.cpp index 4cdc49f86d..11ea16b1c8 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager_client.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager_client.cpp @@ -79,8 +79,8 @@ bool ScreenSessionManagerClient::CheckIfNeedConnectScreen(ScreenId screenId, Scr return false; } if (screenSessionManager_->GetScreenProperty(screenId).GetScreenType() == ScreenType::VIRTUAL) { - if (name == "HiCar" || name == "SuperLauncher") { - WLOGFI("HiCar or SuperLauncher, need to connect the screen"); + if (name == "HiCar" || name == "SuperLauncher" || name == "CastEngine") { + WLOGFI("HiCar or SuperLauncher or CastEngine, need to connect the screen"); return true; } else { WLOGFE("ScreenType is virtual, no need to connect the screen"); diff --git a/window_scene/session_manager/include/screen_session_manager.h b/window_scene/session_manager/include/screen_session_manager.h index 3e04b1d6ed..993efb4244 100644 --- a/window_scene/session_manager/include/screen_session_manager.h +++ b/window_scene/session_manager/include/screen_session_manager.h @@ -96,6 +96,7 @@ public: const sptr& displayManagerAgent) override; virtual DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface) override; virtual DMError SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool autoRotate) override; + virtual DMError SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode) override; virtual DMError DestroyVirtualScreen(ScreenId screenId) override; DMError ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height) override; virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, diff --git a/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h b/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h index 9e427d8787..83c16c186f 100644 --- a/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h +++ b/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h @@ -77,6 +77,8 @@ public: virtual DMError SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool autoRotate) override; + virtual DMError SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode) override; + virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, ScreenId& screenGroupId) override; virtual DMError StopMirror(const std::vector& mirrorScreenIds) override; diff --git a/window_scene/session_manager/src/screen_session_manager.cpp b/window_scene/session_manager/src/screen_session_manager.cpp index 3b6d4bfca2..186658e61e 100644 --- a/window_scene/session_manager/src/screen_session_manager.cpp +++ b/window_scene/session_manager/src/screen_session_manager.cpp @@ -1717,6 +1717,25 @@ DMError ScreenSessionManager::SetVirtualScreenSurface(ScreenId screenId, sptr(reply.ReadInt32()); } +DMError ScreenSessionManagerProxy::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode) +{ + if (screenId == SCREEN_ID_INVALID) { + return DMError::DM_ERROR_INVALID_PARAM; + } + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("WriteInterfaceToken failed"); + return DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED; + } + bool res = data.WriteUint64(static_cast(screenId)) && data.WriteUint32(static_cast(scaleMode)); + if (!res) { + WLOGFE("Write screenId/scaleMode failed"); + return DMError::DM_ERROR_WRITE_DATA_FAILED; + } + if (Remote()->SendRequest(static_cast(DisplayManagerMessage::TRANS_ID_SET_VIRTUAL_SCREEN_SCALE_MODE), + data, reply, option) != ERR_NONE) { + WLOGFW("SendRequest failed"); + return DMError::DM_ERROR_IPC_FAILED; + } + return static_cast(reply.ReadInt32()); +} + DMError ScreenSessionManagerProxy::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height) { WLOGFI("ScreenSessionManagerProxy::ResizeVirtualScreen: ENTER"); diff --git a/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp b/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp index 1059d599ee..0bea9607a8 100644 --- a/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp +++ b/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp @@ -210,6 +210,13 @@ int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel& reply.WriteInt32(static_cast(result)); break; } + case DisplayManagerMessage::TRANS_ID_SET_VIRTUAL_SCREEN_SCALE_MODE: { + ScreenId screenId = static_cast(data.ReadUint64()); + ScreenScaleMode scaleMode = static_cast(data.ReadUint32()); + DMError result = SetVirtualMirrorScreenScaleMode(screenId, scaleMode); + reply.WriteInt32(static_cast(result)); + break; + } case DisplayManagerMessage::TRANS_ID_DESTROY_VIRTUAL_SCREEN: { ScreenId screenId = static_cast(data.ReadUint64()); DMError result = DestroyVirtualScreen(screenId); -- Gitee