From 598643951fa9ee35299d61f6e0694ea6da8d31d6 Mon Sep 17 00:00:00 2001 From: davidjiagoogle Date: Wed, 7 Oct 2026 01:03:02 +0000 Subject: [PATCH] Fix ViewPort and PreviewDisplay aspect ratio on landscape-natural devices --- .../google/jetpackcamera/core/camera/CameraSession.kt | 10 +++++++++- .../ui/components/capture/CaptureScreenComponents.kt | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/camera/src/main/java/com/google/jetpackcamera/core/camera/CameraSession.kt b/core/camera/src/main/java/com/google/jetpackcamera/core/camera/CameraSession.kt index fd3d00271..b4b30109e 100644 --- a/core/camera/src/main/java/com/google/jetpackcamera/core/camera/CameraSession.kt +++ b/core/camera/src/main/java/com/google/jetpackcamera/core/camera/CameraSession.kt @@ -667,9 +667,17 @@ internal fun createUseCaseGroup( TAG, "Setting initial device rotation to ${initialTransientSettings.deviceRotation}" ) + val isSensorRotationLandscape = + (cameraInfo.getSensorRotationDegrees(previewUseCase.targetRotation) % 180 == 0) == + (cameraInfo.sensorRect.width() >= cameraInfo.sensorRect.height()) + val viewPortAspectRatio = if (isSensorRotationLandscape) { + Rational(aspectRatio.denominator, aspectRatio.numerator) + } else { + Rational(aspectRatio.numerator, aspectRatio.denominator) + } setViewPort( ViewPort.Builder( - Rational(aspectRatio.numerator, aspectRatio.denominator), + viewPortAspectRatio, // Initialize rotation to Preview's rotation, which comes from Display rotation previewUseCase.targetRotation ).build() diff --git a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/CaptureScreenComponents.kt b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/CaptureScreenComponents.kt index 4f0153f3d..585fec79c 100644 --- a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/CaptureScreenComponents.kt +++ b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/CaptureScreenComponents.kt @@ -797,7 +797,11 @@ fun PreviewDisplay( val aspectRatio = aspectRatioUiState.selectedAspectRatio val maxAspectRatio: Float = maxWidth / maxHeight - val aspectRatioFloat: Float = aspectRatio.toFloat() + val aspectRatioFloat: Float = if (maxWidth > maxHeight) { + aspectRatio.toLandscapeFloat() + } else { + aspectRatio.toFloat() + } val shouldUseMaxWidth = maxAspectRatio <= aspectRatioFloat val width = if (shouldUseMaxWidth) maxWidth else maxHeight * aspectRatioFloat val height = if (!shouldUseMaxWidth) maxHeight else maxWidth / aspectRatioFloat