package com.fastebro.androidrgbtool.livepicker;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.PorterDuff;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import com.fastebro.androidrgbtool.R;
import com.fastebro.androidrgbtool.rgb.MainActivity;
import com.fastebro.androidrgbtool.utils.CameraUtils;
import com.fastebro.androidrgbtool.widgets.CircleView;
import butterknife.BindView;
import butterknife.ButterKnife;
import timber.log.Timber;
public class LivePickerActivity extends AppCompatActivity implements LivePickerTextureView.OnColorPointedListener,
View.OnClickListener {
private static final String TAG = LivePickerActivity.class.getName();
@BindView(R.id.live_picker_preview_container)
FrameLayout livePreviewContainer;
@BindView(R.id.live_picker_pointer_stroke)
View pointerRing;
@BindView(R.id.live_picker_btn_back)
ImageButton btnBack;
@BindView(R.id.live_picker_last_color)
CircleView lastColor;
@BindView(R.id.live_picker_btn_save_color)
ImageButton btnSaveColor;
@BindView(R.id.live_picker_btn_flash)
ImageButton btnFlashToggle;
private Camera camera;
private CameraAsyncTask cameraAsyncTask;
private LivePickerTextureView livePickerTextureView;
private boolean isPortrait;
private int pointedColor;
private boolean isFlashOn;
private static Camera getFacingBackCameraInstance() {
Camera camera = null;
try {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
} catch (Exception e) {
Timber.d("Error getting camera instance: %s", e.getMessage());
}
return camera;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_picker);
ButterKnife.bind(this);
initViews();
}
@Override
protected void onResume() {
super.onResume();
isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
cameraAsyncTask = new CameraAsyncTask();
cameraAsyncTask.execute();
}
@Override
protected void onPause() {
super.onPause();
if (cameraAsyncTask != null) {
cameraAsyncTask.cancel(true);
}
releaseCameraPreview();
releaseCamera();
}
@Override
protected void onStop() {
super.onStop();
toggleFlash();
}
private void initViews() {
btnBack.setOnClickListener(view -> {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
});
btnSaveColor.setOnClickListener(view -> {
// TODO
});
if (isFlashSupported()) {
btnFlashToggle.setVisibility(View.VISIBLE);
btnFlashToggle.setOnClickListener(view -> {
toggleFlash();
});
}
}
private void releaseCameraPreview() {
if (livePickerTextureView != null) {
livePreviewContainer.removeView(livePickerTextureView);
}
}
private void releaseCamera() {
if (camera != null) {
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
}
}
@Override
public void onColorPointed(int newColor) {
pointedColor = newColor;
pointerRing.getBackground().setColorFilter(pointedColor, PorterDuff.Mode.SRC_ATOP);
}
@Override
public void onClick(View v) {
// TODO
}
private class CameraAsyncTask extends AsyncTask<Void, Void, Camera> {
FrameLayout.LayoutParams previewParams;
@Override
protected Camera doInBackground(Void... params) {
return getFacingBackCameraInstance();
}
@Override
protected void onPostExecute(Camera camera) {
if (!isCancelled()) {
LivePickerActivity.this.camera = camera;
if (LivePickerActivity.this.camera == null) {
LivePickerActivity.this.finish();
} else {
Camera.Parameters cameraParameters = camera.getParameters();
Camera.Size bestSize = CameraUtils.getBestPreviewSize(
cameraParameters.getSupportedPreviewSizes()
, livePreviewContainer.getWidth()
, livePreviewContainer.getHeight()
, isPortrait);
// Set optimal camera preview
cameraParameters.setPreviewSize(bestSize.width, bestSize.height);
// Set focus mode
if (cameraParameters.getSupportedFocusModes().contains(
Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
cameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
camera.setParameters(cameraParameters);
// Set camera orientation to match with current device orientation
CameraUtils.setCameraDisplayOrientation(LivePickerActivity.this, camera);
// Get proportional dimension for the layout used to display preview according to the preview size
// used
int[] adaptedDimension = CameraUtils.getProportionalDimension(
bestSize
, livePreviewContainer.getWidth()
, livePreviewContainer.getHeight()
, isPortrait);
// Set up params for the layout used to display the preview
previewParams = new FrameLayout.LayoutParams(adaptedDimension[0], adaptedDimension[1]);
previewParams.gravity = Gravity.CENTER;
// Set up camera preview
livePickerTextureView = new LivePickerTextureView(LivePickerActivity.this, LivePickerActivity
.this.camera);
livePickerTextureView.setOnColorPointedListener(LivePickerActivity.this);
livePickerTextureView.setOnClickListener(LivePickerActivity.this);
livePreviewContainer.addView(livePickerTextureView, 0, previewParams);
}
}
}
@Override
protected void onCancelled(Camera camera) {
if (camera != null) {
camera.release();
}
}
}
private boolean isFlashSupported() {
return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
private void toggleFlash() {
if (camera != null) {
final Camera.Parameters parameters = camera.getParameters();
final String flashParameter = isFlashOn ? Camera.Parameters.FLASH_MODE_OFF : Camera.Parameters
.FLASH_MODE_TORCH;
parameters.setFlashMode(flashParameter);
camera.stopPreview();
camera.setParameters(parameters);
camera.startPreview();
isFlashOn = !isFlashOn;
if (btnFlashToggle != null) {
if (isFlashOn) {
btnFlashToggle.setImageDrawable(getDrawable(R.drawable.ic_flash_off_white));
} else {
btnFlashToggle.setImageDrawable(getDrawable(R.drawable.ic_flash_on_white));
}
}
}
}
}