package com.yydcdut.note.presenters.camera.impl; import android.content.Context; import android.support.annotation.NonNull; import com.yydcdut.note.injector.ContextLife; import com.yydcdut.note.model.camera.ICameraFocus; import com.yydcdut.note.model.camera.ICameraModel; import com.yydcdut.note.model.camera.ICameraSettingModel; import com.yydcdut.note.model.camera.ICaptureModel; import com.yydcdut.note.model.camera.IPreviewModel; import com.yydcdut.note.model.camera.impl.CameraModelImpl; import com.yydcdut.note.model.compare.SizeComparator; import com.yydcdut.note.presenters.camera.IAdjustCameraPresenter; import com.yydcdut.note.utils.Const; import com.yydcdut.note.utils.LocalStorageUtils; import com.yydcdut.note.utils.Utils; import com.yydcdut.note.utils.YLog; import com.yydcdut.note.utils.camera.param.Size; import com.yydcdut.note.views.IView; import com.yydcdut.note.views.camera.IAdjustCameraView; import com.yydcdut.note.widget.camera.AutoFitPreviewView; import org.json.JSONException; import java.util.Collections; import java.util.List; import javax.inject.Inject; /** * Created by yuyidong on 16/2/16. */ public class AdjustCameraPresenterImpl implements IAdjustCameraPresenter { private Context mContext; private IAdjustCameraView mAdjustCameraView; /* CameraId */ private String mCameraId = Const.CAMERA_BACK; private int mCurrentOrientationDegree = 0; private static final int DELTA_DEGREE = 90; private LocalStorageUtils mLocalStorageUtils; private ICameraModel mCameraModel; private ICameraSettingModel mCameraSettingModel; private IPreviewModel mPreviewModel; private AutoFitPreviewView.PreviewSurface mPreviewSurface; @Inject public AdjustCameraPresenterImpl(@ContextLife("Activity") Context context, LocalStorageUtils localStorageUtils, CameraModelImpl cameraModelImpl) { mContext = context; mLocalStorageUtils = localStorageUtils; mCurrentOrientationDegree = getCameraRotation(); //Camera2没有设置方向的方法 // if (AppCompat.AFTER_LOLLIPOP) { // mCameraModel = new Camera2ModelImpl(context); // } else { mCameraModel = cameraModelImpl; // } } private int getCameraRotation() { switch (mCameraId) { case Const.CAMERA_BACK: mCurrentOrientationDegree = mLocalStorageUtils.getCameraBackRotation(); return mCurrentOrientationDegree; default: case Const.CAMERA_FRONT: mCurrentOrientationDegree = mLocalStorageUtils.getCameraBackRotation(); return mCurrentOrientationDegree; } } @Override public Context getContext() { return mContext; } @Override public void attachView(@NonNull IView iView) { mAdjustCameraView = (IAdjustCameraView) iView; mCameraModel.openCamera(mCameraId, new ICameraModel.OnCameraOpenedCallback() { @Override public void onOpen(IPreviewModel previewModel, ICameraSettingModel cameraSettingModel) { mPreviewModel = previewModel; mCameraSettingModel = cameraSettingModel; if (!isPictureSizeSaved()) { } savePictureSizes(mCameraId); Size previewSize = getSuitablePreviewSize(mCameraSettingModel.getSupportPreviewSizes()); mAdjustCameraView.setSize(previewSize.getHeight(), previewSize.getWidth()); } @Override public void onError() { } }, getCameraRotation(), null); } /** * 获得最佳预览尺寸 * * @param previewList * @return */ private Size getSuitablePreviewSize(List<Size> previewList) { Size previewSize = null; Collections.sort(previewList, new SizeComparator()); float screenScale = Utils.sScreenHeight / (float) Utils.sScreenWidth; for (Size preSize : previewList) { if (preSize.getWidth() * preSize.getHeight() > 1200000) { continue; } float preScale = preSize.getWidth() / (float) preSize.getHeight(); if (Math.abs(preScale - screenScale) < 0.03) { previewSize = preSize; } } if (previewSize == null) { for (Size preSize : previewList) { if (preSize.getWidth() * preSize.getHeight() > 1200000) { continue; } float preScale = preSize.getWidth() / (float) preSize.getHeight(); if (preScale < 1.36f && preScale > 1.30f) { previewSize = preSize; } } } if (previewSize == null) { previewSize = previewList.get(previewList.size() / 2); } return previewSize; } /** * 保存照片尺寸到SharedPreference * * @param currentCameraId */ private Size savePictureSizes(String currentCameraId) { Size size = null; try { List<Size> list = mCameraSettingModel.getSupportPictureSizes(); Collections.sort(list, new SizeComparator()); size = list.get(list.size() - 1); mLocalStorageUtils.setPictureSizes(currentCameraId, list); mLocalStorageUtils.setPictureSize(currentCameraId, size); } catch (JSONException e) { YLog.e(e); } catch (NullPointerException e) { //mCameraSettingModel有可能为空 YLog.e(e); } return size; } private boolean isPictureSizeSaved() { boolean bool = true; try { bool = mLocalStorageUtils.getPictureSize(mCameraId) != null; } catch (JSONException e) { YLog.e(e); } return bool; } @Override public void detachView() { closeCamera(); } private void closeCamera() { if (mPreviewModel != null && mPreviewModel.isPreview()) { mPreviewModel.stopPreview(); } if (mCameraModel.isOpen()) { mCameraModel.closeCamera(); } } @Override public void onSurfaceAvailable(AutoFitPreviewView.PreviewSurface surface, int width, int height) { mPreviewSurface = surface; if (!mCameraModel.isOpen()) { mCameraModel.openCamera(mCameraId, new ICameraModel.OnCameraOpenedCallback() { @Override public void onOpen(IPreviewModel previewModel, ICameraSettingModel cameraSettingModel) { mPreviewModel = previewModel; mCameraSettingModel = cameraSettingModel; if (!isPictureSizeSaved()) { savePictureSizes(mCameraId); } Size previewSize = getSuitablePreviewSize(mCameraSettingModel.getSupportPreviewSizes()); mPreviewModel.startPreview(mPreviewSurface, mPreviewCallback, previewSize); } @Override public void onError() { } }, getCameraRotation(), null); } else if (mCameraModel.isOpen() && mPreviewModel != null) { Size previewSize = getSuitablePreviewSize(mCameraSettingModel.getSupportPreviewSizes()); mPreviewModel.startPreview(mPreviewSurface, mPreviewCallback, previewSize); } } @Override public void onSurfaceDestroy() { closeCamera(); } @Override public void switchCamera() { saveRotation(); if (mCameraSettingModel != null && mCameraSettingModel.getNumberOfCameras() == 2) { if (Const.CAMERA_BACK.equals(mCameraId)) { mCameraId = Const.CAMERA_FRONT; } else { mCameraId = Const.CAMERA_BACK; } closeCamera(); mCameraModel.openCamera(mCameraId, new ICameraModel.OnCameraOpenedCallback() { @Override public void onOpen(IPreviewModel previewModel, ICameraSettingModel cameraSettingModel) { mPreviewModel = previewModel; mCameraSettingModel = cameraSettingModel; Size previewSize = getSuitablePreviewSize(mCameraSettingModel.getSupportPreviewSizes()); mPreviewModel.startPreview(mPreviewSurface, mPreviewCallback, previewSize); } @Override public void onError() { } }, getCameraRotation(), null); } } @Override public void clickBack() { saveRotation(); mAdjustCameraView.finishActivity(); } private void saveRotation() { if (Const.CAMERA_BACK.equals(mCameraId)) { mLocalStorageUtils.setCameraBackRotation(mCurrentOrientationDegree % 360); } else if (Const.CAMERA_FRONT.equals(mCameraId)) { mLocalStorageUtils.setCameraFrontRotation(mCurrentOrientationDegree % 360); } } @Override public void clickRotation() { if (mCameraSettingModel != null) { mCurrentOrientationDegree = (mCurrentOrientationDegree + DELTA_DEGREE) % 360; mCameraSettingModel.setDisplayOrientation(mCurrentOrientationDegree); } } private IPreviewModel.OnCameraPreviewCallback mPreviewCallback = new IPreviewModel.OnCameraPreviewCallback() { @Override public void onPreview(ICaptureModel captureModel, ICameraFocus cameraFocus) { } @Override public void onPreviewError() { } }; }