summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorLikai Ding <likaid@codeaurora.org>2015-04-27 14:21:31 +0800
committerLikai Ding <likaid@codeaurora.org>2015-04-27 14:22:34 +0800
commitc58ac9b63792a8a4459972fd836baa0697ae2765 (patch)
treeb3139726e9e611a4c22c2902201728f9ad4ad788 /src/com
parent09db6ed4599bb6686e81a45e9fb1e0287c0eb7f7 (diff)
downloadandroid_packages_apps_Snap-c58ac9b63792a8a4459972fd836baa0697ae2765.tar.gz
android_packages_apps_Snap-c58ac9b63792a8a4459972fd836baa0697ae2765.tar.bz2
android_packages_apps_Snap-c58ac9b63792a8a4459972fd836baa0697ae2765.zip
SnapdragonCamera: add touch animation for refocus
also added a dialog to explain refocus mode Change-Id: I8c319c2cb64ca85d320eca453ade9c325fd4ac37
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/camera/CameraSettings.java2
-rw-r--r--src/com/android/camera/PhotoModule.java1
-rw-r--r--src/com/android/camera/PhotoUI.java22
-rw-r--r--src/com/android/camera/RefocusActivity.java104
4 files changed, 129 insertions, 0 deletions
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index cfc52a7ea..b5c264b96 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -240,6 +240,8 @@ public class CameraSettings {
public static final String KEY_TS_MAKEUP_LEVEL_WHITEN = "pref_camera_tsmakeup_whiten";
public static final String KEY_TS_MAKEUP_LEVEL_CLEAN = "pref_camera_tsmakeup_clean";
+ public static final String KEY_REFOCUS_PROMPT = "refocus-prompt";
+
public static final String EXPOSURE_DEFAULT_VALUE = "0";
public static final int CURRENT_VERSION = 5;
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index e2fc34b0c..865ea9889 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -3496,6 +3496,7 @@ public class PhotoModule
if (refocusOn.equals(mSceneMode)) {
try {
mUI.setPreference(CameraSettings.KEY_ADVANCED_FEATURES, refocusOn);
+ mUI.showRefocusDialog();
} catch (NullPointerException e) {
}
} else {
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index d2e2345e6..b013c9837 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -22,6 +22,7 @@ import java.util.List;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.res.Configuration;
+import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
@@ -32,6 +33,7 @@ import android.hardware.Camera;
import android.hardware.Camera.Face;
import android.os.AsyncTask;
import android.os.Handler;
+import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Gravity;
import android.view.Surface;
@@ -1313,4 +1315,24 @@ public class PhotoUI implements PieListener,
public void adjustOrientation() {
setOrientation(mOrientation, true);
}
+
+ public void showRefocusDialog() {
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
+ int prompt = prefs.getInt(CameraSettings.KEY_REFOCUS_PROMPT, 1);
+ if (prompt == 1) {
+ AlertDialog dialog = new AlertDialog.Builder(mActivity)
+ .setTitle(R.string.refocus_prompt_title)
+ .setMessage(R.string.refocus_prompt_message)
+ .setPositiveButton(R.string.dialog_ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int arg1) {
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putInt(CameraSettings.KEY_REFOCUS_PROMPT, 0);
+ editor.apply();
+ }
+ })
+ .show();
+ }
+ }
}
diff --git a/src/com/android/camera/RefocusActivity.java b/src/com/android/camera/RefocusActivity.java
index 2102d1a78..8c18db977 100644
--- a/src/com/android/camera/RefocusActivity.java
+++ b/src/com/android/camera/RefocusActivity.java
@@ -32,19 +32,29 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
+import android.animation.Animator;
+import android.animation.Keyframe;
+import android.animation.PropertyValuesHolder;
+import android.animation.ValueAnimator;
import android.app.Activity;
+import android.content.Context;
+import android.content.res.Resources;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.Point;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Build;
+import android.util.AttributeSet;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
+import android.widget.FrameLayout;
import org.codeaurora.snapcam.R;
@@ -59,6 +69,7 @@ public class RefocusActivity extends Activity {
private ImageView mImageView;
private int mWidth;
private int mHeight;
+ private Indicator mIndicator;
private DepthMap mDepthMap;
private int mCurrentImage = -1;
@@ -79,6 +90,8 @@ public class RefocusActivity extends Activity {
setResult(RESULT_CANCELED, new Intent());
setContentView(R.layout.refocus_editor);
+ mIndicator = (Indicator) findViewById(R.id.refocus_indicator);
+
mImageView = (ImageView) findViewById(R.id.refocus_image);
mImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
@@ -89,6 +102,8 @@ public class RefocusActivity extends Activity {
float y = event.getY();
int w = v.getWidth();
int h = v.getHeight();
+ mIndicator.startAnimation(x + mImageView.getLeft(),
+ y + mImageView.getTop());
if (mDepthMap != null) {
int depth = mDepthMap.getDepth(x / (float) w, y / (float) h);
setCurrentImage(depth);
@@ -246,4 +261,93 @@ public class RefocusActivity extends Activity {
return result;
}
}
+
+ public static class Indicator extends FrameLayout {
+ private float mX;
+ private float mY;
+ private ValueAnimator mAnimator;
+ private Paint mPaint;
+ private float mCrossLength;
+ private float mStrokeWidth;
+ private int mColor1;
+ private int mColor2;
+
+ public Indicator(Context context, AttributeSet attr) {
+ super(context, attr);
+ final Resources res = context.getResources();
+
+ float r1 = res.getDimensionPixelSize(R.dimen.refocus_circle_diameter_1) / 2;
+ float r2 = res.getDimensionPixelSize(R.dimen.refocus_circle_diameter_2) / 2;
+ float r3 = res.getDimensionPixelSize(R.dimen.refocus_circle_diameter_3) / 2;
+ mCrossLength = res.getDimensionPixelSize(R.dimen.refocus_cross_length) / 2;
+ mStrokeWidth = res.getDimensionPixelSize(R.dimen.refocus_stroke_width) / 2;
+ mColor1 = res.getColor(R.color.refocus_indicator_1);
+ mColor2 = res.getColor(R.color.refocus_indicator_2);
+
+ Keyframe k0 = Keyframe.ofFloat(0f, r1);
+ Keyframe k1 = Keyframe.ofFloat(5f / 12f, r2);
+ Keyframe k2 = Keyframe.ofFloat(0.5f, r2);
+ Keyframe k3 = Keyframe.ofFloat(0.75f, r3);
+ Keyframe k4 = Keyframe.ofFloat(1f, r2);
+ PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe(
+ "radius", k0, k1, k2, k3, k4);
+ mAnimator = ValueAnimator.ofPropertyValuesHolder(holder);
+
+ mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mPaint.setStrokeCap(Paint.Cap.BUTT);
+ mPaint.setStrokeWidth(res.getDimensionPixelSize(R.dimen.refocus_stroke_width));
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mAnimator != null && mAnimator.isStarted()) {
+ mPaint.setColor(mAnimator.getAnimatedFraction() < 0.5f ? mColor1 : mColor2);
+
+ mPaint.setStyle(Paint.Style.STROKE);
+ canvas.drawCircle(mX, mY, (Float) mAnimator.getAnimatedValue(), mPaint);
+ canvas.drawLine(mX - mCrossLength, mY, mX + mCrossLength, mY, mPaint);
+ canvas.drawLine(mX, mY - mCrossLength, mX, mY + mCrossLength, mPaint);
+ }
+ }
+
+ public void startAnimation(float x, float y) {
+ mX = x;
+ mY = y;
+
+ if (mAnimator != null) {
+ mAnimator.cancel();
+ }
+
+ mAnimator.setDuration(720);
+ mAnimator.removeAllUpdateListeners();
+ mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ invalidate();
+ }
+ });
+ mAnimator.removeAllListeners();
+ mAnimator.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ setWillNotDraw(false);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ setWillNotDraw(true);
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ setWillNotDraw(true);
+ }
+ });
+ mAnimator.start();
+ }
+ }
}