blob: 3cbcb4bf5be4034e6d53115d5a9bc74e773b27b6 [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
Doris Liu753bb8a2013-03-14 21:01:35 -070019import android.app.Activity;
Michael Kolb8872c232013-01-29 10:33:22 -080020import android.graphics.drawable.Drawable;
21import android.util.Log;
22
23import com.android.camera.CameraPreference.OnPreferenceChangedListener;
24import com.android.camera.drawable.TextDrawable;
25import 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
36 private static String TAG = "CAM_piecontrol";
37
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
44 protected Activity mActivity;
Michael Kolb8872c232013-01-29 10:33:22 -080045 protected PreferenceGroup mPreferenceGroup;
46 protected OnPreferenceChangedListener mListener;
47 protected PieRenderer mRenderer;
48 private List<IconListPreference> mPreferences;
49 private Map<IconListPreference, PieItem> mPreferenceMap;
50 private Map<IconListPreference, String> mOverrides;
51
52 public void setListener(OnPreferenceChangedListener listener) {
53 mListener = listener;
54 }
55
Doris Liu753bb8a2013-03-14 21:01:35 -070056 public PieController(Activity 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);
78 pref.setValue("" + cameraId);
79 }
80
81 protected PieItem makeItem(int resId) {
82 // We need a mutable version as we change the alpha
83 Drawable d = mActivity.getResources().getDrawable(resId).mutate();
84 return new PieItem(d, 0);
85 }
86
87 protected PieItem makeItem(CharSequence value) {
88 TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
89 return new PieItem(drawable, 0);
90 }
91
Michael Kolbb7c49992013-04-30 09:23:23 -070092 public PieItem makeItem(String prefKey) {
Michael Kolb8872c232013-01-29 10:33:22 -080093 final IconListPreference pref =
94 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
Michael Kolb3bc96b22013-03-12 10:24:42 -070095 if (pref == null) return null;
Michael Kolb8872c232013-01-29 10:33:22 -080096 int[] iconIds = pref.getLargeIconIds();
97 int resid = -1;
98 if (!pref.getUseSingleIcon() && iconIds != null) {
99 // Each entry has a corresponding icon.
100 int index = pref.findIndexOfValue(pref.getValue());
101 resid = iconIds[index];
102 } else {
103 // The preference only has a single icon to represent it.
104 resid = pref.getSingleIcon();
105 }
106 PieItem item = makeItem(resid);
Michael Kolb10f4ba02013-04-10 08:50:51 -0700107 item.setLabel(pref.getTitle().toUpperCase());
Michael Kolb8872c232013-01-29 10:33:22 -0800108 mPreferences.add(pref);
109 mPreferenceMap.put(pref, item);
110 int nOfEntries = pref.getEntries().length;
111 if (nOfEntries > 1) {
112 for (int i = 0; i < nOfEntries; i++) {
113 PieItem inner = null;
114 if (iconIds != null) {
115 inner = makeItem(iconIds[i]);
116 } else {
117 inner = makeItem(pref.getEntries()[i]);
118 }
Michael Kolb10f4ba02013-04-10 08:50:51 -0700119 inner.setLabel(pref.getLabels()[i]);
Michael Kolb8872c232013-01-29 10:33:22 -0800120 item.addItem(inner);
121 final int index = i;
122 inner.setOnClickListener(new OnClickListener() {
123 @Override
124 public void onClick(PieItem item) {
125 pref.setValueIndex(index);
126 reloadPreference(pref);
127 onSettingChanged(pref);
128 }
129 });
130 }
131 }
Michael Kolb3bc96b22013-03-12 10:24:42 -0700132 return item;
133 }
134
Michael Kolbb7c49992013-04-30 09:23:23 -0700135 public PieItem makeSwitchItem(final String prefKey, boolean addListener) {
Michael Kolb25c0ec42013-04-18 12:31:10 -0700136 final IconListPreference pref =
137 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
138 if (pref == null) return null;
139 int[] iconIds = pref.getLargeIconIds();
140 int resid = -1;
141 int index = pref.findIndexOfValue(pref.getValue());
142 if (!pref.getUseSingleIcon() && iconIds != null) {
143 // Each entry has a corresponding icon.
144 resid = iconIds[index];
145 } else {
146 // The preference only has a single icon to represent it.
147 resid = pref.getSingleIcon();
148 }
149 PieItem item = makeItem(resid);
Michael Kolb25c0ec42013-04-18 12:31:10 -0700150 item.setLabel(pref.getLabels()[index]);
151 item.setImageResource(mActivity, resid);
152 mPreferences.add(pref);
153 mPreferenceMap.put(pref, item);
154 if (addListener) {
155 final PieItem fitem = item;
156 item.setOnClickListener(new OnClickListener() {
157 @Override
158 public void onClick(PieItem item) {
159 IconListPreference pref = (IconListPreference) mPreferenceGroup
160 .findPreference(prefKey);
161 int index = pref.findIndexOfValue(pref.getValue());
162 CharSequence[] values = pref.getEntryValues();
163 index = (index + 1) % values.length;
164 pref.setValueIndex(index);
165 fitem.setLabel(pref.getLabels()[index]);
166 fitem.setImageResource(mActivity,
167 ((IconListPreference) pref).getLargeIconIds()[index]);
168 reloadPreference(pref);
169 onSettingChanged(pref);
170 }
171 });
172 }
173 return item;
174 }
175
176
Michael Kolb3bc96b22013-03-12 10:24:42 -0700177 public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) {
178 PieItem item = makeItem(iconId);
179 return item;
180 }
181
Michael Kolbb7c49992013-04-30 09:23:23 -0700182 public void addItem(String prefKey) {
183 PieItem item = makeItem(prefKey);
Michael Kolb3bc96b22013-03-12 10:24:42 -0700184 mRenderer.addItem(item);
Michael Kolb8872c232013-01-29 10:33:22 -0800185 }
186
Michael Kolb25c0ec42013-04-18 12:31:10 -0700187 public void updateItem(PieItem item, String prefKey) {
188 IconListPreference pref = (IconListPreference) mPreferenceGroup
189 .findPreference(prefKey);
190 if (pref != null) {
191 int index = pref.findIndexOfValue(pref.getValue());
192 item.setLabel(pref.getLabels()[index]);
193 item.setImageResource(mActivity,
194 ((IconListPreference) pref).getLargeIconIds()[index]);
195 }
196 }
197
Michael Kolb8872c232013-01-29 10:33:22 -0800198 public void setPreferenceGroup(PreferenceGroup group) {
199 mPreferenceGroup = group;
200 }
201
202 public void reloadPreferences() {
203 mPreferenceGroup.reloadValue();
204 for (IconListPreference pref : mPreferenceMap.keySet()) {
205 reloadPreference(pref);
206 }
207 }
208
209 private void reloadPreference(IconListPreference pref) {
210 if (pref.getUseSingleIcon()) return;
211 PieItem item = mPreferenceMap.get(pref);
212 String overrideValue = mOverrides.get(pref);
213 int[] iconIds = pref.getLargeIconIds();
214 if (iconIds != null) {
215 // Each entry has a corresponding icon.
216 int index;
217 if (overrideValue == null) {
218 index = pref.findIndexOfValue(pref.getValue());
219 } else {
220 index = pref.findIndexOfValue(overrideValue);
221 if (index == -1) {
222 // Avoid the crash if camera driver has bugs.
223 Log.e(TAG, "Fail to find override value=" + overrideValue);
224 pref.print();
225 return;
226 }
227 }
228 item.setImageResource(mActivity, iconIds[index]);
229 } else {
230 // The preference only has a single icon to represent it.
231 item.setImageResource(mActivity, pref.getSingleIcon());
232 }
233 }
234
235 // Scene mode may override other camera settings (ex: flash mode).
236 public void overrideSettings(final String ... keyvalues) {
237 if (keyvalues.length % 2 != 0) {
238 throw new IllegalArgumentException();
239 }
240 for (IconListPreference pref : mPreferenceMap.keySet()) {
241 override(pref, keyvalues);
242 }
243 }
244
245 private void override(IconListPreference pref, final String ... keyvalues) {
246 mOverrides.remove(pref);
247 for (int i = 0; i < keyvalues.length; i += 2) {
248 String key = keyvalues[i];
249 String value = keyvalues[i + 1];
250 if (key.equals(pref.getKey())) {
251 mOverrides.put(pref, value);
252 PieItem item = mPreferenceMap.get(pref);
253 item.setEnabled(value == null);
254 break;
255 }
256 }
257 reloadPreference(pref);
258 }
259}