/******************************************************************************* * Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.fanfou.app.opensource.preferences; import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import com.fanfou.app.opensource.AppContext; /** * @author mcxiaoke * @version 1.0 2011.11.09 * @version 1.5 2011.11.10 * @version 1.6 2011.12.19 * */ public class SeekBarPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener { private static final String TAG = SeekBarPreference.class.getSimpleName(); private static final String androidns = "http://schemas.android.com/apk/res/android"; private SeekBar mSeekBar; private TextView mMessageText, mValueText; private final Context mContext; private final String mDialogMessage, mSuffix; private final int mDefault; private int mMax; private int mValue = 0; public SeekBarPreference(final Context context, final AttributeSet attrs) { super(context, attrs); this.mContext = context; this.mDialogMessage = attrs.getAttributeValue( SeekBarPreference.androidns, "dialogMessage"); this.mSuffix = attrs.getAttributeValue(SeekBarPreference.androidns, "text"); this.mDefault = attrs.getAttributeIntValue(SeekBarPreference.androidns, "defaultValue", 0); this.mMax = attrs.getAttributeIntValue(SeekBarPreference.androidns, "max", 100); if (AppContext.DEBUG) { Log.d(SeekBarPreference.TAG, "SeekBarPreference() mDefault=" + this.mDefault); Log.d(SeekBarPreference.TAG, "SeekBarPreference() mValue=" + this.mValue); } } public int getMax() { return this.mMax; } public int getProgress() { return this.mValue; } @Override protected void onBindDialogView(final View v) { super.onBindDialogView(v); if (AppContext.DEBUG) { Log.d(SeekBarPreference.TAG, "onBindDialogView() mDefault=" + this.mDefault); Log.d(SeekBarPreference.TAG, "onBindDialogView() mValue=" + this.mValue); } this.mSeekBar.setMax(this.mMax); this.mSeekBar.setProgress(this.mValue); } @Override protected View onCreateDialogView() { LinearLayout.LayoutParams params; final LinearLayout layout = new LinearLayout(this.mContext); layout.setOrientation(LinearLayout.VERTICAL); layout.setPadding(6, 6, 6, 6); if (this.mDialogMessage != null) { this.mMessageText = new TextView(this.mContext); this.mMessageText.setText(this.mDialogMessage); layout.addView(this.mMessageText); } this.mValueText = new TextView(this.mContext); this.mValueText.setGravity(Gravity.CENTER_HORIZONTAL); this.mValueText.setTextSize(32); params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); layout.addView(this.mValueText, params); this.mSeekBar = new SeekBar(this.mContext); this.mSeekBar.setOnSeekBarChangeListener(this); layout.addView(this.mSeekBar, new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); if (shouldPersist()) { this.mValue = getPersistedInt(this.mDefault); } // if(App.DEBUG){ // Log.d(TAG, "onCreateDialogView() mDefault="+mDefault); // Log.d(TAG, "onCreateDialogView() mMax="+mMax); // Log.d(TAG, "onCreateDialogView() mValue="+mValue); // } // mSeekBar.setMax(mMax); // mSeekBar.setProgress(mValue); return layout; } @Override protected void onDialogClosed(final boolean positiveResult) { if (AppContext.DEBUG) { Log.d(SeekBarPreference.TAG, "onDialogClosed positive=" + positiveResult + " mvalue=" + this.mValue); } if (positiveResult) { if (shouldPersist()) { persistInt(this.mValue); } if (AppContext.DEBUG) { Log.d(SeekBarPreference.TAG, "onDialogClosed() mDefault=" + this.mDefault); Log.d(SeekBarPreference.TAG, "onDialogClosed() mValue=" + this.mValue); } callChangeListener(Integer.valueOf(this.mValue)); } } @Override public void onProgressChanged(final SeekBar seek, final int value, final boolean fromTouch) { final String t = String.valueOf(value); if (value > 0) { this.mValue = value; } if (AppContext.DEBUG) { Log.d(SeekBarPreference.TAG, "onProgressChanged() mDefault=" + this.mDefault); Log.d(SeekBarPreference.TAG, "onProgressChanged() mValue=" + this.mValue); Log.d(SeekBarPreference.TAG, "onProgressChanged() value=" + value); } this.mValueText.setText(this.mSuffix == null ? t : t .concat(this.mSuffix)); // if (shouldPersist()) // persistInt(value); // callChangeListener(new Integer(value)); } @Override protected void onSetInitialValue(final boolean restore, final Object defaultValue) { super.onSetInitialValue(restore, defaultValue); if (restore) { this.mValue = shouldPersist() ? getPersistedInt(this.mDefault) : 0; } else { this.mValue = (Integer) defaultValue; } if (AppContext.DEBUG) { Log.d(SeekBarPreference.TAG, "onSetInitialValue() mDefault=" + this.mDefault); Log.d(SeekBarPreference.TAG, "onSetInitialValue() mValue=" + this.mValue); } setSummary("" + this.mValue + this.mSuffix); } @Override public void onStartTrackingTouch(final SeekBar seek) { } @Override public void onStopTrackingTouch(final SeekBar seek) { } public void setMax(final int max) { this.mMax = max; } public void setProgress(final int progress) { this.mValue = progress; if (this.mSeekBar != null) { this.mSeekBar.setProgress(progress); } } }