PhotoController.java revision 3ed120d2204c73ab20d6093f112367de60129eb3
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.content.Context; 20import android.hardware.Camera.Parameters; 21import android.view.LayoutInflater; 22 23import com.android.camera.ui.AbstractSettingPopup; 24import com.android.camera.ui.ListPrefSettingPopup; 25import com.android.camera.ui.MoreSettingPopup; 26import com.android.camera.ui.PieItem; 27import com.android.camera.ui.PieItem.OnClickListener; 28import com.android.camera.ui.PieRenderer; 29 30public class PhotoController extends PieController 31 implements MoreSettingPopup.Listener, 32 ListPrefSettingPopup.Listener { 33 private static String TAG = "CAM_photocontrol"; 34 private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2; 35 private final String mSettingOff; 36 37 private PhotoModule mModule; 38 private String[] mOtherKeys; 39 // First level popup 40 private MoreSettingPopup mPopup; 41 // Second level popup 42 private AbstractSettingPopup mSecondPopup; 43 44 public PhotoController(CameraActivity activity, PhotoModule module, PieRenderer pie) { 45 super(activity, pie); 46 mModule = module; 47 mSettingOff = activity.getString(R.string.setting_off_value); 48 } 49 50 public void initialize(PreferenceGroup group) { 51 super.initialize(group); 52 mPopup = null; 53 mSecondPopup = null; 54 float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2; 55 addItem(CameraSettings.KEY_FLASH_MODE, FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); 56 addItem(CameraSettings.KEY_EXPOSURE, 3 * FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); 57 addItem(CameraSettings.KEY_WHITE_BALANCE, 3 * FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); 58 PieItem item = makeItem(R.drawable.ic_switch_photo_facing_holo_light); 59 item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); 60 item.setOnClickListener(new OnClickListener() { 61 62 @Override 63 public void onClick(PieItem item) { 64 // Find the index of next camera. 65 ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID); 66 if (pref != null) { 67 int index = pref.findIndexOfValue(pref.getValue()); 68 CharSequence[] values = pref.getEntryValues(); 69 index = (index + 1) % values.length; 70 int newCameraId = Integer.parseInt((String) values[index]); 71 mListener.onCameraPickerClicked(newCameraId); 72 } 73 } 74 }); 75 mRenderer.addItem(item); 76 if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) { 77 PieItem hdr = makeItem(R.drawable.ic_hdr); 78 hdr.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep); 79 hdr.setOnClickListener(new OnClickListener() { 80 @Override 81 public void onClick(PieItem item) { 82 // Find the index of next camera. 83 ListPreference pref = mPreferenceGroup 84 .findPreference(CameraSettings.KEY_CAMERA_HDR); 85 if (pref != null) { 86 // toggle hdr value 87 int index = (pref.findIndexOfValue(pref.getValue()) + 1) % 2; 88 pref.setValueIndex(index); 89 onSettingChanged(pref); 90 } 91 } 92 }); 93 mRenderer.addItem(hdr); 94 } 95 mOtherKeys = new String[] { 96 CameraSettings.KEY_SCENE_MODE, 97 CameraSettings.KEY_RECORD_LOCATION, 98 CameraSettings.KEY_PICTURE_SIZE, 99 CameraSettings.KEY_FOCUS_MODE}; 100 item = makeItem(R.drawable.ic_settings_holo_light); 101 item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO * 3, sweep); 102 item.setOnClickListener(new OnClickListener() { 103 @Override 104 public void onClick(PieItem item) { 105 if (mPopup == null) { 106 initializePopup(); 107 } 108 mModule.showPopup(mPopup); 109 } 110 }); 111 mRenderer.addItem(item); 112 } 113 114 protected void setCameraId(int cameraId) { 115 ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID); 116 pref.setValue("" + cameraId); 117 } 118 119 @Override 120 public void reloadPreferences() { 121 super.reloadPreferences(); 122 if (mPopup != null) { 123 mPopup.reloadPreference(); 124 } 125 } 126 127 @Override 128 // Hit when an item in the second-level popup gets selected 129 public void onListPrefChanged(ListPreference pref) { 130 if (mPopup != null && mSecondPopup != null) { 131 mModule.dismissPopup(true); 132 mPopup.reloadPreference(); 133 } 134 onSettingChanged(pref); 135 } 136 137 @Override 138 public void overrideSettings(final String ... keyvalues) { 139 super.overrideSettings(keyvalues); 140 if (mPopup == null) initializePopup(); 141 mPopup.overrideSettings(keyvalues); 142 } 143 144 protected void initializePopup() { 145 LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService( 146 Context.LAYOUT_INFLATER_SERVICE); 147 148 MoreSettingPopup popup = (MoreSettingPopup) inflater.inflate( 149 R.layout.more_setting_popup, null, false); 150 popup.setSettingChangedListener(this); 151 popup.initialize(mPreferenceGroup, mOtherKeys); 152 mPopup = popup; 153 } 154 155 public void popupDismissed(boolean topPopupOnly) { 156 // if the 2nd level popup gets dismissed 157 if (mSecondPopup != null) { 158 mSecondPopup = null; 159 if (topPopupOnly) mModule.showPopup(mPopup); 160 } 161 } 162 163 // Return true if the preference has the specified key but not the value. 164 private static boolean notSame(ListPreference pref, String key, String value) { 165 return (key.equals(pref.getKey()) && !value.equals(pref.getValue())); 166 } 167 168 private void setPreference(String key, String value) { 169 ListPreference pref = mPreferenceGroup.findPreference(key); 170 if (pref != null && !value.equals(pref.getValue())) { 171 pref.setValue(value); 172 reloadPreferences(); 173 } 174 } 175 176 @Override 177 public void onSettingChanged(ListPreference pref) { 178 // Reset the scene mode if HDR is set to on. Reset HDR if scene mode is 179 // set to non-auto. 180 if (notSame(pref, CameraSettings.KEY_CAMERA_HDR, mSettingOff)) { 181 setPreference(CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO); 182 } else if (notSame(pref, CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO)) { 183 setPreference(CameraSettings.KEY_CAMERA_HDR, mSettingOff); 184 } 185 super.onSettingChanged(pref); 186 } 187 188 @Override 189 // Hit when an item in the first-level popup gets selected, then bring up 190 // the second-level popup 191 public void onPreferenceClicked(ListPreference pref) { 192 if (mSecondPopup != null) return; 193 194 LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService( 195 Context.LAYOUT_INFLATER_SERVICE); 196 ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate( 197 R.layout.list_pref_setting_popup, null, false); 198 basic.initialize(pref); 199 basic.setSettingChangedListener(this); 200 mModule.dismissPopup(true); 201 mSecondPopup = basic; 202 mModule.showPopup(mSecondPopup); 203 } 204} 205