summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/ui
diff options
context:
space:
mode:
authorjunjiez <junjiez@codeaurora.org>2017-06-29 13:44:15 +0800
committerjunjiez <junjiez@codeaurora.org>2017-07-26 15:28:52 +0800
commitef407574ede2694755abbd5a872936623030c1d7 (patch)
treed89371f4fdc74d928f032bc6bba3d921a0bad01d /src/com/android/camera/ui
parent73c61caa5c7d17f02153bd559e5dbe340dbff245 (diff)
downloadandroid_packages_apps_Snap-ef407574ede2694755abbd5a872936623030c1d7.tar.gz
android_packages_apps_Snap-ef407574ede2694755abbd5a872936623030c1d7.tar.bz2
android_packages_apps_Snap-ef407574ede2694755abbd5a872936623030c1d7.zip
SnapdragonCamera:RTB UI
1.add a new icon on the top of camera control to enable bokeh mode. 2.add toast to show the distance,lighting and effect alert. 3.add debug mode to save all the images received from HAL separately 4.modify ui according to the spec Change-Id: I1178015f48c29cade4e14bb531c9727665905fec
Diffstat (limited to 'src/com/android/camera/ui')
-rwxr-xr-x[-rw-r--r--]src/com/android/camera/ui/CameraControls.java93
-rwxr-xr-x[-rw-r--r--]src/com/android/camera/ui/PieRenderer.java116
2 files changed, 185 insertions, 24 deletions
diff --git a/src/com/android/camera/ui/CameraControls.java b/src/com/android/camera/ui/CameraControls.java
index 2a2222804..73afcd5a0 100644..100755
--- a/src/com/android/camera/ui/CameraControls.java
+++ b/src/com/android/camera/ui/CameraControls.java
@@ -59,6 +59,7 @@ public class CameraControls extends RotatableLayout {
private View mFrontBackSwitcher;
private View mHdrSwitcher;
private View mTsMakeupSwitcher;
+ private View mBokehSwitcher;
private View mIndicators;
private View mPreview;
private View mSceneModeSwitcher;
@@ -69,7 +70,7 @@ public class CameraControls extends RotatableLayout {
private ArrowTextView mRefocusToast;
private int mSize;
- private static final int WIDTH_GRID = 5;
+ private static int WIDTH_GRID = 5;
private static final int HEIGHT_GRID = 7;
private static boolean isAnimating = false;
private ArrayList<View> mViewList;
@@ -86,7 +87,8 @@ public class CameraControls extends RotatableLayout {
private static final int MUTE_INDEX = 9;
private static final int VIDEO_SHUTTER_INDEX = 10;
private static final int EXIT_PANORAMA_INDEX = 11;
- private static final int MAX_INDEX= 12;
+ private static final int BOKEH_INDEX = 12;
+ private static final int MAX_INDEX= 13;
private static final int ANIME_DURATION = 300;
private float[][] mLocX = new float[4][MAX_INDEX];
private float[][] mLocY = new float[4][MAX_INDEX];
@@ -106,6 +108,8 @@ public class CameraControls extends RotatableLayout {
private static final int LOW_REMAINING_PHOTOS = 20;
private static final int HIGH_REMAINING_PHOTOS = 1000000;
+ private boolean mIsBokehMode = false;
+
AnimatorListener outlistener = new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
@@ -126,9 +130,11 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setVisibility(View.INVISIBLE);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setVisibility(View.INVISIBLE);
+ }
mSceneModeSwitcher.setVisibility(View.INVISIBLE);
mFilterModeSwitcher.setVisibility(View.INVISIBLE);
-
mSwitcher.setVisibility(View.INVISIBLE);
mShutter.setVisibility(View.INVISIBLE);
mVideoShutter.setVisibility(View.INVISIBLE);
@@ -151,9 +157,11 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setVisibility(View.INVISIBLE);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setVisibility(View.INVISIBLE);
+ }
mSceneModeSwitcher.setVisibility(View.INVISIBLE);
mFilterModeSwitcher.setVisibility(View.INVISIBLE);
-
mSwitcher.setVisibility(View.INVISIBLE);
mShutter.setVisibility(View.INVISIBLE);
mVideoShutter.setVisibility(View.INVISIBLE);
@@ -231,6 +239,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setPressed(false);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setPressed(false);
+ }
mSceneModeSwitcher.setPressed(false);
}
@@ -247,6 +258,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setEnabled(enable);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setEnabled(enable);
+ }
mPreview.setEnabled(enable);
}
@@ -262,6 +276,11 @@ public class CameraControls extends RotatableLayout {
if (mHdrSwitcher.getVisibility() == View.VISIBLE)
mViewList.add(mHdrSwitcher);
}
+ if (mIsBokehMode) {
+ if (mBokehSwitcher.getVisibility() == View.VISIBLE) {
+ mViewList.add(mBokehSwitcher);
+ }
+ }
if (mSceneModeSwitcher.getVisibility() == View.VISIBLE)
mViewList.add(mSceneModeSwitcher);
if (mFilterModeSwitcher.getVisibility() == View.VISIBLE)
@@ -299,6 +318,7 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher = findViewById(R.id.hdr_switcher);
}
+ mBokehSwitcher = findViewById(R.id.bokeh_switcher);
mMenu = findViewById(R.id.menu);
mMute = findViewById(R.id.mute_button);
mExitPanorama = findViewById(R.id.exit_panorama);
@@ -379,7 +399,12 @@ public class CameraControls extends RotatableLayout {
private void setLocation(int w, int h) {
int rotation = getUnifiedRotation();
- toIndex(mSwitcher, w, h, rotation, 4, 6, SWITCHER_INDEX);
+ if (mIsBokehMode) {
+ toIndex(mSwitcher, w, h, rotation, 5, 6, SWITCHER_INDEX);
+ toIndex(mBokehSwitcher,w,h,rotation,5,0,BOKEH_INDEX);
+ } else {
+ toIndex(mSwitcher, w, h, rotation, 4, 6, SWITCHER_INDEX);
+ }
toIndex(mVideoShutter, w, h, rotation, 3, 6, VIDEO_SHUTTER_INDEX);
toIndex(mMenu, w, h, rotation, 4, 0, MENU_INDEX);
toIndex(mMute, w, h, rotation, 3, 0, MUTE_INDEX);
@@ -490,6 +515,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setX(mLocX[idx1][HDR_INDEX] + x);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setX(mLocX[idx1][BOKEH_INDEX] + x);
+ }
mSceneModeSwitcher.setX(mLocX[idx1][SCENE_MODE_INDEX] + x);
mFilterModeSwitcher.setX(mLocX[idx1][FILTER_MODE_INDEX] + x);
mMenu.setX(mLocX[idx1][MENU_INDEX] + x);
@@ -507,6 +535,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setY(mLocY[idx1][HDR_INDEX] + y);
}
+ if (mIsBokehMode){
+ mBokehSwitcher.setY(mLocY[idx1][BOKEH_INDEX] + y);
+ }
mSceneModeSwitcher.setY(mLocY[idx1][SCENE_MODE_INDEX] + y);
mFilterModeSwitcher.setY(mLocY[idx1][FILTER_MODE_INDEX] + y);
mMenu.setY(mLocY[idx1][MENU_INDEX] + y);
@@ -529,6 +560,20 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setVisibility(status);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setVisibility(status);
+ }
+ }
+
+ public void setBokehMode(boolean enable) {
+ mIsBokehMode = enable;
+ if (mIsBokehMode) {
+ WIDTH_GRID = 6;
+ } else {
+ WIDTH_GRID = 5;
+ mBokehSwitcher.setVisibility(GONE);
+ }
+ requestLayout();
}
public void hideUI() {
@@ -542,6 +587,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().cancel();
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().cancel();
+ }
mSceneModeSwitcher.animate().cancel();
mFilterModeSwitcher.animate().cancel();
mSwitcher.animate().cancel();
@@ -564,6 +612,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
@@ -583,6 +634,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
@@ -602,6 +656,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
@@ -621,6 +678,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
@@ -649,6 +709,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().cancel();
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().cancel();
+ }
mSceneModeSwitcher.animate().cancel();
mFilterModeSwitcher.animate().cancel();
mSwitcher.animate().cancel();
@@ -683,6 +746,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationYBy(mSize).setDuration(ANIME_DURATION);
@@ -704,6 +770,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationXBy(mSize).setDuration(ANIME_DURATION);
@@ -725,6 +794,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationYBy(-mSize).setDuration(ANIME_DURATION);
@@ -746,6 +818,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
+ }
mSceneModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
mFilterModeSwitcher.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
mMenu.animate().translationXBy(-mSize).setDuration(ANIME_DURATION);
@@ -1024,7 +1099,7 @@ public class CameraControls extends RotatableLayout {
mOrientation = orientation;
View[] views = {
mSceneModeSwitcher, mFilterModeSwitcher, mFrontBackSwitcher,
- TsMakeupManager.HAS_TS_MAKEUP ? mTsMakeupSwitcher : mHdrSwitcher,
+ TsMakeupManager.HAS_TS_MAKEUP ? mTsMakeupSwitcher : mHdrSwitcher,mBokehSwitcher,
mMenu, mShutter, mPreview, mSwitcher, mMute, mReviewRetakeButton,
mReviewCancelButton, mReviewDoneButton, mExitPanorama
};
@@ -1044,6 +1119,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setVisibility(View.INVISIBLE);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setVisibility(View.INVISIBLE);
+ }
mSceneModeSwitcher.setVisibility(View.INVISIBLE);
mFilterModeSwitcher.setVisibility(View.INVISIBLE);
mMenu.setVisibility(View.INVISIBLE);
@@ -1056,6 +1134,9 @@ public class CameraControls extends RotatableLayout {
} else {
mHdrSwitcher.setVisibility(View.VISIBLE);
}
+ if (mIsBokehMode) {
+ mBokehSwitcher.setVisibility(View.VISIBLE);
+ }
mSceneModeSwitcher.setVisibility(View.VISIBLE);
mFilterModeSwitcher.setVisibility(View.VISIBLE);
mMenu.setVisibility(View.VISIBLE);
diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java
index 3712de1b7..323973301 100644..100755
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -21,6 +21,9 @@ import android.animation.Animator.AnimatorListener;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
@@ -28,13 +31,21 @@ import android.graphics.Path;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.FloatMath;
+import android.util.Log;
+import android.util.Size;
import android.view.MotionEvent;
+import android.view.View;
import android.view.ViewConfiguration;
+import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Transformation;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.SeekBar;
import com.android.camera.CameraActivity;
import com.android.camera.drawable.TextDrawable;
@@ -82,6 +93,7 @@ public class PieRenderer extends OverlayRenderer
private static final int MSG_OPEN = 0;
private static final int MSG_CLOSE = 1;
private static final int MSG_OPENSUBMENU = 2;
+ private static final int MSG_MOVED = 3;
protected static float CENTER = (float) Math.PI / 2;
protected static float RAD24 = (float)(24 * Math.PI / 180);
@@ -147,25 +159,35 @@ public class PieRenderer extends OverlayRenderer
private int mDeadZone;
private int mAngleZone;
private float mCenterAngle;
+ private boolean mIsBokehMode = false;
+ private TypedArray mBokehFocusResId;
+ private Bitmap mBokehFocusCircle;
+ private int mBokehFocusIndex = 0;
+
private ProgressRenderer mProgressRenderer;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.what) {
- case MSG_OPEN:
- if (mListener != null) {
- mListener.onPieOpened(mPieCenterX, mPieCenterY);
- }
- break;
- case MSG_CLOSE:
- if (mListener != null) {
- mListener.onPieClosed();
- }
- break;
- case MSG_OPENSUBMENU:
- onEnterOpen();
- break;
+ case MSG_OPEN:
+ if (mListener != null) {
+ mListener.onPieOpened(mPieCenterX, mPieCenterY);
+ }
+ break;
+ case MSG_CLOSE:
+ if (mListener != null) {
+ mListener.onPieClosed();
+ }
+ break;
+ case MSG_OPENSUBMENU:
+ onEnterOpen();
+ break;
+ case MSG_MOVED:
+ if (mListener != null) {
+ mListener.onPieMoved(mFocusX, mFocusY);
+ }
+ break;
}
}
@@ -176,6 +198,7 @@ public class PieRenderer extends OverlayRenderer
static public interface PieListener {
public void onPieOpened(int centerX, int centerY);
public void onPieClosed();
+ public void onPieMoved(int centerX,int centerY);
}
public void setPieListener(PieListener pl) {
@@ -248,6 +271,55 @@ public class PieRenderer extends OverlayRenderer
getRoot().addItem(item);
}
+ public void setBokehMode(boolean enable) {
+ mIsBokehMode = enable;
+ if (mIsBokehMode){
+ mBokehFocusResId = getContext().getResources().obtainTypedArray(
+ R.array.bokeh_shutter_icons);
+ int resid = mBokehFocusResId.getResourceId(mBokehFocusIndex,0);
+ mBokehFocusCircle = BitmapFactory.decodeResource(getContext().getResources(),resid);
+ } else {
+ if (mBokehFocusCircle != null)
+ mBokehFocusCircle.recycle();
+ }
+ mOverlay.update();
+ }
+
+ public void setBokehDegree(int degree) {
+ if (degree >=0 && degree <= 100) {
+ int index = (int)degree/15;
+ Log.d("ZJJ","index="+index);
+ if (mBokehFocusIndex == index)
+ return;
+ mBokehFocusIndex = index;
+ int resid = mBokehFocusResId.getResourceId(mBokehFocusIndex,0);
+ Log.d("ZJJ","resid = "+resid );
+ if (mBokehFocusCircle != null) {
+ mBokehFocusCircle.recycle();
+ }
+ mBokehFocusCircle = BitmapFactory.decodeResource(getContext().getResources(),resid);
+ mOverlay.update();
+ }
+ }
+
+ public Size getBokehFocusSize() {
+ if (mIsBokehMode && mBokehFocusCircle != null) {
+ return new Size(mBokehFocusCircle.getWidth(),mBokehFocusCircle.getHeight());
+ }
+ return new Size(0,0);
+ }
+
+ private void drawBokehFocus(Canvas canvas) {
+ if (mBokehFocusCircle != null) {
+ float x = mFocusX-mBokehFocusCircle.getWidth()/2;
+ float y = mFocusY-mBokehFocusCircle.getHeight()/2;
+ canvas.drawBitmap(
+ mBokehFocusCircle,x,y,new Paint());
+ }
+ mHandler.sendEmptyMessage(MSG_MOVED);
+ return;
+ }
+
public void clearItems() {
getRoot().clearItems();
}
@@ -307,7 +379,12 @@ public class PieRenderer extends OverlayRenderer
mLabel.setText("");
}
}
- setVisible(show);
+ if (mIsBokehMode) {
+ setVisible(true);
+ } else {
+ setVisible(show);
+ }
+
mHandler.sendEmptyMessage(show ? MSG_OPEN : MSG_CLOSE);
}
@@ -535,7 +612,6 @@ public class PieRenderer extends OverlayRenderer
@Override
public void onDraw(Canvas canvas) {
mProgressRenderer.onDraw(canvas, mFocusX, mFocusY);
-
float alpha = 1;
if (mXFade != null) {
alpha = (Float) mXFade.getAnimatedValue();
@@ -549,8 +625,12 @@ public class PieRenderer extends OverlayRenderer
float sf = 0.9f + alpha * 0.1f;
canvas.scale(sf, sf, mPieCenterX, mPieCenterY);
}
- if (mState != STATE_PIE) {
- drawFocus(canvas);
+ if (mIsBokehMode) {
+ drawBokehFocus(canvas);
+ } else {
+ if (mState != STATE_PIE) {
+ drawFocus(canvas);
+ }
}
if (mState == STATE_FINISHING) {
canvas.restoreToCount(state);
@@ -1109,7 +1189,7 @@ public class PieRenderer extends OverlayRenderer
private class Disappear implements Runnable {
@Override
public void run() {
- if (mState == STATE_PIE) return;
+ if (mState == STATE_PIE || mIsBokehMode) return;
setVisible(false);
mFocusX = mCenterX;
mFocusY = mCenterY;