CameraSettings.java revision ed6661e212048dc3e143c48402b3935911c3741c
1package com.android.camera; 2 3import android.app.Activity; 4import android.content.Context; 5import android.content.SharedPreferences; 6import android.hardware.Camera.Parameters; 7import android.hardware.Camera.Size; 8import android.os.SystemProperties; 9import android.preference.ListPreference; 10import android.preference.Preference; 11import android.preference.PreferenceGroup; 12import android.preference.PreferenceManager; 13import android.preference.PreferenceScreen; 14 15import java.util.ArrayList; 16import java.util.List; 17 18public class CameraSettings { 19 private static final int FIRST_REQUEST_CODE = 100; 20 private static final int NOT_FOUND = -1; 21 22 public static final String KEY_VERSION = "pref_version_key"; 23 public static final String KEY_RECORD_LOCATION = 24 "pref_camera_recordlocation_key"; 25 public static final String KEY_VIDEO_QUALITY = 26 "pref_camera_videoquality_key"; 27 public static final String KEY_VIDEO_DURATION = 28 "pref_camera_video_duration_key"; 29 public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key"; 30 public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key"; 31 public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key"; 32 public static final String KEY_FLASH_MODE = "pref_camera_flashmode_key"; 33 public static final String KEY_COLOR_EFFECT = "pref_camera_coloreffect_key"; 34 public static final String KEY_WHITE_BALANCE = 35 "pref_camera_whitebalance_key"; 36 public static final String KEY_SCENE_MODE = "pref_camera_scenemode_key"; 37 38 public static final int CURRENT_VERSION = 1; 39 40 // max mms video duration in seconds. 41 public static final int MMS_VIDEO_DURATION = 42 SystemProperties.getInt("ro.media.enc.lprof.duration", 60); 43 44 public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true; 45 46 // MMS video length 47 public static final int DEFAULT_VIDEO_DURATION_VALUE = -1; 48 49 private static final String TAG = "CameraSettings"; 50 51 private final Context mContext; 52 private final Parameters mParameters; 53 private final PreferenceManager mManager; 54 55 public CameraSettings(Activity activity, Parameters parameters) { 56 mContext = activity; 57 mParameters = parameters; 58 mManager = new PreferenceManager(activity, FIRST_REQUEST_CODE); 59 } 60 61 public PreferenceScreen getPreferenceScreen(int preferenceRes) { 62 PreferenceScreen screen = mManager.createPreferenceScreen(mContext); 63 mManager.inflateFromResource(mContext, preferenceRes, screen); 64 initPreference(screen); 65 return screen; 66 } 67 68 private void initPreference(PreferenceScreen screen) { 69 ListPreference videoDuration = 70 (ListPreference) screen.findPreference(KEY_VIDEO_DURATION); 71 ListPreference pictureSize = 72 (ListPreference) screen.findPreference(KEY_PICTURE_SIZE); 73 ListPreference whiteBalance = 74 (ListPreference) screen.findPreference(KEY_WHITE_BALANCE); 75 ListPreference colorEffect = 76 (ListPreference) screen.findPreference(KEY_COLOR_EFFECT); 77 ListPreference sceneMode = 78 (ListPreference) screen.findPreference(KEY_SCENE_MODE); 79 ListPreference flashMode = 80 (ListPreference) screen.findPreference(KEY_FLASH_MODE); 81 82 // Since the screen could be loaded from different resources, we need 83 // to check if the preference is available here 84 if (videoDuration != null) { 85 // Modify video duration settings. 86 // The first entry is for MMS video duration, and we need to fill 87 // in the device-dependent value (in seconds). 88 CharSequence[] entries = videoDuration.getEntries(); 89 entries[0] = String.format( 90 entries[0].toString(), MMS_VIDEO_DURATION); 91 } 92 93 // Filter out unsupported settings / options 94 if (pictureSize != null) { 95 filterUnsupportedOptions(screen, pictureSize, sizeListToStringList( 96 mParameters.getSupportedPictureSizes())); 97 } 98 if (whiteBalance != null) { 99 filterUnsupportedOptions(screen, 100 whiteBalance, mParameters.getSupportedWhiteBalance()); 101 } 102 if (colorEffect != null) { 103 filterUnsupportedOptions(screen, 104 colorEffect, mParameters.getSupportedColorEffects()); 105 } 106 if (sceneMode != null) { 107 filterUnsupportedOptions(screen, 108 sceneMode, mParameters.getSupportedSceneModes()); 109 } 110 if (flashMode != null) { 111 filterUnsupportedOptions(screen, 112 flashMode, mParameters.getSupportedFlashModes()); 113 } 114 } 115 116 private boolean removePreference(PreferenceGroup group, Preference remove) { 117 if (group.removePreference(remove)) return true; 118 119 for (int i = 0; i < group.getPreferenceCount(); i++) { 120 final Preference child = group.getPreference(i); 121 if (child instanceof PreferenceGroup) { 122 if (removePreference((PreferenceGroup) child, remove)) { 123 return true; 124 } 125 } 126 } 127 return false; 128 } 129 130 private void filterUnsupportedOptions(PreferenceScreen screen, 131 ListPreference pref, List<String> supported) { 132 133 // Remove the preference if the parameter is not supported. 134 if (supported == null) { 135 removePreference(screen, pref); 136 return; 137 } 138 139 // Prepare setting entries and entry values. 140 CharSequence[] allEntries = pref.getEntries(); 141 CharSequence[] allEntryValues = pref.getEntryValues(); 142 ArrayList<CharSequence> entries = new ArrayList<CharSequence>(); 143 ArrayList<CharSequence> entryValues = new ArrayList<CharSequence>(); 144 for (int i = 0, len = allEntryValues.length; i < len; i++) { 145 if (supported.indexOf(allEntryValues[i].toString()) != NOT_FOUND) { 146 entries.add(allEntries[i]); 147 entryValues.add(allEntryValues[i]); 148 } 149 } 150 151 // Set entries and entry values to list preference. 152 pref.setEntries(entries.toArray(new CharSequence[entries.size()])); 153 pref.setEntryValues(entryValues.toArray( 154 new CharSequence[entryValues.size()])); 155 156 // Set the value to the first entry if it is invalid. 157 String value = pref.getValue(); 158 if (pref.findIndexOfValue(value) == NOT_FOUND) { 159 pref.setValueIndex(0); 160 } 161 } 162 163 private static List<String> sizeListToStringList(List<Size> sizes) { 164 ArrayList<String> list = new ArrayList<String>(); 165 for (Size size : sizes) { 166 list.add(String.format("%dx%d", size.width, size.height)); 167 } 168 return list; 169 } 170 171 public static void upgradePreferences(SharedPreferences pref) { 172 int version; 173 try { 174 version = pref.getInt(KEY_VERSION, 0); 175 } catch (Exception ex) { 176 version = 0; 177 } 178 179 if (version == 0) { 180 SharedPreferences.Editor editor = pref.edit(); 181 // For old version, change 1 to -1 for video duration preference. 182 if (pref.getString(KEY_VIDEO_DURATION, "1").equals("1")) { 183 editor.putString(KEY_VIDEO_DURATION, "-1"); 184 } 185 editor.putInt(KEY_VERSION, CURRENT_VERSION); 186 editor.commit(); 187 } 188 } 189} 190