/* * Copyright 2010, 2011 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.muxe.advancedtouristmap; 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.TextView; import android.widget.SeekBar.OnSeekBarChangeListener; /** * 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 currentValueTextView; private Editor editor; private LinearLayout linearLayout; private TextView messageTextView; private SeekBar preferenceSeekBar; /** * 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); this.preferencesDefault = PreferenceManager.getDefaultSharedPreferences(context); } @Override public void onClick(DialogInterface dialog, int which) { // check if the "OK" button was pressed if (which == DialogInterface.BUTTON_POSITIVE) { // check if the value of the seek bar differs from the initial value if (this.seekBarCurrentValue != this.preferenceSeekBar.getProgress()) { // get the value of the seek bar and save it in the preferences this.seekBarCurrentValue = this.preferenceSeekBar.getProgress(); this.editor = this.preferencesDefault.edit(); this.editor.putInt(this.getKey(), this.seekBarCurrentValue); this.editor.commit(); } } } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (this.currentValueTextView != null) { this.currentValueTextView.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 this.linearLayout = new LinearLayout(getContext()); this.linearLayout.setOrientation(LinearLayout.VERTICAL); this.linearLayout.setPadding(20, 10, 20, 10); // check if a text message should appear above the seek bar if (this.messageText != null) { // create a text view for the text messageText this.messageTextView = new TextView(getContext()); this.messageTextView.setText(this.messageText); this.messageTextView.setPadding(0, 0, 0, 20); // add the text message view to the layout this.linearLayout.addView(this.messageTextView); } // create the seek bar and set the maximum and current value this.preferenceSeekBar = new SeekBar(getContext()); this.preferenceSeekBar.setOnSeekBarChangeListener(this); this.preferenceSeekBar.setMax(this.max); this.preferenceSeekBar.setProgress(Math.min(this.seekBarCurrentValue, this.max)); this.preferenceSeekBar.setKeyProgressIncrement(this.increment); this.preferenceSeekBar.setPadding(0, 0, 0, 10); // add the seek bar to the layout this.linearLayout.addView(this.preferenceSeekBar); // create the text view for the current value below the seek bar this.currentValueTextView = new TextView(getContext()); this.currentValueTextView.setText(getCurrentValueText(this.preferenceSeekBar .getProgress())); this.currentValueTextView.setGravity(Gravity.CENTER_HORIZONTAL); // add the current value text view to the layout this.linearLayout.addView(this.currentValueTextView); return this.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); }