18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/*
28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2012 The Android Open Source Project
38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License.
68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at
78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software
118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and
148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License.
158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */
168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera;
188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
19753bb8aa56fff425fe16b93be368b9b236e4751fDoris Liuimport android.app.Activity;
208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.drawable.Drawable;
218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.Log;
228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.CameraPreference.OnPreferenceChangedListener;
248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.drawable.TextDrawable;
258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieItem;
268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieItem.OnClickListener;
278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieRenderer;
288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.ArrayList;
308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.HashMap;
318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.List;
328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.Map;
338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class PieController {
358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private static String TAG = "CAM_piecontrol";
378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected static final int MODE_PHOTO = 0;
398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected static final int MODE_VIDEO = 1;
408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
41753bb8aa56fff425fe16b93be368b9b236e4751fDoris Liu    protected static float CENTER = (float) Math.PI / 2;
42753bb8aa56fff425fe16b93be368b9b236e4751fDoris Liu    protected static final float SWEEP = 0.06f;
43753bb8aa56fff425fe16b93be368b9b236e4751fDoris Liu
44753bb8aa56fff425fe16b93be368b9b236e4751fDoris Liu    protected Activity mActivity;
458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PreferenceGroup mPreferenceGroup;
468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected OnPreferenceChangedListener mListener;
478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PieRenderer mRenderer;
488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private List<IconListPreference> mPreferences;
498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private Map<IconListPreference, PieItem> mPreferenceMap;
508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private Map<IconListPreference, String> mOverrides;
518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void setListener(OnPreferenceChangedListener listener) {
538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mListener = listener;
548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
56753bb8aa56fff425fe16b93be368b9b236e4751fDoris Liu    public PieController(Activity activity, PieRenderer pie) {
578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mActivity = activity;
588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mRenderer = pie;
598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferences = new ArrayList<IconListPreference>();
608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceMap = new HashMap<IconListPreference, PieItem>();
618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOverrides = new HashMap<IconListPreference, String>();
628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void initialize(PreferenceGroup group) {
658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mRenderer.clearItems();
661ce28c910dca3de9a832079acc77cb807b25d178Doris Liu        mPreferenceMap.clear();
678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        setPreferenceGroup(group);
688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void onSettingChanged(ListPreference pref) {
718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (mListener != null) {
728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            mListener.onSharedPreferenceChanged();
738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected void setCameraId(int cameraId) {
778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        pref.setValue("" + cameraId);
798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PieItem makeItem(int resId) {
828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        // We need a mutable version as we change the alpha
838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        Drawable d = mActivity.getResources().getDrawable(resId).mutate();
848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return new PieItem(d, 0);
858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PieItem makeItem(CharSequence value) {
888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return new PieItem(drawable, 0);
908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
92b7c49994231f31f5cf4de4a66eec7a85a3bd9551Michael Kolb    public PieItem makeItem(String prefKey) {
938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        final IconListPreference pref =
948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                (IconListPreference) mPreferenceGroup.findPreference(prefKey);
953bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        if (pref == null) return null;
968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int[] iconIds = pref.getLargeIconIds();
978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int resid = -1;
988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (!pref.getUseSingleIcon() && iconIds != null) {
998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // Each entry has a corresponding icon.
1008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            int index = pref.findIndexOfValue(pref.getValue());
1018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            resid = iconIds[index];
1028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        } else {
1038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // The preference only has a single icon to represent it.
1048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            resid = pref.getSingleIcon();
1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        PieItem item = makeItem(resid);
10710f4ba0198904a3d7679771ce845c847d940226fMichael Kolb        item.setLabel(pref.getTitle().toUpperCase());
1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferences.add(pref);
1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceMap.put(pref, item);
1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int nOfEntries = pref.getEntries().length;
1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (nOfEntries > 1) {
1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            for (int i = 0; i < nOfEntries; i++) {
1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                PieItem inner = null;
1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                if (iconIds != null) {
1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    inner = makeItem(iconIds[i]);
1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                } else {
1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    inner = makeItem(pref.getEntries()[i]);
1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                }
11910f4ba0198904a3d7679771ce845c847d940226fMichael Kolb                inner.setLabel(pref.getLabels()[i]);
1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                item.addItem(inner);
1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                final int index = i;
1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                inner.setOnClickListener(new OnClickListener() {
1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    @Override
1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    public void onClick(PieItem item) {
1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                        pref.setValueIndex(index);
1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                        reloadPreference(pref);
1278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                        onSettingChanged(pref);
1288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    }
1298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                });
1308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
1318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1323bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        return item;
1333bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    }
1343bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb
135b7c49994231f31f5cf4de4a66eec7a85a3bd9551Michael Kolb    public PieItem makeSwitchItem(final String prefKey, boolean addListener) {
13625c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        final IconListPreference pref =
13725c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                (IconListPreference) mPreferenceGroup.findPreference(prefKey);
13825c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        if (pref == null) return null;
13925c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        int[] iconIds = pref.getLargeIconIds();
14025c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        int resid = -1;
14125c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        int index = pref.findIndexOfValue(pref.getValue());
14225c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        if (!pref.getUseSingleIcon() && iconIds != null) {
14325c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            // Each entry has a corresponding icon.
14425c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            resid = iconIds[index];
14525c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        } else {
14625c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            // The preference only has a single icon to represent it.
14725c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            resid = pref.getSingleIcon();
14825c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        }
14925c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        PieItem item = makeItem(resid);
15025c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        item.setLabel(pref.getLabels()[index]);
15125c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        item.setImageResource(mActivity, resid);
15225c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        mPreferences.add(pref);
15325c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        mPreferenceMap.put(pref, item);
15425c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        if (addListener) {
15525c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            final PieItem fitem = item;
15625c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            item.setOnClickListener(new OnClickListener() {
15725c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                @Override
15825c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                public void onClick(PieItem item) {
159d90d0ffc3e69316b105b6f9d03dc98cd5b40ecbfAngus Kong                    if (!item.isEnabled()) {
160d90d0ffc3e69316b105b6f9d03dc98cd5b40ecbfAngus Kong                        return;
161d90d0ffc3e69316b105b6f9d03dc98cd5b40ecbfAngus Kong                    }
16225c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    IconListPreference pref = (IconListPreference) mPreferenceGroup
16325c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                            .findPreference(prefKey);
16425c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    int index = pref.findIndexOfValue(pref.getValue());
16525c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    CharSequence[] values = pref.getEntryValues();
16625c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    index = (index + 1) % values.length;
16725c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    pref.setValueIndex(index);
16825c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    fitem.setLabel(pref.getLabels()[index]);
16925c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    fitem.setImageResource(mActivity,
17025c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                            ((IconListPreference) pref).getLargeIconIds()[index]);
17125c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    reloadPreference(pref);
17225c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    onSettingChanged(pref);
17325c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                }
17425c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            });
17525c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        }
17625c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        return item;
17725c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb    }
17825c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb
17925c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb
1803bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) {
1813bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        PieItem item = makeItem(iconId);
1823bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        return item;
1833bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    }
1843bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb
185b7c49994231f31f5cf4de4a66eec7a85a3bd9551Michael Kolb    public void addItem(String prefKey) {
186b7c49994231f31f5cf4de4a66eec7a85a3bd9551Michael Kolb        PieItem item = makeItem(prefKey);
1873bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        mRenderer.addItem(item);
1888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
19025c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb    public void updateItem(PieItem item, String prefKey) {
19125c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        IconListPreference pref = (IconListPreference) mPreferenceGroup
19225c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                .findPreference(prefKey);
19325c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        if (pref != null) {
19425c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            int index = pref.findIndexOfValue(pref.getValue());
19525c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            item.setLabel(pref.getLabels()[index]);
19625c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb            item.setImageResource(mActivity,
19725c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb                    ((IconListPreference) pref).getLargeIconIds()[index]);
19825c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb        }
19925c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb    }
20025c0ec4c1252a8d0f9de74ba7ade74bc7af3f5b2Michael Kolb
2018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void setPreferenceGroup(PreferenceGroup group) {
2028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceGroup = group;
2038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
2048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void reloadPreferences() {
2068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceGroup.reloadValue();
2078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        for (IconListPreference pref : mPreferenceMap.keySet()) {
2088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            reloadPreference(pref);
2098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
2118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private void reloadPreference(IconListPreference pref) {
2138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (pref.getUseSingleIcon()) return;
2148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        PieItem item = mPreferenceMap.get(pref);
2158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        String overrideValue = mOverrides.get(pref);
2168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int[] iconIds = pref.getLargeIconIds();
2178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (iconIds != null) {
2188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // Each entry has a corresponding icon.
2198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            int index;
2208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            if (overrideValue == null) {
2218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                index = pref.findIndexOfValue(pref.getValue());
2228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            } else {
2238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                index = pref.findIndexOfValue(overrideValue);
2248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                if (index == -1) {
2258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    // Avoid the crash if camera driver has bugs.
2268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    Log.e(TAG, "Fail to find override value=" + overrideValue);
2278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    pref.print();
2288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    return;
2298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                }
2308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
2318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            item.setImageResource(mActivity, iconIds[index]);
2328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        } else {
2338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // The preference only has a single icon to represent it.
2348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            item.setImageResource(mActivity, pref.getSingleIcon());
2358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
2378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    // Scene mode may override other camera settings (ex: flash mode).
2398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void overrideSettings(final String ... keyvalues) {
2408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (keyvalues.length % 2 != 0) {
2418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            throw new IllegalArgumentException();
2428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        for (IconListPreference pref : mPreferenceMap.keySet()) {
2448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            override(pref, keyvalues);
2458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
2478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private void override(IconListPreference pref, final String ... keyvalues) {
2498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOverrides.remove(pref);
2508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        for (int i = 0; i < keyvalues.length; i += 2) {
2518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            String key = keyvalues[i];
2528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            String value = keyvalues[i + 1];
2538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            if (key.equals(pref.getKey())) {
2548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                mOverrides.put(pref, value);
2558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                PieItem item = mPreferenceMap.get(pref);
2568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                item.setEnabled(value == null);
2578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                break;
2588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
2598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        reloadPreference(pref);
2618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
2628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb}
263