package com.flurgle.camerakit;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.util.Log;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
@TargetApi(21)
class Camera2 extends CameraImpl {
private CameraDevice mCamera;
private CameraCharacteristics mCameraCharacteristics;
private CameraManager mCameraManager;
private String mCameraId;
private int mFacing;
private Size mCaptureSize;
private Size mPreviewSize;
Camera2(CameraListener callback, PreviewImpl preview, Context context) {
super(callback, preview);
preview.setCallback(new PreviewImpl.Callback() {
@Override
public void onSurfaceChanged() {
}
});
mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
}
// CameraImpl:
@Override
void start() {
}
@Override
void stop() {
}
@Override
void setDisplayOrientation(int displayOrientation) {
}
@Override
void setFacing(@Facing int facing) {
int internalFacing = new ConstantMapper.Facing(facing).map();
if (internalFacing == -1) {
return;
}
final String[] ids;
try {
ids = mCameraManager.getCameraIdList();
} catch (CameraAccessException e) {
Log.e("CameraKit", e.toString());
return;
}
if (ids.length == 0) {
throw new RuntimeException("No camera available.");
}
//
// for (String id : ids) {
// CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics(id);
// Integer level = cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
// if (level == null || level == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
// continue;
// }
// Integer internal = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
// if (internal == null) {
// throw new NullPointerException("Unexpected state: LENS_FACING null");
// }
// if (internal == internalFacing) {
// mCameraId = id;
// mCameraCharacteristics = cameraCharacteristics;
// return true;
// }
// }
if (mFacing == facing && isCameraOpened()) {
stop();
start();
}
}
@Override
void setFlash(@Flash int flash) {
}
@Override
void setFocus(@Focus int focus) {
}
@Override
void setMethod(@Method int method) {
}
@Override
void setZoom(@Zoom int zoom) {
}
@Override
void setVideoQuality(int videoQuality) {
}
@Override
void captureImage() {
}
@Override
void startVideo() {
}
@Override
void endVideo() {
}
@Override
Size getCaptureResolution() {
if (mCaptureSize == null && mCameraCharacteristics != null) {
TreeSet<Size> sizes = new TreeSet<>();
sizes.addAll(getAvailableCaptureResolutions());
TreeSet<AspectRatio> aspectRatios = new CommonAspectRatioFilter(
getAvailablePreviewResolutions(),
getAvailableCaptureResolutions()
).filter();
AspectRatio targetRatio = aspectRatios.size() > 0 ? aspectRatios.last() : null;
Iterator<Size> descendingSizes = sizes.descendingIterator();
Size size;
while (descendingSizes.hasNext() && mCaptureSize == null) {
size = descendingSizes.next();
if (targetRatio == null || targetRatio.matches(size)) {
mCaptureSize = size;
break;
}
}
}
return mCaptureSize;
}
@Override
Size getPreviewResolution() {
if (mPreviewSize == null && mCameraCharacteristics != null) {
TreeSet<Size> sizes = new TreeSet<>();
sizes.addAll(getAvailablePreviewResolutions());
TreeSet<AspectRatio> aspectRatios = new CommonAspectRatioFilter(
getAvailablePreviewResolutions(),
getAvailableCaptureResolutions()
).filter();
AspectRatio targetRatio = aspectRatios.size() > 0 ? aspectRatios.last() : null;
Iterator<Size> descendingSizes = sizes.descendingIterator();
Size size;
while (descendingSizes.hasNext() && mPreviewSize == null) {
size = descendingSizes.next();
if (targetRatio == null || targetRatio.matches(size)) {
mPreviewSize = size;
break;
}
}
}
return mPreviewSize;
}
@Override
boolean isCameraOpened() {
return mCamera != null;
}
// Internal
private List<Size> getAvailableCaptureResolutions() {
List<Size> output = new ArrayList<>();
if (mCameraCharacteristics != null) {
StreamConfigurationMap map = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (map == null) {
throw new IllegalStateException("Failed to get configuration map: " + mCameraId);
}
for (android.util.Size size : map.getOutputSizes(ImageFormat.JPEG)) {
output.add(new Size(size.getWidth(), size.getHeight()));
}
}
return output;
}
private List<Size> getAvailablePreviewResolutions() {
List<Size> output = new ArrayList<>();
if (mCameraCharacteristics != null) {
StreamConfigurationMap map = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (map == null) {
throw new IllegalStateException("Failed to get configuration map: " + mCameraId);
}
for (android.util.Size size : map.getOutputSizes(mPreview.getOutputClass())) {
output.add(new Size(size.getWidth(), size.getHeight()));
}
}
return output;
}
}