diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraOptions1Test.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraOptions1Test.java index 0bd611ba..d78b2bcf 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraOptions1Test.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraOptions1Test.java @@ -7,7 +7,7 @@ import com.otaliastudios.cameraview.controls.Audio; import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; -import com.otaliastudios.cameraview.engine.mappers.Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.controls.Grid; import com.otaliastudios.cameraview.controls.Hdr; @@ -252,11 +252,11 @@ public class CameraOptions1Test extends BaseTest { } CameraOptions o = new CameraOptions(mock(Camera.Parameters.class), false); - Mapper m = Mapper.get(Engine.CAMERA1); + Camera1Mapper m = Camera1Mapper.get(); Collection s = o.getSupportedControls(Facing.class); assertEquals(s.size(), supported.size()); for (Facing facing : s) { - assertTrue(supported.contains(m.map(facing))); + assertTrue(supported.contains(m.map(facing))); assertTrue(o.supports(facing)); } } diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MapperTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/Camera1MapperTest.java similarity index 94% rename from cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MapperTest.java rename to cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/Camera1MapperTest.java index f8cd336e..47b8f019 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MapperTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/Camera1MapperTest.java @@ -9,7 +9,7 @@ import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.WhiteBalance; -import com.otaliastudios.cameraview.engine.mappers.Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; @@ -22,9 +22,9 @@ import static org.junit.Assert.*; @RunWith(AndroidJUnit4.class) @SmallTest -public class MapperTest extends BaseTest { +public class Camera1MapperTest extends BaseTest { - private Mapper mapper = Mapper.get(Engine.CAMERA1); + private Camera1Mapper mapper = Camera1Mapper.get(); @Test public void testMap() { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java index fdb85b8e..5dec1450 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java @@ -19,7 +19,8 @@ import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Preview; -import com.otaliastudios.cameraview.engine.mappers.Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera2Mapper; import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.controls.Grid; import com.otaliastudios.cameraview.controls.Hdr; @@ -63,7 +64,7 @@ public class CameraOptions { public CameraOptions(@NonNull Camera.Parameters params, boolean flipSizes) { List strings; - Mapper mapper = Mapper.get(Engine.CAMERA1); + Camera1Mapper mapper = Camera1Mapper.get(); // Facing Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); @@ -148,7 +149,7 @@ public class CameraOptions { // Camera2Engine constructor. @RequiresApi(Build.VERSION_CODES.LOLLIPOP) public CameraOptions(@NonNull CameraManager manager, @NonNull String cameraId, boolean flipSizes) throws CameraAccessException { - Mapper mapper = Mapper.get(Engine.CAMERA2); + Camera2Mapper mapper = Camera2Mapper.get(); CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId); // Facing diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java index 98c495ca..6517ef75 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java @@ -11,7 +11,7 @@ import android.os.Handler; import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Facing; -import com.otaliastudios.cameraview.engine.mappers.Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.internal.utils.ExifHelper; import com.otaliastudios.cameraview.internal.utils.WorkerHandler; @@ -61,7 +61,7 @@ public class CameraUtils { */ public static boolean hasCameraFacing(@SuppressWarnings("unused") @NonNull Context context, @NonNull Facing facing) { - int internal = Mapper.get(Engine.CAMERA1).map(facing); + int internal = Camera1Mapper.get().map(facing); Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); for (int i = 0, count = Camera.getNumberOfCameras(); i < count; i++) { Camera.getCameraInfo(i, cameraInfo); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java index fe13c061..bae9f2ab 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -22,7 +22,7 @@ import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.controls.Engine; -import com.otaliastudios.cameraview.engine.mappers.Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.engine.offset.Axis; import com.otaliastudios.cameraview.engine.offset.Reference; import com.otaliastudios.cameraview.frame.Frame; @@ -62,13 +62,13 @@ public class Camera1Engine extends CameraEngine implements private static final int PREVIEW_FORMAT = ImageFormat.NV21; @VisibleForTesting static final int AUTOFOCUS_END_DELAY_MILLIS = 2500; + private final Camera1Mapper mMapper = Camera1Mapper.get(); private Camera mCamera; @VisibleForTesting int mCameraId; private Runnable mFocusEndRunnable; public Camera1Engine(@NonNull Callback callback) { super(callback); - mMapper = Mapper.get(Engine.CAMERA1); } //region Utilities @@ -444,7 +444,7 @@ public class Camera1Engine extends CameraEngine implements private boolean applyFlash(@NonNull Camera.Parameters params, @NonNull Flash oldFlash) { if (mCameraOptions.supports(mFlash)) { - params.setFlashMode((String) mMapper.map(mFlash)); + params.setFlashMode(mMapper.map(mFlash)); return true; } mFlash = oldFlash; @@ -497,7 +497,7 @@ public class Camera1Engine extends CameraEngine implements private boolean applyWhiteBalance(@NonNull Camera.Parameters params, @NonNull WhiteBalance oldWhiteBalance) { if (mCameraOptions.supports(mWhiteBalance)) { - params.setWhiteBalance((String) mMapper.map(mWhiteBalance)); + params.setWhiteBalance(mMapper.map(mWhiteBalance)); return true; } mWhiteBalance = oldWhiteBalance; @@ -522,7 +522,7 @@ public class Camera1Engine extends CameraEngine implements private boolean applyHdr(@NonNull Camera.Parameters params, @NonNull Hdr oldHdr) { if (mCameraOptions.supports(mHdr)) { - params.setSceneMode((String) mMapper.map(mHdr)); + params.setSceneMode(mMapper.map(mHdr)); return true; } mHdr = oldHdr; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java index 46d1ae99..553c5e45 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -36,13 +36,12 @@ import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.VideoResult; -import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.controls.WhiteBalance; -import com.otaliastudios.cameraview.engine.mappers.Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera2Mapper; import com.otaliastudios.cameraview.engine.offset.Axis; import com.otaliastudios.cameraview.engine.offset.Reference; import com.otaliastudios.cameraview.frame.Frame; @@ -83,6 +82,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv private CaptureRequest.Builder mRepeatingRequestBuilder; private CaptureRequest mRepeatingRequest; private CameraCaptureSession.CaptureCallback mRepeatingRequestCallback; + private final Camera2Mapper mMapper = Camera2Mapper.get(); // Frame processing private Size mFrameProcessingSize; @@ -105,7 +105,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv public Camera2Engine(Callback callback) { super(callback); - mMapper = Mapper.get(Engine.CAMERA2); mManager = (CameraManager) mCallback.getContext().getSystemService(Context.CAMERA_SERVICE); mFrameConversionHandler = WorkerHandler.get("CameraFrameConversion"); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java index a8acb509..0cc4fa9a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -18,7 +18,7 @@ import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.PictureResult; -import com.otaliastudios.cameraview.engine.mappers.Mapper; +import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.overlay.Overlay; import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.engine.offset.Angles; @@ -155,7 +155,6 @@ public abstract class CameraEngine implements @SuppressWarnings("WeakerAccess") protected final Callback mCallback; @SuppressWarnings("WeakerAccess") protected CameraPreview mPreview; @SuppressWarnings("WeakerAccess") protected CameraOptions mCameraOptions; - @SuppressWarnings("WeakerAccess") protected Mapper mMapper; @SuppressWarnings("WeakerAccess") protected PictureRecorder mPictureRecorder; @SuppressWarnings("WeakerAccess") protected VideoRecorder mVideoRecorder; @SuppressWarnings("WeakerAccess") protected Size mCaptureSize; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera1Mapper.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera1Mapper.java new file mode 100644 index 00000000..125763f9 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera1Mapper.java @@ -0,0 +1,112 @@ +package com.otaliastudios.cameraview.engine.mappers; + +import android.hardware.Camera; +import android.os.Build; + +import com.otaliastudios.cameraview.controls.Control; +import com.otaliastudios.cameraview.controls.Facing; +import com.otaliastudios.cameraview.controls.Flash; +import com.otaliastudios.cameraview.controls.Hdr; +import com.otaliastudios.cameraview.controls.WhiteBalance; + +import java.util.HashMap; +import java.util.Map; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +/** + * A Mapper maps camera engine constants to CameraView constants. + */ +public class Camera1Mapper { + + private static Camera1Mapper sInstance; + + @NonNull + public static Camera1Mapper get() { + if (sInstance == null) { + sInstance = new Camera1Mapper(); + } + return sInstance; + } + + private static final Map FLASH = new HashMap<>(); + private static final Map WB = new HashMap<>(); + private static final Map FACING = new HashMap<>(); + private static final Map HDR = new HashMap<>(); + + static { + FLASH.put(Flash.OFF, Camera.Parameters.FLASH_MODE_OFF); + FLASH.put(Flash.ON, Camera.Parameters.FLASH_MODE_ON); + FLASH.put(Flash.AUTO, Camera.Parameters.FLASH_MODE_AUTO); + FLASH.put(Flash.TORCH, Camera.Parameters.FLASH_MODE_TORCH); + FACING.put(Facing.BACK, Camera.CameraInfo.CAMERA_FACING_BACK); + FACING.put(Facing.FRONT, Camera.CameraInfo.CAMERA_FACING_FRONT); + WB.put(WhiteBalance.AUTO, Camera.Parameters.WHITE_BALANCE_AUTO); + WB.put(WhiteBalance.INCANDESCENT, Camera.Parameters.WHITE_BALANCE_INCANDESCENT); + WB.put(WhiteBalance.FLUORESCENT, Camera.Parameters.WHITE_BALANCE_FLUORESCENT); + WB.put(WhiteBalance.DAYLIGHT, Camera.Parameters.WHITE_BALANCE_DAYLIGHT); + WB.put(WhiteBalance.CLOUDY, Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT); + HDR.put(Hdr.OFF, Camera.Parameters.SCENE_MODE_AUTO); + if (Build.VERSION.SDK_INT >= 17) { + HDR.put(Hdr.ON, Camera.Parameters.SCENE_MODE_HDR); + } else { + HDR.put(Hdr.ON, "hdr"); + } + } + + private Camera1Mapper() {} + + @NonNull + public String map(@NonNull Flash flash) { + //noinspection ConstantConditions + return FLASH.get(flash); + } + + public int map(@NonNull Facing facing) { + //noinspection ConstantConditions + return FACING.get(facing); + } + + @NonNull + public String map(@NonNull WhiteBalance whiteBalance) { + //noinspection ConstantConditions + return WB.get(whiteBalance); + } + + @NonNull + public String map(@NonNull Hdr hdr) { + //noinspection ConstantConditions + return HDR.get(hdr); + } + + @Nullable + public Flash unmapFlash(@NonNull String cameraConstant) { + return reverseLookup(FLASH, cameraConstant); + } + + @Nullable + public Facing unmapFacing(int cameraConstant) { + return reverseLookup(FACING, cameraConstant); + } + + @Nullable + public WhiteBalance unmapWhiteBalance(@NonNull String cameraConstant) { + return reverseLookup(WB, cameraConstant); + } + + @Nullable + public Hdr unmapHdr(@NonNull String cameraConstant) { + return reverseLookup(HDR, cameraConstant); + } + + @Nullable + private C reverseLookup(@NonNull Map map, @NonNull T object) { + for (C value : map.keySet()) { + if (object.equals(map.get(value))) { + return value; + } + } + return null; + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Mapper.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera2Mapper.java similarity index 90% rename from cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Mapper.java rename to cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera2Mapper.java index c2ae5db7..1ee2396f 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Mapper.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera2Mapper.java @@ -4,6 +4,9 @@ import android.hardware.Camera; import android.hardware.camera2.CameraCharacteristics; import android.os.Build; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + import com.otaliastudios.cameraview.controls.Control; import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Facing; @@ -16,21 +19,23 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; - /** * A Mapper maps camera engine constants to CameraView constants. */ -public abstract class Mapper { +@RequiresApi(Build.VERSION_CODES.LOLLIPOP) +public abstract class Camera2Mapper { - private static Mapper CAMERA1; - private static Mapper CAMERA2; + private static com.otaliastudios.cameraview.engine.mappers.Camera2Mapper sInstance; + + public static com.otaliastudios.cameraview.engine.mappers.Camera2Mapper get() { + if (sInstance == null) sInstance = new Camera2Mapper(); + return sInstance; + } - public static Mapper get(@NonNull Engine engine) { + public static com.otaliastudios.cameraview.engine.mappers.Camera2Mapper get(@NonNull Engine engine) { if (engine == Engine.CAMERA1) { - if (CAMERA1 == null) CAMERA1 = new Camera1Mapper(); - return CAMERA1; + if (sInstance == null) sInstance = new Camera1Mapper(); + return sInstance; } else if (engine == Engine.CAMERA2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (CAMERA2 == null) CAMERA2 = new Camera2Mapper(); return CAMERA2; @@ -39,7 +44,7 @@ public abstract class Mapper { } } - private Mapper() {} + private Camera2Mapper() {} public abstract T map(Flash flash); @@ -82,7 +87,7 @@ public abstract class Mapper { } @SuppressWarnings("unchecked") - private static class Camera1Mapper extends Mapper { + private static class Camera1Mapper extends com.otaliastudios.cameraview.engine.mappers.Camera2Mapper { private static final HashMap FLASH = new HashMap<>(); private static final HashMap WB = new HashMap<>(); @@ -152,7 +157,7 @@ public abstract class Mapper { @SuppressWarnings("unchecked") @RequiresApi(Build.VERSION_CODES.LOLLIPOP) - private static class Camera2Mapper extends Mapper { + private static class Camera2Mapper extends com.otaliastudios.cameraview.engine.mappers.Camera2Mapper { private static final HashMap> FLASH = new HashMap<>(); private static final HashMap FACING = new HashMap<>();