package io.github.froger.instamaterial.ui.activity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.hardware.Camera; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewTreeObserver; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.Button; import android.widget.ImageView; import android.widget.ViewSwitcher; import com.commonsware.cwac.camera.CameraHost; import com.commonsware.cwac.camera.CameraHostProvider; import com.commonsware.cwac.camera.CameraView; import com.commonsware.cwac.camera.PictureTransaction; import com.commonsware.cwac.camera.SimpleCameraHost; import java.io.File; import butterknife.BindView; import butterknife.OnClick; import io.github.froger.instamaterial.R; import io.github.froger.instamaterial.Utils; import io.github.froger.instamaterial.ui.adapter.PhotoFiltersAdapter; import io.github.froger.instamaterial.ui.view.RevealBackgroundView; /** * Created by Miroslaw Stanek on 08.02.15. */ public class TakePhotoActivity extends BaseActivity implements RevealBackgroundView.OnStateChangeListener, CameraHostProvider { public static final String ARG_REVEAL_START_LOCATION = "reveal_start_location"; private static final Interpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); private static final Interpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator(); private static final int STATE_TAKE_PHOTO = 0; private static final int STATE_SETUP_PHOTO = 1; @BindView(R.id.vRevealBackground) RevealBackgroundView vRevealBackground; @BindView(R.id.vPhotoRoot) View vTakePhotoRoot; @BindView(R.id.vShutter) View vShutter; @BindView(R.id.ivTakenPhoto) ImageView ivTakenPhoto; @BindView(R.id.vUpperPanel) ViewSwitcher vUpperPanel; @BindView(R.id.vLowerPanel) ViewSwitcher vLowerPanel; @BindView(R.id.cameraView) CameraView cameraView; @BindView(R.id.rvFilters) RecyclerView rvFilters; @BindView(R.id.btnTakePhoto) Button btnTakePhoto; private boolean pendingIntro; private int currentState; private File photoPath; public static void startCameraFromLocation(int[] startingLocation, Activity startingActivity) { Intent intent = new Intent(startingActivity, TakePhotoActivity.class); intent.putExtra(ARG_REVEAL_START_LOCATION, startingLocation); startingActivity.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_take_photo); updateStatusBarColor(); updateState(STATE_TAKE_PHOTO); setupRevealBackground(savedInstanceState); setupPhotoFilters(); vUpperPanel.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { vUpperPanel.getViewTreeObserver().removeOnPreDrawListener(this); pendingIntro = true; vUpperPanel.setTranslationY(-vUpperPanel.getHeight()); vLowerPanel.setTranslationY(vLowerPanel.getHeight()); return true; } }); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void updateStatusBarColor() { if (Utils.isAndroid5()) { getWindow().setStatusBarColor(0xff111111); } } private void setupRevealBackground(Bundle savedInstanceState) { vRevealBackground.setFillPaintColor(0xFF16181a); vRevealBackground.setOnStateChangeListener(this); if (savedInstanceState == null) { final int[] startingLocation = getIntent().getIntArrayExtra(ARG_REVEAL_START_LOCATION); vRevealBackground.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { vRevealBackground.getViewTreeObserver().removeOnPreDrawListener(this); vRevealBackground.startFromLocation(startingLocation); return true; } }); } else { vRevealBackground.setToFinishedFrame(); } } private void setupPhotoFilters() { PhotoFiltersAdapter photoFiltersAdapter = new PhotoFiltersAdapter(this); rvFilters.setHasFixedSize(true); rvFilters.setAdapter(photoFiltersAdapter); rvFilters.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); } @Override protected void onResume() { super.onResume(); cameraView.onResume(); } @Override protected void onPause() { super.onPause(); cameraView.onPause(); } @OnClick(R.id.btnTakePhoto) public void onTakePhotoClick() { btnTakePhoto.setEnabled(false); cameraView.takePicture(true, true); animateShutter(); } @OnClick(R.id.btnAccept) public void onAcceptClick() { PublishActivity.openWithPhotoUri(this, Uri.fromFile(photoPath)); } private void animateShutter() { vShutter.setVisibility(View.VISIBLE); vShutter.setAlpha(0.f); ObjectAnimator alphaInAnim = ObjectAnimator.ofFloat(vShutter, "alpha", 0f, 0.8f); alphaInAnim.setDuration(100); alphaInAnim.setStartDelay(100); alphaInAnim.setInterpolator(ACCELERATE_INTERPOLATOR); ObjectAnimator alphaOutAnim = ObjectAnimator.ofFloat(vShutter, "alpha", 0.8f, 0f); alphaOutAnim.setDuration(200); alphaOutAnim.setInterpolator(DECELERATE_INTERPOLATOR); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playSequentially(alphaInAnim, alphaOutAnim); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { vShutter.setVisibility(View.GONE); } }); animatorSet.start(); } @Override public void onStateChange(int state) { if (RevealBackgroundView.STATE_FINISHED == state) { vTakePhotoRoot.setVisibility(View.VISIBLE); if (pendingIntro) { startIntroAnimation(); } } else { vTakePhotoRoot.setVisibility(View.INVISIBLE); } } private void startIntroAnimation() { vUpperPanel.animate().translationY(0).setDuration(400).setInterpolator(DECELERATE_INTERPOLATOR); vLowerPanel.animate().translationY(0).setDuration(400).setInterpolator(DECELERATE_INTERPOLATOR).start(); } @Override public CameraHost getCameraHost() { return new MyCameraHost(this); } class MyCameraHost extends SimpleCameraHost { private Camera.Size previewSize; public MyCameraHost(Context ctxt) { super(ctxt); } @Override public boolean useFullBleedPreview() { return true; } @Override public Camera.Size getPictureSize(PictureTransaction xact, Camera.Parameters parameters) { return previewSize; } @Override public Camera.Parameters adjustPreviewParameters(Camera.Parameters parameters) { Camera.Parameters parameters1 = super.adjustPreviewParameters(parameters); previewSize = parameters1.getPreviewSize(); return parameters1; } @Override public void saveImage(PictureTransaction xact, final Bitmap bitmap) { runOnUiThread(new Runnable() { @Override public void run() { showTakenPicture(bitmap); } }); } @Override public void saveImage(PictureTransaction xact, byte[] image) { super.saveImage(xact, image); photoPath = getPhotoPath(); } } private void showTakenPicture(Bitmap bitmap) { vUpperPanel.showNext(); vLowerPanel.showNext(); ivTakenPhoto.setImageBitmap(bitmap); updateState(STATE_SETUP_PHOTO); } @Override public void onBackPressed() { if (currentState == STATE_SETUP_PHOTO) { btnTakePhoto.setEnabled(true); vUpperPanel.showNext(); vLowerPanel.showNext(); updateState(STATE_TAKE_PHOTO); } else { super.onBackPressed(); } } private void updateState(int state) { currentState = state; if (currentState == STATE_TAKE_PHOTO) { vUpperPanel.setInAnimation(this, R.anim.slide_in_from_right); vLowerPanel.setInAnimation(this, R.anim.slide_in_from_right); vUpperPanel.setOutAnimation(this, R.anim.slide_out_to_left); vLowerPanel.setOutAnimation(this, R.anim.slide_out_to_left); new Handler().postDelayed(new Runnable() { @Override public void run() { ivTakenPhoto.setVisibility(View.GONE); } }, 400); } else if (currentState == STATE_SETUP_PHOTO) { vUpperPanel.setInAnimation(this, R.anim.slide_in_from_left); vLowerPanel.setInAnimation(this, R.anim.slide_in_from_left); vUpperPanel.setOutAnimation(this, R.anim.slide_out_to_right); vLowerPanel.setOutAnimation(this, R.anim.slide_out_to_right); ivTakenPhoto.setVisibility(View.VISIBLE); } } }