From http://www.jwz.org/xscreensaver/xscreensaver-5.33.tar.gz
[xscreensaver] / android / project / xscreensaver / src / org / jwz / xscreensaver / SliderPreference.java
1 /*
2  * Copyright 2012 Jay Weisskopf
3  *
4  * Licensed under the MIT License (see LICENSE.txt)
5  */
6
7 //package net.jayschwa.android.preference;
8 package org.jwz.xscreensaver;
9
10
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;
17
18 /**
19  * @author Jay Weisskopf
20  */
21 public class SliderPreference extends DialogPreference {
22
23         protected final static int SEEKBAR_RESOLUTION = 10000;
24
25         protected float mValue;
26         protected int mSeekBarValue;
27         protected CharSequence[] mSummaries;
28
29         /**
30          * @param context
31          * @param attrs
32          */
33         public SliderPreference(Context context, AttributeSet attrs) {
34                 super(context, attrs);
35                 setup(context, attrs);
36         }
37
38         /**
39          * @param context
40          * @param attrs
41          * @param defStyle
42          */
43         public SliderPreference(Context context, AttributeSet attrs, int defStyle) {
44                 super(context, attrs, defStyle);
45                 setup(context, attrs);
46         }
47
48         private void setup(Context context, AttributeSet attrs) {
49                 setDialogLayoutResource(R.layout.slider_preference_dialog);
50                 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SliderPreference);
51                 try {
52                         setSummary(a.getTextArray(R.styleable.SliderPreference_android_summary));
53                 } catch (Exception e) {
54                         // Do nothing
55                 }
56                 a.recycle();
57         }
58
59         @Override
60         protected Object onGetDefaultValue(TypedArray a, int index) {
61                 return a.getFloat(index, 0);
62         }
63
64         @Override
65         protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
66                 setValue(restoreValue ? getPersistedFloat(mValue) : (Float) defaultValue);
67         }
68
69         @Override
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];
75                 } else {
76                         return super.getSummary();
77                 }
78         }
79
80         public void setSummary(CharSequence[] summaries) {
81                 mSummaries = summaries;
82         }
83
84         @Override
85         public void setSummary(CharSequence summary) {
86                 super.setSummary(summary);
87                 mSummaries = null;
88         }
89
90         @Override
91         public void setSummary(int summaryResId) {
92                 try {
93                         setSummary(getContext().getResources().getStringArray(summaryResId));
94                 } catch (Exception e) {
95                         super.setSummary(summaryResId);
96                 }
97         }
98
99         public float getValue() {
100                 return mValue;
101         }
102
103         public void setValue(float value) {
104                 value = Math.max(0, Math.min(value, 1)); // clamp to [0, 1]
105                 if (shouldPersist()) {
106                         persistFloat(value);
107                 }
108                 if (value != mValue) {
109                         mValue = value;
110                         notifyChanged();
111                 }
112         }
113
114         @Override
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() {
122
123                         @Override
124                         public void onStopTrackingTouch(SeekBar seekBar) {
125                         }
126
127                         @Override
128                         public void onStartTrackingTouch(SeekBar seekBar) {
129                         }
130
131                         @Override
132                         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
133                                 if (fromUser) {
134                                         SliderPreference.this.mSeekBarValue = progress;
135                                 }
136                         }
137                 });
138                 return view;
139         }
140
141         @Override
142         protected void onDialogClosed(boolean positiveResult) {
143                 final float newValue = (float) mSeekBarValue / SEEKBAR_RESOLUTION;
144                 if (positiveResult && callChangeListener(newValue)) {
145                         setValue(newValue);
146                 }
147                 super.onDialogClosed(positiveResult);
148         }
149
150         // TODO: Save and restore preference state.
151 }