Refactor Camera1Mapper

pull/574/head
Mattia Iavarone 6 years ago
parent 4facd60dfd
commit 314ae7f0fe
  1. 6
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraOptions1Test.java
  2. 6
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/Camera1MapperTest.java
  3. 7
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java
  4. 4
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java
  5. 10
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java
  6. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  7. 3
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java
  8. 112
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera1Mapper.java
  9. 29
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/mappers/Camera2Mapper.java

@ -7,7 +7,7 @@ import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Engine;
import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash; 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.gesture.GestureAction;
import com.otaliastudios.cameraview.controls.Grid; import com.otaliastudios.cameraview.controls.Grid;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
@ -252,11 +252,11 @@ public class CameraOptions1Test extends BaseTest {
} }
CameraOptions o = new CameraOptions(mock(Camera.Parameters.class), false); CameraOptions o = new CameraOptions(mock(Camera.Parameters.class), false);
Mapper m = Mapper.get(Engine.CAMERA1); Camera1Mapper m = Camera1Mapper.get();
Collection<Facing> s = o.getSupportedControls(Facing.class); Collection<Facing> s = o.getSupportedControls(Facing.class);
assertEquals(s.size(), supported.size()); assertEquals(s.size(), supported.size());
for (Facing facing : s) { for (Facing facing : s) {
assertTrue(supported.contains(m.<Integer>map(facing))); assertTrue(supported.contains(m.map(facing)));
assertTrue(o.supports(facing)); assertTrue(o.supports(facing));
} }
} }

