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.content.res.Resources; 20 import android.hardware.Camera.Parameters; 21 22 import com.android.camera.ui.AbstractSettingPopup; 23 import com.android.camera.ui.CountdownTimerPopup; 24 import com.android.camera.ui.ListPrefSettingPopup; 25 import com.android.camera.ui.PieItem; 26 import com.android.camera.ui.PieItem.OnClickListener; 27 import com.android.camera.ui.PieRenderer; 28 import com.android.gallery3d.R; 29 30 import java.util.Locale; 31 32 public class PhotoMenu extends PieController 33 implements CountdownTimerPopup.Listener, 34 ListPrefSettingPopup.Listener { 35 private static String TAG = "CAM_photomenu"; 36 37 private final String mSettingOff; 38 39 private PhotoUI mUI; 40 private AbstractSettingPopup mPopup; 41 private CameraActivity mActivity; 42 43 public PhotoMenu(CameraActivity activity, PhotoUI ui, PieRenderer pie) { 44 super(activity, pie); 45 mUI = ui; 46 mSettingOff = activity.getString(R.string.setting_off_value); 47 mActivity = activity; 48 } 49 50 public void initialize(PreferenceGroup group) { 51 super.initialize(group); 52 mPopup = null; 53 PieItem item = null; 54 final Resources res = mActivity.getResources(); 55 Locale locale = res.getConfiguration().locale; 56 // the order is from left to right in the menu 57 58 // hdr 59 if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) { 60 item = makeSwitchItem(CameraSettings.KEY_CAMERA_HDR, true); 61 mRenderer.addItem(item); 62 } 63 // exposure compensation 64 if (group.findPreference(CameraSettings.KEY_EXPOSURE) != null) { 65 item = makeItem(CameraSettings.KEY_EXPOSURE); 66 item.setLabel(res.getString(R.string.pref_exposure_label)); 67 mRenderer.addItem(item); 68 } 69 // more settings 70 PieItem more = makeItem(R.drawable.ic_settings_holo_light); 71 more.setLabel(res.getString(R.string.camera_menu_more_label)); 72 mRenderer.addItem(more); 73 // flash 74 if (group.findPreference(CameraSettings.KEY_FLASH_MODE) != null) { 75 item = makeItem(CameraSettings.KEY_FLASH_MODE); 76 item.setLabel(res.getString(R.string.pref_camera_flashmode_label)); 77 mRenderer.addItem(item); 78 } 79 // camera switcher 80 if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) { 81 item = makeSwitchItem(CameraSettings.KEY_CAMERA_ID, false); 82 final PieItem fitem = item; 83 item.setOnClickListener(new OnClickListener() { 84 @Override 85 public void onClick(PieItem item) { 86 // Find the index of next camera. 87 ListPreference pref = mPreferenceGroup 88 .findPreference(CameraSettings.KEY_CAMERA_ID); 89 if (pref != null) { 90 int index = pref.findIndexOfValue(pref.getValue()); 91 CharSequence[] values = pref.getEntryValues(); 92 index = (index + 1) % values.length; 93 pref.setValueIndex(index); 94 mListener.onCameraPickerClicked(index); 95 } 96 updateItem(fitem, CameraSettings.KEY_CAMERA_ID); 97 } 98 }); 99 mRenderer.addItem(item); 100 } 101 // location 102 if (group.findPreference(CameraSettings.KEY_RECORD_LOCATION) != null) { 103 item = makeSwitchItem(CameraSettings.KEY_RECORD_LOCATION, true); 104 more.addItem(item); 105 if (mActivity.isSecureCamera()) { 106 // Prevent location preference from getting changed in secure camera mode 107 item.setEnabled(false); 108 } 109 } 110 // countdown timer 111 final ListPreference ctpref = group.findPreference(CameraSettings.KEY_TIMER); 112 final ListPreference beeppref = group.findPreference(CameraSettings.KEY_TIMER_SOUND_EFFECTS); 113 item = makeItem(R.drawable.ic_timer); 114 item.setLabel(res.getString(R.string.pref_camera_timer_title).toUpperCase(locale)); 115 item.setOnClickListener(new OnClickListener() { 116 @Override 117 public void onClick(PieItem item) { 118 CountdownTimerPopup timerPopup = (CountdownTimerPopup) mActivity.getLayoutInflater().inflate( 119 R.layout.countdown_setting_popup, null, false); 120 timerPopup.initialize(ctpref, beeppref); 121 timerPopup.setSettingChangedListener(PhotoMenu.this); 122 mUI.dismissPopup(); 123 mPopup = timerPopup; 124 mUI.showPopup(mPopup); 125 } 126 }); 127 more.addItem(item); 128 // image size 129 item = makeItem(R.drawable.ic_imagesize); 130 final ListPreference sizePref = group.findPreference(CameraSettings.KEY_PICTURE_SIZE); 131 item.setLabel(res.getString(R.string.pref_camera_picturesize_title).toUpperCase(locale)); 132 item.setOnClickListener(new OnClickListener() { 133 @Override 134 public void onClick(PieItem item) { 135 ListPrefSettingPopup popup = (ListPrefSettingPopup) mActivity.getLayoutInflater().inflate( 136 R.layout.list_pref_setting_popup, null, false); 137 popup.initialize(sizePref); 138 popup.setSettingChangedListener(PhotoMenu.this); 139 mUI.dismissPopup(); 140 mPopup = popup; 141 mUI.showPopup(mPopup); 142 } 143 }); 144 more.addItem(item); 145 // white balance 146 if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) { 147 item = makeItem(CameraSettings.KEY_WHITE_BALANCE); 148 item.setLabel(res.getString(R.string.pref_camera_whitebalance_label)); 149 more.addItem(item); 150 } 151 // scene mode 152 if (group.findPreference(CameraSettings.KEY_SCENE_MODE) != null) { 153 IconListPreference pref = (IconListPreference) group.findPreference( 154 CameraSettings.KEY_SCENE_MODE); 155 pref.setUseSingleIcon(true); 156 item = makeItem(CameraSettings.KEY_SCENE_MODE); 157 more.addItem(item); 158 } 159 } 160 161 @Override 162 // Hit when an item in a popup gets selected 163 public void onListPrefChanged(ListPreference pref) { 164 if (mPopup != null) { 165 mUI.dismissPopup(); 166 } 167 onSettingChanged(pref); 168 } 169 170 public void popupDismissed() { 171 // the popup gets dismissed 172 if (mPopup != null) { 173 mPopup = null; 174 } 175 } 176 177 // Return true if the preference has the specified key but not the value. 178 private static boolean notSame(ListPreference pref, String key, String value) { 179 return (key.equals(pref.getKey()) && !value.equals(pref.getValue())); 180 } 181 182 private void setPreference(String key, String value) { 183 ListPreference pref = mPreferenceGroup.findPreference(key); 184 if (pref != null && !value.equals(pref.getValue())) { 185 pref.setValue(value); 186 reloadPreferences(); 187 } 188 } 189 190 @Override 191 public void onSettingChanged(ListPreference pref) { 192 // Reset the scene mode if HDR is set to on. Reset HDR if scene mode is 193 // set to non-auto. 194 if (notSame(pref, CameraSettings.KEY_CAMERA_HDR, mSettingOff)) { 195 setPreference(CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO); 196 } else if (notSame(pref, CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO)) { 197 setPreference(CameraSettings.KEY_CAMERA_HDR, mSettingOff); 198 } 199 super.onSettingChanged(pref); 200 } 201 202 } 203