/*
 * Copyright 2010, 2011, 2012 mapsforge.org
 *
 * This program is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
package org.oscim.app.preferences;

import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.DialogPreference;
import android.preference.PreferenceManager;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

/**
 * This abstract class provides all code for a seek bar preference. Deriving
 * classes only need to set the current and
 * maximum value of the seek bar. An optional text message above the seek bar is
 * also supported as well as an optional
 * current value message below the seek bar.
 */
abstract class SeekBarPreference extends DialogPreference implements OnSeekBarChangeListener {
    private TextView mCurrentValueTextView;
    private Editor mEditor;
    private SeekBar mPreferenceSeekBar;

    /**
     * How much the value should increase when the seek bar is moved.
     */
    int increment = 1;

    /**
     * The maximum value of the seek bar.
     */
    int max;

    /**
     * Optional text message to display on top of the seek bar.
     */
    String messageText;

    /**
     * The SharedPreferences instance that is used.
     */
    final SharedPreferences preferencesDefault;

    /**
     * The current value of the seek bar.
     */
    int seekBarCurrentValue;

    /**
     * Create a new seek bar preference.
     *
     * @param context the context of the seek bar preferences activity.
     * @param attrs   A set of attributes (currently ignored).
     */
    SeekBarPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        preferencesDefault = PreferenceManager.getDefaultSharedPreferences(context);
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        // check if the "OK" button was pressed and the seek bar value has changed
        if (which == DialogInterface.BUTTON_POSITIVE
                && seekBarCurrentValue != mPreferenceSeekBar.getProgress()) {
            // get the value of the seek bar and save it in the preferences
            seekBarCurrentValue = mPreferenceSeekBar.getProgress();
            mEditor = preferencesDefault.edit();
            mEditor.putInt(getKey(), seekBarCurrentValue);
            mEditor.commit();
        }
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (mCurrentValueTextView != null) {
            mCurrentValueTextView.setText(getCurrentValueText(progress));
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // do nothing
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // do nothing
    }

    @Override
    protected View onCreateDialogView() {
        // create a layout for the optional text messageText and the seek bar
        LinearLayout linearLayout = new LinearLayout(getContext());
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        linearLayout.setPadding(20, 10, 20, 10);

        // check if a text message should appear above the seek bar
        if (messageText != null) {
            // create a text view for the text messageText
            TextView messageTextView = new TextView(getContext());
            messageTextView.setText(messageText);
            messageTextView.setPadding(0, 0, 0, 20);
            // add the text message view to the layout
            linearLayout.addView(messageTextView);
        }

        // create the seek bar and set the maximum and current value
        mPreferenceSeekBar = new SeekBar(getContext());
        mPreferenceSeekBar.setOnSeekBarChangeListener(this);
        mPreferenceSeekBar.setMax(max);
        mPreferenceSeekBar.setProgress(Math.min(seekBarCurrentValue, max));
        mPreferenceSeekBar.setKeyProgressIncrement(increment);
        mPreferenceSeekBar.setPadding(0, 0, 0, 10);
        // add the seek bar to the layout
        linearLayout.addView(mPreferenceSeekBar);

        // create the text view for the current value below the seek bar
        mCurrentValueTextView = new TextView(getContext());
        mCurrentValueTextView.setText(getCurrentValueText(mPreferenceSeekBar.getProgress()));
        mCurrentValueTextView.setGravity(Gravity.CENTER_HORIZONTAL);
        // add the current value text view to the layout
        linearLayout.addView(mCurrentValueTextView);

        return linearLayout;
    }

    /**
     * Get the current value text.
     *
     * @param progress the current progress level of the seek bar.
     * @return the new current value text
     */
    abstract String getCurrentValueText(int progress);
}
