/*
 * Copyright 2012 Jay Weisskopf
 *
 * Licensed under the MIT License (see LICENSE.txt)
 */

package net.jayschwa.android.preference;

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 float mValue = -1;
	protected int mSeekBarValue;
	protected int mSeekBarResolution = 10000;
	protected CharSequence[] mSummaries;
	protected final static float DEFAULT_VALUE = 0.5f;

	/**
	 * @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, DEFAULT_VALUE);
	}

	@Override
	protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
		setValue(restoreValue ? getPersistedFloat(DEFAULT_VALUE) : (Float) defaultValue, false);
	}

	@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, boolean notify) {
		value = Math.max(0, Math.min(value, 1));
		if (value != mValue) {
			mValue = value;
			if (isPersistent()) {
				persistFloat(mValue);
			}
			if (notify) {
				notifyChanged();
			}
		}
	}

	public void setValue(float value) {
		setValue(value, true);
	}

	protected void setSeekBarValue(int value) {
		mSeekBarValue = value;
	}

	@Override
	protected View onCreateDialogView() {
		mSeekBarValue = (int) (mValue * mSeekBarResolution);
		View view = super.onCreateDialogView();
		SeekBar seekbar = (SeekBar) view.findViewById(R.id.slider_preference_seekbar);
		seekbar.setMax(mSeekBarResolution);
		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.setSeekBarValue(progress);
				}
			}
		});
		return view;
	}

	@Override
	protected void onDialogClosed(boolean positiveResult) {
		final float newValue = (float) mSeekBarValue / mSeekBarResolution;
		if (positiveResult && callChangeListener(newValue)) {
			setValue(newValue);
		}
		super.onDialogClosed(positiveResult);
	}

	// TODO: Save and restore preference state.
}

@@ -458,10 +458,21 @@
 e = 
--1
+DEFAULT_VALUE
 ;%0A%09p
@@ -1618,29 +1618,22 @@
 edFloat(
-DEFAULT_VALUE
+mValue
 ) : (Flo
@@ -1652,15 +1652,8 @@
 alue
-, false
 );%0A%09
@@ -2420,24 +2420,8 @@
 alue
-, boolean notify
 ) %7B%0A
@@ -2466,79 +2466,53 @@
 1));
-%0A%09%09if (value != mValue) %7B%0A%09%09%09mValue = value;%0A%09%09%09if (is
+ // clamp to %5B0, 1%5D%0A%09%09if (should
 Persist
-ent
 ()) %7B%0A
-%09
 %09%09%09p
@@ -2519,26 +2519,25 @@
 ersistFloat(
-mV
+v
 alue);%0A%09%09%09%7D%0A
@@ -2537,91 +2537,27 @@
 ;%0A%09%09
-%09
 %7D%0A
-%09
 %09%09if (
-notify) %7B%0A%09%09%09%09notifyChanged();%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%0A%09public void setValue(float v
+value != mV
 alue
@@ -2566,30 +2566,48 @@
 %7B%0A%09%09
-set
+%09m
 Value
-(
+ = 
 value
-, true);
+;%0A%09%09%09notifyChanged();%0A%09%09%7D
 %0A%09%7D%0A

Initialize mValue with default value