Add menu labels

  Bug: 8618169

Change-Id: Iea1ac7256450afd2870c144099459f32868c699f
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index d0d575c..ede4156 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -247,8 +247,10 @@
         // show only integer values for exposure compensation
         int maxValue = Math.min(3, (int) FloatMath.floor(max * step));
         int minValue = Math.max(-3, (int) FloatMath.ceil(min * step));
+        String explabel = mContext.getResources().getString(R.string.pref_exposure_label);
         CharSequence entries[] = new CharSequence[maxValue - minValue + 1];
         CharSequence entryValues[] = new CharSequence[maxValue - minValue + 1];
+        CharSequence labels[] = new CharSequence[maxValue - minValue + 1];
         int[] icons = new int[maxValue - minValue + 1];
         TypedArray iconIds = mContext.getResources().obtainTypedArray(
                 R.array.pref_camera_exposure_icons);
@@ -257,10 +259,12 @@
             StringBuilder builder = new StringBuilder();
             if (i > 0) builder.append('+');
             entries[maxValue - i] = builder.append(i).toString();
+            labels[maxValue - i] = explabel + " " + builder.toString();
             icons[maxValue - i] = iconIds.getResourceId(3 + i, 0);
         }
         exposure.setUseSingleIcon(true);
         exposure.setEntries(entries);
+        exposure.setLabels(labels);
         exposure.setEntryValues(entryValues);
         exposure.setLargeIconIds(icons);
     }
diff --git a/src/com/android/camera/ListPreference.java b/src/com/android/camera/ListPreference.java
index a29b197..9ea2e34 100644
--- a/src/com/android/camera/ListPreference.java
+++ b/src/com/android/camera/ListPreference.java
@@ -40,6 +40,7 @@
 
     private CharSequence[] mEntries;
     private CharSequence[] mEntryValues;
+    private CharSequence[] mLabels;
     private boolean mLoaded = false;
 
     public ListPreference(Context context, AttributeSet attrs) {
@@ -68,6 +69,8 @@
         setEntries(a.getTextArray(R.styleable.ListPreference_entries));
         setEntryValues(a.getTextArray(
                 R.styleable.ListPreference_entryValues));
+        setLabels(a.getTextArray(
+                R.styleable.ListPreference_labels));
         a.recycle();
     }
 
@@ -83,6 +86,10 @@
         return mEntryValues;
     }
 
+    public CharSequence[] getLabels() {
+        return mLabels;
+    }
+
     public void setEntries(CharSequence entries[]) {
         mEntries = entries == null ? new CharSequence[0] : entries;
     }
@@ -91,6 +98,10 @@
         mEntryValues = values == null ? new CharSequence[0] : values;
     }
 
+    public void setLabels(CharSequence labels[]) {
+        mLabels = labels == null ? new CharSequence[0] : labels;
+    }
+
     public String getValue() {
         if (!mLoaded) {
             mValue = getSharedPreferences().getString(mKey,
@@ -135,6 +146,10 @@
         return mEntries[findIndexOfValue(getValue())].toString();
     }
 
+    public String getLabel() {
+        return mLabels[findIndexOfValue(getValue())].toString();
+    }
+
     protected void persistStringValue(String value) {
         SharedPreferences.Editor editor = getSharedPreferences().edit();
         editor.putString(mKey, value);
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index f5ba733..09c96b2 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -17,6 +17,7 @@
 package com.android.camera;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.hardware.Camera.Parameters;
 import android.view.LayoutInflater;
 
@@ -65,20 +66,26 @@
         mPopup = null;
         mSecondPopup = null;
         PieItem item = null;
+        final Resources res = mActivity.getResources();
         // flash
         if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) {
             item = makeItem(CameraSettings.KEY_FLASH_MODE, POS_FLASH, 5);
+            item.setLabel(res.getString(R.string.pref_camera_flashmode_label));
             mRenderer.addItem(item);
         }
         // exposure compensation
         if (group.findPreference(CameraSettings.KEY_EXPOSURE) != null) {
             item = makeItem(CameraSettings.KEY_EXPOSURE, POS_EXP, 5);
+            item.setLabel(res.getString(R.string.pref_exposure_label));
             mRenderer.addItem(item);
         }
         // camera switcher
         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
             item = makeItem(R.drawable.ic_switch_photo_facing_holo_light);
+            ListPreference lpref = group.findPreference(CameraSettings.KEY_CAMERA_ID);
             item.setPosition(POS_SWITCH, 5);
+            item.setLabel(lpref.getLabel());
+            final PieItem fitem = item;
             item.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(PieItem item) {
@@ -91,6 +98,7 @@
                         index = (index + 1) % values.length;
                         int newCameraId = Integer
                                 .parseInt((String) values[index]);
+                        fitem.setLabel(camPref.getLabel());
                         mListener.onCameraPickerClicked(newCameraId);
                     }
                 }
@@ -99,8 +107,11 @@
         }
         // hdr
         if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) {
+            ListPreference lp = group.findPreference(CameraSettings.KEY_CAMERA_HDR);
             item = makeItem(R.drawable.ic_hdr);
+            item.setLabel(lp.getLabel());
             item.setPosition(POS_HDR, 5);
+            final PieItem fitem = item;
             item.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(PieItem item) {
@@ -112,6 +123,7 @@
                         int index = (pref.findIndexOfValue(pref.getValue()) + 1) % 2;
                         pref.setValueIndex(index);
                         onSettingChanged(pref);
+                        fitem.setLabel(pref.getLabel());
                     }
                 }
             });
@@ -121,10 +133,12 @@
         // more settings
         PieItem more = makeItem(R.drawable.ic_settings_holo_light);
         more.setPosition(POS_MORE, 5);
+        more.setLabel(res.getString(R.string.camera_menu_more_label));
         mRenderer.addItem(more);
         // white balance
         if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) {
             item = makeItem(CameraSettings.KEY_WHITE_BALANCE, POS_WB, 5);
+            item.setLabel(res.getString(R.string.pref_camera_whitebalance_label));
             more.addItem(item);
         }
         // settings popup
@@ -137,6 +151,7 @@
                 CameraSettings.KEY_TIMER_SOUND_EFFECTS,
                 };
         item = makeItem(R.drawable.ic_settings_holo_light);
+        item.setLabel(res.getString(R.string.camera_menu_settings_label));
         item.setPosition(POS_SET, 5);
         item.setOnClickListener(new OnClickListener() {
             @Override
diff --git a/src/com/android/camera/PieController.java b/src/com/android/camera/PieController.java
index a9b8575..5ccab5e 100644
--- a/src/com/android/camera/PieController.java
+++ b/src/com/android/camera/PieController.java
@@ -104,6 +104,7 @@
         }
         PieItem item = makeItem(resid);
         item.setPosition(position, count);
+        item.setLabel(pref.getTitle().toUpperCase());
         mPreferences.add(pref);
         mPreferenceMap.put(pref, item);
         int nOfEntries = pref.getEntries().length;
@@ -116,6 +117,7 @@
                     inner = makeItem(pref.getEntries()[i]);
                 }
                 inner.setPosition(i, nOfEntries);
