11373b98135b2854578111dd535e24d39c8853f14Michael Kolb/*
21373b98135b2854578111dd535e24d39c8853f14Michael Kolb * Copyright (C) 2012 The Android Open Source Project
31373b98135b2854578111dd535e24d39c8853f14Michael Kolb *
41373b98135b2854578111dd535e24d39c8853f14Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
51373b98135b2854578111dd535e24d39c8853f14Michael Kolb * you may not use this file except in compliance with the License.
61373b98135b2854578111dd535e24d39c8853f14Michael Kolb * You may obtain a copy of the License at
71373b98135b2854578111dd535e24d39c8853f14Michael Kolb *
81373b98135b2854578111dd535e24d39c8853f14Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
91373b98135b2854578111dd535e24d39c8853f14Michael Kolb *
101373b98135b2854578111dd535e24d39c8853f14Michael Kolb * Unless required by applicable law or agreed to in writing, software
111373b98135b2854578111dd535e24d39c8853f14Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
121373b98135b2854578111dd535e24d39c8853f14Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131373b98135b2854578111dd535e24d39c8853f14Michael Kolb * See the License for the specific language governing permissions and
141373b98135b2854578111dd535e24d39c8853f14Michael Kolb * limitations under the License.
151373b98135b2854578111dd535e24d39c8853f14Michael Kolb */
161373b98135b2854578111dd535e24d39c8853f14Michael Kolb
171373b98135b2854578111dd535e24d39c8853f14Michael Kolbpackage com.android.camera;
181373b98135b2854578111dd535e24d39c8853f14Michael Kolb
193ed120d2204c73ab20d6093f112367de60129eb3John Reckimport android.graphics.drawable.Drawable;
201373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport android.util.Log;
211373b98135b2854578111dd535e24d39c8853f14Michael Kolb
221373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport com.android.camera.CameraPreference.OnPreferenceChangedListener;
233ed120d2204c73ab20d6093f112367de60129eb3John Reckimport com.android.camera.drawable.TextDrawable;
241373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport com.android.camera.ui.PieItem;
253ed120d2204c73ab20d6093f112367de60129eb3John Reckimport com.android.camera.ui.PieItem.OnClickListener;
261373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport com.android.camera.ui.PieRenderer;
271373b98135b2854578111dd535e24d39c8853f14Michael Kolb
281373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.ArrayList;
291373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.HashMap;
301373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.List;
311373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.Map;
321373b98135b2854578111dd535e24d39c8853f14Michael Kolb
331373b98135b2854578111dd535e24d39c8853f14Michael Kolbpublic class PieController {
341373b98135b2854578111dd535e24d39c8853f14Michael Kolb
351373b98135b2854578111dd535e24d39c8853f14Michael Kolb    private static String TAG = "CAM_piecontrol";
361373b98135b2854578111dd535e24d39c8853f14Michael Kolb
371373b98135b2854578111dd535e24d39c8853f14Michael Kolb    protected static final int MODE_PHOTO = 0;
381373b98135b2854578111dd535e24d39c8853f14Michael Kolb    protected static final int MODE_VIDEO = 1;
391373b98135b2854578111dd535e24d39c8853f14Michael Kolb
402d3af28f91481d7f3887cb0bb9c5d06375baf787Michael Kolb    protected CameraActivity mActivity;
41b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb    protected PreferenceGroup mPreferenceGroup;
42b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb    protected OnPreferenceChangedListener mListener;
43b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb    protected PieRenderer mRenderer;
441373b98135b2854578111dd535e24d39c8853f14Michael Kolb    private List<IconListPreference> mPreferences;
451373b98135b2854578111dd535e24d39c8853f14Michael Kolb    private Map<IconListPreference, PieItem> mPreferenceMap;
461373b98135b2854578111dd535e24d39c8853f14Michael Kolb    private Map<IconListPreference, String> mOverrides;
471373b98135b2854578111dd535e24d39c8853f14Michael Kolb
481373b98135b2854578111dd535e24d39c8853f14Michael Kolb    public void setListener(OnPreferenceChangedListener listener) {
491373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mListener = listener;
501373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
511373b98135b2854578111dd535e24d39c8853f14Michael Kolb
521373b98135b2854578111dd535e24d39c8853f14Michael Kolb    public PieController(CameraActivity activity, PieRenderer pie) {
531373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mActivity = activity;
541373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mRenderer = pie;
551373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mPreferences = new ArrayList<IconListPreference>();
561373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mPreferenceMap = new HashMap<IconListPreference, PieItem>();
571373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mOverrides = new HashMap<IconListPreference, String>();
581373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
591373b98135b2854578111dd535e24d39c8853f14Michael Kolb
60b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb    public void initialize(PreferenceGroup group) {
611373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mRenderer.clearItems();
621373b98135b2854578111dd535e24d39c8853f14Michael Kolb        setPreferenceGroup(group);
631373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
641373b98135b2854578111dd535e24d39c8853f14Michael Kolb
65ad30bda0d0103bd8a93eb834c234341b1ab1e77fWu-cheng Li    public void onSettingChanged(ListPreference pref) {
661373b98135b2854578111dd535e24d39c8853f14Michael Kolb        if (mListener != null) {
671373b98135b2854578111dd535e24d39c8853f14Michael Kolb            mListener.onSharedPreferenceChanged();
681373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
691373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
701373b98135b2854578111dd535e24d39c8853f14Michael Kolb
711373b98135b2854578111dd535e24d39c8853f14Michael Kolb    protected void setCameraId(int cameraId) {
721373b98135b2854578111dd535e24d39c8853f14Michael Kolb        ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
731373b98135b2854578111dd535e24d39c8853f14Michael Kolb        pref.setValue("" + cameraId);
741373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
751373b98135b2854578111dd535e24d39c8853f14Michael Kolb
761373b98135b2854578111dd535e24d39c8853f14Michael Kolb    protected PieItem makeItem(int resId) {
773ed120d2204c73ab20d6093f112367de60129eb3John Reck        // We need a mutable version as we change the alpha
783ed120d2204c73ab20d6093f112367de60129eb3John Reck        Drawable d = mActivity.getResources().getDrawable(resId).mutate();
793ed120d2204c73ab20d6093f112367de60129eb3John Reck        return new PieItem(d, 0);
801373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
811373b98135b2854578111dd535e24d39c8853f14Michael Kolb
821373b98135b2854578111dd535e24d39c8853f14Michael Kolb    protected PieItem makeItem(CharSequence value) {
833ed120d2204c73ab20d6093f112367de60129eb3John Reck        TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
843ed120d2204c73ab20d6093f112367de60129eb3John Reck        return new PieItem(drawable, 0);
851373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
861373b98135b2854578111dd535e24d39c8853f14Michael Kolb
87b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb    public void addItem(String prefKey, float center, float sweep) {
88b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb        final IconListPreference pref =
89b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb                (IconListPreference) mPreferenceGroup.findPreference(prefKey);
90b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb        if (pref == null) return;
911373b98135b2854578111dd535e24d39c8853f14Michael Kolb        int[] iconIds = pref.getLargeIconIds();
921373b98135b2854578111dd535e24d39c8853f14Michael Kolb        int resid = -1;
93ec6a318cdba09ff85bdcacd861442b617399b6daMichael Kolb        if (!pref.getUseSingleIcon() && iconIds != null) {
941373b98135b2854578111dd535e24d39c8853f14Michael Kolb            // Each entry has a corresponding icon.
951373b98135b2854578111dd535e24d39c8853f14Michael Kolb            int index = pref.findIndexOfValue(pref.getValue());
961373b98135b2854578111dd535e24d39c8853f14Michael Kolb            resid = iconIds[index];
971373b98135b2854578111dd535e24d39c8853f14Michael Kolb        } else {
981373b98135b2854578111dd535e24d39c8853f14Michael Kolb            // The preference only has a single icon to represent it.
991373b98135b2854578111dd535e24d39c8853f14Michael Kolb            resid = pref.getSingleIcon();
1001373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
1011373b98135b2854578111dd535e24d39c8853f14Michael Kolb        PieItem item = makeItem(resid);
102b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb        // use center and sweep to determine layout
103b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb        item.setFixedSlice(center, sweep);
1041373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mRenderer.addItem(item);
1051373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mPreferences.add(pref);
1061373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mPreferenceMap.put(pref, item);
1071373b98135b2854578111dd535e24d39c8853f14Michael Kolb        int nOfEntries = pref.getEntries().length;
1081373b98135b2854578111dd535e24d39c8853f14Michael Kolb        if (nOfEntries > 1) {
1091373b98135b2854578111dd535e24d39c8853f14Michael Kolb            for (int i = 0; i < nOfEntries; i++) {
1101373b98135b2854578111dd535e24d39c8853f14Michael Kolb                PieItem inner = null;
1111373b98135b2854578111dd535e24d39c8853f14Michael Kolb                if (iconIds != null) {
1121373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    inner = makeItem(iconIds[i]);
1131373b98135b2854578111dd535e24d39c8853f14Michael Kolb                } else {
1141373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    inner = makeItem(pref.getEntries()[i]);
1151373b98135b2854578111dd535e24d39c8853f14Michael Kolb                }
1161373b98135b2854578111dd535e24d39c8853f14Michael Kolb                item.addItem(inner);
1171373b98135b2854578111dd535e24d39c8853f14Michael Kolb                final int index = i;
1183ed120d2204c73ab20d6093f112367de60129eb3John Reck                inner.setOnClickListener(new OnClickListener() {
1191373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    @Override
1203ed120d2204c73ab20d6093f112367de60129eb3John Reck                    public void onClick(PieItem item) {
1211373b98135b2854578111dd535e24d39c8853f14Michael Kolb                        pref.setValueIndex(index);
1221373b98135b2854578111dd535e24d39c8853f14Michael Kolb                        reloadPreference(pref);
123ad30bda0d0103bd8a93eb834c234341b1ab1e77fWu-cheng Li                        onSettingChanged(pref);
1241373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    }
1251373b98135b2854578111dd535e24d39c8853f14Michael Kolb                });
1261373b98135b2854578111dd535e24d39c8853f14Michael Kolb            }
1271373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
1281373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
1291373b98135b2854578111dd535e24d39c8853f14Michael Kolb
1301373b98135b2854578111dd535e24d39c8853f14Michael Kolb    public void setPreferenceGroup(PreferenceGroup group) {
1311373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mPreferenceGroup = group;
1321373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
1331373b98135b2854578111dd535e24d39c8853f14Michael Kolb
1341373b98135b2854578111dd535e24d39c8853f14Michael Kolb    public void reloadPreferences() {
1351373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mPreferenceGroup.reloadValue();
1361373b98135b2854578111dd535e24d39c8853f14Michael Kolb        for (IconListPreference pref : mPreferenceMap.keySet()) {
1371373b98135b2854578111dd535e24d39c8853f14Michael Kolb            reloadPreference(pref);
1381373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
1391373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
1401373b98135b2854578111dd535e24d39c8853f14Michael Kolb
1411373b98135b2854578111dd535e24d39c8853f14Michael Kolb    private void reloadPreference(IconListPreference pref) {
142ec6a318cdba09ff85bdcacd861442b617399b6daMichael Kolb        if (pref.getUseSingleIcon()) return;
1431373b98135b2854578111dd535e24d39c8853f14Michael Kolb        PieItem item = mPreferenceMap.get(pref);
1441373b98135b2854578111dd535e24d39c8853f14Michael Kolb        String overrideValue = mOverrides.get(pref);
1451373b98135b2854578111dd535e24d39c8853f14Michael Kolb        int[] iconIds = pref.getLargeIconIds();
1461373b98135b2854578111dd535e24d39c8853f14Michael Kolb        if (iconIds != null) {
1471373b98135b2854578111dd535e24d39c8853f14Michael Kolb            // Each entry has a corresponding icon.
1481373b98135b2854578111dd535e24d39c8853f14Michael Kolb            int index;
1491373b98135b2854578111dd535e24d39c8853f14Michael Kolb            if (overrideValue == null) {
1501373b98135b2854578111dd535e24d39c8853f14Michael Kolb                index = pref.findIndexOfValue(pref.getValue());
1511373b98135b2854578111dd535e24d39c8853f14Michael Kolb            } else {
1521373b98135b2854578111dd535e24d39c8853f14Michael Kolb                index = pref.findIndexOfValue(overrideValue);
1531373b98135b2854578111dd535e24d39c8853f14Michael Kolb                if (index == -1) {
1541373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    // Avoid the crash if camera driver has bugs.
1551373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    Log.e(TAG, "Fail to find override value=" + overrideValue);
1561373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    pref.print();
1571373b98135b2854578111dd535e24d39c8853f14Michael Kolb                    return;
1581373b98135b2854578111dd535e24d39c8853f14Michael Kolb                }
1591373b98135b2854578111dd535e24d39c8853f14Michael Kolb            }
1603ed120d2204c73ab20d6093f112367de60129eb3John Reck            item.setImageResource(mActivity, iconIds[index]);
1611373b98135b2854578111dd535e24d39c8853f14Michael Kolb        } else {
1621373b98135b2854578111dd535e24d39c8853f14Michael Kolb            // The preference only has a single icon to represent it.
1633ed120d2204c73ab20d6093f112367de60129eb3John Reck            item.setImageResource(mActivity, pref.getSingleIcon());
1641373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
1651373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
1661373b98135b2854578111dd535e24d39c8853f14Michael Kolb
1671373b98135b2854578111dd535e24d39c8853f14Michael Kolb    // Scene mode may override other camera settings (ex: flash mode).
1681373b98135b2854578111dd535e24d39c8853f14Michael Kolb    public void overrideSettings(final String ... keyvalues) {
1691373b98135b2854578111dd535e24d39c8853f14Michael Kolb        if (keyvalues.length % 2 != 0) {
1701373b98135b2854578111dd535e24d39c8853f14Michael Kolb            throw new IllegalArgumentException();
1711373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
1721373b98135b2854578111dd535e24d39c8853f14Michael Kolb        for (IconListPreference pref : mPreferenceMap.keySet()) {
1731373b98135b2854578111dd535e24d39c8853f14Michael Kolb            override(pref, keyvalues);
1741373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
1751373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
1761373b98135b2854578111dd535e24d39c8853f14Michael Kolb
1771373b98135b2854578111dd535e24d39c8853f14Michael Kolb    private void override(IconListPreference pref, final String ... keyvalues) {
1781373b98135b2854578111dd535e24d39c8853f14Michael Kolb        mOverrides.remove(pref);
1791373b98135b2854578111dd535e24d39c8853f14Michael Kolb        for (int i = 0; i < keyvalues.length; i += 2) {
1801373b98135b2854578111dd535e24d39c8853f14Michael Kolb            String key = keyvalues[i];
1811373b98135b2854578111dd535e24d39c8853f14Michael Kolb            String value = keyvalues[i + 1];
1821373b98135b2854578111dd535e24d39c8853f14Michael Kolb            if (key.equals(pref.getKey())) {
1831373b98135b2854578111dd535e24d39c8853f14Michael Kolb                mOverrides.put(pref, value);
1841373b98135b2854578111dd535e24d39c8853f14Michael Kolb                PieItem item = mPreferenceMap.get(pref);
1851373b98135b2854578111dd535e24d39c8853f14Michael Kolb                item.setEnabled(value == null);
1861373b98135b2854578111dd535e24d39c8853f14Michael Kolb                break;
1871373b98135b2854578111dd535e24d39c8853f14Michael Kolb            }
1881373b98135b2854578111dd535e24d39c8853f14Michael Kolb        }
1891373b98135b2854578111dd535e24d39c8853f14Michael Kolb        reloadPreference(pref);
1901373b98135b2854578111dd535e24d39c8853f14Michael Kolb    }
1911373b98135b2854578111dd535e24d39c8853f14Michael Kolb}
192