package org.getlantern.firetweet.preference; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.DialogPreference; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import org.getlantern.firetweet.Constants; import org.getlantern.firetweet.R; import org.getlantern.firetweet.graphic.AlphaPatternDrawable; import org.getlantern.firetweet.util.accessor.ViewAccessor; /** * Created by mariotaku on 14/11/8. */ public class ThemeBackgroundPreference extends DialogPreference implements Constants { private final String[] mBackgroundEntries, mBackgroundValues; private String mValue; private View mAlphaContainer; private SeekBar mAlphaSlider; private ImageView mAlphaPreview; private OnClickListener mSingleChoiceListener = new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { final String value = mBackgroundValues[which]; setValue(value); // if (!VALUE_THEME_BACKGROUND_TRANSPARENT.equals(value)) { // ThemeBackgroundPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); // } } }; private OnSeekBarChangeListener mAlphaSliderChangedListener = new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { updateAlphaPreview(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }; @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { final SharedPreferences preferences = getSharedPreferences(); final SharedPreferences.Editor editor = preferences.edit(); editor.putInt(KEY_THEME_BACKGROUND_ALPHA, mAlphaSlider.getProgress()); editor.apply(); persistValue(mValue); } } @Override protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { setValue(restorePersistedValue ? getPersistedString(null) : (String) defaultValue); updateSummary(); } private void updateSummary() { final int valueIndex = getValueIndex(); setSummary(valueIndex != -1 ? mBackgroundEntries[valueIndex] : null); } private void setValue(String value) { mValue = value; updateAlphaVisibility(); } private void persistValue(String value) { // Always persist/notify the first time. if (!TextUtils.equals(getPersistedString(null), value)) { persistString(value); notifyChanged(); } updateAlphaVisibility(); updateSummary(); } private void updateAlphaVisibility() { if (mAlphaContainer == null) return; final boolean isTransparent = VALUE_THEME_BACKGROUND_TRANSPARENT.equals(mValue); mAlphaContainer.setVisibility(isTransparent ? View.VISIBLE : View.GONE); } public String getValue() { return mValue; } @Override public void onClick(DialogInterface dialog, int which) { super.onClick(dialog, which); } public ThemeBackgroundPreference(Context context) { this(context, null); } private int getValueIndex() { return findIndexOfValue(mValue); } public ThemeBackgroundPreference(Context context, AttributeSet attrs) { super(context, attrs); setKey(KEY_THEME_BACKGROUND); final Resources resources = context.getResources(); mBackgroundEntries = resources.getStringArray(R.array.entries_theme_background); mBackgroundValues = resources.getStringArray(R.array.values_theme_background); } @Override protected void onPrepareDialogBuilder(Builder builder) { super.onPrepareDialogBuilder(builder); builder.setSingleChoiceItems(mBackgroundEntries, getValueIndex(), mSingleChoiceListener); } public int findIndexOfValue(String value) { if (value != null && mBackgroundValues != null) { for (int i = mBackgroundValues.length - 1; i >= 0; i--) { if (mBackgroundValues[i].equals(value)) { return i; } } } return -1; } @Override protected void showDialog(Bundle state) { super.showDialog(state); final Dialog dialog = getDialog(); final SharedPreferences preferences = getSharedPreferences(); if (dialog instanceof AlertDialog && preferences != null) { mValue = getPersistedString(null); final Resources res = dialog.getContext().getResources(); final LayoutInflater inflater = dialog.getLayoutInflater(); final ListView listView = ((AlertDialog) dialog).getListView(); final ViewGroup listViewParent = (ViewGroup) listView.getParent(); listViewParent.removeView(listView); final View view = inflater.inflate(R.layout.dialog_theme_background_preference, listViewParent); ((ViewGroup) view.findViewById(R.id.list_container)).addView(listView); mAlphaContainer = view.findViewById(R.id.alpha_container); mAlphaSlider = (SeekBar) view.findViewById(R.id.alpha_slider); mAlphaPreview = (ImageView) view.findViewById(R.id.alpha_preview); mAlphaSlider.setMax(0xFF); mAlphaSlider.setOnSeekBarChangeListener(mAlphaSliderChangedListener); mAlphaSlider.setProgress(preferences.getInt(KEY_THEME_BACKGROUND_ALPHA, DEFAULT_THEME_BACKGROUND_ALPHA)); final int patternSize = res.getDimensionPixelSize(R.dimen.element_spacing_msmall); ViewAccessor.setBackground(mAlphaPreview, new AlphaPatternDrawable(patternSize)); updateAlphaVisibility(); updateAlphaPreview(); final int checkedIdx = findIndexOfValue(mValue); if (checkedIdx < 0) { listView.clearChoices(); } else { listView.setItemChecked(checkedIdx, true); } } } private void updateAlphaPreview() { if (mAlphaPreview == null || mAlphaSlider == null) return; final Drawable drawable = mAlphaPreview.getDrawable(); if (drawable == null) return; drawable.setAlpha(mAlphaSlider.getProgress()); } }