From http://www.jwz.org/xscreensaver/xscreensaver-5.33.tar.gz
[xscreensaver] / android / project / xscreensaver / src / org / jwz / xscreensaver / SliderPreference.java
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java
new file mode 100644 (file)
index 0000000..8a77263
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2012 Jay Weisskopf
+ *
+ * Licensed under the MIT License (see LICENSE.txt)
+ */
+
+//package net.jayschwa.android.preference;
+package org.jwz.xscreensaver;
+
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.preference.DialogPreference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.SeekBar;
+
+/**
+ * @author Jay Weisskopf
+ */
+public class SliderPreference extends DialogPreference {
+
+       protected final static int SEEKBAR_RESOLUTION = 10000;
+
+       protected float mValue;
+       protected int mSeekBarValue;
+       protected CharSequence[] mSummaries;
+
+       /**
+        * @param context
+        * @param attrs
+        */
+       public SliderPreference(Context context, AttributeSet attrs) {
+               super(context, attrs);
+               setup(context, attrs);
+       }
+
+       /**
+        * @param context
+        * @param attrs
+        * @param defStyle
+        */
+       public SliderPreference(Context context, AttributeSet attrs, int defStyle) {
+               super(context, attrs, defStyle);
+               setup(context, attrs);
+       }
+
+       private void setup(Context context, AttributeSet attrs) {
+               setDialogLayoutResource(R.layout.slider_preference_dialog);
+               TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SliderPreference);
+               try {
+                       setSummary(a.getTextArray(R.styleable.SliderPreference_android_summary));
+               } catch (Exception e) {
+                       // Do nothing
+               }
+               a.recycle();
+       }
+
+       @Override
+       protected Object onGetDefaultValue(TypedArray a, int index) {
+               return a.getFloat(index, 0);
+       }
+
+       @Override
+       protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+               setValue(restoreValue ? getPersistedFloat(mValue) : (Float) defaultValue);
+       }
+
+       @Override
+       public CharSequence getSummary() {
+               if (mSummaries != null && mSummaries.length > 0) {
+                       int index = (int) (mValue * mSummaries.length);
+                       index = Math.min(index, mSummaries.length - 1);
+                       return mSummaries[index];
+               } else {
+                       return super.getSummary();
+               }
+       }
+
+       public void setSummary(CharSequence[] summaries) {
+               mSummaries = summaries;
+       }
+
+       @Override
+       public void setSummary(CharSequence summary) {
+               super.setSummary(summary);
+               mSummaries = null;
+       }
+
+       @Override
+       public void setSummary(int summaryResId) {
+               try {
+                       setSummary(getContext().getResources().getStringArray(summaryResId));
+               } catch (Exception e) {
+                       super.setSummary(summaryResId);
+               }
+       }
+
+       public float getValue() {
+               return mValue;
+       }
+
+       public void setValue(float value) {
+               value = Math.max(0, Math.min(value, 1)); // clamp to [0, 1]
+               if (shouldPersist()) {
+                       persistFloat(value);
+               }
+               if (value != mValue) {
+                       mValue = value;
+                       notifyChanged();
+               }
+       }
+
+       @Override
+       protected View onCreateDialogView() {
+               mSeekBarValue = (int) (mValue * SEEKBAR_RESOLUTION);
+               View view = super.onCreateDialogView();
+               SeekBar seekbar = (SeekBar) view.findViewById(R.id.slider_preference_seekbar);
+               seekbar.setMax(SEEKBAR_RESOLUTION);
+               seekbar.setProgress(mSeekBarValue);
+               seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+
+                       @Override
+                       public void onStopTrackingTouch(SeekBar seekBar) {
+                       }
+
+                       @Override
+                       public void onStartTrackingTouch(SeekBar seekBar) {
+                       }
+
+                       @Override
+                       public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                               if (fromUser) {
+                                       SliderPreference.this.mSeekBarValue = progress;
+                               }
+                       }
+               });
+               return view;
+       }
+
+       @Override
+       protected void onDialogClosed(boolean positiveResult) {
+               final float newValue = (float) mSeekBarValue / SEEKBAR_RESOLUTION;
+               if (positiveResult && callChangeListener(newValue)) {
+                       setValue(newValue);
+               }
+               super.onDialogClosed(positiveResult);
+       }
+
+       // TODO: Save and restore preference state.
+}