package org.emdev.ui.preference; import org.sufficientlysecure.viewer.R; import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import java.util.IllegalFormatException; import org.emdev.ui.widget.IViewContainer; import org.emdev.ui.widget.SeekBarIncrementHandler; import org.emdev.utils.LengthUtils; import org.emdev.utils.WidgetUtils; public final class SeekBarPreference extends DialogPreference implements OnSeekBarChangeListener { private static final int DEFAULT_MIN_VALUE = 0; private static final int DEFAULT_MAX_VALUE = 100; private static final int DEFAULT_DEFAULT_VALUE = 50; private final int defaultValue; private final int maxValue; private final int minValue; private int currentValue; private SeekBar seekBar; private TextView text; private final SeekBarIncrementHandler handler; public SeekBarPreference(final Context context, final AttributeSet attrs) { super(context, attrs); handler = new SeekBarIncrementHandler(); minValue = WidgetUtils.getIntAttribute(context, attrs, WidgetUtils.EBOOKDROID_NS, WidgetUtils.ATTR_MIN_VALUE, DEFAULT_MIN_VALUE); maxValue = WidgetUtils.getIntAttribute(context, attrs, WidgetUtils.EBOOKDROID_NS, WidgetUtils.ATTR_MAX_VALUE, DEFAULT_MAX_VALUE); defaultValue = WidgetUtils.getIntAttribute(context, attrs, WidgetUtils.ANDROID_NS, WidgetUtils.ATTR_DEFAULT_VALUE, DEFAULT_DEFAULT_VALUE); } public int getValue() { return currentValue; } @Override protected void onSetInitialValue(final boolean restoreValue, final Object defaultValue) { try { currentValue = Integer.parseInt(getPersistedString(LengthUtils.toString(defaultValue))); } catch (NumberFormatException ex) { currentValue = minValue; } } @Override protected View onCreateDialogView() { final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View view = inflater.inflate(R.layout.pref_seek_dialog, null); try { currentValue = Integer.parseInt(getPersistedString(Integer.toString(defaultValue))); } catch (NumberFormatException ex) { currentValue = minValue; } ((TextView) view.findViewById(R.id.pref_seek_min_value)).setText(Integer.toString(minValue)); ((TextView) view.findViewById(R.id.pref_seek_max_value)).setText(Integer.toString(maxValue)); seekBar = (SeekBar) view.findViewById(R.id.pref_seek_bar); seekBar.setMax(maxValue - minValue); seekBar.setProgress(currentValue - minValue); seekBar.setKeyProgressIncrement(1); seekBar.setOnSeekBarChangeListener(this); text = (TextView) view.findViewById(R.id.pref_seek_current_value); text.setText(Integer.toString(currentValue)); handler.init(new IViewContainer.ViewBridge(view), seekBar, R.id.pref_seek_bar_minus, R.id.pref_seek_bar_plus); return view; } @Override protected void onDialogClosed(final boolean positiveResult) { if (positiveResult) { final String value = Integer.toString(currentValue); if (callChangeListener(value)) { if (shouldPersist()) { persistString(value); } notifyChanged(); } } } @Override public CharSequence getSummary() { final String summary = super.getSummary().toString(); int value = minValue; try { value = Integer.parseInt(getPersistedString(Integer.toString(defaultValue))); } catch (NumberFormatException ex) { } try { return String.format(summary, value); } catch (IllegalFormatException ex) { System.err.println("Error on summary formatting for " + getKey()+": " + ex.getMessage()); } return summary; } @Override public void onProgressChanged(final SeekBar seek, final int value, final boolean fromTouch) { currentValue = value + minValue; text.setText(Integer.toString(currentValue)); } @Override public void onStartTrackingTouch(final SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { } }