package net.bible.android.view.util;
import net.bible.android.activity.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
/**
* @author Martin Denham [mjdenham at gmail dot com]
* @see gnu.lgpl.License for license details.<br>
* The copyright to this program is held by it's author.
*/
public class SeekBarPreference extends DialogPreference implements
SeekBar.OnSeekBarChangeListener {
private static final String androidns = "http://schemas.android.com/apk/res/android";
private SeekBar mSeekBar;
private TextView mDialogMessageView;
private TextView mValueText;
private String mSuffix;
private int mMax, mMin, mValue = 0;
@SuppressWarnings("unused")
private static final String TAG = "SeekBarPreference";
public SeekBarPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setPersistent(true);
mSuffix = attrs.getAttributeValue(androidns, "text");
mMin = attrs.getAttributeIntValue(androidns, "min", 0);
mMax = attrs.getAttributeIntValue(androidns, "max", 100);
setDialogLayoutResource(R.layout.preference_seekbar);
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
mDialogMessageView = (TextView) v.findViewById(R.id.dialogMessage);
mDialogMessageView.setText(getDialogMessage());
mValueText = (TextView) v.findViewById(R.id.actualValue);
mSeekBar = (SeekBar) v.findViewById(R.id.myBar);
mSeekBar.setOnSeekBarChangeListener(this);
mSeekBar.setMax(mMax-mMin);
mSeekBar.setProgress(mValue-mMin);
String t = String.valueOf(mValue);
mValueText.setText(mSuffix == null ? t : t.concat(mSuffix));
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getInt(index, 0);
}
@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
mValue = getPersistedInt(defaultValue == null ? 0 : (Integer) defaultValue);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
int value = mSeekBar.getProgress()+mMin;
if (callChangeListener(value)) {
setValue(value);
}
}
}
public void setValue(int value) {
if (value > mMax) {
value = mMax;
} else if (value < 0) {
value = 0;
}
mValue = value;
persistInt(value);
}
public void setMax(int max) {
mMax = max;
if (mValue > mMax) {
setValue(mMax);
}
}
public void setMin(int min) {
if (min < mMax) {
mMin = min;
}
}
/** update text displays reflecting new value
* called as a result of changing progresBar
* @param value
*/
protected void updateScreenValue(int value) {
String t = String.valueOf(value);
mValueText.setText(mSuffix == null ? t : t.concat(mSuffix));
}
public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {
int newValue = value + mMin;
updateScreenValue(newValue);
}
public void onStartTrackingTouch(SeekBar seek) {
}
public void onStopTrackingTouch(SeekBar seek) {
}
public TextView getDialogMessageView() {
return mDialogMessageView;
}
}