PieController.java revision 8872c23e739de38d74f04a8c852ebb5199c905f6
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
198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.drawable.Drawable;
208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.Log;
218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.CameraPreference.OnPreferenceChangedListener;
238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.drawable.TextDrawable;
248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieItem;
258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieItem.OnClickListener;
268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieRenderer;
278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.ArrayList;
298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.HashMap;
308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.List;
318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.Map;
328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class PieController {
348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private static String TAG = "CAM_piecontrol";
368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected static final int MODE_PHOTO = 0;
388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected static final int MODE_VIDEO = 1;
398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected CameraActivity mActivity;
418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PreferenceGroup mPreferenceGroup;
428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected OnPreferenceChangedListener mListener;
438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PieRenderer mRenderer;
448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private List<IconListPreference> mPreferences;
458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private Map<IconListPreference, PieItem> mPreferenceMap;
468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private Map<IconListPreference, String> mOverrides;
478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void setListener(OnPreferenceChangedListener listener) {
498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mListener = listener;
508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public PieController(CameraActivity activity, PieRenderer pie) {
538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mActivity = activity;
548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mRenderer = pie;
558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferences = new ArrayList<IconListPreference>();
568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceMap = new HashMap<IconListPreference, PieItem>();
578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOverrides = new HashMap<IconListPreference, String>();
588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void initialize(PreferenceGroup group) {
618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mRenderer.clearItems();
628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        setPreferenceGroup(group);
638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void onSettingChanged(ListPreference pref) {
668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (mListener != null) {
678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            mListener.onSharedPreferenceChanged();
688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected void setCameraId(int cameraId) {
728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        pref.setValue("" + cameraId);
748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PieItem makeItem(int resId) {
778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        // We need a mutable version as we change the alpha
788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        Drawable d = mActivity.getResources().getDrawable(resId).mutate();
798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return new PieItem(d, 0);
808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    protected PieItem makeItem(CharSequence value) {
838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return new PieItem(drawable, 0);
858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void addItem(String prefKey, float center, float sweep) {
888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        final IconListPreference pref =
898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                (IconListPreference) mPreferenceGroup.findPreference(prefKey);
908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (pref == null) return;
918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int[] iconIds = pref.getLargeIconIds();
928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int resid = -1;
938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (!pref.getUseSingleIcon() && iconIds != null) {
948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // Each entry has a corresponding icon.
958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            int index = pref.findIndexOfValue(pref.getValue());
968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            resid = iconIds[index];
978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        } else {
988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // The preference only has a single icon to represent it.
998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            resid = pref.getSingleIcon();
1008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        PieItem item = makeItem(resid);
1028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        // use center and sweep to determine layout
1038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        item.setFixedSlice(center, sweep);
1048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mRenderer.addItem(item);
1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferences.add(pref);
1068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceMap.put(pref, item);
1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int nOfEntries = pref.getEntries().length;
1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (nOfEntries > 1) {
1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            for (int i = 0; i < nOfEntries; i++) {
1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                PieItem inner = null;
1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                if (iconIds != null) {
1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    inner = makeItem(iconIds[i]);
1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                } else {
1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    inner = makeItem(pref.getEntries()[i]);
1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                }
1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                item.addItem(inner);
1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                final int index = i;
1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                inner.setOnClickListener(new OnClickListener() {
1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    @Override
1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    public void onClick(PieItem item) {
1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                        pref.setValueIndex(index);
1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                        reloadPreference(pref);
1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                        onSettingChanged(pref);
1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    }
1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                });
1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
1278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void setPreferenceGroup(PreferenceGroup group) {
1318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceGroup = group;
1328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void reloadPreferences() {
1358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mPreferenceGroup.reloadValue();
1368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        for (IconListPreference pref : mPreferenceMap.keySet()) {
1378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            reloadPreference(pref);
1388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private void reloadPreference(IconListPreference pref) {
1428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (pref.getUseSingleIcon()) return;
1438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        PieItem item = mPreferenceMap.get(pref);
1448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        String overrideValue = mOverrides.get(pref);
1458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        int[] iconIds = pref.getLargeIconIds();
1468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (iconIds != null) {
1478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // Each entry has a corresponding icon.
1488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            int index;
1498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            if (overrideValue == null) {
1508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                index = pref.findIndexOfValue(pref.getValue());
1518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            } else {
1528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                index = pref.findIndexOfValue(overrideValue);
1538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                if (index == -1) {
1548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    // Avoid the crash if camera driver has bugs.
1558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    Log.e(TAG, "Fail to find override value=" + overrideValue);
1568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    pref.print();
1578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                    return;
1588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                }
1598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
1608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            item.setImageResource(mActivity, iconIds[index]);
1618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        } else {
1628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // The preference only has a single icon to represent it.
1638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            item.setImageResource(mActivity, pref.getSingleIcon());
1648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    // Scene mode may override other camera settings (ex: flash mode).
1688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void overrideSettings(final String ... keyvalues) {
1698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        if (keyvalues.length % 2 != 0) {
1708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            throw new IllegalArgumentException();
1718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        for (IconListPreference pref : mPreferenceMap.keySet()) {
1738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            override(pref, keyvalues);
1748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
1778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private void override(IconListPreference pref, final String ... keyvalues) {
1788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOverrides.remove(pref);
1798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        for (int i = 0; i < keyvalues.length; i += 2) {
1808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            String key = keyvalues[i];
1818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            String value = keyvalues[i + 1];
1828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            if (key.equals(pref.getKey())) {
1838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                mOverrides.put(pref, value);
1848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                PieItem item = mPreferenceMap.get(pref);
1858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                item.setEnabled(value == null);
1868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                break;
1878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
1888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        reloadPreference(pref);
1908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
1918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb}
192