diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index e50f3c44bbb0bcfd5992f5658635a6a3abf5fd98..9a3fc82070f5a50d1f62eee1b47ce14f11e98231 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -53,6 +53,7 @@ public: DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface) override; DMError IsScreenRotationLocked(bool& isLocked) override; DMError SetScreenRotationLocked(bool isLocked) override; + Rotation GetTargetDisplayRotation(Orientation orientation); sptr GetDefaultDisplayInfo() override; sptr GetDisplayInfoById(DisplayId displayId) override; diff --git a/dmserver/include/display_manager_service_inner.h b/dmserver/include/display_manager_service_inner.h index a40f65b88353b0a3750fb83f433b79bfee71f354..c361424bd888ae5a86544b1d764f63076f29a55a 100644 --- a/dmserver/include/display_manager_service_inner.h +++ b/dmserver/include/display_manager_service_inner.h @@ -54,6 +54,7 @@ public: void RegisterRSScreenChangeListener(const sptr& listener); sptr GetCutoutInfo(DisplayId displayId) const; void NotifyPrivateWindowStateChanged(bool hasPrivate); + Rotation GetTargetDisplayRotation(Orientation orientation); }; } // namespace OHOS::Rosen diff --git a/dmserver/include/screen_rotation_controller.h b/dmserver/include/screen_rotation_controller.h index 1f4a9c59d0b85e0775775f37399112dd8e420769..1575a6d33068b8bdf3243199c3933add088165eb 100644 --- a/dmserver/include/screen_rotation_controller.h +++ b/dmserver/include/screen_rotation_controller.h @@ -52,6 +52,7 @@ public: static DMError SetScreenRotationLocked(bool isLocked); static void SetDefaultDeviceRotationOffset(uint32_t defaultDeviceRotationOffset); static void ProcessOrientationSwitch(Orientation orientation, bool withAnimation); + static Rotation GetTargetDisplayRotation(Orientation orientation); static bool IsDefaultDisplayRotationPortrait(); static bool IsDisplayRotationVertical(Rotation rotation); diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index e9b8f914a8376438fe7a9f097207f22343b68f41..81526decd283e4db1a32f1a128683b0b4cbd945f 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -719,6 +719,11 @@ DMError DisplayManagerService::SetScreenRotationLocked(bool isLocked) return ScreenRotationController::SetScreenRotationLocked(isLocked); } +Rotation DisplayManagerService::GetTargetDisplayRotation(Orientation orientation) +{ + return ScreenRotationController::GetTargetDisplayRotation(orientation); +} + void DisplayManagerService::SetGravitySensorSubscriptionEnabled() { if (!isAutoRotationOpen_) { diff --git a/dmserver/src/display_manager_service_inner.cpp b/dmserver/src/display_manager_service_inner.cpp index 605aec9a27d602e3de546c1b5d942504ac0acbf1..b6dc689b3959257aab6ec01ed417a8e96e3b4e47 100644 --- a/dmserver/src/display_manager_service_inner.cpp +++ b/dmserver/src/display_manager_service_inner.cpp @@ -173,4 +173,9 @@ void DisplayManagerServiceInner::NotifyPrivateWindowStateChanged(bool hasPrivate { return DisplayManagerService::GetInstance().NotifyPrivateWindowStateChanged(hasPrivate); } + +Rotation DisplayManagerServiceInner::GetTargetDisplayRotation(Orientation orientation) +{ + return DisplayManagerService::GetInstance().GetTargetDisplayRotation(orientation); +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dmserver/src/screen_rotation_controller.cpp b/dmserver/src/screen_rotation_controller.cpp index 3eb08270e2243d7f302fe231d461aae7461b8763..92c58713006de65238b73ed64b17aae641301474 100644 --- a/dmserver/src/screen_rotation_controller.cpp +++ b/dmserver/src/screen_rotation_controller.cpp @@ -98,6 +98,33 @@ void ScreenRotationController::HandleSensorEventInput(DeviceRotation deviceRotat SetScreenRotation(targetDisplayRotation); } +Rotation ScreenRotationController::GetTargetDisplayRotation(Orientation orientation) +{ + if (!IsSensorRelatedOrientation(orientation)) { + switch (orientation) { + case Orientation::UNSPECIFIED: + return Rotation::ROTATION_0; + case Orientation::VERTICAL: + return ConvertDeviceToDisplayRotation(DeviceRotation::ROTATION_PORTRAIT); + case Orientation::HORIZONTAL: + return ConvertDeviceToDisplayRotation(DeviceRotation::ROTATION_LANDSCAPE); + case Orientation::REVERSE_VERTICAL: + return ConvertDeviceToDisplayRotation(DeviceRotation::ROTATION_PORTRAIT_INVERTED); + case Orientation::REVERSE_HORIZONTAL: + return ConvertDeviceToDisplayRotation(DeviceRotation::ROTATION_LANDSCAPE_INVERTED); + case Orientation::LOCKED: + return currentDisplayRotation_; + default: + return Rotation::ROTATION_0; + } + } + + if (currentDisplayRotation_ == ConvertDeviceToDisplayRotation(lastSensorRotationConverted_)) { + return currentDisplayRotation_; + } + return CalcTargetDisplayRotation(orientation, lastSensorRotationConverted_); +} + Rotation ScreenRotationController::GetCurrentDisplayRotation() { sptr defaultDisplayInfo = DisplayManagerServiceInner::GetInstance().GetDefaultDisplay();