OSDN Git Service

Remove empty slots from menu
authorMichael Kolb <kolby@google.com>
Tue, 30 Apr 2013 16:23:23 +0000 (09:23 -0700)
committerMichael Kolb <kolby@google.com>
Tue, 30 Apr 2013 16:23:23 +0000 (09:23 -0700)
  Bug: 8640131

When a specific camera doesn't support one of the menu options,
the option is removed from the menu, no empty spot anymore.

Change-Id: I002d6347c35cb0bfd5f71d880294f04f45ffb38f

src/com/android/camera/PhotoMenu.java
src/com/android/camera/PieController.java
src/com/android/camera/VideoMenu.java
src/com/android/camera/ui/PieItem.java
src/com/android/camera/ui/PieRenderer.java

index 31fe670..f29ed4a 100644 (file)
@@ -36,16 +36,6 @@ public class PhotoMenu extends PieController
         ListPrefSettingPopup.Listener {
     private static String TAG = "CAM_photomenu";
 
-    private static final int POS_HDR = 0;
-    private static final int POS_EXP = 1;
-    private static final int POS_MORE = 2;
-    private static final int POS_FLASH = 3;
-    private static final int POS_SWITCH = 4;
-    private static final int POS_LOCATION = 1;
-    private static final int POS_WB = 3;
-    private static final int POS_SET = 2;
-    private static final int POS_SCENE = 4;
-
     private final String mSettingOff;
 
     private PhotoUI mUI;
@@ -69,21 +59,32 @@ public class PhotoMenu extends PieController
         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));
+        // the order is from left to right in the menu
+
+        // hdr
+        if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) {
+            item = makeSwitchItem(CameraSettings.KEY_CAMERA_HDR, true);
             mRenderer.addItem(item);
         }
         // exposure compensation
         if (group.findPreference(CameraSettings.KEY_EXPOSURE) != null) {
-            item = makeItem(CameraSettings.KEY_EXPOSURE, POS_EXP, 5);
+            item = makeItem(CameraSettings.KEY_EXPOSURE);
             item.setLabel(res.getString(R.string.pref_exposure_label));
             mRenderer.addItem(item);
         }
+        // more settings
+        PieItem more = makeItem(R.drawable.ic_settings_holo_light);
+        more.setLabel(res.getString(R.string.camera_menu_more_label));
+        mRenderer.addItem(more);
+        // flash
+        if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) {
+            item = makeItem(CameraSettings.KEY_FLASH_MODE);
+            item.setLabel(res.getString(R.string.pref_camera_flashmode_label));
+            mRenderer.addItem(item);
+        }
         // camera switcher
         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
-            item = makeSwitchItem(CameraSettings.KEY_CAMERA_ID, POS_SWITCH, 5, false);
+            item = makeSwitchItem(CameraSettings.KEY_CAMERA_ID, false);
             final PieItem fitem = item;
             item.setOnClickListener(new OnClickListener() {
                 @Override
@@ -103,33 +104,9 @@ public class PhotoMenu extends PieController
             });
             mRenderer.addItem(item);
         }
-        // hdr
-        if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) {
-            item = makeSwitchItem(CameraSettings.KEY_CAMERA_HDR, POS_HDR, 5, true);
-            mRenderer.addItem(item);
-        }
-        // 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);
-        }
         // location
         if (group.findPreference(CameraSettings.KEY_RECORD_LOCATION) != null) {
-            item = makeSwitchItem(CameraSettings.KEY_RECORD_LOCATION, POS_LOCATION, 5, true);
-            more.addItem(item);
-        }
-        // scene mode
-        if (group.findPreference(CameraSettings.KEY_SCENE_MODE) != null) {
-            IconListPreference pref = (IconListPreference) group.findPreference(
-                    CameraSettings.KEY_SCENE_MODE);
-            pref.setUseSingleIcon(true);
-            item = makeItem(CameraSettings.KEY_SCENE_MODE, POS_SCENE, 5);
+            item = makeSwitchItem(CameraSettings.KEY_RECORD_LOCATION, true);
             more.addItem(item);
         }
         // settings popup
@@ -141,7 +118,6 @@ public class PhotoMenu extends PieController
                 };
         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
             public void onClick(PieItem item) {
@@ -152,6 +128,20 @@ public class PhotoMenu extends PieController
             }
         });
         more.addItem(item);
