2 * Copyright 2012 Jay Weisskopf
4 * Licensed under the MIT License (see LICENSE.txt)
7 //package net.jayschwa.android.preference;
8 package org.jwz.xscreensaver;
11 import android.content.Context;
12 import android.content.res.TypedArray;
13 import android.preference.DialogPreference;
14 import android.util.AttributeSet;
15 import android.view.View;
16 import android.widget.SeekBar;
19 * @author Jay Weisskopf
21 public class SliderPreference extends DialogPreference {
23 protected final static int SEEKBAR_RESOLUTION = 10000;
25 protected float mValue;
26 protected int mSeekBarValue;
27 protected CharSequence[] mSummaries;
33 public SliderPreference(Context context, AttributeSet attrs) {
34 super(context, attrs);
35 setup(context, attrs);
43 public SliderPreference(Context context, AttributeSet attrs, int defStyle) {
44 super(context, attrs, defStyle);
45 setup(context, attrs);
48 private void setup(Context context, AttributeSet attrs) {
49 setDialogLayoutResource(R.layout.slider_preference_dialog);
50 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SliderPreference);
52 setSummary(a.getTextArray(R.styleable.SliderPreference_android_summary));
53 } catch (Exception e) {
60 protected Object onGetDefaultValue(TypedArray a, int index) {
61 return a.getFloat(index, 0);
65 protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
66 setValue(restoreValue ? getPersistedFloat(mValue) : (Float) defaultValue);
70 public CharSequence getSummary() {
71 if (mSummaries != null && mSummaries.length > 0) {
72 int index = (int) (mValue * mSummaries.length);
73 index = Math.min(index, mSummaries.length - 1);
74 return mSummaries[index];
76 return super.getSummary();
80 public void setSummary(CharSequence[] summaries) {
81 mSummaries = summaries;
85 public void setSummary(CharSequence summary) {
86 super.setSummary(summary);
91 public void setSummary(int summaryResId) {
93 setSummary(getContext().getResources().getStringArray(summaryResId));
94 } catch (Exception e) {
95 super.setSummary(summaryResId);
99 public float getValue() {
103 public void setValue(float value) {
104 value = Math.max(0, Math.min(value, 1)); // clamp to [0, 1]
105 if (shouldPersist()) {
108 if (value != mValue) {
115 protected View onCreateDialogView() {
116 mSeekBarValue = (int) (mValue * SEEKBAR_RESOLUTION);
117 View view = super.onCreateDialogView();
118 SeekBar seekbar = (SeekBar) view.findViewById(R.id.slider_preference_seekbar);
119 seekbar.setMax(SEEKBAR_RESOLUTION);
120 seekbar.setProgress(mSeekBarValue);
121 seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
124 public void onStopTrackingTouch(SeekBar seekBar) {
128 public void onStartTrackingTouch(SeekBar seekBar) {
132 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
134 SliderPreference.this.mSeekBarValue = progress;
142 protected void onDialogClosed(boolean positiveResult) {
143 final float newValue = (float) mSeekBarValue / SEEKBAR_RESOLUTION;
144 if (positiveResult && callChangeListener(newValue)) {
147 super.onDialogClosed(positiveResult);
150 // TODO: Save and restore preference state.