package cn.mutils.app.zxing.decode;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import com.google.zxing.Result;
import cn.mutils.app.zxing.CaptureConst;
import cn.mutils.app.zxing.CaptureView;
import cn.mutils.app.zxing.camera.CameraManager;
public class CaptureHandler extends Handler {
protected CaptureView mView;
protected DecodeThread mDecodeThread;
protected State mState;
private enum State {
PREVIEW, SUCCESS, DONE
}
public CaptureHandler(CaptureView view, String charset) {
this.mView = view;
mDecodeThread = new DecodeThread(view, charset);
mDecodeThread.start();
mState = State.SUCCESS;
// Start ourselves capturing previews and decoding.
CameraManager.get().startPreview();
restartPreviewAndDecode();
}
@Override
public void handleMessage(Message message) {
switch (message.what) {
case CaptureConst.ID_AUTO_FOCUS:
// Log.d(TAG, "Got auto-focus message");
// When one auto focus pass finishes, start another. This is the
// closest thing to
// continuous AF. It does seem to hunt a bit, but I'm not sure what
// else to do.
if (mState == State.PREVIEW) {
CameraManager.get().requestAutoFocus(this,
CaptureConst.ID_AUTO_FOCUS);
}
break;
case CaptureConst.ID_RESTART_PREVIEW:
// Log.d(TAG, "Got restart preview message");
restartPreviewAndDecode();
break;
case CaptureConst.ID_DECODE_SUCCEEDED:
// Log.d(TAG, "Got decode succeeded message");
mState = State.SUCCESS;
Bundle bundle = message.getData();
Bitmap barcode = bundle == null ? null : (Bitmap) bundle
.getParcelable(DecodeThread.BARCODE_BITMAP);
mView.handleDecode((Result) message.obj, barcode);
break;
case CaptureConst.ID_DECODE_FAILED:
// We're decoding as fast as possible, so when one decode fails,
// start another.
mState = State.PREVIEW;
CameraManager.get().requestPreviewFrame(mDecodeThread.getHandler(),
CaptureConst.ID_DECODE);
break;
case CaptureConst.ID_RETURN_SCAN_RESULT:
// Log.d(TAG, "Got return scan result message");
// activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
// activity.finish();
mView.handleDecode((Result) message.obj, null);
break;
}
}
public void quitSynchronously() {
mState = State.DONE;
CameraManager.get().stopPreview();
Message quit = Message.obtain(mDecodeThread.getHandler(),
CaptureConst.ID_QUIT);
quit.sendToTarget();
try {
mDecodeThread.join();
} catch (InterruptedException e) {
// continue
}
// Be absolutely sure we don't send any queued up messages
removeMessages(CaptureConst.ID_DECODE_SUCCEEDED);
removeMessages(CaptureConst.ID_DECODE_FAILED);
}
private void restartPreviewAndDecode() {
if (mState == State.SUCCESS) {
mState = State.PREVIEW;
CameraManager.get().requestPreviewFrame(mDecodeThread.getHandler(),
CaptureConst.ID_DECODE);
CameraManager.get().requestAutoFocus(this,
CaptureConst.ID_AUTO_FOCUS);
mView.drawViewfinder();
}
}
}