11373b98135b2854578111dd535e24d39c8853f14Michael Kolb/* 21373b98135b2854578111dd535e24d39c8853f14Michael Kolb * Copyright (C) 2012 The Android Open Source Project 31373b98135b2854578111dd535e24d39c8853f14Michael Kolb * 41373b98135b2854578111dd535e24d39c8853f14Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 51373b98135b2854578111dd535e24d39c8853f14Michael Kolb * you may not use this file except in compliance with the License. 61373b98135b2854578111dd535e24d39c8853f14Michael Kolb * You may obtain a copy of the License at 71373b98135b2854578111dd535e24d39c8853f14Michael Kolb * 81373b98135b2854578111dd535e24d39c8853f14Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 91373b98135b2854578111dd535e24d39c8853f14Michael Kolb * 101373b98135b2854578111dd535e24d39c8853f14Michael Kolb * Unless required by applicable law or agreed to in writing, software 111373b98135b2854578111dd535e24d39c8853f14Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 121373b98135b2854578111dd535e24d39c8853f14Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131373b98135b2854578111dd535e24d39c8853f14Michael Kolb * See the License for the specific language governing permissions and 141373b98135b2854578111dd535e24d39c8853f14Michael Kolb * limitations under the License. 151373b98135b2854578111dd535e24d39c8853f14Michael Kolb */ 161373b98135b2854578111dd535e24d39c8853f14Michael Kolb 171373b98135b2854578111dd535e24d39c8853f14Michael Kolbpackage com.android.camera; 181373b98135b2854578111dd535e24d39c8853f14Michael Kolb 193ed120d2204c73ab20d6093f112367de60129eb3John Reckimport android.graphics.drawable.Drawable; 201373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport android.util.Log; 211373b98135b2854578111dd535e24d39c8853f14Michael Kolb 221373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport com.android.camera.CameraPreference.OnPreferenceChangedListener; 233ed120d2204c73ab20d6093f112367de60129eb3John Reckimport com.android.camera.drawable.TextDrawable; 241373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport com.android.camera.ui.PieItem; 253ed120d2204c73ab20d6093f112367de60129eb3John Reckimport com.android.camera.ui.PieItem.OnClickListener; 261373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport com.android.camera.ui.PieRenderer; 271373b98135b2854578111dd535e24d39c8853f14Michael Kolb 281373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.ArrayList; 291373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.HashMap; 301373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.List; 311373b98135b2854578111dd535e24d39c8853f14Michael Kolbimport java.util.Map; 321373b98135b2854578111dd535e24d39c8853f14Michael Kolb 331373b98135b2854578111dd535e24d39c8853f14Michael Kolbpublic class PieController { 341373b98135b2854578111dd535e24d39c8853f14Michael Kolb 351373b98135b2854578111dd535e24d39c8853f14Michael Kolb private static String TAG = "CAM_piecontrol"; 361373b98135b2854578111dd535e24d39c8853f14Michael Kolb 371373b98135b2854578111dd535e24d39c8853f14Michael Kolb protected static final int MODE_PHOTO = 0; 381373b98135b2854578111dd535e24d39c8853f14Michael Kolb protected static final int MODE_VIDEO = 1; 391373b98135b2854578111dd535e24d39c8853f14Michael Kolb 402d3af28f91481d7f3887cb0bb9c5d06375baf787Michael Kolb protected CameraActivity mActivity; 41b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb protected PreferenceGroup mPreferenceGroup; 42b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb protected OnPreferenceChangedListener mListener; 43b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb protected PieRenderer mRenderer; 441373b98135b2854578111dd535e24d39c8853f14Michael Kolb private List<IconListPreference> mPreferences; 451373b98135b2854578111dd535e24d39c8853f14Michael Kolb private Map<IconListPreference, PieItem> mPreferenceMap; 461373b98135b2854578111dd535e24d39c8853f14Michael Kolb private Map<IconListPreference, String> mOverrides; 471373b98135b2854578111dd535e24d39c8853f14Michael Kolb 481373b98135b2854578111dd535e24d39c8853f14Michael Kolb public void setListener(OnPreferenceChangedListener listener) { 491373b98135b2854578111dd535e24d39c8853f14Michael Kolb mListener = listener; 501373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 511373b98135b2854578111dd535e24d39c8853f14Michael Kolb 521373b98135b2854578111dd535e24d39c8853f14Michael Kolb public PieController(CameraActivity activity, PieRenderer pie) { 531373b98135b2854578111dd535e24d39c8853f14Michael Kolb mActivity = activity; 541373b98135b2854578111dd535e24d39c8853f14Michael Kolb mRenderer = pie; 551373b98135b2854578111dd535e24d39c8853f14Michael Kolb mPreferences = new ArrayList<IconListPreference>(); 561373b98135b2854578111dd535e24d39c8853f14Michael Kolb mPreferenceMap = new HashMap<IconListPreference, PieItem>(); 571373b98135b2854578111dd535e24d39c8853f14Michael Kolb mOverrides = new HashMap<IconListPreference, String>(); 581373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 591373b98135b2854578111dd535e24d39c8853f14Michael Kolb 60b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb public void initialize(PreferenceGroup group) { 611373b98135b2854578111dd535e24d39c8853f14Michael Kolb mRenderer.clearItems(); 621373b98135b2854578111dd535e24d39c8853f14Michael Kolb setPreferenceGroup(group); 631373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 641373b98135b2854578111dd535e24d39c8853f14Michael Kolb 65ad30bda0d0103bd8a93eb834c234341b1ab1e77fWu-cheng Li public void onSettingChanged(ListPreference pref) { 661373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (mListener != null) { 671373b98135b2854578111dd535e24d39c8853f14Michael Kolb mListener.onSharedPreferenceChanged(); 681373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 691373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 701373b98135b2854578111dd535e24d39c8853f14Michael Kolb 711373b98135b2854578111dd535e24d39c8853f14Michael Kolb protected void setCameraId(int cameraId) { 721373b98135b2854578111dd535e24d39c8853f14Michael Kolb ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID); 731373b98135b2854578111dd535e24d39c8853f14Michael Kolb pref.setValue("" + cameraId); 741373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 751373b98135b2854578111dd535e24d39c8853f14Michael Kolb 761373b98135b2854578111dd535e24d39c8853f14Michael Kolb protected PieItem makeItem(int resId) { 773ed120d2204c73ab20d6093f112367de60129eb3John Reck // We need a mutable version as we change the alpha 783ed120d2204c73ab20d6093f112367de60129eb3John Reck Drawable d = mActivity.getResources().getDrawable(resId).mutate(); 793ed120d2204c73ab20d6093f112367de60129eb3John Reck return new PieItem(d, 0); 801373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 811373b98135b2854578111dd535e24d39c8853f14Michael Kolb 821373b98135b2854578111dd535e24d39c8853f14Michael Kolb protected PieItem makeItem(CharSequence value) { 833ed120d2204c73ab20d6093f112367de60129eb3John Reck TextDrawable drawable = new TextDrawable(mActivity.getResources(), value); 843ed120d2204c73ab20d6093f112367de60129eb3John Reck return new PieItem(drawable, 0); 851373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 861373b98135b2854578111dd535e24d39c8853f14Michael Kolb 87b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb public void addItem(String prefKey, float center, float sweep) { 88b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb final IconListPreference pref = 89b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb (IconListPreference) mPreferenceGroup.findPreference(prefKey); 90b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb if (pref == null) return; 911373b98135b2854578111dd535e24d39c8853f14Michael Kolb int[] iconIds = pref.getLargeIconIds(); 921373b98135b2854578111dd535e24d39c8853f14Michael Kolb int resid = -1; 93ec6a318cdba09ff85bdcacd861442b617399b6daMichael Kolb if (!pref.getUseSingleIcon() && iconIds != null) { 941373b98135b2854578111dd535e24d39c8853f14Michael Kolb // Each entry has a corresponding icon. 951373b98135b2854578111dd535e24d39c8853f14Michael Kolb int index = pref.findIndexOfValue(pref.getValue()); 961373b98135b2854578111dd535e24d39c8853f14Michael Kolb resid = iconIds[index]; 971373b98135b2854578111dd535e24d39c8853f14Michael Kolb } else { 981373b98135b2854578111dd535e24d39c8853f14Michael Kolb // The preference only has a single icon to represent it. 991373b98135b2854578111dd535e24d39c8853f14Michael Kolb resid = pref.getSingleIcon(); 1001373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1011373b98135b2854578111dd535e24d39c8853f14Michael Kolb PieItem item = makeItem(resid); 102b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb // use center and sweep to determine layout 103b5b59b88683823d70faac7b3454519d53c51180bMichael Kolb item.setFixedSlice(center, sweep); 1041373b98135b2854578111dd535e24d39c8853f14Michael Kolb mRenderer.addItem(item); 1051373b98135b2854578111dd535e24d39c8853f14Michael Kolb mPreferences.add(pref); 1061373b98135b2854578111dd535e24d39c8853f14Michael Kolb mPreferenceMap.put(pref, item); 1071373b98135b2854578111dd535e24d39c8853f14Michael Kolb int nOfEntries = pref.getEntries().length; 1081373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (nOfEntries > 1) { 1091373b98135b2854578111dd535e24d39c8853f14Michael Kolb for (int i = 0; i < nOfEntries; i++) { 1101373b98135b2854578111dd535e24d39c8853f14Michael Kolb PieItem inner = null; 1111373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (iconIds != null) { 1121373b98135b2854578111dd535e24d39c8853f14Michael Kolb inner = makeItem(iconIds[i]); 1131373b98135b2854578111dd535e24d39c8853f14Michael Kolb } else { 1141373b98135b2854578111dd535e24d39c8853f14Michael Kolb inner = makeItem(pref.getEntries()[i]); 1151373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1161373b98135b2854578111dd535e24d39c8853f14Michael Kolb item.addItem(inner); 1171373b98135b2854578111dd535e24d39c8853f14Michael Kolb final int index = i; 1183ed120d2204c73ab20d6093f112367de60129eb3John Reck inner.setOnClickListener(new OnClickListener() { 1191373b98135b2854578111dd535e24d39c8853f14Michael Kolb @Override 1203ed120d2204c73ab20d6093f112367de60129eb3John Reck public void onClick(PieItem item) { 1211373b98135b2854578111dd535e24d39c8853f14Michael Kolb pref.setValueIndex(index); 1221373b98135b2854578111dd535e24d39c8853f14Michael Kolb reloadPreference(pref); 123ad30bda0d0103bd8a93eb834c234341b1ab1e77fWu-cheng Li onSettingChanged(pref); 1241373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1251373b98135b2854578111dd535e24d39c8853f14Michael Kolb }); 1261373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1271373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1281373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1291373b98135b2854578111dd535e24d39c8853f14Michael Kolb 1301373b98135b2854578111dd535e24d39c8853f14Michael Kolb public void setPreferenceGroup(PreferenceGroup group) { 1311373b98135b2854578111dd535e24d39c8853f14Michael Kolb mPreferenceGroup = group; 1321373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1331373b98135b2854578111dd535e24d39c8853f14Michael Kolb 1341373b98135b2854578111dd535e24d39c8853f14Michael Kolb public void reloadPreferences() { 1351373b98135b2854578111dd535e24d39c8853f14Michael Kolb mPreferenceGroup.reloadValue(); 1361373b98135b2854578111dd535e24d39c8853f14Michael Kolb for (IconListPreference pref : mPreferenceMap.keySet()) { 1371373b98135b2854578111dd535e24d39c8853f14Michael Kolb reloadPreference(pref); 1381373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1391373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1401373b98135b2854578111dd535e24d39c8853f14Michael Kolb 1411373b98135b2854578111dd535e24d39c8853f14Michael Kolb private void reloadPreference(IconListPreference pref) { 142ec6a318cdba09ff85bdcacd861442b617399b6daMichael Kolb if (pref.getUseSingleIcon()) return; 1431373b98135b2854578111dd535e24d39c8853f14Michael Kolb PieItem item = mPreferenceMap.get(pref); 1441373b98135b2854578111dd535e24d39c8853f14Michael Kolb String overrideValue = mOverrides.get(pref); 1451373b98135b2854578111dd535e24d39c8853f14Michael Kolb int[] iconIds = pref.getLargeIconIds(); 1461373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (iconIds != null) { 1471373b98135b2854578111dd535e24d39c8853f14Michael Kolb // Each entry has a corresponding icon. 1481373b98135b2854578111dd535e24d39c8853f14Michael Kolb int index; 1491373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (overrideValue == null) { 1501373b98135b2854578111dd535e24d39c8853f14Michael Kolb index = pref.findIndexOfValue(pref.getValue()); 1511373b98135b2854578111dd535e24d39c8853f14Michael Kolb } else { 1521373b98135b2854578111dd535e24d39c8853f14Michael Kolb index = pref.findIndexOfValue(overrideValue); 1531373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (index == -1) { 1541373b98135b2854578111dd535e24d39c8853f14Michael Kolb // Avoid the crash if camera driver has bugs. 1551373b98135b2854578111dd535e24d39c8853f14Michael Kolb Log.e(TAG, "Fail to find override value=" + overrideValue); 1561373b98135b2854578111dd535e24d39c8853f14Michael Kolb pref.print(); 1571373b98135b2854578111dd535e24d39c8853f14Michael Kolb return; 1581373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1591373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1603ed120d2204c73ab20d6093f112367de60129eb3John Reck item.setImageResource(mActivity, iconIds[index]); 1611373b98135b2854578111dd535e24d39c8853f14Michael Kolb } else { 1621373b98135b2854578111dd535e24d39c8853f14Michael Kolb // The preference only has a single icon to represent it. 1633ed120d2204c73ab20d6093f112367de60129eb3John Reck item.setImageResource(mActivity, pref.getSingleIcon()); 1641373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1651373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1661373b98135b2854578111dd535e24d39c8853f14Michael Kolb 1671373b98135b2854578111dd535e24d39c8853f14Michael Kolb // Scene mode may override other camera settings (ex: flash mode). 1681373b98135b2854578111dd535e24d39c8853f14Michael Kolb public void overrideSettings(final String ... keyvalues) { 1691373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (keyvalues.length % 2 != 0) { 1701373b98135b2854578111dd535e24d39c8853f14Michael Kolb throw new IllegalArgumentException(); 1711373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1721373b98135b2854578111dd535e24d39c8853f14Michael Kolb for (IconListPreference pref : mPreferenceMap.keySet()) { 1731373b98135b2854578111dd535e24d39c8853f14Michael Kolb override(pref, keyvalues); 1741373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1751373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1761373b98135b2854578111dd535e24d39c8853f14Michael Kolb 1771373b98135b2854578111dd535e24d39c8853f14Michael Kolb private void override(IconListPreference pref, final String ... keyvalues) { 1781373b98135b2854578111dd535e24d39c8853f14Michael Kolb mOverrides.remove(pref); 1791373b98135b2854578111dd535e24d39c8853f14Michael Kolb for (int i = 0; i < keyvalues.length; i += 2) { 1801373b98135b2854578111dd535e24d39c8853f14Michael Kolb String key = keyvalues[i]; 1811373b98135b2854578111dd535e24d39c8853f14Michael Kolb String value = keyvalues[i + 1]; 1821373b98135b2854578111dd535e24d39c8853f14Michael Kolb if (key.equals(pref.getKey())) { 1831373b98135b2854578111dd535e24d39c8853f14Michael Kolb mOverrides.put(pref, value); 1841373b98135b2854578111dd535e24d39c8853f14Michael Kolb PieItem item = mPreferenceMap.get(pref); 1851373b98135b2854578111dd535e24d39c8853f14Michael Kolb item.setEnabled(value == null); 1861373b98135b2854578111dd535e24d39c8853f14Michael Kolb break; 1871373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1881373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1891373b98135b2854578111dd535e24d39c8853f14Michael Kolb reloadPreference(pref); 1901373b98135b2854578111dd535e24d39c8853f14Michael Kolb } 1911373b98135b2854578111dd535e24d39c8853f14Michael Kolb} 192