blob: 0a7fcc6dc641e44dde2e809ee627cd5abc8cd61b [file] [log] [blame]
Michael Kolb8872c232013-01-29 10:33:22 -08001/*
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
Erin Dahlgren357b7672013-11-20 17:38:14 -080022import com.android.camera.CameraActivity;
Michael Kolb8872c232013-01-29 10:33:22 -080023import com.android.camera.CameraPreference.OnPreferenceChangedListener;
24import com.android.camera.drawable.TextDrawable;
Erin Dahlgren357b7672013-11-20 17:38:14 -080025import com.android.camera.settings.SettingsManager;
Michael Kolb8872c232013-01-29 10:33:22 -080026import com.android.camera.ui.PieItem;
27import com.android.camera.ui.PieItem.OnClickListener;
28import com.android.camera.ui.PieRenderer;
29
30import java.util.ArrayList;
31import java.util.HashMap;
32import java.util.List;
33import java.util.Map;
34
35public class PieController {
36
37 private static String TAG = "CAM_piecontrol";
38
39 protected static final int MODE_PHOTO = 0;
40 protected static final int MODE_VIDEO = 1;
41
Doris Liu753bb8a2013-03-14 21:01:35 -070042 protected static float CENTER = (float) Math.PI / 2;
43 protected static final float SWEEP = 0.06f;
44
Erin Dahlgren357b7672013-11-20 17:38:14 -080045 protected CameraActivity mActivity;
Michael Kolb8872c232013-01-29 10:33:22 -080046 protected PreferenceGroup mPreferenceGroup;
47 protected OnPreferenceChangedListener mListener;
48 protected PieRenderer mRenderer;
49 private List<IconListPreference> mPreferences;
50 private Map<IconListPreference, PieItem> mPreferenceMap;
51 private Map<IconListPreference, String> mOverrides;
52
53 public void setListener(OnPreferenceChangedListener listener) {
54 mListener = listener;
55 }
56
Erin Dahlgren357b7672013-11-20 17:38:14 -080057 public PieController(CameraActivity activity, PieRenderer pie) {
Michael Kolb8872c232013-01-29 10:33:22 -080058 mActivity = activity;
59 mRenderer = pie;
60 mPreferences = new ArrayList<IconListPreference>();
61 mPreferenceMap = new HashMap<IconListPreference, PieItem>();
62 mOverrides = new HashMap<IconListPreference, String>();
63 }
64
65 public void initialize(PreferenceGroup group) {
66 mRenderer.clearItems();
Doris Liu1ce28c92013-04-18 17:14:51 -070067 mPreferenceMap.clear();
Michael Kolb8872c232013-01-29 10:33:22 -080068 setPreferenceGroup(group);
69 }
70
71 public void onSettingChanged(ListPreference pref) {
72 if (mListener != null) {
73 mListener.onSharedPreferenceChanged();
74 }
75 }
76
77 protected void setCameraId(int cameraId) {
78 ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
Erin Dahlgren357b7672013-11-20 17:38:14 -080079 SettingsManager settingsManager = mActivity.getSettingsManager();
80 settingsManager.setValueFromPreference(pref, "" + cameraId);
Michael Kolb8872c232013-01-29 10:33:22 -080081 }
82
83 protected PieItem makeItem(int resId) {
84 // We need a mutable version as we change the alpha
85 Drawable d = mActivity.getResources().getDrawable(resId).mutate();
86 return new PieItem(d, 0);
87 }
88
89 protected PieItem makeItem(CharSequence value) {
90 TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
91 return new PieItem(drawable, 0);
92 }
93
Michael Kolbb7c49992013-04-30 09:23:23 -070094 public PieItem makeItem(String prefKey) {
Erin Dahlgren357b7672013-11-20 17:38:14 -080095 final SettingsManager settingsManager = mActivity.getSettingsManager();
96
Michael Kolb8872c232013-01-29 10:33:22 -080097 final IconListPreference pref =
98 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
Michael Kolb3bc96b22013-03-12 10:24:42 -070099 if (pref == null) return null;
Michael Kolb8872c232013-01-29 10:33:22 -0800100 int[] iconIds = pref.getLargeIconIds();
101 int resid = -1;
102 if (!pref.getUseSingleIcon() && iconIds != null) {
103 // Each entry has a corresponding icon.
Erin Dahlgren357b7672013-11-20 17:38:14 -0800104 String value = settingsManager.getValueFromPreference(pref);
105 int index = pref.findIndexOfValue(value);
Michael Kolb8872c232013-01-29 10:33:22 -0800106 resid = iconIds[index];
107 } else {
108 // The preference only has a single icon to represent it.
109 resid = pref.getSingleIcon();
110 }
111 PieItem item = makeItem(resid);
Michael Kolb10f4ba02013-04-10 08:50:51 -0700112 item.setLabel(pref.getTitle().toUpperCase());
Michael Kolb8872c232013-01-29 10:33:22 -0800113 mPreferences.add(pref);
114 mPreferenceMap.put(pref, item);
115 int nOfEntries = pref.getEntries().length;
116 if (nOfEntries > 1) {
117 for (int i = 0; i < nOfEntries; i++) {
118 PieItem inner = null;
119 if (iconIds != null) {
120 inner = makeItem(iconIds[i]);
121 } else {
122 inner = makeItem(pref.getEntries()[i]);
123 }
Michael Kolb10f4ba02013-04-10 08:50:51 -0700124 inner.setLabel(pref.getLabels()[i]);
Michael Kolb8872c232013-01-29 10:33:22 -0800125 item.addItem(inner);
126 final int index = i;
127 inner.setOnClickListener(new OnClickListener() {
128 @Override
129 public void onClick(PieItem item) {
Erin Dahlgren357b7672013-11-20 17:38:14 -0800130 settingsManager.setValueIndexFromPreference(pref, index);
Michael Kolb8872c232013-01-29 10:33:22 -0800131 reloadPreference(pref);
132 onSettingChanged(pref);
133 }
134 });
135 }
136 }
Michael Kolb3bc96b22013-03-12 10:24:42 -0700137 return item;
138 }
139
Michael Kolbb7c49992013-04-30 09:23:23 -0700140 public PieItem makeSwitchItem(final String prefKey, boolean addListener) {
Michael Kolb25c0ec42013-04-18 12:31:10 -0700141 final IconListPreference pref =
142 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
143 if (pref == null) return null;
144 int[] iconIds = pref.getLargeIconIds();
145 int resid = -1;
Erin Dahlgren357b7672013-11-20 17:38:14 -0800146 SettingsManager settingsManager = mActivity.getSettingsManager();
147 String value = settingsManager.getValueFromPreference(pref);
148 int index = pref.findIndexOfValue(value);
149
Michael Kolb25c0ec42013-04-18 12:31:10 -0700150 if (!pref.getUseSingleIcon() && iconIds != null) {
151 // Each entry has a corresponding icon.
152 resid = iconIds[index];
153 } else {
154 // The preference only has a single icon to represent it.
155 resid = pref.getSingleIcon();
156 }
157 PieItem item = makeItem(resid);
Michael Kolb25c0ec42013-04-18 12:31:10 -0700158 item.setLabel(pref.getLabels()[index]);
159 item.setImageResource(mActivity, resid);
160 mPreferences.add(pref);
161 mPreferenceMap.put(pref, item);
162 if (addListener) {
163 final PieItem fitem = item;
164 item.setOnClickListener(new OnClickListener() {
165 @Override
166 public void onClick(PieItem item) {
Angus Kongd90d0ff2013-10-13 20:21:09 -0700167 if (!item.isEnabled()) {
168 return;
169 }
Michael Kolb25c0ec42013-04-18 12:31:10 -0700170 IconListPreference pref = (IconListPreference) mPreferenceGroup
171 .findPreference(prefKey);
Erin Dahlgren357b7672013-11-20 17:38:14 -0800172
173 SettingsManager settingsManager = mActivity.getSettingsManager();
174 String value = settingsManager.getValueFromPreference(pref);
175 int index = pref.findIndexOfValue(value);
176
Michael Kolb25c0ec42013-04-18 12:31:10 -0700177 CharSequence[] values = pref.getEntryValues();
178 index = (index + 1) % values.length;
Erin Dahlgren357b7672013-11-20 17:38:14 -0800179 settingsManager.setValueIndexFromPreference(pref, index);
Michael Kolb25c0ec42013-04-18 12:31:10 -0700180 fitem.setLabel(pref.getLabels()[index]);
181 fitem.setImageResource(mActivity,
182 ((IconListPreference) pref).getLargeIconIds()[index]);
183 reloadPreference(pref);
184 onSettingChanged(pref);
185 }
186 });
187 }
188 return item;
189 }
190
191
Michael Kolb3bc96b22013-03-12 10:24:42 -0700192 public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) {
193 PieItem item = makeItem(iconId);
194 return item;
195 }
196
Michael Kolbb7c49992013-04-30 09:23:23 -0700197 public void addItem(String prefKey) {
198 PieItem item = makeItem(prefKey);
Michael Kolb3bc96b22013-03-12 10:24:42 -0700199 mRenderer.addItem(item);
Michael Kolb8872c232013-01-29 10:33:22 -0800200 }
201
Michael Kolb25c0ec42013-04-18 12:31:10 -0700202 public void updateItem(PieItem item, String prefKey) {
203 IconListPreference pref = (IconListPreference) mPreferenceGroup
204 .findPreference(prefKey);
205 if (pref != null) {
Erin Dahlgren357b7672013-11-20 17:38:14 -0800206 SettingsManager settingsManager = mActivity.getSettingsManager();
207 String value = settingsManager.getValueFromPreference(pref);
208 int index = pref.findIndexOfValue(value);
209
Michael Kolb25c0ec42013-04-18 12:31:10 -0700210 item.setLabel(pref.getLabels()[index]);
211 item.setImageResource(mActivity,
212 ((IconListPreference) pref).getLargeIconIds()[index]);
213 }
214 }
215
Michael Kolb8872c232013-01-29 10:33:22 -0800216 public void setPreferenceGroup(PreferenceGroup group) {
217 mPreferenceGroup = group;
218 }
219
220 public void reloadPreferences() {
221 mPreferenceGroup.reloadValue();
222 for (IconListPreference pref : mPreferenceMap.keySet()) {
223 reloadPreference(pref);
224 }
225 }
226
227 private void reloadPreference(IconListPreference pref) {
228 if (pref.getUseSingleIcon()) return;
229 PieItem item = mPreferenceMap.get(pref);
230 String overrideValue = mOverrides.get(pref);
231 int[] iconIds = pref.getLargeIconIds();
232 if (iconIds != null) {
233 // Each entry has a corresponding icon.
234 int index;
235 if (overrideValue == null) {
Erin Dahlgren357b7672013-11-20 17:38:14 -0800236 SettingsManager settingsManager = mActivity.getSettingsManager();
237 String value = settingsManager.getValueFromPreference(pref);
238 index = pref.findIndexOfValue(value);
Michael Kolb8872c232013-01-29 10:33:22 -0800239 } else {
240 index = pref.findIndexOfValue(overrideValue);
241 if (index == -1) {
242 // Avoid the crash if camera driver has bugs.
243 Log.e(TAG, "Fail to find override value=" + overrideValue);
244 pref.print();
245 return;
246 }
247 }
248 item.setImageResource(mActivity, iconIds[index]);
249 } else {
250 // The preference only has a single icon to represent it.
251 item.setImageResource(mActivity, pref.getSingleIcon());
252 }
253 }
254
255 // Scene mode may override other camera settings (ex: flash mode).
256 public void overrideSettings(final String ... keyvalues) {
257 if (keyvalues.length % 2 != 0) {
258 throw new IllegalArgumentException();
259 }
260 for (IconListPreference pref : mPreferenceMap.keySet()) {
261 override(pref, keyvalues);
262 }
263 }
264
265 private void override(IconListPreference pref, final String ... keyvalues) {
266 mOverrides.remove(pref);
267 for (int i = 0; i < keyvalues.length; i += 2) {
268 String key = keyvalues[i];
269 String value = keyvalues[i + 1];
270 if (key.equals(pref.getKey())) {
271 mOverrides.put(pref, value);
272 PieItem item = mPreferenceMap.get(pref);
273 item.setEnabled(value == null);
274 break;
275 }
276 }
277 reloadPreference(pref);
278 }
279}