PieController.java revision 3ed120d2204c73ab20d6093f112367de60129eb3
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.camera;
18
19import android.graphics.drawable.Drawable;
20import android.util.Log;
21
22import com.android.camera.CameraPreference.OnPreferenceChangedListener;
23import com.android.camera.drawable.TextDrawable;
24import com.android.camera.ui.PieItem;
25import com.android.camera.ui.PieItem.OnClickListener;
26import com.android.camera.ui.PieRenderer;
27
28import java.util.ArrayList;
29import java.util.HashMap;
30import java.util.List;
31import java.util.Map;
32
33public class PieController {
34
35    private static String TAG = "CAM_piecontrol";
36
37    protected static final int MODE_PHOTO = 0;
38    protected static final int MODE_VIDEO = 1;
39
40    protected CameraActivity mActivity;
41    protected PreferenceGroup mPreferenceGroup;
42    protected OnPreferenceChangedListener mListener;
43    protected PieRenderer mRenderer;
44    private List<IconListPreference> mPreferences;
45    private Map<IconListPreference, PieItem> mPreferenceMap;
46    private Map<IconListPreference, String> mOverrides;
47
48    public void setListener(OnPreferenceChangedListener listener) {
49        mListener = listener;
50    }
51
52    public PieController(CameraActivity activity, PieRenderer pie) {
53        mActivity = activity;
54        mRenderer = pie;
55        mPreferences = new ArrayList<IconListPreference>();
56        mPreferenceMap = new HashMap<IconListPreference, PieItem>();
57        mOverrides = new HashMap<IconListPreference, String>();
58    }
59
60    public void initialize(PreferenceGroup group) {
61        mRenderer.clearItems();
62        setPreferenceGroup(group);
63    }
64
65    public void onSettingChanged(ListPreference pref) {
66        if (mListener != null) {
67            mListener.onSharedPreferenceChanged();
68        }
69    }
70
71    protected void setCameraId(int cameraId) {
72        ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
73        pref.setValue("" + cameraId);
74    }
75
76    protected PieItem makeItem(int resId) {
77        // We need a mutable version as we change the alpha
78        Drawable d = mActivity.getResources().getDrawable(resId).mutate();
79        return new PieItem(d, 0);
80    }
81
82    protected PieItem makeItem(CharSequence value) {
83        TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
84        return new PieItem(drawable, 0);
85    }
86
87    public void addItem(String prefKey, float center, float sweep) {
88        final IconListPreference pref =
89                (IconListPreference) mPreferenceGroup.findPreference(prefKey);
90        if (pref == null) return;
91        int[] iconIds = pref.getLargeIconIds();
92        int resid = -1;
93        if (iconIds != null) {
94            // Each entry has a corresponding icon.
95            int index = pref.findIndexOfValue(pref.getValue());
96            resid = iconIds[index];
97        } else {
98            // The preference only has a single icon to represent it.
99            resid = pref.getSingleIcon();
100        }
101        PieItem item = makeItem(resid);
102        // use center and sweep to determine layout
103        item.setFixedSlice(center, sweep);
104        mRenderer.addItem(item);
105        mPreferences.add(pref);
106        mPreferenceMap.put(pref, item);
107        int nOfEntries = pref.getEntries().length;
108        if (nOfEntries > 1) {
109            for (int i = 0; i < nOfEntries; i++) {
110                PieItem inner = null;
111                if (iconIds != null) {
112                    inner = makeItem(iconIds[i]);
113                } else {
114                    inner = makeItem(pref.getEntries()[i]);
115                }
116                item.addItem(inner);
117                final int index = i;
118                inner.setOnClickListener(new OnClickListener() {
119                    @Override
120                    public void onClick(PieItem item) {
121                        pref.setValueIndex(index);
122                        reloadPreference(pref);
123                        onSettingChanged(pref);
124                    }
125                });
126            }
127        }
128    }
129
130    public void setPreferenceGroup(PreferenceGroup group) {
131        mPreferenceGroup = group;
132    }
133
134    public void reloadPreferences() {
135        mPreferenceGroup.reloadValue();
136        for (IconListPreference pref : mPreferenceMap.keySet()) {
137            reloadPreference(pref);
138        }
139    }
140
141    private void reloadPreference(IconListPreference pref) {
142        PieItem item = mPreferenceMap.get(pref);
143        String overrideValue = mOverrides.get(pref);
144        int[] iconIds = pref.getLargeIconIds();
145        if (iconIds != null) {
146            // Each entry has a corresponding icon.
147            int index;
148            if (overrideValue == null) {
149                index = pref.findIndexOfValue(pref.getValue());
150            } else {
151                index = pref.findIndexOfValue(overrideValue);
152                if (index == -1) {
153                    // Avoid the crash if camera driver has bugs.
154                    Log.e(TAG, "Fail to find override value=" + overrideValue);
155                    pref.print();
156                    return;
157                }
158            }
159            item.setImageResource(mActivity, iconIds[index]);
160        } else {
161            // The preference only has a single icon to represent it.
162            item.setImageResource(mActivity, pref.getSingleIcon());
163        }
164    }
165
166    // Scene mode may override other camera settings (ex: flash mode).
167    public void overrideSettings(final String ... keyvalues) {
168        if (keyvalues.length % 2 != 0) {
169            throw new IllegalArgumentException();
170        }
171        for (IconListPreference pref : mPreferenceMap.keySet()) {
172            override(pref, keyvalues);
173        }
174    }
175
176    private void override(IconListPreference pref, final String ... keyvalues) {
177        mOverrides.remove(pref);
178        for (int i = 0; i < keyvalues.length; i += 2) {
179            String key = keyvalues[i];
180            String value = keyvalues[i + 1];
181            if (key.equals(pref.getKey())) {
182                mOverrides.put(pref, value);
183                PieItem item = mPreferenceMap.get(pref);
184                item.setEnabled(value == null);
185                break;
186            }
187        }
188        reloadPreference(pref);
189    }
190}
191