package cn.mutils.app.zxing;
import com.google.zxing.Result;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.widget.RelativeLayout;
import cn.mutils.app.R;
import cn.mutils.app.ui.StateView;
import cn.mutils.app.zxing.camera.CameraManager;
import cn.mutils.app.zxing.decode.CaptureHandler;
/**
* Capture view of framework<br>
* It is used to capture data from QRCode image.
*/
@SuppressWarnings({"UnnecessaryInterfaceModifier", "deprecation", "UnusedParameters", "unused"})
public class CaptureView extends StateView implements Callback {
public static interface CaptureListener {
void onCapture(String data);
}
protected CaptureHandler mHandler;
protected SurfaceView mSurfaceView;
protected ViewfinderView mViewfinderView;
protected boolean mHasSurface;
protected CaptureListener mListener;
protected boolean mLightsOn;
protected Drawable mLaserLine;
protected ColorStateList mLaserColor;
protected ColorStateList mFrameColor;
protected ColorStateList mMaskColor;
public CaptureView(Context context) {
super(context);
init(context, null);
}
public CaptureView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public CaptureView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
protected void init(Context context, AttributeSet attrs) {
if (attrs == null) {
return;
}
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CaptureView);
mLaserLine = typedArray.getDrawable(R.styleable.CaptureView_laserLine);
mLaserColor = typedArray.getColorStateList(R.styleable.CaptureView_laserColor);
mFrameColor = typedArray.getColorStateList(R.styleable.CaptureView_frameColor);
mMaskColor = typedArray.getColorStateList(R.styleable.CaptureView_maskColor);
typedArray.recycle();
}
@Override
public void onCreate() {
super.onCreate();
Context context = this.getContext();
mSurfaceView = new SurfaceView(context);
mSurfaceView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT));
this.addView(mSurfaceView);
mViewfinderView = new ViewfinderView(context);
mViewfinderView.setLaserLine(mLaserLine);
mViewfinderView.setLaserColor(mLaserColor);
mViewfinderView.setFrameColor(mFrameColor);
mViewfinderView.setMaskColor(mMaskColor);
mViewfinderView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT));
this.addView(mViewfinderView);
mHasSurface = false;
CameraManager.init(getContext().getApplicationContext());
}
@Override
public void onResume() {
super.onResume();
SurfaceHolder surfaceHolder = mSurfaceView.getHolder();
if (mHasSurface) {
initCamera(surfaceHolder);
} else {
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
}
@Override
public void onPause() {
if (mHandler != null) {
mHandler.quitSynchronously();
mHandler = null;
}
CameraManager.get().closeDriver();
super.onPause();
}
protected void initCamera(SurfaceHolder surfaceHolder) {
try {
CameraManager.get().openDriver(surfaceHolder);
} catch (Exception e) {
return;
}
if (mHandler == null) {
mHandler = new CaptureHandler(this, "UTF-8");
}
if (mLightsOn) {
this.turnOnLights();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (!mHasSurface) {
mHasSurface = true;
initCamera(holder);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mHasSurface = false;
}
public void handleDecode(Result obj, Bitmap barcode) {
if (mListener != null) {
mListener.onCapture(obj.getText());
}
}
public void drawViewfinder() {
mViewfinderView.invalidate();
}
public ViewfinderView getViewfinderView() {
return mViewfinderView;
}
public CaptureHandler getCaptureHandler() {
return mHandler;
}
public boolean isLightsOn() {
return mLightsOn;
}
public boolean turnOnLights() {
CameraManager cameraManager = CameraManager.get();
if (cameraManager == null) {
return false;
}
Camera camera = cameraManager.getCamera();
if (camera == null) {
return false;
}
Parameters parameters = camera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
mLightsOn = Parameters.FLASH_MODE_TORCH.equals(camera.getParameters().getFlashMode());
return mLightsOn;
}
public boolean turnOffLights() {
CameraManager cameraManager = CameraManager.get();
if (cameraManager == null) {
return false;
}
Camera camera = cameraManager.getCamera();
if (camera == null) {
return false;
}
Parameters parameters = camera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
mLightsOn = Parameters.FLASH_MODE_TORCH.equals(camera.getParameters().getFlashMode());
return !mLightsOn;
}
public void setChromeColor(int chromeColor) {
this.mViewfinderView.setFrameColor(chromeColor);
this.mViewfinderView.setLaserColor(chromeColor);
}
public void setChromeColor(String chromeColor) {
try {
this.setChromeColor(Color.parseColor(chromeColor));
} catch (Exception e) {
// IllegalArgumentException
}
}
public void setListener(CaptureListener listener) {
mListener = listener;
}
}