diff options
author | Chih-Chung Chang <chihchung@google.com> | 2011-10-27 19:50:21 +0800 |
---|---|---|
committer | Chih-Chung Chang <chihchung@google.com> | 2011-10-28 12:43:44 +0800 |
commit | 60dc073ff3087af41f9cf3b738eaa74bb2212f95 (patch) | |
tree | 0c9466be7359ed5678602a2d45f6cef8fab98011 /src | |
parent | bc85294715ce88c8378af3b77f7a0d27d7ceeaba (diff) | |
download | LegacyCamera-60dc073ff3087af41f9cf3b738eaa74bb2212f95.zip LegacyCamera-60dc073ff3087af41f9cf3b738eaa74bb2212f95.tar.gz LegacyCamera-60dc073ff3087af41f9cf3b738eaa74bb2212f95.tar.bz2 |
Fix 5310099: Accept an array of default values for ListPreference.
The reason we want an array of default values is some of them may
be unsupported on a hardware platform. The first supported value
in the array will be used as the default value.
Change-Id: I9e372304ec0eaea3181cf70c352a50b82d4b8c58
Diffstat (limited to 'src')
-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 |
3 files changed, 52 insertions, 10 deletions
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; |