From f8a49d8c062035387312a1732302a0e67c20c483 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sun, 24 Nov 2013 02:26:25 +0400 Subject: add easier font size selection dialog bump version --- .../fox/ttrss/util/FontSizeDialogPreference.java | 224 +++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 src/org/fox/ttrss/util/FontSizeDialogPreference.java (limited to 'src') diff --git a/src/org/fox/ttrss/util/FontSizeDialogPreference.java b/src/org/fox/ttrss/util/FontSizeDialogPreference.java new file mode 100644 index 00000000..a4220fd1 --- /dev/null +++ b/src/org/fox/ttrss/util/FontSizeDialogPreference.java @@ -0,0 +1,224 @@ +package org.fox.ttrss.util; + +// http://www.lukehorvat.com/blog/android-seekbardialogpreference/ + +import org.fox.ttrss.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Parcel; +import android.os.Parcelable; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.widget.SeekBar; +import android.widget.SeekBar.OnSeekBarChangeListener; +import android.widget.TextView; + +/** + * A {@link DialogPreference} that provides a user with the means to select an + * integer from a {@link SeekBar}, and persist it. + * + * @author lukehorvat + * + */ +public class FontSizeDialogPreference extends DialogPreference { + private static final int DEFAULT_MIN_PROGRESS = 9; + private static final int DEFAULT_MAX_PROGRESS = 24; + private static final String DEFAULT_PROGRESS = "0"; + + private int mMinProgress = DEFAULT_MIN_PROGRESS; + private int mMaxProgress = DEFAULT_MAX_PROGRESS; + private int mProgress; + private CharSequence mProgressTextSuffix; + private TextView mProgressText; + private SeekBar mSeekBar; + + public FontSizeDialogPreference(Context context) { + this(context, null); + } + + public FontSizeDialogPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + setProgressTextSuffix(" " + context.getString(R.string.font_size_dialog_suffix)); + + // set layout + setDialogLayoutResource(R.layout.select_font_size_dialog); + setPositiveButtonText(android.R.string.ok); + setNegativeButtonText(android.R.string.cancel); + setDialogIcon(null); + } + + @Override + protected void onSetInitialValue(boolean restore, Object defaultValue) { + setProgress(restore ? Integer.valueOf(getPersistedString(DEFAULT_PROGRESS)) + : Integer.valueOf((String)defaultValue)); + } + + @Override + protected Object onGetDefaultValue(TypedArray a, int index) { + return a.getString(index); + } + + @Override + protected void onBindDialogView(View view) { + super.onBindDialogView(view); + + mProgressText = (TextView) view.findViewById(R.id.text_progress); + + mSeekBar = (SeekBar) view.findViewById(R.id.seek_bar); + mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, + boolean fromUser) { + // update text that displays the current SeekBar progress value + // note: this does not persist the progress value. that is only + // ever done in setProgress() + String progressStr = String.valueOf(progress + mMinProgress); + mProgressText.setText(mProgressTextSuffix == null ? progressStr + : progressStr.concat(mProgressTextSuffix.toString())); + mProgressText.setTextSize(TypedValue.COMPLEX_UNIT_SP, progress + mMinProgress); + } + }); + + mSeekBar.setMax(mMaxProgress - mMinProgress); + mSeekBar.setProgress(mProgress - mMinProgress); + } + + public int getMinProgress() { + return mMinProgress; + } + + public void setMinProgress(int minProgress) { + mMinProgress = minProgress; + setProgress(Math.max(mProgress, mMinProgress)); + } + + public int getMaxProgress() { + return mMaxProgress; + } + + public void setMaxProgress(int maxProgress) { + mMaxProgress = maxProgress; + setProgress(Math.min(mProgress, mMaxProgress)); + } + + public int getProgress() { + return mProgress; + } + + public void setProgress(int progress) { + progress = Math.max(Math.min(progress, mMaxProgress), mMinProgress); + + if (progress != mProgress) { + mProgress = progress; + persistString(String.valueOf(progress)); + notifyChanged(); + } + } + + public CharSequence getProgressTextSuffix() { + return mProgressTextSuffix; + } + + public void setProgressTextSuffix(CharSequence progressTextSuffix) { + mProgressTextSuffix = progressTextSuffix; + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + + // when the user selects "OK", persist the new value + if (positiveResult) { + int seekBarProgress = mSeekBar.getProgress() + mMinProgress; + if (callChangeListener(seekBarProgress)) { + setProgress(seekBarProgress); + } + } + } + + @Override + protected Parcelable onSaveInstanceState() { + // save the instance state so that it will survive screen orientation + // changes and other events that may temporarily destroy it + final Parcelable superState = super.onSaveInstanceState(); + + // set the state's value with the class member that holds current + // setting value + final SavedState myState = new SavedState(superState); + myState.minProgress = getMinProgress(); + myState.maxProgress = getMaxProgress(); + myState.progress = getProgress(); + + return myState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + // check whether we saved the state in onSaveInstanceState() + if (state == null || !state.getClass().equals(SavedState.class)) { + // didn't save the state, so call superclass + super.onRestoreInstanceState(state); + return; + } + + // restore the state + SavedState myState = (SavedState) state; + setMinProgress(myState.minProgress); + setMaxProgress(myState.maxProgress); + setProgress(myState.progress); + + super.onRestoreInstanceState(myState.getSuperState()); + } + + private static class SavedState extends BaseSavedState { + int minProgress; + int maxProgress; + int progress; + + public SavedState(Parcelable superState) { + super(superState); + } + + public SavedState(Parcel source) { + super(source); + + minProgress = source.readInt(); + maxProgress = source.readInt(); + progress = source.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + + dest.writeInt(minProgress); + dest.writeInt(maxProgress); + dest.writeInt(progress); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf