From d46aeaec4f29a853753e12aeb8fbbc60a2e46ebd Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Sun, 28 Jul 2024 20:09:59 -0600 Subject: [PATCH] Gross way of getting android preview view to respect orientation --- .../src/main/java/com/mrousavy/camera/CameraView.kt | 7 +++++++ .../main/java/com/mrousavy/camera/CameraViewManager.kt | 2 ++ .../java/com/mrousavy/camera/core/CameraSession.kt | 5 +++-- .../main/java/com/mrousavy/camera/core/PreviewView.kt | 10 +++++++++- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraView.kt b/package/android/src/main/java/com/mrousavy/camera/CameraView.kt index 5849573..b9b1657 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraView.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraView.kt @@ -72,6 +72,13 @@ class CameraView(context: Context) : var zoom: Float = 1f // in "factor" var exposure: Double = 1.0 var orientation: Orientation = Orientation.PORTRAIT + set(value) { + field = value + previewView.config?.let { + it.orientation = value + } + previewView.requestLayout() + } var enableZoomGesture = false set(value) { field = value diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt b/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt index 2c9f579..d27a27a 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt @@ -10,6 +10,7 @@ import com.mrousavy.camera.types.CodeScannerOptions import com.mrousavy.camera.types.Orientation import com.mrousavy.camera.types.PixelFormat import com.mrousavy.camera.types.ResizeMode +import android.util.Log import com.mrousavy.camera.types.Torch import com.mrousavy.camera.types.VideoStabilizationMode @@ -182,6 +183,7 @@ class CameraViewManager : ViewGroupManager() { fun setOrientation(view: CameraView, orientation: String?) { if (orientation != null) { val newMode = Orientation.fromUnionValue(orientation) + Log.i(TAG, "Orientation set to: $newMode") view.orientation = newMode } else { view.orientation = Orientation.PORTRAIT diff --git a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt index 501cab3..33a88c3 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt @@ -191,7 +191,7 @@ class CameraSession(private val context: Context, private val cameraManager: Cam Log.i(TAG, "PreviewView Surface destroyed! ${holder.surface}") destroyPreviewOutputSync() } - } + }, configuration ) this.previewView = previewView return previewView @@ -312,8 +312,9 @@ class CameraSession(private val context: Context, private val cameraManager: Cam enableHdr ) outputs.add(output) - // Size is usually landscape, so we flip it here + previewView?.setSurfaceSize(size.width, size.height, deviceDetails.sensorOrientation) + previewView?.config = configuration } // CodeScanner Output diff --git a/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt b/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt index 0727a1f..691c361 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt @@ -17,7 +17,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @SuppressLint("ViewConstructor") -class PreviewView(context: Context, callback: SurfaceHolder.Callback) : +class PreviewView(context: Context, callback: SurfaceHolder.Callback, var config: CameraConfiguration?) : SurfaceView(context), SurfaceHolder.Callback { var size: Size = CameraDeviceDetails.getMaximumPreviewSize() @@ -101,8 +101,16 @@ class PreviewView(context: Context, callback: SurfaceHolder.Callback) : } private fun getSize(contentSize: Size, containerSize: Size, resizeMode: ResizeMode): Size { + var contentSize = contentSize + val orientation = config?.orientation + + // Swap dimensions if orientation is landscape + if (orientation?.isLandscape() == true) { + contentSize = Size(contentSize.height, contentSize.width) + } val contentAspectRatio = contentSize.width.toDouble() / contentSize.height val containerAspectRatio = containerSize.width.toDouble() / containerSize.height + Log.i(TAG, "Getting size: $contentSize -> $containerSize, orientation: $orientation") if (!(contentAspectRatio > 0 && containerAspectRatio > 0)) { // One of the aspect ratios is 0 or NaN, maybe the view hasn't been laid out yet. return contentSize