diff options
-rw-r--r-- | res/values/arrays.xml | 6 | ||||
-rw-r--r-- | res/values/attrs.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 3 | ||||
-rw-r--r-- | res/xml/camera_preferences.xml | 2 | ||||
-rw-r--r-- | src/com/android/camera/Camera.java | 5 | ||||
-rw-r--r-- | src/com/android/camera/FocusManager.java | 22 | ||||
-rw-r--r-- | src/com/android/camera/ListPreference.java | 35 |
7 files changed, 60 insertions, 15 deletions
diff --git a/res/values/arrays.xml b/res/values/arrays.xml index cf17819..e258ad2 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -294,4 +294,10 @@ <item>@drawable/ic_video_effects_background_disco_holo</item> <item>@drawable/ic_video_effects_background_normal_holo_dark</item> </array> + + <!-- Default focus mode setting.--> + <string-array name="pref_camera_focusmode_default_array" translatable="false"> + <item>continuous-picture</item> + <item>auto</item> + </string-array> </resources> diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 567d205..b6b272a 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -19,7 +19,7 @@ </declare-styleable> <declare-styleable name="ListPreference"> <attr name="key" format="string" /> - <attr name="defaultValue" format="string" /> + <attr name="defaultValue" format="string|reference" /> <attr name="entryValues" format="reference" /> <attr name="entries" format="reference" /> </declare-styleable> diff --git a/res/values/strings.xml b/res/values/strings.xml index ffe4b8a..d1cde99 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -146,9 +146,6 @@ <string name="pref_camera_picturesize_entry_640x480">VGA</string> <string name="pref_camera_picturesize_entry_320x240">QVGA</string> - <!-- Default focus mode setting.--> - <string name="pref_camera_focusmode_default" translatable="false">continuous-picture</string> - <!-- Settings screen, Focus mode title --> <string name="pref_camera_focusmode_title">Focus mode</string> diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml index ee8a091..d9ffcd6 100644 --- a/res/xml/camera_preferences.xml +++ b/res/xml/camera_preferences.xml @@ -60,7 +60,7 @@ camera:entryValues="@array/pref_camera_picturesize_entryvalues" /> <ListPreference camera:key="pref_camera_focusmode_key" - camera:defaultValue="@string/pref_camera_focusmode_default" + camera:defaultValue="@array/pref_camera_focusmode_default_array" camera:title="@string/pref_camera_focusmode_title" camera:entries="@array/pref_camera_focusmode_entries" camera:entryValues="@array/pref_camera_focusmode_entryvalues" /> diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index 2ead501..151ef7a 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -1026,8 +1026,9 @@ public class Camera extends ActivityBase implements FocusManager.Listener, public void onCreate(Bundle icicle) { super.onCreate(icicle); getPreferredCameraId(); - mFocusManager = new FocusManager(mPreferences, - getString(R.string.pref_camera_focusmode_default)); + String[] defaultFocusModes = getResources().getStringArray( + R.array.pref_camera_focusmode_default_array); + mFocusManager = new FocusManager(mPreferences, defaultFocusModes); /* * To reduce startup time, we start the camera open and preview threads. diff --git a/src/com/android/camera/FocusManager.java b/src/com/android/camera/FocusManager.java index 86b92c2..28c81e9 100644 --- a/src/com/android/camera/FocusManager.java +++ b/src/com/android/camera/FocusManager.java @@ -68,7 +68,7 @@ public class FocusManager { private List<Area> mFocusArea; // focus area in driver format private List<Area> mMeteringArea; // metering area in driver format private String mFocusMode; - private String mDefaultFocusMode; + private String[] mDefaultFocusModes; private String mOverrideFocusMode; private Parameters mParameters; private ComboPreferences mPreferences; @@ -97,9 +97,9 @@ public class FocusManager { } } - public FocusManager(ComboPreferences preferences, String defaultFocusMode) { + public FocusManager(ComboPreferences preferences, String[] defaultFocusModes) { mPreferences = preferences; - mDefaultFocusMode = defaultFocusMode; + mDefaultFocusModes = defaultFocusModes; mHandler = new MainHandler(); mMatrix = new Matrix(); } @@ -378,6 +378,7 @@ public class FocusManager { // This can only be called after mParameters is initialized. public String getFocusMode() { if (mOverrideFocusMode != null) return mOverrideFocusMode; + List<String> supportedFocusModes = mParameters.getSupportedFocusModes(); if (mInLongPress) { // Users long-press the shutter button in CAF. Change it to auto @@ -389,9 +390,20 @@ public class FocusManager { } else { // The default is continuous autofocus. mFocusMode = mPreferences.getString( - CameraSettings.KEY_FOCUS_MODE, mDefaultFocusMode); + CameraSettings.KEY_FOCUS_MODE, null); + + // Try to find a supported focus mode from the default list. + if (mFocusMode == null) { + for (int i = 0; i < mDefaultFocusModes.length; i++) { + String mode = mDefaultFocusModes[i]; + if (isSupported(mode, supportedFocusModes)) { + mFocusMode = mode; + break; + } + } + } } - if (!isSupported(mFocusMode, mParameters.getSupportedFocusModes())) { + if (!isSupported(mFocusMode, supportedFocusModes)) { // For some reasons, the driver does not support the current // focus mode. Fall back to auto. if (isSupported(Parameters.FOCUS_MODE_AUTO, diff --git a/src/com/android/camera/ListPreference.java b/src/com/android/camera/ListPreference.java index 6885a37..32cf692 100644 --- a/src/com/android/camera/ListPreference.java +++ b/src/com/android/camera/ListPreference.java @@ -21,6 +21,7 @@ import android.content.SharedPreferences; import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.Log; +import android.util.TypedValue; import java.util.ArrayList; import java.util.List; @@ -33,7 +34,7 @@ public class ListPreference extends CameraPreference { private final String TAG = "ListPreference"; private final String mKey; private String mValue; - private final String mDefaultValue; + private final CharSequence[] mDefaultValues; private CharSequence[] mEntries; private CharSequence[] mEntryValues; @@ -47,7 +48,20 @@ public class ListPreference extends CameraPreference { mKey = Util.checkNotNull( a.getString(R.styleable.ListPreference_key)); - mDefaultValue = a.getString(R.styleable.ListPreference_defaultValue); + + // We allow the defaultValue attribute to be a string or an array of + // strings. The reason we need multiple default values is that some + // of them may be unsupported on a specific platform (for example, + // continuous auto-focus). In that case the first supported value + // in the array will be used. + int attrDefaultValue = R.styleable.ListPreference_defaultValue; + TypedValue tv = a.peekValue(attrDefaultValue); + if (tv != null && tv.type == TypedValue.TYPE_REFERENCE) { + mDefaultValues = a.getTextArray(attrDefaultValue); + } else { + mDefaultValues = new CharSequence[1]; + mDefaultValues[0] = a.getString(attrDefaultValue); + } setEntries(a.getTextArray(R.styleable.ListPreference_entries)); setEntryValues(a.getTextArray( @@ -77,12 +91,27 @@ public class ListPreference extends CameraPreference { public String getValue() { if (!mLoaded) { - mValue = getSharedPreferences().getString(mKey, mDefaultValue); + mValue = getSharedPreferences().getString(mKey, + findSupportedDefaultValue()); mLoaded = true; } return mValue; } + // Find the first value in mDefaultValues which is supported. + private String findSupportedDefaultValue() { + for (int i = 0; i < mDefaultValues.length; i++) { + for (int j = 0; j < mEntryValues.length; j++) { + // Note that mDefaultValues[i] may be null (if unspecified + // in the xml file). + if (mEntryValues[j].equals(mDefaultValues[i])) { + return mDefaultValues[i].toString(); + } + } + } + return null; + } + public void setValue(String value) { if (findIndexOfValue(value) < 0) throw new IllegalArgumentException(); mValue = value; |