PieController.java revision 8872c23e739de38d74f04a8c852ebb5199c905f6
18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* 28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2012 The Android Open Source Project 38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License. 68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at 78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software 118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and 148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License. 158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera; 188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.drawable.Drawable; 208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.Log; 218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.CameraPreference.OnPreferenceChangedListener; 238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.drawable.TextDrawable; 248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieItem; 258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieItem.OnClickListener; 268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieRenderer; 278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.ArrayList; 298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.HashMap; 308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.List; 318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.Map; 328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class PieController { 348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static String TAG = "CAM_piecontrol"; 368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected static final int MODE_PHOTO = 0; 388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected static final int MODE_VIDEO = 1; 398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected CameraActivity mActivity; 418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected PreferenceGroup mPreferenceGroup; 428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected OnPreferenceChangedListener mListener; 438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected PieRenderer mRenderer; 448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private List<IconListPreference> mPreferences; 458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Map<IconListPreference, PieItem> mPreferenceMap; 468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Map<IconListPreference, String> mOverrides; 478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setListener(OnPreferenceChangedListener listener) { 498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener = listener; 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public PieController(CameraActivity activity, PieRenderer pie) { 538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mActivity = activity; 548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mRenderer = pie; 558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferences = new ArrayList<IconListPreference>(); 568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferenceMap = new HashMap<IconListPreference, PieItem>(); 578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOverrides = new HashMap<IconListPreference, String>(); 588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void initialize(PreferenceGroup group) { 618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mRenderer.clearItems(); 628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setPreferenceGroup(group); 638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onSettingChanged(ListPreference pref) { 668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mListener != null) { 678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.onSharedPreferenceChanged(); 688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected void setCameraId(int cameraId) { 728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID); 738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb pref.setValue("" + cameraId); 748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected PieItem makeItem(int resId) { 778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // We need a mutable version as we change the alpha 788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Drawable d = mActivity.getResources().getDrawable(resId).mutate(); 798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return new PieItem(d, 0); 808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb protected PieItem makeItem(CharSequence value) { 838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb TextDrawable drawable = new TextDrawable(mActivity.getResources(), value); 848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return new PieItem(drawable, 0); 858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void addItem(String prefKey, float center, float sweep) { 888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb final IconListPreference pref = 898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb (IconListPreference) mPreferenceGroup.findPreference(prefKey); 908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (pref == null) return; 918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int[] iconIds = pref.getLargeIconIds(); 928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int resid = -1; 938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!pref.getUseSingleIcon() && iconIds != null) { 948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Each entry has a corresponding icon. 958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int index = pref.findIndexOfValue(pref.getValue()); 968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb resid = iconIds[index]; 978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // The preference only has a single icon to represent it. 998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb resid = pref.getSingleIcon(); 1008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb PieItem item = makeItem(resid); 1028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // use center and sweep to determine layout 1038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb item.setFixedSlice(center, sweep); 1048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mRenderer.addItem(item); 1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferences.add(pref); 1068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferenceMap.put(pref, item); 1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int nOfEntries = pref.getEntries().length; 1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (nOfEntries > 1) { 1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < nOfEntries; i++) { 1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb PieItem inner = null; 1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (iconIds != null) { 1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb inner = makeItem(iconIds[i]); 1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb inner = makeItem(pref.getEntries()[i]); 1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb item.addItem(inner); 1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb final int index = i; 1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb inner.setOnClickListener(new OnClickListener() { 1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onClick(PieItem item) { 1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb pref.setValueIndex(index); 1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb reloadPreference(pref); 1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb onSettingChanged(pref); 1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb }); 1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setPreferenceGroup(PreferenceGroup group) { 1318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferenceGroup = group; 1328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void reloadPreferences() { 1358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferenceGroup.reloadValue(); 1368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (IconListPreference pref : mPreferenceMap.keySet()) { 1378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb reloadPreference(pref); 1388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void reloadPreference(IconListPreference pref) { 1428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (pref.getUseSingleIcon()) return; 1438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb PieItem item = mPreferenceMap.get(pref); 1448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String overrideValue = mOverrides.get(pref); 1458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int[] iconIds = pref.getLargeIconIds(); 1468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (iconIds != null) { 1478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Each entry has a corresponding icon. 1488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int index; 1498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (overrideValue == null) { 1508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb index = pref.findIndexOfValue(pref.getValue()); 1518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 1528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb index = pref.findIndexOfValue(overrideValue); 1538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (index == -1) { 1548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Avoid the crash if camera driver has bugs. 1558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Log.e(TAG, "Fail to find override value=" + overrideValue); 1568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb pref.print(); 1578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return; 1588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb item.setImageResource(mActivity, iconIds[index]); 1618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 1628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // The preference only has a single icon to represent it. 1638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb item.setImageResource(mActivity, pref.getSingleIcon()); 1648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Scene mode may override other camera settings (ex: flash mode). 1688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void overrideSettings(final String ... keyvalues) { 1698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (keyvalues.length % 2 != 0) { 1708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb throw new IllegalArgumentException(); 1718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (IconListPreference pref : mPreferenceMap.keySet()) { 1738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb override(pref, keyvalues); 1748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void override(IconListPreference pref, final String ... keyvalues) { 1788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOverrides.remove(pref); 1798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < keyvalues.length; i += 2) { 1808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String key = keyvalues[i]; 1818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String value = keyvalues[i + 1]; 1828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (key.equals(pref.getKey())) { 1838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOverrides.put(pref, value); 1848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb PieItem item = mPreferenceMap.get(pref); 1858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb item.setEnabled(value == null); 1868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 1878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb reloadPreference(pref); 1908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb} 192