diff options
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/camera/CameraSettings.java | 2 | ||||
-rw-r--r-- | src/com/android/camera/PhotoUI.java | 31 | ||||
-rw-r--r-- | src/com/android/camera/ui/Arrows.java | 91 | ||||
-rw-r--r-- | src/com/android/camera/ui/MenuHelp.java | 377 |
4 files changed, 500 insertions, 1 deletions
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index 2f9764aec..407f879cf 100644 --- a/src/com/android/camera/CameraSettings.java +++ b/src/com/android/camera/CameraSettings.java @@ -245,6 +245,8 @@ public class CameraSettings { public static final String KEY_REFOCUS_PROMPT = "refocus-prompt"; + public static final String KEY_SHOW_MENU_HELP = "help_menu"; + public static final String KEY_SELFIE_FLASH = "pref_selfie_flash_key"; public static final String EXPOSURE_DEFAULT_VALUE = "0"; diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index f8f30ac0d..e7ab1ff9d 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -69,6 +69,7 @@ import com.android.camera.ui.FaceView; import com.android.camera.ui.FocusIndicator; import com.android.camera.ui.ListSubMenu; import com.android.camera.ui.ModuleSwitcher; +import com.android.camera.ui.MenuHelp; import com.android.camera.ui.PieRenderer; import com.android.camera.ui.PieRenderer.PieListener; import com.android.camera.ui.RenderOverlay; @@ -114,6 +115,7 @@ public class PhotoUI implements PieListener, private PhotoMenu mMenu; private ModuleSwitcher mSwitcher; private CameraControls mCameraControls; + private MenuHelp mMenuHelp; private AlertDialog mLocationDialog; // Small indicators which show the camera settings in the viewfinder. @@ -322,6 +324,7 @@ public class PhotoUI implements PieListener, mScreenRatio = CameraUtil.determineRatio(size.x, size.y); calculateMargins(size); mCameraControls.setMargins(mTopMargin, mBottomMargin); + showFirstTimeHelp(); } private void calculateMargins(Point size) { @@ -341,6 +344,19 @@ public class PhotoUI implements PieListener, mOrientationResize = orientation; } + private void showFirstTimeHelp(int topMargin, int bottomMargin) { + mMenuHelp = (MenuHelp) mRootView.findViewById(R.id.menu_help); + mMenuHelp.setVisibility(View.VISIBLE); + mMenuHelp.setMargins(topMargin, bottomMargin); + mMenuHelp.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mMenuHelp.setVisibility(View.GONE); + mMenuHelp = null; + } + }); + } + public void setAspectRatio(float ratio) { if (ratio <= 0.0) throw new IllegalArgumentException(); @@ -568,7 +584,7 @@ public class PhotoUI implements PieListener, mMenuButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - if(mMenu != null){ + if (mMenu != null) { mMenu.openFirstLevel(); } } @@ -1335,6 +1351,8 @@ public class PhotoUI implements PieListener, public void setOrientation(int orientation, boolean animation) { mOrientation = orientation; mCameraControls.setOrientation(orientation, animation); + if (mMenuHelp != null) + mMenuHelp.setOrientation(orientation, animation); if (mMenuLayout != null) mMenuLayout.setOrientation(orientation, animation); if (mSubMenuLayout != null) @@ -1390,6 +1408,17 @@ public class PhotoUI implements PieListener, setOrientation(mOrientation, true); } + public void showFirstTimeHelp() { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity); + boolean isMenuShown = prefs.getBoolean(CameraSettings.KEY_SHOW_MENU_HELP, false); + if(!isMenuShown) { + showFirstTimeHelp(mTopMargin, mBottomMargin); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean(CameraSettings.KEY_SHOW_MENU_HELP, true); + editor.apply(); + } + } + public void showRefocusDialog() { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity); int prompt = prefs.getInt(CameraSettings.KEY_REFOCUS_PROMPT, 1); diff --git a/src/com/android/camera/ui/Arrows.java b/src/com/android/camera/ui/Arrows.java new file mode 100644 index 000000000..4923eb10e --- /dev/null +++ b/src/com/android/camera/ui/Arrows.java @@ -0,0 +1,91 @@ +/* +Copyright (c) 2016, The Linux Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of The Linux Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package com.android.camera.ui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.util.AttributeSet; +import android.view.View; + +import java.util.ArrayList; + +public class Arrows extends View { + private static final int ARROW_COLOR = Color.WHITE; + private static final double ARROW_END_DEGREE = 15d; + private static final int ARROW_END_LENGTH = 50; + + private Paint mPaint; + private ArrayList<Path> mPaths; + + public Arrows(Context context, AttributeSet attrs) { + super(context, attrs); + mPaths = new ArrayList<Path>(); + mPaint = new Paint(); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(ARROW_COLOR); + mPaint.setStrokeWidth(2f); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mPaths != null) { + for(int i=0; i < mPaths.size(); i++) { + canvas.drawPath(mPaths.get(i), mPaint); + } + } + } + + public void addPath(float[] x, float[] y) { + Path path = new Path(); + path.reset(); + path.moveTo(x[0], y[0]); + for(int i=1; i < x.length; i++) { + if(i == x.length-1) { + path.lineTo(x[i], y[i]); + + double setha = Math.toDegrees(Math.atan2(y[i] - y[i - 1], x[i] - x[i - 1])); + setha = (setha + ARROW_END_DEGREE + 360) % 360; + path.lineTo(x[i]-(float)(ARROW_END_LENGTH*Math.cos(Math.toRadians(setha))), + y[i]-(float)(ARROW_END_LENGTH*Math.sin(Math.toRadians(setha)))); + path.lineTo(x[i], y[i]); + setha = (setha - ARROW_END_DEGREE*2 + 360) % 360; + path.lineTo(x[i]-(float)(ARROW_END_LENGTH*Math.cos(Math.toRadians(setha))), + y[i]-(float)(ARROW_END_LENGTH*Math.sin(Math.toRadians(setha)))); + } + else + path.quadTo(x[i],y[i], x[i+1], y[i+1]); + } + mPaths.add(path); + invalidate(); + } +} diff --git a/src/com/android/camera/ui/MenuHelp.java b/src/com/android/camera/ui/MenuHelp.java new file mode 100644 index 000000000..d753a2680 --- /dev/null +++ b/src/com/android/camera/ui/MenuHelp.java @@ -0,0 +1,377 @@ +/* +Copyright (c) 2016, The Linux Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of The Linux Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package com.android.camera.ui; + +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Typeface; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Paint; +import android.graphics.Path; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewPropertyAnimator; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TableLayout; +import android.widget.TextView; +import java.util.ArrayList; + +import org.codeaurora.snapcam.R; +import com.android.camera.ui.ModuleSwitcher; +import com.android.camera.ui.RotateImageView; +import com.android.camera.ShutterButton; +import com.android.camera.Storage; +import com.android.camera.util.CameraUtil; +import com.android.camera.TsMakeupManager; + +public class MenuHelp extends RotatableLayout { + + private static final String TAG = "MenuHelp"; + private View mBackgroundView; + private Arrows mArrows; + private static int mTopMargin = 0; + private static int mBottomMargin = 0; + private static final int HELP_0_0_INDEX = 0; + private static final int HELP_1_0_INDEX = 1; + private static final int HELP_3_0_INDEX = 2; + private static final int HELP_4_6_INDEX = 3; + private static final int OK_2_4_INDEX = 4; + private static final int MAX_INDEX = 5; + private float[][] mLocX = new float[4][MAX_INDEX]; + private float[][] mLocY = new float[4][MAX_INDEX]; + private RotateLayout mHelp0_0; + private RotateLayout mHelp1_0; + private RotateLayout mHelp3_0; + private RotateLayout mHelp4_6; + private RotateLayout mOk2_4; + private Context mContext; + private int mOrientation; + private final static int POINT_MARGIN = 50; + private static final int WIDTH_GRID = 5; + private static final int HEIGHT_GRID = 7; + private Typeface mTypeface; + + public MenuHelp(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + mTypeface = Typeface.create(Typeface.SERIF, Typeface.NORMAL); + } + + public MenuHelp(Context context) { + this(context, null); + } + + public void setMargins(int top, int bottom) { + mTopMargin = top; + mBottomMargin = bottom; + } + + @Override + public void onLayout(boolean changed, int l, int t, int r, int b) { + r = r - l; + b = b - t; + l = 0; + t = 0; + for (int i = 0; i < getChildCount(); i++) { + View v = getChildAt(i); + v.layout(l, t, r, b); + } + setLocation(r - l, b - t); + } + + private void setLocation(int w, int h) { + int rotation = getUnifiedRotation(); + toIndex(mHelp0_0, w, h, rotation, 1, 3, HELP_0_0_INDEX); + toIndex(mHelp1_0, w, h, rotation, 2, 2, HELP_1_0_INDEX); + if(TsMakeupManager.HAS_TS_MAKEUP) + toIndex(mHelp3_0, w, h, rotation, 3, 1, HELP_3_0_INDEX); + toIndex(mHelp4_6, w, h, rotation, 3, 4, HELP_4_6_INDEX); + toIndex(mOk2_4, w, h, rotation, 1, 5, OK_2_4_INDEX); + fillArrows(w, h, rotation); + } + + private void fillArrows(int w, int h, int rotation) { + View v1 = new View(mContext); + View v2 = new View(mContext); + View v3 = new View(mContext); + { + toIndex(v1, w, h, rotation, 1, 3, -1); + toIndex(v2, w, h, rotation, 0, 1, -1); + toIndex(v3, w, h, rotation, 0, 0, -1); + float[] x = {v1.getX()-POINT_MARGIN, v2.getX(), v3.getX()}; + float[] y = {v1.getY()-POINT_MARGIN, v2.getY(), v3.getY()+POINT_MARGIN}; + mArrows.addPath(x, y); + } + + { + toIndex(v1, w, h, rotation, 2, 2, -1); + toIndex(v2, w, h, rotation, 1, 1, -1); + toIndex(v3, w, h, rotation, 1, 0, -1); + float[] x = {v1.getX()-POINT_MARGIN, v2.getX(), v3.getX()}; + float[] y = {v1.getY()-POINT_MARGIN, v2.getY(), v3.getY()+POINT_MARGIN}; + mArrows.addPath(x, y); + } + + if(TsMakeupManager.HAS_TS_MAKEUP) { + toIndex(v1, w, h, rotation, 3, 1, -1); + toIndex(v2, w, h, rotation, 3, 0, -1); + float[] x = {v1.getX(), v2.getX()}; + float[] y = {v1.getY()-POINT_MARGIN*2, v2.getY()+POINT_MARGIN}; + mArrows.addPath(x, y); + } + + { + toIndex(v1, w, h, rotation, 3, 4, -1); + toIndex(v2, w, h, rotation, 3, 5, -1); + toIndex(v3, w, h, rotation, 4, 6, -1); + float[] x = {v1.getX(), v2.getX(), v3.getX()}; + float[] y = {v1.getY()+POINT_MARGIN, v2.getY(), v3.getY()-POINT_MARGIN}; + mArrows.addPath(x, y); + } + } + + private void toIndex(View v, int w, int h, int rotation, int index, int index2, int index3) { + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) v.getLayoutParams(); + int tw = v.getMeasuredWidth(); + int th = v.getMeasuredHeight(); + int l = 0, r = 0, t = 0, b = 0; + + int wnumber = WIDTH_GRID; + int hnumber = HEIGHT_GRID; + int windex = 0; + int hindex = 0; + switch (rotation) { + case 0: + // portrait, to left of anchor at bottom + wnumber = WIDTH_GRID; + hnumber = HEIGHT_GRID; + windex = index; + hindex = index2; + break; + case 90: + // phone landscape: below anchor on right + wnumber = HEIGHT_GRID; + hnumber = WIDTH_GRID; + windex = index2; + hindex = hnumber - index - 1; + break; + case 180: + // phone upside down: right of anchor at top + wnumber = WIDTH_GRID; + hnumber = HEIGHT_GRID; + windex = wnumber - index - 1; + hindex = hnumber - index2 - 1; + break; + case 270: + // reverse landscape: above anchor on left + wnumber = HEIGHT_GRID; + hnumber = WIDTH_GRID; + windex = wnumber - index2 - 1; + hindex = index; + break; + } + int boxh = h / hnumber; + int boxw = w / wnumber; + int cx = (2 * windex + 1) * boxw / 2; + int cy = (2 * hindex + 1) * boxh / 2; + + if (index2 == 0 && mTopMargin != 0) { + switch (rotation) { + case 90: + cx = mTopMargin / 2; + break; + case 180: + cy = h - mTopMargin / 2; + break; + case 270: + cx = w - mTopMargin / 2; + break; + default: + cy = mTopMargin / 2; + break; + } + } + + l = cx - tw / 2; + r = cx + tw / 2; + t = cy - th / 2; + b = cy + th / 2; + + if (index3 != -1) { + int idx1 = rotation / 90; + int idx2 = index3; + mLocX[idx1][idx2] = l; + mLocY[idx1][idx2] = t; + } + v.layout(l, t, r, b); + } + + public void setOrientation(int orientation, boolean animation) { + mOrientation = orientation; + RotateLayout[] layouts = { + mHelp0_0, mHelp1_0, mHelp3_0, mHelp4_6, mOk2_4 + }; + for (RotateLayout l : layouts) { + l.setOrientation(orientation, animation); + } + } + + @Override + public void onFinishInflate() { + super.onFinishInflate(); + mBackgroundView = findViewById(R.id.background); + mBackgroundView.setBackgroundColor(Color.argb(200, 0, 0, 0)); + mHelp0_0 = (RotateLayout)findViewById(R.id.help_text_0_0); + fillHelp0_0(); + mHelp1_0 = (RotateLayout)findViewById(R.id.help_text_1_0); + fillHelp1_0(); + mHelp3_0 = (RotateLayout) findViewById(R.id.help_text_3_0); + fillHelp3_0(); + mHelp4_6 = (RotateLayout)findViewById(R.id.help_text_4_6); + fillHelp4_6(); + mOk2_4 = (RotateLayout)findViewById(R.id.help_ok_2_4); + fillOk2_4(); + mArrows = (Arrows)findViewById(R.id.arrows); + } + + private void fillOk2_4() { + LinearLayout linearLayout = new LinearLayout(mContext); + mOk2_4.addView(linearLayout); + linearLayout.setGravity(Gravity.CENTER); + linearLayout.setPadding(40, 20, 40, 20); + linearLayout.setBackgroundColor(Color.WHITE); + TextView text1 = new TextView(mContext); + text1.setText("OK"); + text1.setTextColor(Color.BLACK); + text1.setTypeface(mTypeface); + linearLayout.addView(text1); + } + + private void fillHelp0_0() { + TableLayout tableLayout = new TableLayout(mContext); + mHelp0_0.addView(tableLayout); + LinearLayout linearLayout = new LinearLayout(mContext); + TextView text1 = new TextView(mContext); + text1.setTextColor(Color.WHITE); + text1.setText("Select a "); + text1.setTypeface(mTypeface); + linearLayout.addView(text1); + TextView text2 = new TextView(mContext); + text2.setText("Scene Mode"); + text2.setTypeface(mTypeface); + linearLayout.addView(text2); + text2.setTextColor(Color.GREEN); + tableLayout.addView(linearLayout); + TextView text3 = new TextView(mContext); + text3.setText("for better pictures"); + text3.setTextColor(Color.WHITE); + text3.setTypeface(mTypeface); + tableLayout.addView(text3); + } + + private void fillHelp1_0() { + TableLayout tableLayout = new TableLayout(mContext); + mHelp1_0.addView(tableLayout); + LinearLayout linearLayout = new LinearLayout(mContext); + TextView text1 = new TextView(mContext); + text1.setText("Apply color "); + text1.setTextColor(Color.WHITE); + text1.setTypeface(mTypeface); + linearLayout.addView(text1); + TextView text2 = new TextView(mContext); + text2.setText("filters"); + text2.setTextColor(Color.GREEN); + text2.setTypeface(mTypeface); + linearLayout.addView(text2); + TextView text3 = new TextView(mContext); + text3.setText(" to "); + text3.setTextColor(Color.WHITE); + text3.setTypeface(mTypeface); + linearLayout.addView(text3); + tableLayout.addView(linearLayout); + TextView text4 = new TextView(mContext); + text4.setText("improve pictures"); + text4.setTextColor(Color.WHITE); + text4.setTypeface(mTypeface); + tableLayout.addView(text4); + } + + private void fillHelp3_0() { + TableLayout tableLayout = new TableLayout(mContext); + mHelp3_0.addView(tableLayout); + if(TsMakeupManager.HAS_TS_MAKEUP) { + TextView text1 = new TextView(mContext); + text1.setText("Enhance portraits"); + text1.setTextColor(Color.WHITE); + text1.setTypeface(mTypeface); + tableLayout.addView(text1); + TextView text2 = new TextView(mContext); + text2.setText("with the"); + text2.setTextColor(Color.WHITE); + text2.setTypeface(mTypeface); + tableLayout.addView(text2); + TextView text3 = new TextView(mContext); + text3.setText("Beautify feature"); + text3.setTextColor(Color.GREEN); + text3.setTypeface(mTypeface); + tableLayout.addView(text3); + } + } + + private void fillHelp4_6() { + TableLayout tableLayout = new TableLayout(mContext); + mHelp4_6.addView(tableLayout); + LinearLayout linearLayout = new LinearLayout(mContext); + TextView text1 = new TextView(mContext); + text1.setText("Switch"); + text1.setTextColor(Color.GREEN); + text1.setTypeface(mTypeface); + linearLayout.addView(text1); + TextView text2 = new TextView(mContext); + text2.setText(" between "); + text2.setTextColor(Color.WHITE); + text2.setTypeface(mTypeface); + linearLayout.addView(text2); + tableLayout.addView(linearLayout); + TextView text3 = new TextView(mContext); + text3.setText("camera, video, and panorama"); + text3.setTextColor(Color.WHITE); + text3.setTypeface(mTypeface); + tableLayout.addView(text3); + } +} |