@ -9,7 +9,7 @@ import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
import com.otaliastudios.cameraview.controls.WhiteBalance; 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.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@ -22,9 +22,9 @@ import static org.junit.Assert.*;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@SmallTest @SmallTest
public class MapperTest extends BaseTest { public class Camera1MapperTest extends BaseTest {
private Mapper mapper = Mapper.get(Engine.CAMERA1); private Camera1Mapper mapper = Camera1Mapper.get();
@Test @Test
public void testMap() { public void testMap() {

@ -19,7 +19,8 @@ import com.otaliastudios.cameraview.controls.Engine;
import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.controls.Preview; 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.gesture.GestureAction;
import com.otaliastudios.cameraview.controls.Grid; import com.otaliastudios.cameraview.controls.Grid;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
@ -63,7 +64,7 @@ public class CameraOptions {
public CameraOptions(@NonNull Camera.Parameters params, boolean flipSizes) { public CameraOptions(@NonNull Camera.Parameters params, boolean flipSizes) {
List<String> strings; List<String> strings;
Mapper mapper = Mapper.get(Engine.CAMERA1); Camera1Mapper mapper = Camera1Mapper.get();
// Facing // Facing
Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
@ -148,7 +149,7 @@ public class CameraOptions {
// Camera2Engine constructor. // Camera2Engine constructor.
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public CameraOptions(@NonNull CameraManager manager, @NonNull String cameraId, boolean flipSizes) throws CameraAccessException { 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); CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId);
// Facing // Facing

@ -11,7 +11,7 @@ import android.os.Handler;
import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Engine;
import com.otaliastudios.cameraview.controls.Facing; 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.ExifHelper;
import com.otaliastudios.cameraview.internal.utils.WorkerHandler; import com.otaliastudios.cameraview.internal.utils.WorkerHandler;
@ -61,7 +61,7 @@ public class CameraUtils {
*/ */
public static boolean hasCameraFacing(@SuppressWarnings("unused") @NonNull Context context, public static boolean hasCameraFacing(@SuppressWarnings("unused") @NonNull Context context,
@NonNull Facing facing) { @NonNull Facing facing) {
int internal = Mapper.get(Engine.CAMERA1).map(facing); int internal = Camera1Mapper.get().map(facing);
Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int i = 0, count = Camera.getNumberOfCameras(); i < count; i++) { for (int i = 0, count = Camera.getNumberOfCameras(); i < count; i++) {
Camera.getCameraInfo(i, cameraInfo); Camera.getCameraInfo(i, cameraInfo);

@ -22,7 +22,7 @@ import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.controls.Engine; 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.Axis;
import com.otaliastudios.cameraview.engine.offset.Reference; import com.otaliastudios.cameraview.engine.offset.Reference;
import com.otaliastudios.cameraview.frame.Frame; import com.otaliastudios.cameraview.frame.Frame;
@ -62,13 +62,13 @@ public class Camera1Engine extends CameraEngine implements
private static final int PREVIEW_FORMAT = ImageFormat.NV21; private static final int PREVIEW_FORMAT = ImageFormat.NV21;
@VisibleForTesting static final int AUTOFOCUS_END_DELAY_MILLIS = 2500; @VisibleForTesting static final int AUTOFOCUS_END_DELAY_MILLIS = 2500;
private final Camera1Mapper mMapper = Camera1Mapper.get();
private Camera mCamera; private Camera mCamera;
@VisibleForTesting int mCameraId; @VisibleForTesting int mCameraId;
private Runnable mFocusEndRunnable; private Runnable mFocusEndRunnable;
public Camera1Engine(@NonNull Callback callback) { public Camera1Engine(@NonNull Callback callback) {
super(callback); super(callback);
mMapper = Mapper.get(Engine.CAMERA1);
} }
//region Utilities //region Utilities
@ -444,7 +444,7 @@ public class Camera1Engine extends CameraEngine implements
private boolean applyFlash(@NonNull Camera.Parameters params, @NonNull Flash oldFlash) { private boolean applyFlash(@NonNull Camera.Parameters params, @NonNull Flash oldFlash) {
if (mCameraOptions.supports(mFlash)) { if (mCameraOptions.supports(mFlash)) {
params.setFlashMode((String) mMapper.map(mFlash)); params.setFlashMode(mMapper.map(mFlash));
return true; return true;
} }
mFlash = oldFlash; mFlash = oldFlash;
@ -497,7 +497,7 @@ public class Camera1Engine extends CameraEngine implements
private boolean applyWhiteBalance(@NonNull Camera.Parameters params, @NonNull WhiteBalance oldWhiteBalance) { private boolean applyWhiteBalance(@NonNull Camera.Parameters params, @NonNull WhiteBalance oldWhiteBalance) {
if (mCameraOptions.supports(mWhiteBalance)) { if (mCameraOptions.supports(mWhiteBalance)) {
params.setWhiteBalance((String) mMapper.map(mWhiteBalance)); params.setWhiteBalance(mMapper.map(mWhiteBalance));
return true; return true;
} }
mWhiteBalance = oldWhiteBalance; mWhiteBalance = oldWhiteBalance;
@ -522,7 +522,7 @@ public class Camera1Engine extends CameraEngine implements
private boolean applyHdr(@NonNull Camera.Parameters params, @NonNull Hdr oldHdr) { private boolean applyHdr(@NonNull Camera.Parameters params, @NonNull Hdr oldHdr) {
if (mCameraOptions.supports(mHdr)) { if (mCameraOptions.supports(mHdr)) {
params.setSceneMode((String) mMapper.map(mHdr)); params.setSceneMode(mMapper.map(mHdr));
return true; return true;
} }
mHdr = oldHdr; mHdr = oldHdr;

@ -36,13 +36,12 @@ import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.VideoResult;
import com.otaliastudios.cameraview.controls.Engine;
import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.controls.Mode;
import com.otaliastudios.cameraview.controls.WhiteBalance; 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.Axis;
import com.otaliastudios.cameraview.engine.offset.Reference; import com.otaliastudios.cameraview.engine.offset.Reference;
import com.otaliastudios.cameraview.frame.Frame; import com.otaliastudios.cameraview.frame.Frame;
@ -83,6 +82,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
private CaptureRequest.Builder mRepeatingRequestBuilder; private CaptureRequest.Builder mRepeatingRequestBuilder;
private CaptureRequest mRepeatingRequest; private CaptureRequest mRepeatingRequest;
private CameraCaptureSession.CaptureCallback mRepeatingRequestCallback; private CameraCaptureSession.CaptureCallback mRepeatingRequestCallback;
private final Camera2Mapper mMapper = Camera2Mapper.get();
// Frame processing // Frame processing
private Size mFrameProcessingSize; private Size mFrameProcessingSize;
@ -105,7 +105,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
public Camera2Engine(Callback callback) { public Camera2Engine(Callback callback) {
super(callback); super(callback);
mMapper = Mapper.get(Engine.CAMERA2);
mManager = (CameraManager) mCallback.getContext().getSystemService(Context.CAMERA_SERVICE); mManager = (CameraManager) mCallback.getContext().getSystemService(Context.CAMERA_SERVICE);
mFrameConversionHandler = WorkerHandler.get("CameraFrameConversion"); mFrameConversionHandler = WorkerHandler.get("CameraFrameConversion");
} }

@ -18,7 +18,7 @@ import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.PictureResult; 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.overlay.Overlay;
import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.VideoResult;
import com.otaliastudios.cameraview.engine.offset.Angles; 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 final Callback mCallback;
@SuppressWarnings("WeakerAccess") protected CameraPreview mPreview; @SuppressWarnings("WeakerAccess") protected CameraPreview mPreview;
@SuppressWarnings("WeakerAccess") protected CameraOptions mCameraOptions; @SuppressWarnings("WeakerAccess") protected CameraOptions mCameraOptions;
@SuppressWarnings("WeakerAccess") protected Mapper mMapper;
@SuppressWarnings("WeakerAccess") protected PictureRecorder mPictureRecorder; @SuppressWarnings("WeakerAccess") protected PictureRecorder mPictureRecorder;
@SuppressWarnings("WeakerAccess") protected VideoRecorder mVideoRecorder; @SuppressWarnings("WeakerAccess") protected VideoRecorder mVideoRecorder;
@SuppressWarnings("WeakerAccess") protected Size mCaptureSize; @SuppressWarnings("WeakerAccess") protected Size mCaptureSize;

@ -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, String> FLASH = new HashMap<>();
private static final Map<WhiteBalance, String> WB = new HashMap<>();
private static final Map<Facing, Integer> FACING = new HashMap<>();
private static final Map<Hdr, String> 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 extends Control, T> C reverseLookup(@NonNull Map<C, T> map, @NonNull T object) {
for (C value : map.keySet()) {
if (object.equals(map.get(value))) {
return value;
}
}
return null;
}
}

@ -4,6 +4,9 @@ import android.hardware.Camera;
import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraCharacteristics;
import android.os.Build; import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import com.otaliastudios.cameraview.controls.Control; import com.otaliastudios.cameraview.controls.Control;
import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Engine;
import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Facing;
@ -16,21 +19,23 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
/** /**
* A Mapper maps camera engine constants to CameraView constants. * 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 com.otaliastudios.cameraview.engine.mappers.Camera2Mapper sInstance;
private static Mapper CAMERA2;
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 (engine == Engine.CAMERA1) {
if (CAMERA1 == null) CAMERA1 = new Camera1Mapper(); if (sInstance == null) sInstance = new Camera1Mapper();
return CAMERA1; return sInstance;
} else if (engine == Engine.CAMERA2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { } else if (engine == Engine.CAMERA2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (CAMERA2 == null) CAMERA2 = new Camera2Mapper(); if (CAMERA2 == null) CAMERA2 = new Camera2Mapper();
return CAMERA2; return CAMERA2;
@ -39,7 +44,7 @@ public abstract class Mapper {
} }
} }
private Mapper() {} private Camera2Mapper() {}
public abstract <T> T map(Flash flash); public abstract <T> T map(Flash flash);
@ -82,7 +87,7 @@ public abstract class Mapper {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static class Camera1Mapper extends Mapper { private static class Camera1Mapper extends com.otaliastudios.cameraview.engine.mappers.Camera2Mapper {
private static final HashMap<Flash, String> FLASH = new HashMap<>(); private static final HashMap<Flash, String> FLASH = new HashMap<>();
private static final HashMap<WhiteBalance, String> WB = new HashMap<>(); private static final HashMap<WhiteBalance, String> WB = new HashMap<>();
@ -152,7 +157,7 @@ public abstract class Mapper {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) @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, List<Integer>> FLASH = new HashMap<>(); private static final HashMap<Flash, List<Integer>> FLASH = new HashMap<>();
private static final HashMap<Facing, Integer> FACING = new HashMap<>(); private static final HashMap<Facing, Integer> FACING = new HashMap<>();
Loading…
Cancel
Save