package com.limelight.preferences; import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; // Based on a Stack Overflow example: http://stackoverflow.com/questions/1974193/slider-on-my-preferencescreen public class SeekBarPreference extends DialogPreference { private static final String SCHEMA_URL = "http://schemas.android.com/apk/res/android"; private SeekBar seekBar; private TextView valueText; private final Context context; private final String dialogMessage; private final String suffix; private final int defaultValue; private final int maxValue; private final int minValue; private int currentValue; public SeekBarPreference(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; // Read the message from XML int dialogMessageId = attrs.getAttributeResourceValue(SCHEMA_URL, "dialogMessage", 0); if (dialogMessageId == 0) { dialogMessage = attrs.getAttributeValue(SCHEMA_URL, "dialogMessage"); } else { dialogMessage = context.getString(dialogMessageId); } // Get the suffix for the number displayed in the dialog int suffixId = attrs.getAttributeResourceValue(SCHEMA_URL, "text", 0); if (suffixId == 0) { suffix = attrs.getAttributeValue(SCHEMA_URL, "text"); } else { suffix = context.getString(suffixId); } // Get default, min, and max seekbar values defaultValue = attrs.getAttributeIntValue(SCHEMA_URL, "defaultValue", PreferenceConfiguration.getDefaultBitrate(context)); maxValue = attrs.getAttributeIntValue(SCHEMA_URL, "max", 100); minValue = 1; } @Override protected View onCreateDialogView() { LinearLayout.LayoutParams params; LinearLayout layout = new LinearLayout(context); layout.setOrientation(LinearLayout.VERTICAL); layout.setPadding(6, 6, 6, 6); TextView splashText = new TextView(context); splashText.setPadding(30, 10, 30, 10); if (dialogMessage != null) { splashText.setText(dialogMessage); } layout.addView(splashText); valueText = new TextView(context); valueText.setGravity(Gravity.CENTER_HORIZONTAL); valueText.setTextSize(32); params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layout.addView(valueText, params); seekBar = new SeekBar(context); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int value, boolean b) { if (value < minValue) { seekBar.setProgress(minValue); return; } String t = String.valueOf(value); valueText.setText(suffix == null ? t : t.concat(suffix.length() > 1 ? " "+suffix : suffix)); } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} }); layout.addView(seekBar, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); if (shouldPersist()) { currentValue = getPersistedInt(defaultValue); } seekBar.setMax(maxValue); seekBar.setProgress(currentValue); return layout; } @Override protected void onBindDialogView(View v) { super.onBindDialogView(v); seekBar.setMax(maxValue); seekBar.setProgress(currentValue); } @Override protected void onSetInitialValue(boolean restore, Object defaultValue) { super.onSetInitialValue(restore, defaultValue); if (restore) { currentValue = shouldPersist() ? getPersistedInt(this.defaultValue) : 0; } else { currentValue = (Integer) defaultValue; } } public void setProgress(int progress) { this.currentValue = progress; if (seekBar != null) { seekBar.setProgress(progress); } } public int getProgress() { return currentValue; } @Override public void showDialog(Bundle state) { super.showDialog(state); Button positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); positiveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (shouldPersist()) { currentValue = seekBar.getProgress(); persistInt(seekBar.getProgress()); callChangeListener(seekBar.getProgress()); } getDialog().dismiss(); } }); } }