blob: 3cc4415f4d85b41304ee711f18ac2920ff407367 [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
22import com.android.camera.CameraPreference.OnPreferenceChangedListener;
23import com.android.camera.drawable.TextDrawable;
Erin Dahlgren357b7672013-11-20 17:38:14 -080024import com.android.camera.settings.SettingsManager;
Michael Kolb8872c232013-01-29 10:33:22 -080025import com.android.camera.ui.PieItem;
26import com.android.camera.ui.PieItem.OnClickListener;
27import com.android.camera.ui.PieRenderer;
28
29import java.util.ArrayList;
30import java.util.HashMap;
31import java.util.List;
32import java.util.Map;
33
34public class PieController {
35
Sascha Haeberling58501152014-01-06 11:02:35 -080036 private static String TAG = "PieController";
Michael Kolb8872c232013-01-29 10:33:22 -080037
38 protected static final int MODE_PHOTO = 0;
39 protected static final int MODE_VIDEO = 1;
40
Doris Liu753bb8a2013-03-14 21:01:35 -070041 protected static float CENTER = (float) Math.PI / 2;
42 protected static final float SWEEP = 0.06f;
43
Erin Dahlgren357b7672013-11-20 17:38:14 -080044 protected CameraActivity mActivity;
Michael Kolb8872c232013-01-29 10:33:22 -080045 protected PreferenceGroup mPreferenceGroup;
46 protected OnPreferenceChangedListener mListener;
47 protected PieRenderer mRenderer;
Sascha Haeberling58501152014-01-06 11:02:35 -080048 private final List<IconListPreference> mPreferences;
49 private final Map<IconListPreference, PieItem> mPreferenceMap;
50 private final Map<IconListPreference, String> mOverrides;
Michael Kolb8872c232013-01-29 10:33:22 -080051
52 public void setListener(OnPreferenceChangedListener listener) {
53 mListener = listener;
54 }
55
Erin Dahlgren357b7672013-11-20 17:38:14 -080056 public PieController(CameraActivity activity, PieRenderer pie) {
Michael Kolb8872c232013-01-29 10:33:22 -080057 mActivity = activity;
58 mRenderer = pie;
59 mPreferences = new ArrayList<IconListPreference>();
60 mPreferenceMap = new HashMap<IconListPreference, PieItem>();
61 mOverrides = new HashMap<IconListPreference, String>();
62 }
63
64 public void initialize(PreferenceGroup group) {
65 mRenderer.clearItems();
Doris Liu1ce28c92013-04-18 17:14:51 -070066 mPreferenceMap.clear();
Michael Kolb8872c232013-01-29 10:33:22 -080067 setPreferenceGroup(group);
68 }
69
70 public void onSettingChanged(ListPreference pref) {
71 if (mListener != null) {
72 mListener.onSharedPreferenceChanged();
73 }
74 }
75
76 protected void setCameraId(int cameraId) {
77 ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
Erin Dahlgren357b7672013-11-20 17:38:14 -080078 SettingsManager settingsManager = mActivity.getSettingsManager();
79 settingsManager.setValueFromPreference(pref, "" + cameraId);
Michael Kolb8872c232013-01-29 10:33:22 -080080 }
81
82 protected PieItem makeItem(int resId) {
83 // We need a mutable version as we change the alpha
84 Drawable d = mActivity.getResources().getDrawable(resId).mutate();
85 return new PieItem(d, 0);
86 }
87
88 protected PieItem makeItem(CharSequence value) {
89 TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
90 return new PieItem(drawable, 0);
91 }
92
Michael Kolbb7c49992013-04-30 09:23:23 -070093 public PieItem makeItem(String prefKey) {
Erin Dahlgren357b7672013-11-20 17:38:14 -080094 final SettingsManager settingsManager = mActivity.getSettingsManager();
95
Michael Kolb8872c232013-01-29 10:33:22 -080096 final IconListPreference pref =
97 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
Michael Kolb3bc96b22013-03-12 10:24:42 -070098 if (pref == null) return null;
Michael Kolb8872c232013-01-29 10:33:22 -080099 int[] iconIds = pref.getLargeIconIds();
100 int resid = -1;
101 if (!pref.getUseSingleIcon() && iconIds != null) {
102 // Each entry has a corresponding icon.
Erin Dahlgren357b7672013-11-20 17:38:14 -0800103 String value = settingsManager.getValueFromPreference(pref);
104 int index = pref.findIndexOfValue(value);
Michael Kolb8872c232013-01-29 10:33:22 -0800105 resid = iconIds[index];
106 } else {
107 // The preference only has a single icon to represent it.
108 resid = pref.getSingleIcon();
109 }
110 PieItem item = makeItem(resid);
Michael Kolb10f4ba02013-04-10 08:50:51 -0700111 item.setLabel(pref.getTitle().toUpperCase());
Michael Kolb8872c232013-01-29 10:33:22 -0800112 mPreferences.add(pref);
113 mPreferenceMap.put(pref, item);
114 int nOfEntries = pref.getEntries().length;
115 if (nOfEntries > 1) {
116 for (int i = 0; i < nOfEntries; i++) {
117 PieItem inner = null;
118 if (iconIds != null) {
119 inner = makeItem(iconIds[i]);
120 } else {
121 inner = makeItem(pref.getEntries()[i]);
122 }
Michael Kolb10f4ba02013-04-10 08:50:51 -0700123 inner.setLabel(pref.getLabels()[i]);
Michael Kolb8872c232013-01-29 10:33:22 -0800124 item.addItem(inner);
125 final int index = i;
126 inner.setOnClickListener(new OnClickListener() {
127 @Override
128 public void onClick(PieItem item) {
Erin Dahlgren357b7672013-11-20 17:38:14 -0800129 settingsManager.setValueIndexFromPreference(pref, index);
Michael Kolb8872c232013-01-29 10:33:22 -0800130 reloadPreference(pref);
131 onSettingChanged(pref);
132 }
133 });
134 }
135 }
Michael Kolb3bc96b22013-03-12 10:24:42 -0700136 return item;
137 }
138
Michael Kolbb7c49992013-04-30 09:23:23 -0700139 public PieItem makeSwitchItem(final String prefKey, boolean addListener) {
Michael Kolb25c0ec42013-04-18 12:31:10 -0700140 final IconListPreference pref =
141 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
142 if (pref == null) return null;
143 int[] iconIds = pref.getLargeIconIds();
144 int resid = -1;
Erin Dahlgren357b7672013-11-20 17:38:14 -0800145 SettingsManager settingsManager = mActivity.getSettingsManager();
146 String value = settingsManager.getValueFromPreference(pref);
147 int index = pref.findIndexOfValue(value);
148
Michael Kolb25c0ec42013-04-18 12:31:10 -0700149 if (!pref.getUseSingleIcon() && iconIds != null) {
150 // Each entry has a corresponding icon.
151 resid = iconIds[index];
152 } else {
153 // The preference only has a single icon to represent it.
154 resid = pref.getSingleIcon();
155 }
156 PieItem item = makeItem(resid);
Michael Kolb25c0ec42013-04-18 12:31:10 -0700157 item.setLabel(pref.getLabels()[index]);
158 item.setImageResource(mActivity, resid);
159 mPreferences.add(pref);
160 mPreferenceMap.put(pref, item);
161 if (addListener) {
162 final PieItem fitem = item;
163 item.setOnClickListener(new OnClickListener() {
164 @Override
165 public void onClick(PieItem item) {
Angus Kongd90d0ff2013-10-13 20:21:09 -0700166 if (!item.isEnabled()) {
167 return;
168 }
Michael Kolb25c0ec42013-04-18 12:31:10 -0700169 IconListPreference pref = (IconListPreference) mPreferenceGroup
170 .findPreference(prefKey);
Erin Dahlgren357b7672013-11-20 17:38:14 -0800171
172 SettingsManager settingsManager = mActivity.getSettingsManager();
173 String value = settingsManager.getValueFromPreference(pref);
174 int index = pref.findIndexOfValue(value);
175
Michael Kolb25c0ec42013-04-18 12:31:10 -0700176 CharSequence[] values = pref.getEntryValues();
177 index = (index + 1) % values.length;
Erin Dahlgren357b7672013-11-20 17:38:14 -0800178 settingsManager.setValueIndexFromPreference(pref, index);
Michael Kolb25c0ec42013-04-18 12:31:10 -0700179 fitem.setLabel(pref.getLabels()[index]);
180 fitem.setImageResource(mActivity,
Sascha Haeberling58501152014-01-06 11:02:35 -0800181 pref.getLargeIconIds()[index]);
Michael Kolb25c0ec42013-04-18 12:31:10 -0700182 reloadPreference(pref);
183 onSettingChanged(pref);
184 }
185 });
186 }
187 return item;
188 }
189
190
Michael Kolb3bc96b22013-03-12 10:24:42 -0700191 public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) {
192 PieItem item = makeItem(iconId);
193 return item;
194 }
195
Michael Kolbb7c49992013-04-30 09:23:23 -0700196 public void addItem(String prefKey) {
197 PieItem item = makeItem(prefKey);
Michael Kolb3bc96b22013-03-12 10:24:42 -0700198 mRenderer.addItem(item);
Michael Kolb8872c232013-01-29 10:33:22 -0800199 }
200
Michael Kolb25c0ec42013-04-18 12:31:10 -0700201 public void updateItem(PieItem item, String prefKey) {
202 IconListPreference pref = (IconListPreference) mPreferenceGroup
203 .findPreference(prefKey);
204 if (pref != null) {
Erin Dahlgren357b7672013-11-20 17:38:14 -0800205 SettingsManager settingsManager = mActivity.getSettingsManager();
206 String value = settingsManager.getValueFromPreference(pref);
207 int index = pref.findIndexOfValue(value);
208
Michael Kolb25c0ec42013-04-18 12:31:10 -0700209 item.setLabel(pref.getLabels()[index]);
210 item.setImageResource(mActivity,
Sascha Haeberling58501152014-01-06 11:02:35 -0800211 pref.getLargeIconIds()[index]);
Michael Kolb25c0ec42013-04-18 12:31:10 -0700212 }
213 }
214
Michael Kolb8872c232013-01-29 10:33:22 -0800215 public void setPreferenceGroup(PreferenceGroup group) {
216 mPreferenceGroup = group;
217 }
218
219 public void reloadPreferences() {
220 mPreferenceGroup.reloadValue();
221 for (IconListPreference pref : mPreferenceMap.keySet()) {
222 reloadPreference(pref);
223 }
224 }
225
226 private void reloadPreference(IconListPreference pref) {
227 if (pref.getUseSingleIcon()) return;
228 PieItem item = mPreferenceMap.get(pref);
229 String overrideValue = mOverrides.get(pref);
230 int[] iconIds = pref.getLargeIconIds();
231 if (iconIds != null) {
232 // Each entry has a corresponding icon.
233 int index;
234 if (overrideValue == null) {
Erin Dahlgren357b7672013-11-20 17:38:14 -0800235 SettingsManager settingsManager = mActivity.getSettingsManager();
236 String value = settingsManager.getValueFromPreference(pref);
237 index = pref.findIndexOfValue(value);
Michael Kolb8872c232013-01-29 10:33:22 -0800238 } else {
239 index = pref.findIndexOfValue(overrideValue);
240 if (index == -1) {
241 // Avoid the crash if camera driver has bugs.
242 Log.e(TAG, "Fail to find override value=" + overrideValue);
243 pref.print();
244 return;
245 }
246 }
247 item.setImageResource(mActivity, iconIds[index]);
248 } else {
249 // The preference only has a single icon to represent it.
250 item.setImageResource(mActivity, pref.getSingleIcon());
251 }
252 }
253
254 // Scene mode may override other camera settings (ex: flash mode).
255 public void overrideSettings(final String ... keyvalues) {
256 if (keyvalues.length % 2 != 0) {
257 throw new IllegalArgumentException();
258 }
259 for (IconListPreference pref : mPreferenceMap.keySet()) {
260 override(pref, keyvalues);
261 }
262 }
263
264 private void override(IconListPreference pref, final String ... keyvalues) {
265 mOverrides.remove(pref);
266 for (int i = 0; i < keyvalues.length; i += 2) {
267 String key = keyvalues[i];
268 String value = keyvalues[i + 1];
269 if (key.equals(pref.getKey())) {
270 mOverrides.put(pref, value);
271 PieItem item = mPreferenceMap.get(pref);
272 item.setEnabled(value == null);
273 break;
274 }
275 }
276 reloadPreference(pref);
277 }
278}