• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.camera;
18 
19 import android.app.Activity;
20 import android.graphics.drawable.Drawable;
21 import android.util.Log;
22 
23 import com.android.camera.CameraPreference.OnPreferenceChangedListener;
24 import com.android.camera.drawable.TextDrawable;
25 import com.android.camera.ui.PieItem;
26 import com.android.camera.ui.PieItem.OnClickListener;
27 import com.android.camera.ui.PieRenderer;
28 
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 
34 public 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 
41     protected static float CENTER = (float) Math.PI / 2;
42     protected static final float SWEEP = 0.06f;
43 
44     protected Activity 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 
setListener(OnPreferenceChangedListener listener)52     public void setListener(OnPreferenceChangedListener listener) {
53         mListener = listener;
54     }
55 
PieController(Activity activity, PieRenderer pie)56     public PieController(Activity 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 
initialize(PreferenceGroup group)64     public void initialize(PreferenceGroup group) {
65         mRenderer.clearItems();
66         mPreferenceMap.clear();
67         setPreferenceGroup(group);
68     }
69 
onSettingChanged(ListPreference pref)70     public void onSettingChanged(ListPreference pref) {
71         if (mListener != null) {
72             mListener.onSharedPreferenceChanged();
73         }
74     }
75 
setCameraId(int cameraId)76     protected void setCameraId(int cameraId) {
77         ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
78         pref.setValue("" + cameraId);
79     }
80 
makeItem(int resId)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 
makeItem(CharSequence value)87     protected PieItem makeItem(CharSequence value) {
88         TextDrawable drawable = new TextDrawable(mActivity.getResources(), value);
89         return new PieItem(drawable, 0);
90     }
91 
makeItem(String prefKey)92     public PieItem makeItem(String prefKey) {
93         final IconListPreference pref =
94                 (IconListPreference) mPreferenceGroup.findPreference(prefKey);
95         if (pref == null) return null;
96         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);
107         item.setLabel(pref.getTitle().toUpperCase());
108         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                 }
119                 inner.setLabel(pref.getLabels()[i]);
120                 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         }
132         return item;
133     }
134 
makeSwitchItem(final String prefKey, boolean addListener)135     public PieItem makeSwitchItem(final String prefKey, boolean addListener) {
136         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);
150         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                     if (!item.isEnabled()) {
160                         return;
161                     }
162                     IconListPreference pref = (IconListPreference) mPreferenceGroup
163                             .findPreference(prefKey);
164                     int index = pref.findIndexOfValue(pref.getValue());
165                     CharSequence[] values = pref.getEntryValues();
166                     index = (index + 1) % values.length;
167                     pref.setValueIndex(index);
168                     fitem.setLabel(pref.getLabels()[index]);
169                     fitem.setImageResource(mActivity,
170                             ((IconListPreference) pref).getLargeIconIds()[index]);
171                     reloadPreference(pref);
172                     onSettingChanged(pref);
173                 }
174             });
175         }
176         return item;
177     }
178 
179 
makeDialItem(ListPreference pref, int iconId, float center, float sweep)180     public PieItem makeDialItem(ListPreference pref, int iconId, float center, float sweep) {
181         PieItem item = makeItem(iconId);
182         return item;
183     }
184 
addItem(String prefKey)185     public void addItem(String prefKey) {
186         PieItem item = makeItem(prefKey);
187         mRenderer.addItem(item);
188     }
189 
updateItem(PieItem item, String prefKey)190     public void updateItem(PieItem item, String prefKey) {
191         IconListPreference pref = (IconListPreference) mPreferenceGroup
192                 .findPreference(prefKey);
193         if (pref != null) {
194             int index = pref.findIndexOfValue(pref.getValue());
195             item.setLabel(pref.getLabels()[index]);
196             item.setImageResource(mActivity,
197                     ((IconListPreference) pref).getLargeIconIds()[index]);
198         }
199     }
200 
setPreferenceGroup(PreferenceGroup group)201     public void setPreferenceGroup(PreferenceGroup group) {
202         mPreferenceGroup = group;
203     }
204 
reloadPreferences()205     public void reloadPreferences() {
206         mPreferenceGroup.reloadValue();
207         for (IconListPreference pref : mPreferenceMap.keySet()) {
208             reloadPreference(pref);
209         }
210     }
211 
reloadPreference(IconListPreference pref)212     private void reloadPreference(IconListPreference pref) {
213         if (pref.getUseSingleIcon()) return;
214         PieItem item = mPreferenceMap.get(pref);
215         String overrideValue = mOverrides.get(pref);
216         int[] iconIds = pref.getLargeIconIds();
217         if (iconIds != null) {
218             // Each entry has a corresponding icon.
219             int index;
220             if (overrideValue == null) {
221                 index = pref.findIndexOfValue(pref.getValue());
222             } else {
223                 index = pref.findIndexOfValue(overrideValue);
224                 if (index == -1) {
225                     // Avoid the crash if camera driver has bugs.
226                     Log.e(TAG, "Fail to find override value=" + overrideValue);
227                     pref.print();
228                     return;
229                 }
230             }
231             item.setImageResource(mActivity, iconIds[index]);
232         } else {
233             // The preference only has a single icon to represent it.
234             item.setImageResource(mActivity, pref.getSingleIcon());
235         }
236     }
237 
238     // Scene mode may override other camera settings (ex: flash mode).
overrideSettings(final String ... keyvalues)239     public void overrideSettings(final String ... keyvalues) {
240         if (keyvalues.length % 2 != 0) {
241             throw new IllegalArgumentException();
242         }
243         for (IconListPreference pref : mPreferenceMap.keySet()) {
244             override(pref, keyvalues);
245         }
246     }
247 
override(IconListPreference pref, final String ... keyvalues)248     private void override(IconListPreference pref, final String ... keyvalues) {
249         mOverrides.remove(pref);
250         for (int i = 0; i < keyvalues.length; i += 2) {
251             String key = keyvalues[i];
252             String value = keyvalues[i + 1];
253             if (key.equals(pref.getKey())) {
254                 mOverrides.put(pref, value);
255                 PieItem item = mPreferenceMap.get(pref);
256                 item.setEnabled(value == null);
257                 break;
258             }
259         }
260         reloadPreference(pref);
261     }
262 }
263