Commit 74a0e397 authored by Mygod's avatar Mygod

Refine #752 and NumberPickerPreference

parent f35a4b05
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<declare-styleable name="DropDownPreference"> <declare-styleable name="DropDownPreference">
<attr name="entries" format="reference" /> <attr name="android:entries" />
<attr name="entryValues" format="reference" /> <attr name="android:entryValues" />
</declare-styleable> </declare-styleable>
<declare-styleable name="NumberPickerPreference"> <declare-styleable name="NumberPickerPreference">
<attr name="max" format="integer" /> <attr name="max" format="integer" />
......
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
<com.github.shadowsocks.preferences.DropDownPreference <com.github.shadowsocks.preferences.DropDownPreference
android:key="encMethod" android:key="encMethod"
android:persistent="false" android:persistent="false"
app:entries="@array/enc_method_entry" android:entries="@array/enc_method_entry"
app:entryValues="@array/enc_method_value" android:entryValues="@array/enc_method_value"
android:summary="%s" android:summary="%s"
android:title="@string/enc_method"/> android:title="@string/enc_method"/>
<SwitchPreference <SwitchPreference
...@@ -55,8 +55,8 @@ ...@@ -55,8 +55,8 @@
<com.github.shadowsocks.preferences.DropDownPreference <com.github.shadowsocks.preferences.DropDownPreference
android:key="route" android:key="route"
android:persistent="false" android:persistent="false"
app:entries="@array/route_entry" android:entries="@array/route_entry"
app:entryValues="@array/route_value" android:entryValues="@array/route_value"
android:summary="%s" android:summary="%s"
android:title="@string/route_list"/> android:title="@string/route_list"/>
<SwitchPreference <SwitchPreference
......
...@@ -5,7 +5,7 @@ import android.content.Context ...@@ -5,7 +5,7 @@ import android.content.Context
import android.content.res.TypedArray import android.content.res.TypedArray
import android.os.Build import android.os.Build
import android.preference.Preference import android.preference.Preference
import android.support.annotation.NonNull import android.support.annotation.{ArrayRes, NonNull}
import android.support.v7.widget.AppCompatSpinner import android.support.v7.widget.AppCompatSpinner
import android.util.AttributeSet import android.util.AttributeSet
import android.view.{View, ViewGroup} import android.view.{View, ViewGroup}
...@@ -23,14 +23,16 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe ...@@ -23,14 +23,16 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe
private val mSpinner = new AppCompatSpinner(mContext) private val mSpinner = new AppCompatSpinner(mContext)
private var mEntries: Array[CharSequence] = _ private var mEntries: Array[CharSequence] = _
private var mEntryValues: Array[CharSequence] = _ private var mEntryValues: Array[CharSequence] = _
private var mSelectedIndex: Int = _ private var mSelectedIndex: Int = -1
private var mValueSet: Boolean = _
mSpinner.setVisibility(View.INVISIBLE) mSpinner.setVisibility(View.INVISIBLE)
mSpinner.setAdapter(mAdapter) mSpinner.setAdapter(mAdapter)
mSpinner.setOnItemSelectedListener(new OnItemSelectedListener { mSpinner.setOnItemSelectedListener(new OnItemSelectedListener {
override def onNothingSelected(parent: AdapterView[_]) { } def onNothingSelected(parent: AdapterView[_]) { }
override def onItemSelected(parent: AdapterView[_], view: View, position: Int, id: Long) = setValueIndex(position) def onItemSelected(parent: AdapterView[_], view: View, position: Int, id: Long) = {
val value = getValue(position)
if (position != mSelectedIndex && callChangeListener(value)) setValue(position, value)
}
}) })
setOnPreferenceClickListener((preference: Preference) => { setOnPreferenceClickListener((preference: Preference) => {
// TODO: not working with scrolling // TODO: not working with scrolling
...@@ -39,8 +41,8 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe ...@@ -39,8 +41,8 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe
true true
}) })
val a: TypedArray = mContext.obtainStyledAttributes(attrs, R.styleable.DropDownPreference) val a: TypedArray = mContext.obtainStyledAttributes(attrs, R.styleable.DropDownPreference)
setEntries(a.getTextArray(R.styleable.DropDownPreference_entries)) setEntries(a.getTextArray(R.styleable.DropDownPreference_android_entries))
mEntryValues = a.getTextArray(R.styleable.DropDownPreference_entryValues) setEntryValues(a.getTextArray(R.styleable.DropDownPreference_android_entryValues))
a.recycle a.recycle
protected override def getSummaryValue = getEntry protected override def getSummaryValue = getEntry
...@@ -62,7 +64,7 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe ...@@ -62,7 +64,7 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe
* @see #setEntries(CharSequence[]) * @see #setEntries(CharSequence[])
* @param entriesResId The entries array as a resource. * @param entriesResId The entries array as a resource.
*/ */
def setEntries(entriesResId: Int): Unit = setEntries(getContext.getResources.getTextArray(entriesResId)) def setEntries(@ArrayRes entriesResId: Int): Unit = setEntries(getContext.getResources.getTextArray(entriesResId))
/** /**
* The list of entries to be shown in the list in subsequent dialogs. * The list of entries to be shown in the list in subsequent dialogs.
* *
...@@ -82,7 +84,7 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe ...@@ -82,7 +84,7 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe
* @see #setEntryValues(CharSequence[]) * @see #setEntryValues(CharSequence[])
* @param entryValuesResId The entry values array as a resource. * @param entryValuesResId The entry values array as a resource.
*/ */
def setEntryValues(entryValuesResId: Int): Unit = def setEntryValues(@ArrayRes entryValuesResId: Int): Unit =
setEntryValues(getContext.getResources.getTextArray(entryValuesResId)) setEntryValues(getContext.getResources.getTextArray(entryValuesResId))
/** /**
* Returns the array of values to be saved for the preference. * Returns the array of values to be saved for the preference.
...@@ -91,40 +93,26 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe ...@@ -91,40 +93,26 @@ final class DropDownPreference(private val mContext: Context, attrs: AttributeSe
*/ */
def getEntryValues: Array[CharSequence] = mEntryValues def getEntryValues: Array[CharSequence] = mEntryValues
private def getValue(index: Int) = (if (mEntryValues == null) index else mEntryValues(index)).toString
/** /**
* Sets the value of the key. This should be one of the entries in [[getEntryValues]]. * Sets the value of the key. This should be one of the entries in [[getEntryValues]].
* *
* @param value The value to set for the key. * @param value The value to set for the key.
*/ */
def setValue(value: String) { def setValue(value: String): Unit = setValue(findIndexOfValue(value), value)
val i = findIndexOfValue(value)
if (i > -1) setValueIndex(i)
}
/** /**
* Sets the value to the given index from the entry values. * Sets the value to the given index from the entry values.
* *
* Remember to callChangeListener() if this extends Preference directly
*
* https://github.com/android/platform_frameworks_base/blob/
* 4535e11fb7010f2b104d3f8b3954407b9f330e0f/core/java/
* android/preference/ListPreference.java#L282
*
* @param index The index of the value to set. * @param index The index of the value to set.
*/ */
def setValueIndex(index: Int) { def setValueIndex(index: Int) = setValue(index, getValue(index))
val changed = mSelectedIndex != index
if (changed || !mValueSet) { private def setValue(index: Int, value: String) {
mSelectedIndex = index persistString(value)
mValueSet = true mSelectedIndex = index
if (mEntryValues != null) {
val value = mEntryValues(index).toString
if (changed) callChangeListener(value)
persistString(value)
}
if (changed) notifyChanged
}
mSpinner.setSelection(index) mSpinner.setSelection(index)
notifyChanged
} }
/** /**
......
...@@ -28,7 +28,7 @@ final class NumberPickerPreference(context: Context, attrs: AttributeSet = null) ...@@ -28,7 +28,7 @@ final class NumberPickerPreference(context: Context, attrs: AttributeSet = null)
def getMin = if (picker == null) 0 else picker.getMinValue def getMin = if (picker == null) 0 else picker.getMinValue
def getMax = picker.getMaxValue def getMax = picker.getMaxValue
def setValue(i: Int) { def setValue(i: Int) {
if (i == getValue || !callChangeListener(i)) return if (i == getValue) return
picker.setValue(i) picker.setValue(i)
value = picker.getValue value = picker.getValue
persistInt(value) persistInt(value)
...@@ -49,7 +49,10 @@ final class NumberPickerPreference(context: Context, attrs: AttributeSet = null) ...@@ -49,7 +49,10 @@ final class NumberPickerPreference(context: Context, attrs: AttributeSet = null)
override protected def onDialogClosed(positiveResult: Boolean) { override protected def onDialogClosed(positiveResult: Boolean) {
picker.clearFocus // commit changes picker.clearFocus // commit changes
super.onDialogClosed(positiveResult) // forward compatibility super.onDialogClosed(positiveResult) // forward compatibility
if (positiveResult) setValue(picker.getValue) else picker.setValue(value) if (positiveResult) {
val value = picker.getValue
if (callChangeListener(value)) setValue(value)
} else picker.setValue(value)
} }
override protected def onGetDefaultValue(a: TypedArray, index: Int) = a.getInt(index, getMin).asInstanceOf[AnyRef] override protected def onGetDefaultValue(a: TypedArray, index: Int) = a.getInt(index, getMin).asInstanceOf[AnyRef]
override protected def onSetInitialValue(restorePersistedValue: Boolean, defaultValue: Any) { override protected def onSetInitialValue(restorePersistedValue: Boolean, defaultValue: Any) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment