/* The following code was written by Matthew Wiggins
* and is released under the APACHE 2.0 license
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* adjusted by Norbert Nagold 2011 <norbert.nagold@gmail.com>
*/
package com.ichi2.ui;
import android.app.AlertDialog;
import android.content.Context;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import com.ichi2.anki.AnkiDroidApp;
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 mValueText;
private Context mContext;
private String mSuffix;
private int mDefault, mMax, mMin, mInterval, mValue = 0;
public SeekBarPreference(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mSuffix = attrs.getAttributeValue(androidns, "text");
mDefault = attrs.getAttributeIntValue(androidns, "defaultValue", 0);
mMax = attrs.getAttributeIntValue(androidns, "max", 100);
mMin = attrs.getAttributeIntValue(AnkiDroidApp.XML_CUSTOM_NAMESPACE, "min", 0);
mInterval = attrs.getAttributeIntValue(AnkiDroidApp.XML_CUSTOM_NAMESPACE, "interval", 1);
}
@Override
protected View onCreateDialogView() {
LinearLayout.LayoutParams params;
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(6, 6, 6, 6);
mValueText = new TextView(mContext);
mValueText.setGravity(Gravity.CENTER_HORIZONTAL);
mValueText.setTextSize(32);
params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(mValueText, params);
mSeekBar = new SeekBar(mContext);
mSeekBar.setOnSeekBarChangeListener(this);
layout.addView(mSeekBar, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
if (shouldPersist()) {
mValue = getPersistedInt(mDefault);
}
mSeekBar.setMax((mMax - mMin) / mInterval);
mSeekBar.setProgress((mValue - mMin) / mInterval);
String t = String.valueOf(mValue);
mValueText.setText(mSuffix == null ? t : t.concat(mSuffix));
return layout;
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
mSeekBar.setMax((mMax - mMin) / mInterval);
mSeekBar.setProgress((mValue - mMin) / mInterval);
}
@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
super.onSetInitialValue(restore, defaultValue);
mValue = getPersistedInt(mDefault);
if (restore) {
mValue = shouldPersist() ? getPersistedInt(mDefault) : 0;
} else {
mValue = (Integer) defaultValue;
}
}
public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {
if (fromTouch) {
mValue = (value * mInterval) + mMin;
String t = String.valueOf(mValue);
mValueText.setText(mSuffix == null ? t : t.concat(mSuffix));
}
}
public int getValue() {
if (mValue == 0) {
return getPersistedInt(mDefault);
} else {
return mValue;
}
}
public void setValue(int value) {
mValue = value;
persistInt(value);
}
public void onStartTrackingTouch(SeekBar seek) {
}
public void onStopTrackingTouch(SeekBar seek) {
if (shouldPersist()) {
persistInt(mValue);
}
callChangeListener(mValue);
this.getDialog().dismiss();
}
@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
super.onPrepareDialogBuilder(builder);
builder.setNegativeButton(null, null);
builder.setPositiveButton(null, null);
builder.setTitle(null);
}
}