+        // white balance
+        if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) {
+            item = makeItem(CameraSettings.KEY_WHITE_BALANCE);
+            item.setLabel(res.getString(R.string.pref_camera_whitebalance_label));
+            more.addItem(item);
+        }
+        // scene mode
+        if (group.findPreference(CameraSettings.KEY_SCENE_MODE) != null) {
+            IconListPreference pref = (IconListPreference) group.findPreference(
+                    CameraSettings.KEY_SCENE_MODE);
+            pref.setUseSingleIcon(true);
+            item = makeItem(CameraSettings.KEY_SCENE_MODE);
+            more.addItem(item);
+        }
     }
 
     @Override
index d2d9c7f..3cbcb4b 100644 (file)
@@ -89,7 +89,7 @@ public class PieController {
         return new PieItem(drawable, 0);
     }
 
-    public PieItem makeItem(String prefKey, int position, int count) {
+    public PieItem makeItem(String prefKey) {
         final IconListPreference pref =
                 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
         if (pref == null) return null;
@@ -104,7 +104,6 @@ public class PieController {
             resid = pref.getSingleIcon();
         }
         PieItem item = makeItem(resid);
-        item.setPosition(position, count);
         item.setLabel(pref.getTitle().toUpperCase());
         mPreferences.add(pref);
         mPreferenceMap.put(pref, item);
@@ -117,7 +116,6 @@ public class PieController {
                 } else {
                     inner = makeItem(pref.getEntries()[i]);
                 }
-                inner.setPosition(i, nOfEntries);
                 inner.setLabel(pref.getLabels()[i]);
                 item.addItem(inner);
                 final int index = i;
@@ -134,8 +132,7 @@ public class PieController {
         return item;
     }
 
-    public PieItem makeSwitchItem(final String prefKey, int position, int count,
-            boolean addListener) {
+    public PieItem makeSwitchItem(final String prefKey, boolean addListener) {
         final IconListPreference pref =
                 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
         if (pref == null) return null;
@@ -150,7 +147,6 @@ public class PieController {
             resid = pref.getSingleIcon();
         }
         PieItem item = makeItem(resid);
-        item.setPosition(position, count);
         item.setLabel(pref.getLabels()[index]);
         item.setImageResource(mActivity, resid);
         mPreferences.add(pref);
@@ -183,8 +179,8 @@ public class PieController {
         return item;
     }
 
-    public void addItem(String prefKey, int position, int count) {
-        PieItem item = makeItem(prefKey, position, count);
+    public void addItem(String prefKey) {
+        PieItem item = makeItem(prefKey);
         mRenderer.addItem(item);
     }
 
index fee7665..9bfcdea 100644 (file)
@@ -34,10 +34,6 @@ public class VideoMenu extends PieController
         TimeIntervalPopup.Listener {
 
     private static String TAG = "CAM_VideoMenu";
-    private static final int POS_WB = 0;
-    private static final int POS_SET = 1;
-    private static final int POS_FLASH = 3;
-    private static final int POS_SWITCH = 2;
 
     private VideoUI mUI;
     private String[] mOtherKeys;
@@ -60,20 +56,34 @@ public class VideoMenu extends PieController
         mPopup = null;
         mPopupStatus = POPUP_NONE;
         PieItem item = null;
-        // flash
-        if (group.findPreference(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE) != null) {
-            item = makeItem(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE, POS_FLASH, 4);
-            mRenderer.addItem(item);
-        }
         // white balance
         if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) {
-            item = makeItem(CameraSettings.KEY_WHITE_BALANCE, POS_WB, 4);
+            item = makeItem(CameraSettings.KEY_WHITE_BALANCE);
             mRenderer.addItem(item);
         }
+        // settings popup
+        mOtherKeys = new String[] {
+                CameraSettings.KEY_VIDEO_EFFECT,
+                CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL,
+                CameraSettings.KEY_VIDEO_QUALITY,
+                CameraSettings.KEY_RECORD_LOCATION
+        };
+        item = makeItem(R.drawable.ic_settings_holo_light);
+        item.setLabel(mActivity.getResources().getString(R.string.camera_menu_settings_label));
+        item.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(PieItem item) {
+                if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) {
+                    initializePopup();
+                    mPopupStatus = POPUP_FIRST_LEVEL;
+                }
+                mUI.showPopup(mPopup);
+            }
+        });
+        mRenderer.addItem(item);
         // camera switcher
         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
             item = makeItem(R.drawable.ic_switch_back);
-            item.setPosition(POS_SWITCH, 4);
             IconListPreference lpref = (IconListPreference) group.findPreference(
                     CameraSettings.KEY_CAMERA_ID);
             item.setLabel(lpref.getLabel());
@@ -103,27 +113,11 @@ public class VideoMenu extends PieController
             });
             mRenderer.addItem(item);
         }
