From 62915812989c5b588dd33fb02c4004b5ded665b4 Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Thu, 24 Oct 2024 19:11:48 +0200 Subject: [PATCH 1/2] fix(android): optimize cameraX rotation after camera is active --- .../titanium/media/TiCameraXActivity.java | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java b/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java index 10e0d13224e..253f354cbdc 100644 --- a/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java +++ b/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java @@ -19,7 +19,9 @@ import android.os.Environment; import android.provider.MediaStore; import android.util.Size; +import android.view.OrientationEventListener; import android.view.ScaleGestureDetector; +import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -73,6 +75,8 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import ti.modules.titanium.gesture.TiDeviceOrientationMonitor; + public class TiCameraXActivity extends TiBaseActivity implements CameraXConfig.Provider { private static final String TAG = "TiCameraXActivity"; @@ -112,6 +116,10 @@ public class TiCameraXActivity extends TiBaseActivity implements CameraXConfig.P private ProcessCameraProvider cameraProvider; static int targetResolutionWidth = -1; static int targetResolutionHeight = -1; + ImageCapture.Builder imageCaptureBuilder; + TiDeviceOrientationMonitor orientationEventHandler; + private OrientationEventListener orientationEventListener; + private int lastDisplayOrientation = 0; public static void takePicture() { @@ -417,6 +425,30 @@ private void startCamera() int rotation = getWindowManager().getDefaultDisplay().getRotation(); Activity activity = TiApplication.getAppCurrentActivity(); + + orientationEventListener = new OrientationEventListener(activity) + { + @Override + public void onOrientationChanged(int orientation) + { + if (orientationEventListener == null || orientation == ORIENTATION_UNKNOWN) { + return; + } + int rotation = getWindowManager().getDefaultDisplay().getRotation(); + if (lastDisplayOrientation != rotation) { + imageCapture.setTargetRotation(rotation); + lastDisplayOrientation = rotation; + } + + } + }; + if (orientationEventListener.canDetectOrientation()) { + orientationEventListener.enable(); + } else { + orientationEventListener.disable(); + orientationEventListener = null; + } + ListenableFuture cameraProviderFuture = ProcessCameraProvider.getInstance(activity); cameraProviderFuture.addListener(() -> { try { @@ -484,7 +516,7 @@ private void startCamera() camera = cameraProvider.bindToLifecycle(this, cameraSelector, videoCapture, preview); } else { // photo - ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder() + imageCaptureBuilder = new ImageCapture.Builder() .setFlashMode(cameraFlashMode) .setTargetRotation(rotation); @@ -493,8 +525,13 @@ private void startCamera() } if (targetResolutionWidth != -1 && targetResolutionHeight != -1) { - imageCaptureBuilder.setTargetResolution( - new Size(targetResolutionWidth, targetResolutionHeight)); + if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) { + imageCaptureBuilder.setTargetResolution( + new Size(targetResolutionWidth, targetResolutionHeight)); + } else { + imageCaptureBuilder.setTargetResolution( + new Size(targetResolutionHeight, targetResolutionWidth)); + } } imageCapture = imageCaptureBuilder.build(); @@ -573,6 +610,11 @@ protected void onDestroy() if (camera != null) { camera = null; } + if (orientationEventListener != null) { + orientationEventListener.disable(); + orientationEventListener = null; + } + // Destroy this activity. super.onDestroy(); } @@ -581,6 +623,10 @@ protected void onDestroy() public void finish() { overlayProxy = null; + if (orientationEventListener != null) { + orientationEventListener.disable(); + orientationEventListener = null; + } super.finish(); } From 2bfb3f2cfb97674437b2cfd15e58af2b84c2abaf Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Thu, 24 Oct 2024 19:17:44 +0200 Subject: [PATCH 2/2] update --- .../java/ti/modules/titanium/media/TiCameraXActivity.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java b/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java index 253f354cbdc..16b7f20e74b 100644 --- a/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java +++ b/android/modules/media/src/java/ti/modules/titanium/media/TiCameraXActivity.java @@ -75,8 +75,6 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; -import ti.modules.titanium.gesture.TiDeviceOrientationMonitor; - public class TiCameraXActivity extends TiBaseActivity implements CameraXConfig.Provider { private static final String TAG = "TiCameraXActivity"; @@ -116,8 +114,6 @@ public class TiCameraXActivity extends TiBaseActivity implements CameraXConfig.P private ProcessCameraProvider cameraProvider; static int targetResolutionWidth = -1; static int targetResolutionHeight = -1; - ImageCapture.Builder imageCaptureBuilder; - TiDeviceOrientationMonitor orientationEventHandler; private OrientationEventListener orientationEventListener; private int lastDisplayOrientation = 0; @@ -516,7 +512,7 @@ public void onOrientationChanged(int orientation) camera = cameraProvider.bindToLifecycle(this, cameraSelector, videoCapture, preview); } else { // photo - imageCaptureBuilder = new ImageCapture.Builder() + ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder() .setFlashMode(cameraFlashMode) .setTargetRotation(rotation);