Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce8f6d1b authored by Michael Kolb's avatar Michael Kolb
Browse files

Remove empty slots from menu

  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
parent aa3541c5
Loading
Loading
Loading
Loading
+32 −42
Original line number Diff line number Diff line
@@ -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
+4 −8
Original line number Diff line number Diff line
@@ -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);
    }

+26 −32
Original line number Diff line number Diff line
@@ -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,28 +113,12 @@ 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);
            }
        });
        // flash
        if (group.findPreference(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE) != null) {
            item = makeItem(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE);
            mRenderer.addItem(item);
        }
    }

    @Override
    public void reloadPreferences() {
+0 −15
Original line number Diff line number Diff line
@@ -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;
    }
+32 −28
Original line number Diff line number Diff line
@@ -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;
    }