diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index 86a70323b21e972e7c0c31f05026870bb645ab92..96abf36216d348c913ac2ecea3fa1bb4014a7e13 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -110,6 +110,7 @@ public: virtual std::shared_ptr GetDisplaySnapshotWithOption(const CaptureOption& captureOption, DmErrorCode* errorCode = nullptr); virtual sptr GetPrimaryDisplayInfo(); + virtual uint32_t GetDeviceStatus(); private: static inline SingletonDelegator delegator; diff --git a/dm/src/display_manager.cpp b/dm/src/display_manager.cpp index a44495f16ed9efefc793a5066a278db14a03e582..ce6485be943cac5c3da9010917ba1e573321142a 100644 --- a/dm/src/display_manager.cpp +++ b/dm/src/display_manager.cpp @@ -101,6 +101,7 @@ public: DMError SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid, std::vector& windowIdList); sptr GetPrimaryDisplaySync(); void OnRemoteDied(); + uint32_t GetDeviceStatus() const; sptr GetCutoutInfoWithRotation(Rotation rotation); private: @@ -2118,6 +2119,11 @@ std::string DisplayManager::Impl::GetDisplayInfoSrting(sptr display return oss.str(); } +uint32_t DisplayManager::Impl::GetDeviceStatus() const +{ + return SingletonContainer::Get().GetDeviceStatus(); +} + bool DisplayManager::WakeUpBegin(PowerStateChangeReason reason) { WLOGFD("[UL_POWER]WakeUpBegin start, reason:%{public}u", reason); @@ -2485,5 +2491,11 @@ sptr DisplayManager::Impl::GetCutoutInfoWithRotation(Rotation rotati auto displayId = displayInfo->GetDisplayId(); return SingletonContainer::Get().GetCutoutInfoWithRotation(displayId, rotationNum); } + +uint32_t DisplayManager::GetDeviceStatus() const +{ + return pImpl_->GetDeviceStatus(); +} + } // namespace OHOS::Rosen diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 1f8eb1999ac79de5e6783e3a578ef4773a4dd8dd..807ed5d67689ac32a4295cf0be2e06ba1cbf09f5 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -970,6 +970,12 @@ sptr DisplayManagerAdapter::GetPrimaryDisplayInfo() } } +uint32_t DisplayManagerAdapter::GetDeviceStatus() +{ + INIT_PROXY_CHECK_RETURN(0); + return displayManagerServiceProxy_->GetDeviceStatus(); +} + std::shared_ptr DisplayManagerAdapter::GetDisplaySnapshotWithOption(const CaptureOption& captureOption, DmErrorCode* errorCode) { diff --git a/dm/test/unittest/display_manager_test.cpp b/dm/test/unittest/display_manager_test.cpp index 71744ff264ecf95ef502e899f39925cda78e8088..c16e72c926d0ef0d60d8398fab5040883a6bb277 100644 --- a/dm/test/unittest/display_manager_test.cpp +++ b/dm/test/unittest/display_manager_test.cpp @@ -1760,6 +1760,17 @@ HWTEST_F(DisplayManagerTest, GetCutoutInfoWithRotation, Function | SmallTest | L sptr info = DisplayManager::GetInstance().GetCutoutInfoWithRotation(rotation); ASSERT_NE(nullptr, info); } + +/** + * @tc.name: GetDeviceStatus + * @tc.desc: GetDeviceStatus test + * @tc.type: FUNC + */ +HWTEST_F(DisplayManagerTest, GetDeviceStatus, Function | SmallTest | Level1) +{ + uint32_t status = DisplayManager::GetInstance().GetDeviceStatus(); + ASSERT_EQ(status, 0); +} } } // 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 d7b2d7b92161adc855972b9557ba2e962f528f5e..76b2c0c77e80bd8f201f6ec804d1e4b9b0c1cdf1 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -304,6 +304,11 @@ public: { return DMError::DM_ERROR_DEVICE_NOT_SUPPORT; } + + virtual uint32_t GetDeviceStatus() + { + return 0; + } }; } // namespace OHOS::Rosen diff --git a/dmserver/include/display_manager_interface_code.h b/dmserver/include/display_manager_interface_code.h index 104f67c46eca617be04b8c3361078f2203b4fa29..a46d2fd03ef81e98bda473ce4e7e57eb7094a2ff 100644 --- a/dmserver/include/display_manager_interface_code.h +++ b/dmserver/include/display_manager_interface_code.h @@ -163,6 +163,7 @@ enum class DisplayManagerMessage : unsigned int { TRANS_ID_GET_DISPLAY_CAPABILITY, TRANS_ID_SET_SYSTEM_KEYBOARD_STATUS, TRANS_ID_SET_VIRTUAL_DISPLAY_MUTE_FLAG, + TRANS_ID_GET_DEVICE_STATUS, TRANS_ID_NOTIFY_EXTEND_SCREEN_CREATE_FINISH, }; } diff --git a/interfaces/innerkits/dm/display_manager.h b/interfaces/innerkits/dm/display_manager.h index 43ea11ba947967aaf417749bffb7e93ab7db6285..bf03160e4def23502e710f068883f29478fb06e0 100644 --- a/interfaces/innerkits/dm/display_manager.h +++ b/interfaces/innerkits/dm/display_manager.h @@ -844,7 +844,13 @@ public: * @return CutoutInfo object of default screen. */ sptr GetCutoutInfoWithRotation(Rotation rotation); - + + /** + * @brief Get device status. + * + * @return Device status. + */ + uint32_t GetDeviceStatus() const; private: DisplayManager(); ~DisplayManager(); diff --git a/interfaces/innerkits/dm/dm_common.h b/interfaces/innerkits/dm/dm_common.h index 9d6f3a363a0a02d5398d3336627a137591516ff3..6a15c26a7711e9aa67d7ce2e38052c51d3b7f077 100644 --- a/interfaces/innerkits/dm/dm_common.h +++ b/interfaces/innerkits/dm/dm_common.h @@ -612,6 +612,17 @@ struct SessionOption { std::string innerName_; ScreenId screenId_; }; + +/** + * @brief Device state + */ +enum class DMDeviceStatus: uint32_t { + UNKNOWN = 0, + STATUS_FOLDED, + STATUS_TENT_HOVER, + STATUS_TENT, + STATUS_GLOBAL_FULL +}; } } #endif // OHOS_ROSEN_DM_COMMON_H diff --git a/window_scene/screen_session_manager/include/fold_screen_controller/fold_screen_controller.h b/window_scene/screen_session_manager/include/fold_screen_controller/fold_screen_controller.h index 160a35f9abd76c88990755ca6166b6d9b839f8ca..29c6ce7f1b8675bf71c7ea736dbbeb2397023ee8 100644 --- a/window_scene/screen_session_manager/include/fold_screen_controller/fold_screen_controller.h +++ b/window_scene/screen_session_manager/include/fold_screen_controller/fold_screen_controller.h @@ -46,6 +46,7 @@ public: bool IsFoldable(); FoldStatus GetFoldStatus(); bool GetTentMode(); + int GetCurrentTentMode() const; FoldDisplayMode GetModeMatchStatus(); void SetFoldStatus(FoldStatus foldStatus); void OnTentModeChanged(int tentType, int32_t hall = -1); diff --git a/window_scene/screen_session_manager/include/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.h b/window_scene/screen_session_manager/include/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.h index 25884750178f275bd13c859085a2c5716a822c9f..e00d633772f9c91d5c537aeaffd56c1b0b547d55 100644 --- a/window_scene/screen_session_manager/include/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.h +++ b/window_scene/screen_session_manager/include/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.h @@ -38,6 +38,7 @@ public: virtual bool IsCameraMode(); void ClearState(sptr foldScreenPolicy); bool IsTentMode(); + int GetTentMode() const; protected: void HandleSensorChange(FoldStatus nextState, float angle, sptr foldScreenPolicy); diff --git a/window_scene/screen_session_manager/include/screen_session_manager.h b/window_scene/screen_session_manager/include/screen_session_manager.h index 3261a8b0d7b3077e7db772feb63f204f8f7eed7b..5b215d26b107d2a318368d9f1692382d15b1056a 100644 --- a/window_scene/screen_session_manager/include/screen_session_manager.h +++ b/window_scene/screen_session_manager/include/screen_session_manager.h @@ -421,6 +421,7 @@ public: SessionOption GetSessionOption(sptr screenSession); SessionOption GetSessionOption(sptr screenSession, ScreenId screenId); virtual DMError SetSystemKeyboardStatus(bool isTpKeyboardOn = false) override; + uint32_t GetDeviceStatus() override; sptr GetPhysicalScreenSession(ScreenId screenId) const; sptr GetScreenSessionByRsId(ScreenId rsScreenId); diff --git a/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h b/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h index b4d4accfaa54942ac477e921ae3b72b43a6ae31b..e806793a66131996586371d5ef4ace539b81feb9 100644 --- a/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h +++ b/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h @@ -220,6 +220,7 @@ public: ScreenCombination GetScreenCombination(ScreenId screenId) override; DMError SetScreenSkipProtectedWindow(const std::vector& screenIds, bool isEnable) override; bool GetIsRealScreen(ScreenId screenId) override; + uint32_t GetDeviceStatus() override; void NotifyExtendScreenCreateFinish() override; private: diff --git a/window_scene/screen_session_manager/src/fold_screen_controller/fold_screen_controller.cpp b/window_scene/screen_session_manager/src/fold_screen_controller/fold_screen_controller.cpp index 56035725a99ab7e03b42771413d4a8cf242061c8..cd5de28fe4d16bdf00ff510e2c864ae0be2f01f1 100644 --- a/window_scene/screen_session_manager/src/fold_screen_controller/fold_screen_controller.cpp +++ b/window_scene/screen_session_manager/src/fold_screen_controller/fold_screen_controller.cpp @@ -198,6 +198,15 @@ bool FoldScreenController::GetCameraMode() return sensorFoldStateManager_->IsCameraMode(); } +int FoldScreenController::GetCurrentTentMode() const +{ + if (sensorFoldStateManager_ == nullptr) { + TLOGW(WmsLogTag::DMS, "GetCurrentTentMode: sensorFoldStateManager_ is null"); + return 0; + } + return sensorFoldStateManager_->GetTentMode(); +} + void FoldScreenController::OnTentModeChanged(int tentType, int32_t hall) { if (sensorFoldStateManager_ == nullptr) { diff --git a/window_scene/screen_session_manager/src/fold_screen_controller/secondary_display_fold_policy.cpp b/window_scene/screen_session_manager/src/fold_screen_controller/secondary_display_fold_policy.cpp index 81f34c63d38faeae5abf69aa496f3903f0afe084..ecd21b9676348804b40388db58064adfeb50ec7d 100644 --- a/window_scene/screen_session_manager/src/fold_screen_controller/secondary_display_fold_policy.cpp +++ b/window_scene/screen_session_manager/src/fold_screen_controller/secondary_display_fold_policy.cpp @@ -19,6 +19,8 @@ #include "session/screen/include/screen_session.h" #include "screen_session_manager.h" #include "screen_scene_config.h" +#include "sensor_agent.h" +#include "sensor_agent_type.h" #include "window_manager_hilog.h" @@ -108,6 +110,13 @@ void SecondaryDisplayFoldPolicy::ChangeScreenDisplayMode(FoldDisplayMode display currentDisplayMode_ = displayMode; lastDisplayMode_ = displayMode; } + if (displayMode == FoldDisplayMode::GLOBAL_FULL) { + TLOGW(WmsLogTag::DMS, "Set device status to STATUS_GLOBAL_FULL"); + SetDeviceStatus(static_cast(DMDeviceStatus::STATUS_GLOBAL_FULL)); + } else { + TLOGW(WmsLogTag::DMS, "Set device status to UNKNOWN"); + SetDeviceStatus(static_cast(DMDeviceStatus::UNKNOWN)); + } ScreenSessionManager::GetInstance().NotifyDisplayModeChanged(displayMode); } diff --git a/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.cpp b/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.cpp index 432548acc78e6f9619bd0f9cc1c3dcf225de3692..93ab47a63d79257c29be49f029612ab902a4dd84 100644 --- a/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.cpp +++ b/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/sensor_fold_state_manager.cpp @@ -189,4 +189,9 @@ void SensorFoldStateManager::SetTentMode(int tentType) TLOGI(WmsLogTag::DMS, "tent mode changing: %{public}d -> %{public}d", tentModeType_, tentType); tentModeType_ = tentType; } + +int SensorFoldStateManager::GetTentMode() const +{ + return tentModeType_; +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/single_display_sensor_pocket_fold_state_manager.cpp b/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/single_display_sensor_pocket_fold_state_manager.cpp index 56353927deb84851678b2e5ed24a626fefdefac7..acb6933accbb5c85ce45a0559e51069665fc63ff 100644 --- a/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/single_display_sensor_pocket_fold_state_manager.cpp +++ b/window_scene/screen_session_manager/src/fold_screen_controller/sensor_fold_state_manager/single_display_sensor_pocket_fold_state_manager.cpp @@ -26,6 +26,8 @@ #include "app_mgr_client.h" #include "screen_session_manager/include/screen_rotation_property.h" #include "screen_session_manager.h" +#include "sensor_agent.h" +#include "sensor_agent_type.h" #ifdef POWER_MANAGER_ENABLE #include @@ -180,8 +182,12 @@ void SingleDisplaySensorPocketFoldStateManager::HandleTentChange(int tentType, HandleSensorChange(FoldStatus::FOLDED, currentAngle, foldScreenPolicy); foldScreenPolicy->ChangeOnTentMode(FoldStatus::FOLDED); if (tentType == TENT_MODE_ON) { + TLOGI(WmsLogTag::DMS, "Set device status to STATUS_TENT"); + SetDeviceStatus(static_cast(DMDeviceStatus::STATUS_TENT)); ScreenRotationProperty::HandleHoverStatusEventInput(DeviceHoverStatus::TENT_STATUS); } else if (tentType == TENT_MODE_HOVER_ON) { + TLOGI(WmsLogTag::DMS, "Set device status to STATUS_TENT_HOVER"); + SetDeviceStatus(static_cast(DMDeviceStatus::STATUS_TENT_HOVER)); ScreenRotationProperty::HandleHoverStatusEventInput(DeviceHoverStatus::TENT_STATUS_HOVER); } } else { @@ -194,6 +200,13 @@ void SingleDisplaySensorPocketFoldStateManager::HandleTentChange(int tentType, } else { nextState = GetNextFoldState(currentAngle, hall); } + if (nextState == FoldStatus::FOLDED) { + TLOGI(WmsLogTag::DMS, "Set device status to STATUS_FOLDED"); + SetDeviceStatus(static_cast(DMDeviceStatus::STATUS_FOLDED)); + } else { + TLOGI(WmsLogTag::DMS, "Set device status to UNKNOWN"); + SetDeviceStatus(static_cast(DMDeviceStatus::UNKNOWN)); + } HandleSensorChange(nextState, currentAngle, foldScreenPolicy); ReportTentStatusChange(ReportTentModeStatus::NORMAL_EXIT_TENT_MODE); foldScreenPolicy->ChangeOffTentMode(); diff --git a/window_scene/screen_session_manager/src/fold_screen_controller/single_display_pocket_fold_policy.cpp b/window_scene/screen_session_manager/src/fold_screen_controller/single_display_pocket_fold_policy.cpp index 437c390c6d24a49fc17e5f89a3302282f1dc4a3b..8db4c14c2ee0a7d4c569432cdfc90b2503ead485 100644 --- a/window_scene/screen_session_manager/src/fold_screen_controller/single_display_pocket_fold_policy.cpp +++ b/window_scene/screen_session_manager/src/fold_screen_controller/single_display_pocket_fold_policy.cpp @@ -118,6 +118,15 @@ void SingleDisplayPocketFoldPolicy::ChangeScreenDisplayMode(FoldDisplayMode disp std::lock_guard lock_mode(displayModeMutex_); lastDisplayMode_ = displayMode; } + if (!ScreenSessionManager::GetInstance().GetTentMode()) { + if (displayMode == FoldDisplayMode::MAIN) { + TLOGI(WmsLogTag::DMS, "Set device status to STATUS_FOLDED"); + SetDeviceStatus(static_cast(DMDeviceStatus::STATUS_FOLDED)); + } else { + TLOGI(WmsLogTag::DMS, "Set device status to UNKNOWN"); + SetDeviceStatus(static_cast(DMDeviceStatus::UNKNOWN)); + } + } ChangeScreenDisplayModeProc(screenSession, displayMode, reason); { std::lock_guard lock_mode(displayModeMutex_); diff --git a/window_scene/screen_session_manager/src/screen_session_manager.cpp b/window_scene/screen_session_manager/src/screen_session_manager.cpp index 993c17ade2cf37dec1da4d599f464e4b49109519..7406f32387a3152ce650f528e422f17a3f1ac004 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager.cpp @@ -144,6 +144,8 @@ const uint32_t MAX_INTERVAL_US = 1800000000; // 30分钟 const int32_t MAP_SIZE = 300; const std::string NO_EXIST_BUNDLE_MANE = "null"; ScreenCache g_uidVersionMap(MAP_SIZE, NO_EXIST_BUNDLE_MANE); +constexpr int32_t MOTION_ACTION_TENT_MODE_ON = 1; +constexpr int32_t MOTION_ACTION_TENT_MODE_HOVER = 2; const std::string SCREEN_UNKNOWN = "unknown"; #ifdef WM_MULTI_SCREEN_ENABLE @@ -8993,6 +8995,42 @@ void ScreenSessionManager::SetExtendScreenDpi() TLOGI(WmsLogTag::DMS, "get setting extend screen dpi is : %{public}f", g_extendScreenDpiCoef_); } +uint32_t ScreenSessionManager::GetDeviceStatus() +{ + if (foldScreenController_ == nullptr) { + return 0; + } + + DMDeviceStatus status = DMDeviceStatus::UNKNOWN; + + if (FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice()) { + int tentMode = foldScreenController_->GetCurrentTentMode(); + if (tentMode == MOTION_ACTION_TENT_MODE_HOVER) { + status = DMDeviceStatus::STATUS_TENT_HOVER; + } else if (tentMode == MOTION_ACTION_TENT_MODE_ON) { + status = DMDeviceStatus::STATUS_TENT; + } else { + FoldDisplayMode displayMode = foldScreenController_->GetModeMatchStatus(); + if (displayMode == FoldDisplayMode::MAIN) { + status = DMDeviceStatus::STATUS_FOLDED; + } + TLOGI(WmsLogTag::DMS, "Get device status for pocket, display mode: %{public}u", + static_cast(displayMode)); + } + TLOGI(WmsLogTag::DMS, "Get device status for pocket, tent mode: %{public}d status: %{public}u", + tentMode, static_cast(status)); + } else if (FoldScreenStateInternel::IsSecondaryDisplayFoldDevice()) { + FoldDisplayMode displayMode = foldScreenController_->GetModeMatchStatus(); + if (displayMode == FoldDisplayMode::GLOBAL_FULL) { + status = DMDeviceStatus::STATUS_GLOBAL_FULL; + } + TLOGI(WmsLogTag::DMS, "Get device status, display mode: %{public}u status: %{public}u", + static_cast(displayMode), static_cast(status)); + } + + return static_cast(status); +} + sptr ScreenSessionManager::GetFakePhysicalScreenSession(ScreenId screenId, ScreenId defScreenId, ScreenProperty property) { diff --git a/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp b/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp index af6e5db319168ef6992cd0a3c7eb5c9a6efd8a82..8ce0f375536c77a4e0e4cfe948b5162a54cf5cad 100644 --- a/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp +++ b/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp @@ -4108,6 +4108,37 @@ bool ScreenSessionManagerProxy::GetIsRealScreen(ScreenId screenId) return reply.ReadBool(); } +uint32_t ScreenSessionManagerProxy::GetDeviceStatus() +{ + sptr remote = Remote(); + if (remote == nullptr) { + WLOGFW("ScreenSessionManagerProxy::GetDeviceStatus: remote is nullptr"); + return 0; + } + + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("ScreenSessionManagerProxy::GetDeviceStatus: WriteInterfaceToken failed"); + return 0; + } + + if (remote->SendRequest(static_cast(DisplayManagerMessage::TRANS_ID_GET_DEVICE_STATUS), + data, reply, option) != ERR_NONE) { + WLOGFE("ScreenSessionManagerProxy::GetDeviceStatus: SendRequest failed"); + return 0; + } + + uint32_t status = 0; + if (!reply.ReadUint32(status)) { + WLOGFE("ScreenSessionManagerProxy::GetDeviceStatus: ReadUint32 failed"); + return 0; + } + + return status; +} + void ScreenSessionManagerProxy::NotifyExtendScreenCreateFinish() { sptr remote = Remote(); diff --git a/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp b/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp index e66901f6c5a5de829cc7836edb436869a60b051c..4bc32e958bde1113564bb140db47b2cda6b1c8b9 100644 --- a/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp +++ b/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp @@ -1135,6 +1135,13 @@ int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel& SetVirtualDisplayMuteFlag(screenId, muteFlag); break; } + case DisplayManagerMessage::TRANS_ID_GET_DEVICE_STATUS: { + if (!reply.WriteInt32(GetDeviceStatus())) { + TLOGE(WmsLogTag::DMS, "Write device status failed"); + return ERR_INVALID_DATA; + } + break; + } case DisplayManagerMessage::TRANS_ID_NOTIFY_EXTEND_SCREEN_CREATE_FINISH: { NotifyExtendScreenCreateFinish(); break;