-        // settings popup
-        mOtherKeys = new String[] {
-                CameraSettings.KEY_VIDEO_EFFECT,
-                CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL,
-                CameraSettings.KEY_VIDEO_QUALITY,
-                CameraSettings.KEY_RECORD_LOCATION
-        };
-        item = makeItem(R.drawable.ic_settings_holo_light);
-        item.setPosition(POS_SET, 4);
-        item.setLabel(mActivity.getResources().getString(R.string.camera_menu_settings_label));
-        item.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(PieItem item) {
-                if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) {
-                    initializePopup();
-                    mPopupStatus = POPUP_FIRST_LEVEL;
-                }
-                mUI.showPopup(mPopup);
-            }
-        });
-        mRenderer.addItem(item);
+        // flash
+        if (group.findPreference(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE) != null) {
+            item = makeItem(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE);
+            mRenderer.addItem(item);
+        }
     }
 
     @Override
index 6dbcb85..47fe067 100644 (file)
@@ -35,8 +35,6 @@ public class PieItem {
 
     private Drawable mDrawable;
     private int level;
-    private int mPosition;
-    private int mCount;
 
     private boolean mSelected;
     private boolean mEnabled;
@@ -68,19 +66,6 @@ public class PieItem {
         return mLabel;
     }
 
-    public void setPosition(int pos, int count) {
-        mPosition = pos;
-        mCount = count;
-    }
-
-    public int getPosition() {
-        return mPosition;
-    }
-
-    public int getCount() {
-        return mCount;
-    }
-
     public boolean hasItems() {
         return mItems != null;
     }
index a4e7eb0..dcd6350 100644 (file)
@@ -370,10 +370,12 @@ public class PieRenderer extends OverlayRenderer
         Path path = makeSlice(getDegrees(0) + extend, getDegrees(SWEEP_ARC) - extend,
                 mArcRadius, mArcRadius + mRadiusInc + mRadiusInc / 4,
                 mPieCenterX, mArcCenterY - level * mRadiusInc);
+        final int count = items.size();
+        int pos = 0;
         for (PieItem item : items) {
             // shared between items
             item.setPath(path);
-            float angle = getArcCenter(item);
+            float angle = getArcCenter(item, pos, count);
             int w = item.getIntrinsicWidth();
             int h = item.getIntrinsicHeight();
             // move views to outer border
@@ -386,6 +388,7 @@ public class PieRenderer extends OverlayRenderer
             if (item.hasItems()) {
                 layoutItems(level + 1, item.getItems());
             }
+            pos++;
         }
     }
 
@@ -403,14 +406,14 @@ public class PieRenderer extends OverlayRenderer
         return path;
     }
 
