package com.androsz.electricsleepbeta.preference; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.res.TypedArray; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import com.androsz.electricsleepbeta.app.SettingsActivity; import com.androsz.electricsleepbeta.widget.DecimalSeekBar; public class SeekBarPreference extends DialogPreference { private static java.text.NumberFormat nf = java.text.NumberFormat.getInstance(); static { nf.setGroupingUsed(false); nf.setMinimumFractionDigits(0); nf.setMaximumFractionDigits(("" + (int) Math.pow(DecimalSeekBar.PRECISION, 0.5)).length()); nf.setMinimumFractionDigits(("" + (int) Math.pow(DecimalSeekBar.PRECISION, 0.5)).length()); } private final Context context; private DecimalSeekBar seekBar; private TextView textView; public SeekBarPreference(final Context context, final AttributeSet attrs) { super(context, attrs); this.context = context; } @Override protected void onDialogClosed(final boolean positiveResult) { if (positiveResult) { persistFloat(seekBar.getFloatProgress()); } } @Override protected Object onGetDefaultValue(final TypedArray a, final int index) { return a.getFloat(index, 0); } @Override protected void onPrepareDialogBuilder(final Builder builder) { final LinearLayout layout = new LinearLayout(context); layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); layout.setOrientation(LinearLayout.VERTICAL); layout.setMinimumWidth(400); layout.setPadding(20, 20, 20, 20); textView = new TextView(context); textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); syncTextViewText(getPersistedFloat(0)); textView.setPadding(5, 5, 5, 5); layout.addView(textView); seekBar = new DecimalSeekBar(context); seekBar.setMax(Math.round(SettingsActivity.MAX_ALARM_SENSITIVITY)); seekBar.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); seekBar.setProgress(getPersistedFloat(0)); seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) { syncTextViewText(progress / DecimalSeekBar.PRECISION); } @Override public void onStartTrackingTouch(final SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { } }); layout.addView(seekBar); builder.setView(layout); builder.setTitle(getTitle()); super.onPrepareDialogBuilder(builder); } @Override protected void onSetInitialValue(final boolean restoreValue, final Object defaultValue) { final float temp = restoreValue ? getPersistedFloat(0) : (Float) defaultValue; if (!restoreValue) { persistFloat(temp); } } private void syncTextViewText(final float progress) { textView.setText(nf.format(progress)); } }