+                inner.setLabel(pref.getLabels()[i]);
                 item.addItem(inner);
                 final int index = i;
                 inner.setOnClickListener(new OnClickListener() {
diff --git a/src/com/android/camera/drawable/TextDrawable.java b/src/com/android/camera/drawable/TextDrawable.java
index 2e86364..ac5f1ce 100644
--- a/src/com/android/camera/drawable/TextDrawable.java
+++ b/src/com/android/camera/drawable/TextDrawable.java
@@ -37,6 +37,10 @@
     private int mIntrinsicWidth;
     private int mIntrinsicHeight;
 
+    public TextDrawable(Resources res) {
+        this(res, "");
+    }
+
     public TextDrawable(Resources res, CharSequence text) {
         mText = text;
         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -49,11 +53,24 @@
         mIntrinsicHeight = mPaint.getFontMetricsInt(null);
     }
 
+    public void setText(CharSequence txt) {
+        mText = txt;
+        if (txt == null) {
+            mIntrinsicWidth = 0;
+            mIntrinsicHeight = 0;
+        } else {
+            mIntrinsicWidth = (int) (mPaint.measureText(mText, 0, mText.length()) + .5);
+            mIntrinsicHeight = mPaint.getFontMetricsInt(null);
+        }
+    }
+
     @Override
     public void draw(Canvas canvas) {
-        Rect bounds = getBounds();
-        canvas.drawText(mText, 0, mText.length(),
-                bounds.centerX(), bounds.centerY(), mPaint);
+        if (mText != null) {
+            Rect bounds = getBounds();
+            canvas.drawText(mText, 0, mText.length(),
+                    bounds.centerX(), bounds.centerY(), mPaint);
+        }
     }
 
     @Override
diff --git a/src/com/android/camera/ui/PieItem.java b/src/com/android/camera/ui/PieItem.java
index 6128e04..6dbcb85 100644
--- a/src/com/android/camera/ui/PieItem.java
+++ b/src/com/android/camera/ui/PieItem.java
@@ -44,6 +44,7 @@
     private Path mPath;
     private OnClickListener mOnClickListener;
     private float mAlpha;
+    private CharSequence mLabel;
 
     // Gray out the view when disabled
     private static final float ENABLED_ALPHA = 1;
@@ -59,6 +60,14 @@
         mEnabled = true;
     }
 
+    public void setLabel(CharSequence txt) {
+        mLabel = txt;
+    }
+
+    public CharSequence getLabel() {
+        return mLabel;
+    }
+
     public void setPosition(int pos, int count) {
         mPosition = pos;
         mCount = count;
diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java
index 0969e4e..4374fa6 100644
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -27,7 +27,6 @@
 import android.graphics.RectF;
 import android.os.Handler;
 import android.os.Message;
-import android.util.Log;
 import android.view.MotionEvent;
 import android.view.ViewConfiguration;
 import android.view.animation.Animation;
@@ -35,6 +34,7 @@
 import android.view.animation.LinearInterpolator;
 import android.view.animation.Transformation;
 
+import com.android.camera.drawable.TextDrawable;
 import com.android.gallery3d.R;
 
 import java.util.ArrayList;
@@ -133,6 +133,7 @@
     private FadeOutAnimation mFadeOut;
     private volatile boolean mFocusCancelled;
     private PointF mPolar = new PointF();
+    private TextDrawable mLabel;
 
 
 
@@ -213,6 +214,7 @@
         mSliceRadius = res.getDimensionPixelSize(R.dimen.pie_item_radius);
         mArcRadius = res.getDimensionPixelSize(R.dimen.pie_arc_radius);
         mArcOffset = res.getDimensionPixelSize(R.dimen.pie_arc_offset);
+        mLabel = new TextDrawable(res);
     }
 
     private PieItem getRoot() {
@@ -269,6 +271,7 @@
                     }
                 }
             }
+            mLabel.setText("");
             mOpen.clear();
             mOpen.add(root);
             layoutPie();
@@ -335,6 +338,15 @@
 
     private void layoutPie() {
         layoutItems(0, getRoot().getItems());
+        layoutLabel(0);
+    }
+
+    private void layoutLabel(int level) {
+        int x = mPieCenterX;
+        int y = mArcCenterY - mArcRadius - (level + 2) * mRadiusInc;
+        int w = mLabel.getIntrinsicWidth();
+        int h = mLabel.getIntrinsicHeight();
+        mLabel.setBounds(x - w/2, y - h/2, x + w/2, y + h/2);
     }
 
     private void layoutItems(int level, List<PieItem> items) {
@@ -480,6 +492,7 @@
             for (PieItem item : getParent().getItems()) {
                 drawItem(Math.max(0, mOpen.size() - 2), canvas, item, alpha);
             }
+            mLabel.draw(canvas);
         }
         if (hasOpenItem()) {
             int level = getLevel();
@@ -491,6 +504,7 @@
                     drawItem(level, canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1);
                 }
             }
+            mLabel.draw(canvas);
         }
         canvas.restoreToCount(state);
     }
@@ -606,6 +620,7 @@
                 } else {
                     deselect();
                 }
+                mLabel.setText("");
                 return false;
             }
             PieItem item = findItem(mPolar);
@@ -665,6 +680,8 @@
         if (item != null && item.isEnabled()) {
             item.setSelected(true);
             mCurrentItem = item;
+            mLabel.setText(mCurrentItem.getLabel());
+            layoutLabel(getLevel());
         } else {
             mCurrentItem = null;
         }
@@ -690,6 +707,7 @@
             mCurrentItem = item;
             if ((mCurrentItem != getOpenItem()) && mCurrentItem.hasItems()) {
                 openCurrentItem();
+                layoutLabel(getLevel());
             }
         } else {
             mCurrentItem = null;
@@ -728,6 +746,7 @@
                     mXFade = null;
                     ci.setSelected(false);
                     mOpening = false;
+                    mLabel.setText("");
                 }
 
                 @Override