diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index 7cd54d47058c41c417722f66c8b5e0bd9ab5feaf..8f3e640ebda1e3699ba769e204a6ad51fed193d7 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -98,6 +98,7 @@ public: virtual DMError DestroyVirtualScreen(ScreenId screenId); virtual DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface); virtual DMError SetVirtualMirrorScreenBufferRotation(ScreenId screenId, bool bufferRotation); + virtual bool SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason); virtual bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason); virtual ScreenPowerState GetScreenPower(ScreenId dmsScreenId); virtual DMError SetOrientation(ScreenId screenId, Orientation orientation); diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 7c8b2c1e068d6f8426a16570fabdeed4d47238b8..e000604bc63f2ad157961bdec7b81aa508a56589 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -159,6 +159,12 @@ DMError ScreenManagerAdapter::IsScreenRotationLocked(bool& isLocked) return displayManagerServiceProxy_->IsScreenRotationLocked(isLocked); } +bool ScreenManagerAdapter::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) +{ + INIT_PROXY_CHECK_RETURN(false); + return displayManagerServiceProxy_->SetSpecifiedScreenPower(screenId, state, reason); +} + bool ScreenManagerAdapter::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) { INIT_PROXY_CHECK_RETURN(false); diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index f6d89a6e5987b8cb5c03ceb6d1ee6dc336890bdc..4e8fc3d79bc736555dc5ac5a9c4673b6a3be45be 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -563,6 +563,12 @@ DMError ScreenManager::SetVirtualMirrorScreenBufferRotation(ScreenId screenId, b return SingletonContainer::Get().SetVirtualMirrorScreenBufferRotation(screenId, rotation); } +bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) +{ + WLOGFI("screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason); + return SingletonContainer::Get().SetSpecifiedScreenPower(screenId, state, reason); +} + bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) { WLOGFI("state:%{public}u, reason:%{public}u", state, reason); diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index c9a8c587a3c1545d07bdf41884d851ec0627c169..008c585e47587780d9f5892bff71790bdeee96c8 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -46,6 +46,7 @@ public: TRANS_ID_WAKE_UP_END, TRANS_ID_SUSPEND_BEGIN, TRANS_ID_SUSPEND_END, + TRANS_ID_SET_SPECIFIED_SCREEN_POWER, TRANS_ID_SET_SCREEN_POWER_FOR_ALL, TRANS_ID_GET_SCREEN_POWER, TRANS_ID_SET_DISPLAY_STATE, @@ -138,6 +139,7 @@ public: virtual bool WakeUpEnd() = 0; virtual bool SuspendBegin(PowerStateChangeReason reason) = 0; virtual bool SuspendEnd() = 0; + virtual bool SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) = 0; virtual bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) = 0; virtual ScreenPowerState GetScreenPower(ScreenId dmsScreenId) = 0; virtual bool SetDisplayState(DisplayState state) = 0; diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index 478301aaac68163b57b7b562eee1fdd008c38827..3156f36707f3d82b241b4c80034e9d8e80562d4a 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -62,6 +62,7 @@ public: bool WakeUpEnd() override; bool SuspendBegin(PowerStateChangeReason reason) override; bool SuspendEnd() override; + bool SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) override; bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) override; ScreenPowerState GetScreenPower(ScreenId dmsScreenId) override; bool SetDisplayState(DisplayState state) override; diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index 68a39086dbd820d4e6aca57e21f2ce9746648d90..dca9c3227acc4894cd30684c1fc7f1a8ca3799f6 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -79,6 +79,7 @@ public: bool WakeUpEnd() override; bool SuspendBegin(PowerStateChangeReason reason) override; bool SuspendEnd() override; + bool SetSpecifiedScreenPower(ScreenId, ScreenPowerState, PowerStateChangeReason) override; bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) override; ScreenPowerState GetScreenPower(ScreenId dmsScreenId) override; bool SetDisplayState(DisplayState state) override; diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index 3d71a8e329b77b6db97698b2cb04954dd2772f4e..bf811473906b3753680f8a2513533cca2c40a53c 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -644,6 +644,35 @@ bool DisplayManagerProxy::SetScreenPowerForAll(ScreenPowerState state, PowerStat return reply.ReadBool(); } +bool DisplayManagerProxy::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("WriteInterfaceToken failed"); + return false; + } + if (!data.WriteUint32(static_cast(screenId))) { + WLOGFE("Write ScreenId failed"); + return false; + } + if (!data.WriteUint32(static_cast(state))) { + WLOGFE("Write ScreenPowerState failed"); + return false; + } + if (!data.WriteUint32(static_cast(reason))) { + WLOGFE("Write PowerStateChangeReason failed"); + return false; + } + if (Remote()->SendRequest(static_cast(DisplayManagerMessage::TRANS_ID_SET_SPECIFIED_SCREEN_POWER), + data, reply, option) != ERR_NONE) { + WLOGFW("SendRequest failed"); + return false; + } + return reply.ReadBool(); +} + ScreenPowerState DisplayManagerProxy::GetScreenPower(ScreenId dmsScreenId) { MessageParcel data; diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 49144851164759d2acef6a438b75546076b679c6..eca5892b5d6320f3c251627a43feafef890d412f 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -434,6 +434,13 @@ bool DisplayManagerService::SuspendEnd() EventStatus::END); } +bool DisplayManagerService::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) +{ + WLOGFE("DMS not support SetSpecifiedScreenPower: screen:%{public}" PRIu64 ", state:%{public}u", + screenId, state); + return false; +} + bool DisplayManagerService::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) { WLOGFI("SetScreenPowerForAll"); diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index 9499917e198e49aa87d212f8df10036ed9ccd5ae..50dde990649b6df154dcdc3cb03e9001e5597515 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -149,6 +149,13 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, reply.WriteBool(SuspendEnd()); break; } + case DisplayManagerMessage::TRANS_ID_SET_SPECIFIED_SCREEN_POWER: { + ScreenId screenId = static_cast(data.ReadUint32()); + ScreenPowerState state = static_cast(data.ReadUint32()); + PowerStateChangeReason reason = static_cast(data.ReadUint32()); + reply.WriteBool(SetSpecifiedScreenPower(screenId, state, reason)); + break; + } case DisplayManagerMessage::TRANS_ID_SET_SCREEN_POWER_FOR_ALL: { ScreenPowerState state = static_cast(data.ReadUint32()); PowerStateChangeReason reason = static_cast(data.ReadUint32()); diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index 7adcb74daef9f73580d9bdeb90b46d66ec5de685..558e57a3bf0a3631a8d9efee82899b210d133d33 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -205,6 +205,16 @@ public: */ DMError SetVirtualMirrorScreenBufferRotation(ScreenId screenId, bool bufferRotation); + /** + * @brief Set the screen power state on the specified screen. + * + * @param screenId Screen id. + * @param state Screen power state. + * @param reason Reason for power state change. + * @return True means set success, false means set failed. + */ + bool SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason); + /** * @brief Set the screen power states for all screens. * diff --git a/window_scene/session_manager/include/screen_session_manager.h b/window_scene/session_manager/include/screen_session_manager.h index c8b15557d335279bbfb545dc69b8c3f0def312ba..f29c7e5368476cc9ebba5e76b4200d04fbc0bcf7 100644 --- a/window_scene/session_manager/include/screen_session_manager.h +++ b/window_scene/session_manager/include/screen_session_manager.h @@ -67,6 +67,7 @@ public: bool SuspendEnd() override; bool SetDisplayState(DisplayState state) override; DisplayState GetDisplayState(DisplayId displayId) override; + bool SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) override; bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) override; ScreenPowerState GetScreenPower(ScreenId screenId) override; void NotifyDisplayEvent(DisplayEvent event) override; diff --git a/window_scene/session_manager/include/zidl/screen_session_manager_interface.h b/window_scene/session_manager/include/zidl/screen_session_manager_interface.h index 5ba0c8797a81b48c78fb46e04cbd0fc6b93d063e..b9296f01a9538e5d0f1e2f0bf0a58f4004b7d563 100644 --- a/window_scene/session_manager/include/zidl/screen_session_manager_interface.h +++ b/window_scene/session_manager/include/zidl/screen_session_manager_interface.h @@ -74,6 +74,7 @@ public: virtual bool WakeUpEnd() override { return false; } virtual bool SuspendBegin(PowerStateChangeReason reason) override { return false; } virtual bool SuspendEnd() override { return false; } + virtual bool SetSpecifiedScreenPower(ScreenId, ScreenPowerState, PowerStateChangeReason) override { return false; } virtual bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) override { return false; } virtual ScreenPowerState GetScreenPower(ScreenId dmsScreenId) override { return ScreenPowerState::INVALID_STATE; } virtual bool SetDisplayState(DisplayState state) override { return false; } 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 b00a5f209e6a01830c4bfba7be9ceef79688fe6f..ae922c48f8f9cbd21dc020acb35397e08d71406f 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 @@ -50,6 +50,7 @@ public: virtual bool WakeUpEnd() override; virtual bool SuspendBegin(PowerStateChangeReason reason) override; virtual bool SuspendEnd() override; + virtual bool SetSpecifiedScreenPower(ScreenId, ScreenPowerState, PowerStateChangeReason) override; virtual bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) override; virtual ScreenPowerState GetScreenPower(ScreenId dmsScreenId) override; virtual bool SetDisplayState(DisplayState state) override; diff --git a/window_scene/session_manager/src/screen_session_manager.cpp b/window_scene/session_manager/src/screen_session_manager.cpp index 463267fc3041c9b8414215b6ea6e0cd6af72acf7..2a3c01fa9f73ff5626c0ab3e37d6d3af93e6e623 100644 --- a/window_scene/session_manager/src/screen_session_manager.cpp +++ b/window_scene/session_manager/src/screen_session_manager.cpp @@ -687,6 +687,32 @@ void ScreenSessionManager::NotifyScreenshot(DisplayId displayId) } } +bool ScreenSessionManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) +{ + WLOGFI("SetSpecifiedScreenPower: screen id:%{public}" PRIu64 ", state:%{public}u", screenId, state); + + ScreenPowerStatus status; + switch (state) { + case ScreenPowerState::POWER_ON: { + status = ScreenPowerStatus::POWER_STATUS_ON; + break; + } + case ScreenPowerState::POWER_OFF: { + status = ScreenPowerStatus::POWER_STATUS_OFF; + break; + } + default: { + WLOGFW("SetScreenPowerStatus state not support"); + return false; + } + } + + rsInterface_.SetScreenPowerStatus(screenId, status); + + return NotifyDisplayPowerEvent(state == ScreenPowerState::POWER_ON ? DisplayPowerEvent::DISPLAY_ON : + DisplayPowerEvent::DISPLAY_OFF, EventStatus::END); +} + bool ScreenSessionManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) { std::lock_guard lock(mutex_); diff --git a/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp b/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp index f16494abb6beb44dbcf3dfad7cc29e82c49c6a75..052205d65c2d20abbf0e920e9a05b40fe2cce82b 100644 --- a/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp +++ b/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp @@ -423,6 +423,41 @@ bool OHOS::Rosen::ScreenSessionManagerProxy::SetDisplayState(DisplayState state) return reply.ReadBool(); } +bool OHOS::Rosen::ScreenSessionManagerProxy::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) +{ + sptr remote = Remote(); + if (remote == nullptr) { + WLOGFE("SetSpecifiedScreenPower remote is nullptr"); + return false; + } + + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("WriteInterfaceToken failed"); + return false; + } + if (!data.WriteUint32(static_cast(screenId))) { + WLOGFE("Write ScreenId failed"); + return false; + } + if (!data.WriteUint32(static_cast(state))) { + WLOGFE("Write ScreenPowerState failed"); + return false; + } + if (!data.WriteUint32(static_cast(reason))) { + WLOGFE("Write PowerStateChangeReason failed"); + return false; + } + if (remote->SendRequest(static_cast(DisplayManagerMessage::TRANS_ID_SET_SPECIFIED_SCREEN_POWER), + data, reply, option) != ERR_NONE) { + WLOGFW("SendRequest failed"); + return false; + } + return reply.ReadBool(); +} + bool OHOS::Rosen::ScreenSessionManagerProxy::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) { sptr remote = Remote(); 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 22099299d6b10f0d8f6ae7f05d6bc24f1e33d0fa..89df6951a095f3cad957f8dc83933b3ecab7e8ea 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 @@ -79,6 +79,13 @@ int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel& reply.WriteBool(SetDisplayState(state)); break; } + case DisplayManagerMessage::TRANS_ID_SET_SPECIFIED_SCREEN_POWER: { + ScreenId screenId = static_cast(data.ReadUint32()); + ScreenPowerState state = static_cast(data.ReadUint32()); + PowerStateChangeReason reason = static_cast(data.ReadUint32()); + reply.WriteBool(SetSpecifiedScreenPower(screenId, state, reason)); + break; + } case DisplayManagerMessage::TRANS_ID_SET_SCREEN_POWER_FOR_ALL: { ScreenPowerState state = static_cast(data.ReadUint32()); PowerStateChangeReason reason = static_cast(data.ReadUint32()); diff --git a/window_scene/test/unittest/screen_session_manager_test.cpp b/window_scene/test/unittest/screen_session_manager_test.cpp index f20a7ffc4a734789b844293aceafbeff2bcfa8e7..773218e88945c70342fe2ce30117b479597f3e31 100644 --- a/window_scene/test/unittest/screen_session_manager_test.cpp +++ b/window_scene/test/unittest/screen_session_manager_test.cpp @@ -887,6 +887,20 @@ HWTEST_F(ScreenSessionManagerTest, HasImmersiveWindow, Function | SmallTest | Le ASSERT_EQ(DMError::DM_OK, ssm_->HasImmersiveWindow(immersive)); } +/** + * @tc.name: SetSpecifiedScreenPower + * @tc.desc: ScreenSessionManager screen power + * @tc.type: FUNC + */ + HWTEST_F(ScreenSessionManagerTest, SetSpecifiedScreenPower, Function | SmallTest | Level3) + { + ScreenId mainScreenId(DEFAULT_SCREEN_ID); + ScreenPowerState state = ScreenPowerState::POWER_ON; + PowerStateChangeReason reason = PowerStateChangeReason::POWER_BUTTON; + + ASSERT_EQ(true, ssm_->SetSpecifiedScreenPower(mainScreenId, state, reason)); + } + } } // namespace Rosen } // namespace OHOS