blob: 2145fd89456ae50741b05ed024469ef2984c77fa [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;
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
Michael Kolb3bc96b22013-03-12 10:24:42 -070040 protected static float CENTER = (float) Math.PI / 2;
41 protected static final float SWEEP = 0.06f;
42
43
Michael Kolb8872c232013-01-29 10:33:22 -080044 protected CameraActivity mActivity;
45 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
56 public PieController(CameraActivity activity, PieRenderer pie) {
57 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();
66 setPreferenceGroup(group);
67 }
68
69 public void onSettingChanged(ListPreference pref) {
70 if (mListener != null) {
71 mListener.onSharedPreferenceChanged();
72 }
73 }
74
75 protected void setCameraId(int cameraId) {
76 ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
77 pref.setValue("" + cameraId);
78 }
79
80 protected PieItem makeItem(int resId) {
81 // We need a mutable version as we change the alpha
82 Drawable d = mActivity.getResources().getDrawable(resId).mutate();
83 return new PieItem(d, 0);
84 }
85
86 protected PieItem makeItem(CharSequence value) {
87 TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
88 return new PieItem(drawable, 0);
89 }
90
Michael Kolb3bc96b22013-03-12 10:24:42 -070091 public PieItem makeItem(String prefKey, float center, float sweep) {
Michael Kolb8872c232013-01-29 10:33:22 -080092 final IconListPreference pref =
93 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
Michael Kolb3bc96b22013-03-12 10:24:42 -070094 if (pref == null) return null;
Michael Kolb8872c232013-01-29 10:33:22 -080095 int[] iconIds = pref.getLargeIconIds();
96 int resid = -1;
97 if (!pref.getUseSingleIcon() && iconIds != null) {
98 // Each entry has a corresponding icon.
99 int index = pref.findIndexOfValue(pref.getValue());
100 resid = iconIds[index];
101 } else {
102 // The preference only has a single icon to represent it.
103 resid = pref.getSingleIcon();
104 }
105 PieItem item = makeItem(resid);
106 // use center and sweep to determine layout
107 item.setFixedSlice(center, sweep);
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 Kolb3bc96b22013-03-12 10:24:42 -0700119 layoutInner(inner, i, nOfEntries);
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
135 public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) {
136 PieItem item = makeItem(iconId);
137 return item;
138 }
139
140 protected void layoutInner(PieItem item, int ix, int n) {
141 float sweep = (float) (SWEEP * Math.PI);//FLOAT_PI_DIVIDED_BY_TWO / Math.max(n, 5);
142 float start = CENTER + (n - 1) * (sweep / 2f);
143 item.setFixedSlice(start - ix * sweep, sweep);
144 }
145
146 public void addItem(String prefKey, float center, float sweep) {
147 PieItem item = makeItem(prefKey, center, sweep);
148 mRenderer.addItem(item);
Michael Kolb8872c232013-01-29 10:33:22 -0800149 }
150
151 public void setPreferenceGroup(PreferenceGroup group) {
152 mPreferenceGroup = group;
153 }
154
155 public void reloadPreferences() {
156 mPreferenceGroup.reloadValue();
157 for (IconListPreference pref : mPreferenceMap.keySet()) {
158 reloadPreference(pref);
159 }
160 }
161
162 private void reloadPreference(IconListPreference pref) {
163 if (pref.getUseSingleIcon()) return;
164 PieItem item = mPreferenceMap.get(pref);
165 String overrideValue = mOverrides.get(pref);
166 int[] iconIds = pref.getLargeIconIds();
167 if (iconIds != null) {
168 // Each entry has a corresponding icon.
169 int index;
170 if (overrideValue == null) {
171 index = pref.findIndexOfValue(pref.getValue());
172 } else {
173 index = pref.findIndexOfValue(overrideValue);
174 if (index == -1) {
175 // Avoid the crash if camera driver has bugs.
176 Log.e(TAG, "Fail to find override value=" + overrideValue);
177 pref.print();
178 return;
179 }
180 }
181 item.setImageResource(mActivity, iconIds[index]);
182 } else {
183 // The preference only has a single icon to represent it.
184 item.setImageResource(mActivity, pref.getSingleIcon());
185 }
186 }
187
188 // Scene mode may override other camera settings (ex: flash mode).
189 public void overrideSettings(final String ... keyvalues) {
190 if (keyvalues.length % 2 != 0) {
191 throw new IllegalArgumentException();
192 }
193 for (IconListPreference pref : mPreferenceMap.keySet()) {
194 override(pref, keyvalues);
195 }
196 }
197
198 private void override(IconListPreference pref, final String ... keyvalues) {
199 mOverrides.remove(pref);
200 for (int i = 0; i < keyvalues.length; i += 2) {
201 String key = keyvalues[i];
202 String value = keyvalues[i + 1];
203 if (key.equals(pref.getKey())) {
204 mOverrides.put(pref, value);
205 PieItem item = mPreferenceMap.get(pref);
206 item.setEnabled(value == null);
207 break;
208 }
209 }
210 reloadPreference(pref);
211 }
212}