package com.fourtails.usuariolecturista.camera;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.Surface;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.fourtails.usuariolecturista.R;
import com.fourtails.usuariolecturista.ottoEvents.AndroidBus;
import com.melnykov.fab.FloatingActionButton;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.Style;
public class CameraScreenActivity extends Activity {
private Camera mCamera;
private CameraPreview mPreview;
private Camera.PictureCallback mPicture;
private Context myContext;
public static Bus cameraBus;
@Bind(R.id.camera_preview)
LinearLayout cameraPreview;
@Bind(R.id.fabHelpPicture)
FloatingActionButton fabHelpPicture;
@OnClick(R.id.fabHelpPicture)
public void helpClicked() {
Crouton.makeText(this, "Por favor centre los digitos del medidor en el recuadro verde", Style.ALERT).show();
}
@OnClick(R.id.fabTakePicture)
public void takePictureClicked() {
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success)
mCamera.takePicture(null, null, mPicture);
}
});
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_full_screen);
ButterKnife.bind(this);
cameraBus = new AndroidBus();
cameraBus.register(this);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
myContext = this;
initialize();
}
@Subscribe
public void endThisActivity(Boolean end) {
if (end) {
finish();
}
}
private int findBackFacingCamera() {
int cameraId = -1;
//Search for the back facing camera
//get the number of cameras
int numberOfCameras = Camera.getNumberOfCameras();
//for every camera check
for (int i = 0; i < numberOfCameras; i++) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
cameraId = i;
break;
}
}
return cameraId;
}
public void onResume() {
super.onResume();
if (!hasCamera(myContext)) {
Toast toast = Toast.makeText(myContext, "Sorry, your phone does not have a camera!", Toast.LENGTH_LONG);
toast.show();
finish();
}
if (mCamera == null) {
//if the front facing camera does not exist
int cameraId = findBackFacingCamera();
mCamera = Camera.open(cameraId);
setCameraDisplayOrientation(this, cameraId, mCamera);
mPicture = getPictureCallback();
mPreview.refreshCamera(mCamera);
}
}
public void initialize() {
mPreview = new CameraPreview(myContext, mCamera);
cameraPreview.addView(mPreview);
}
public void setCameraDisplayOrientation(Activity activity, int icameraId, Camera camera) {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
Camera.getCameraInfo(icameraId, cameraInfo);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0; // k
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
// cameraType=CAMERATYPE.FRONT;
result = (cameraInfo.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (cameraInfo.orientation - degrees + 360) % 360;
}
// displayRotate=result;
camera.setDisplayOrientation(result);
}
@Override
protected void onPause() {
super.onPause();
//when on Pause, release camera in order to be used from other applications
releaseCamera();
}
private boolean hasCamera(Context context) {
//check if the device has camera
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
return true;
} else {
return false;
}
}
/**
* Most important part, this will get the picture and pass it to the preview
*
* @return
*/
private Camera.PictureCallback getPictureCallback() {
Camera.PictureCallback picture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
CameraDisplayActivity.imageToShow = data;
Intent intent = new Intent(CameraScreenActivity.this, CameraDisplayActivity.class);
startActivity(intent);
//refresh camera to continue preview
mPreview.refreshCamera(mCamera);
}
};
return picture;
}
private void releaseCamera() {
// stop and release camera
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
}