-    private float getArcCenter(PieItem item) {
-        return getCenter(item.getPosition(), item.getCount(), SWEEP_ARC);
+    private float getArcCenter(PieItem item, int pos, int count) {
+        return getCenter(pos, count, SWEEP_ARC);
     }
 
-    private float getSliceCenter(PieItem item) {
+    private float getSliceCenter(PieItem item, int pos, int count) {
         float center = (getCenterAngle() - CENTER) * 0.5f + CENTER;
-        return center + (item.getCount() - 1) * SWEEP_SLICE / 2f
-                - item.getPosition() * SWEEP_SLICE;
+        return center + (count - 1) * SWEEP_SLICE / 2f
+                - pos * SWEEP_SLICE;
     }
 
     private float getCenter(int pos, int count, float sweep) {
@@ -520,20 +523,28 @@ public class PieRenderer extends OverlayRenderer
         if (!hasOpenItem() || (mXFade != null)) {
             // draw base menu
             drawArc(canvas, getLevel(), getParent());
+            List<PieItem> items = getParent().getItems();
+            final int count = items.size();
+            int pos = 0;
             for (PieItem item : getParent().getItems()) {
-                drawItem(Math.max(0, mOpen.size() - 2), canvas, item, alpha);
+                drawItem(Math.max(0, mOpen.size() - 2), pos, count, canvas, item, alpha);
+                pos++;
             }
             mLabel.draw(canvas);
         }
         if (hasOpenItem()) {
             int level = getLevel();
             drawArc(canvas, level, getOpenItem());
-            for (PieItem inner : getOpenItem().getItems()) {
+            List<PieItem> items = getOpenItem().getItems();
+            final int count = items.size();
+            int pos = 0;
+            for (PieItem inner : items) {
                 if (mFadeOut != null) {
-                    drawItem(level, canvas, inner, alpha);
+                    drawItem(level, pos, count, canvas, inner, alpha);
                 } else {
-                    drawItem(level, canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1);
+                    drawItem(level, pos, count, canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1);
                 }
+                pos++;
             }
             mLabel.draw(canvas);
         }
@@ -543,19 +554,9 @@ public class PieRenderer extends OverlayRenderer
     private void drawArc(Canvas canvas, int level, PieItem item) {
         // arc
         if (mState == STATE_PIE) {
-            int min = Integer.MAX_VALUE;
-            int max = Integer.MIN_VALUE;
-            int count = 0;
-            for (PieItem child : item.getItems()) {
-                final int p = child.getPosition();
-                count = child.getCount();
-                if (p < min) min = p;
-                if (p > max) max = p;
-            }
-            float start =  mCenterAngle + (count - 1) * SWEEP_ARC / 2f - min * SWEEP_ARC
-                    + SWEEP_ARC / 2f;
-            float end =  mCenterAngle + (count - 1) * SWEEP_ARC / 2f - max * SWEEP_ARC
-                    - SWEEP_ARC / 2f;
+            final int count = item.getItems().size();
+            float start = mCenterAngle + (count * SWEEP_ARC / 2f);
+            float end =  mCenterAngle - (count * SWEEP_ARC / 2f);
             int cy = mArcCenterY - level * mRadiusInc;
             canvas.drawArc(new RectF(mPieCenterX - mArcRadius, cy - mArcRadius,
                     mPieCenterX + mArcRadius, cy + mArcRadius),
@@ -563,14 +564,14 @@ public class PieRenderer extends OverlayRenderer
         }
     }
 
-    private void drawItem(int level, Canvas canvas, PieItem item, float alpha) {
+    private void drawItem(int level, int pos, int count, Canvas canvas, PieItem item, float alpha) {
         if (mState == STATE_PIE) {
             if (item.getPath() != null) {
                 int y = mArcCenterY - level * mRadiusInc;
                 if (item.isSelected()) {
                     Paint p = mSelectedPaint;
                     int state = canvas.save();
-                    float angle = getArcCenter(item) - SWEEP_ARC / 2f;
+                    float angle = getArcCenter(item, pos, count) - SWEEP_ARC / 2f;
                     angle = getDegrees(angle);
                     canvas.rotate(angle, mPieCenterX, y);
                     if (mFadeOut != null) {
@@ -679,8 +680,8 @@ public class PieRenderer extends OverlayRenderer
         return polarCoords.y < mArcRadius - mRadiusInc;
     }
 
-    private boolean inside(PointF polar, PieItem item) {
-        float start = getSliceCenter(item) - SWEEP_SLICE / 2f;
+    private boolean inside(PointF polar, PieItem item, int pos, int count) {
+        float start = getSliceCenter(item, pos, count) - SWEEP_SLICE / 2f;
         boolean res =  (mArcRadius < polar.y)
                 && (start < polar.x)
                 && (start + SWEEP_SLICE > polar.x)
@@ -801,10 +802,13 @@ public class PieRenderer extends OverlayRenderer
     private PieItem findItem(PointF polar) {
         // find the matching item:
         List<PieItem> items = getOpenItem().getItems();
+        final int count = items.size();
+        int pos = 0;
         for (PieItem item : items) {
-            if (inside(polar, item)) {
+            if (inside(polar, item, pos, count)) {
                 return item;
             }
+            pos++;
         }
         return null;
     }