X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=android%2Fproject%2Fxscreensaver%2Fsrc%2Forg%2Fjwz%2Fxscreensaver%2FSliderPreference.java;fp=android%2Fproject%2Fxscreensaver%2Fsrc%2Forg%2Fjwz%2Fxscreensaver%2FSliderPreference.java;h=8a772637a24ebbcf224ba11038a92680e461ab08;hp=0000000000000000000000000000000000000000;hb=d1ae2829ff0fd2a96c16a0c8c5420efaa47d7b30;hpb=7edd66e6bd3209013ee059819747b10b5835635b 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 index 00000000..8a772637 --- /dev/null +++ b/android/project/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java @@ -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. +}