package info.papdt.pano.ui.preference; import android.content.Context; import android.content.res.TypedArray; import android.preference.Preference; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.adw.library.widgets.discreteseekbar.DiscreteSeekBar; import info.papdt.pano.R; import static info.papdt.pano.ui.util.UiUtility.*; public class DiscreteSeekBarPreference extends Preference implements DiscreteSeekBar.OnProgressChangeListener { private int mMin = 0, mMax = 1, mValue = 0, mTmp = Integer.MIN_VALUE; private String mFormat; private DiscreteSeekBar mSeekbar; public DiscreteSeekBarPreference(Context context) { this(context, null); } public DiscreteSeekBarPreference(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DiscreteSeekBarPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); if (attrs != null) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DiscreteSeekBarPreference); mMax = a.getInt(R.styleable.DiscreteSeekBarPreference_dsbp_max, 1); mMin = a.getInt(R.styleable.DiscreteSeekBarPreference_dsbp_min, 0); mFormat = a.getString(R.styleable.DiscreteSeekBarPreference_dsbp_format); mValue = mMin; a.recycle(); if (mFormat == null || mFormat.trim().equals("")) { mFormat = "%d"; } } } @Override protected View onCreateView(ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); return inflater.inflate(R.layout.pref_discrete, parent, false); } @Override protected void onBindView(View view) { super.onBindView(view); mSeekbar = $(view, R.id.dsbp_seek); mSeekbar.setMin(mMin); mSeekbar.setMax(mMax); mSeekbar.setIndicatorFormatter(mFormat); mSeekbar.setProgress(mValue); mSeekbar.setOnProgressChangeListener(this); } @Override public void onStartTrackingTouch(DiscreteSeekBar seekBar) { } @Override public void onProgressChanged(DiscreteSeekBar seekBar, int value, boolean fromUser) { if (fromUser) { mTmp = value; } } @Override public void onStopTrackingTouch(DiscreteSeekBar seekBar) { if (mTmp >= mMin && mTmp <= mMax) { OnPreferenceChangeListener listener = getOnPreferenceChangeListener(); if (listener != null) { listener.onPreferenceChange(this, mTmp); } mValue = mTmp; mTmp = Integer.MIN_VALUE; } } @Override protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { setValue(restorePersistedValue ? getPersistedInt(mValue) : (Integer) defaultValue); } @Override protected Object onGetDefaultValue(TypedArray a, int index) { return a.getInt(index, mMin); } public void setValue(int value) { if (value >= mMin && value <= mMax) { mValue = value; if (mSeekbar != null) mSeekbar.setProgress(value); } } public int getValue() { return mValue; } }