PieController.java revision 2d3af28f91481d7f3887cb0bb9c5d06375baf787
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 17package com.android.camera; 18 19import android.graphics.Color; 20import android.util.Log; 21import android.view.Gravity; 22import android.view.View; 23import android.view.View.OnClickListener; 24import android.view.ViewGroup.LayoutParams; 25import android.widget.ImageView; 26import android.widget.ImageView.ScaleType; 27import android.widget.TextView; 28 29import com.android.camera.CameraPreference.OnPreferenceChangedListener; 30import com.android.camera.ui.PieItem; 31import com.android.camera.ui.PieRenderer; 32 33import java.util.ArrayList; 34import java.util.HashMap; 35import java.util.List; 36import java.util.Map; 37 38public class PieController { 39 40 private static String TAG = "CAM_piecontrol"; 41 42 protected static final int MODE_PHOTO = 0; 43 protected static final int MODE_VIDEO = 1; 44 45 protected CameraActivity mActivity; 46 protected PreferenceGroup mPreferenceGroup; 47 protected OnPreferenceChangedListener mListener; 48 protected PieRenderer mRenderer; 49 private List<IconListPreference> mPreferences; 50 private Map<IconListPreference, PieItem> mPreferenceMap; 51 private Map<IconListPreference, String> mOverrides; 52 private int mItemSize; 53 54 public void setListener(OnPreferenceChangedListener listener) { 55 mListener = listener; 56 } 57 58 public PieController(CameraActivity activity, PieRenderer pie) { 59 mActivity = activity; 60 mRenderer = pie; 61 mPreferences = new ArrayList<IconListPreference>(); 62 mPreferenceMap = new HashMap<IconListPreference, PieItem>(); 63 mOverrides = new HashMap<IconListPreference, String>(); 64 mItemSize = activity.getResources().getDimensionPixelSize(R.dimen.pie_view_size); 65 } 66 67 public void initialize(PreferenceGroup group) { 68 mRenderer.clearItems(); 69 setPreferenceGroup(group); 70 } 71 72 public void onSettingChanged() { 73 if (mListener != null) { 74 mListener.onSharedPreferenceChanged(); 75 } 76 } 77 78 protected void setCameraId(int cameraId) { 79 ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID); 80 pref.setValue("" + cameraId); 81 } 82 83 protected PieItem makeItem(int resId) { 84 ImageView view = new ImageView(mActivity); 85 view.setImageResource(resId); 86 view.setMinimumWidth(mItemSize); 87 view.setMinimumHeight(mItemSize); 88 view.setScaleType(ScaleType.CENTER); 89 LayoutParams lp = new LayoutParams(mItemSize, mItemSize); 90 view.setLayoutParams(lp); 91 return new PieItem(view, 0); 92 } 93 94 protected PieItem makeItem(CharSequence value) { 95 TextView view = new TextView(mActivity); 96 view.setText(value); 97 view.setMinimumWidth(mItemSize); 98 view.setMinimumHeight(mItemSize); 99 view.setGravity(Gravity.CENTER); 100 view.setTextColor(Color.WHITE); 101 LayoutParams lp = new LayoutParams(mItemSize, mItemSize); 102 view.setLayoutParams(lp); 103 return new PieItem(view, 0); 104 } 105 106 public void addItem(String prefKey, float center, float sweep) { 107 final IconListPreference pref = 108 (IconListPreference) mPreferenceGroup.findPreference(prefKey); 109 if (pref == null) return; 110 int[] iconIds = pref.getLargeIconIds(); 111 int resid = -1; 112 if (iconIds != null) { 113 // Each entry has a corresponding icon. 114 int index = pref.findIndexOfValue(pref.getValue()); 115 resid = iconIds[index]; 116 } else { 117 // The preference only has a single icon to represent it. 118 resid = pref.getSingleIcon(); 119 } 120 PieItem item = makeItem(resid); 121 // use center and sweep to determine layout 122 item.setFixedSlice(center, sweep); 123 mRenderer.addItem(item); 124 mPreferences.add(pref); 125 mPreferenceMap.put(pref, item); 126 int nOfEntries = pref.getEntries().length; 127 if (nOfEntries > 1) { 128 for (int i = 0; i < nOfEntries; i++) { 129 PieItem inner = null; 130 if (iconIds != null) { 131 inner = makeItem(iconIds[i]); 132 } else { 133 inner = makeItem(pref.getEntries()[i]); 134 } 135 item.addItem(inner); 136 final int index = i; 137 inner.getView().setOnClickListener(new OnClickListener() { 138 @Override 139 public void onClick(View v) { 140 pref.setValueIndex(index); 141 reloadPreference(pref); 142 onSettingChanged(); 143 } 144 }); 145 } 146 } 147 } 148 149 public void setPreferenceGroup(PreferenceGroup group) { 150 mPreferenceGroup = group; 151 // Preset the current mode from the title of preference group. 152 String title = group.getTitle(); 153 if (title.equals(mActivity.getString( 154 R.string.pref_camcorder_settings_category))) { 155// mCurrentMode = MODE_VIDEO; 156 } 157 } 158 159 public void reloadPreferences() { 160 mPreferenceGroup.reloadValue(); 161 for (IconListPreference pref : mPreferenceMap.keySet()) { 162 reloadPreference(pref); 163 } 164 } 165 166 private void reloadPreference(IconListPreference pref) { 167 PieItem item = mPreferenceMap.get(pref); 168 String overrideValue = mOverrides.get(pref); 169 int[] iconIds = pref.getLargeIconIds(); 170 if (iconIds != null) { 171 // Each entry has a corresponding icon. 172 int index; 173 if (overrideValue == null) { 174 index = pref.findIndexOfValue(pref.getValue()); 175 } else { 176 index = pref.findIndexOfValue(overrideValue); 177 if (index == -1) { 178 // Avoid the crash if camera driver has bugs. 179 Log.e(TAG, "Fail to find override value=" + overrideValue); 180 pref.print(); 181 return; 182 } 183 } 184 ((ImageView) item.getView()).setImageResource(iconIds[index]); 185 } else { 186 // The preference only has a single icon to represent it. 187 ((ImageView) item.getView()).setImageResource(pref.getSingleIcon()); 188 } 189 } 190 191 // Scene mode may override other camera settings (ex: flash mode). 192 public void overrideSettings(final String ... keyvalues) { 193 if (keyvalues.length % 2 != 0) { 194 throw new IllegalArgumentException(); 195 } 196 for (IconListPreference pref : mPreferenceMap.keySet()) { 197 override(pref, keyvalues); 198 } 199 } 200 201 private void override(IconListPreference pref, final String ... keyvalues) { 202 mOverrides.remove(pref); 203 for (int i = 0; i < keyvalues.length; i += 2) { 204 String key = keyvalues[i]; 205 String value = keyvalues[i + 1]; 206 if (key.equals(pref.getKey())) { 207 mOverrides.put(pref, value); 208 PieItem item = mPreferenceMap.get(pref); 209 item.setEnabled(value == null); 210 break; 211 } 212 } 213 reloadPreference(pref); 214 } 215} 216