Twidere-App-Android-Twitter.../twidere/src/main/java/org/mariotaku/twidere/preference/ThemeBackgroundPreference.java

205 lines
8.0 KiB
Java

package org.mariotaku.twidere.preference;
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.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.preference.DialogPreference;
import android.support.v7.preference.PreferenceDialogFragmentCompat;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SeekBar;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.extension.DialogExtensionsKt;
import org.mariotaku.twidere.preference.iface.IDialogPreference;
/**
* Created by mariotaku on 14/11/8.
*/
public class ThemeBackgroundPreference extends DialogPreference implements Constants,
IDialogPreference {
public final static int MAX_ALPHA = 0xFF;
public final static int MIN_ALPHA = 0x40;
private final String[] mBackgroundEntries, mBackgroundValues;
private String mValue;
private String mDefaultValue;
public ThemeBackgroundPreference(Context context) {
this(context, null);
}
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 onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
mDefaultValue = (String) defaultValue;
setValue(restorePersistedValue ? getPersistedString(null) : mDefaultValue);
updateSummary();
}
private void updateSummary() {
final int valueIndex = getValueIndex();
setSummary(valueIndex != -1 ? mBackgroundEntries[valueIndex] : null);
}
private void persistValue(String value) {
// Always persist/notify the first time.
if (!TextUtils.equals(getPersistedString(null), value)) {
persistString(value);
callChangeListener(value);
notifyChanged();
}
updateSummary();
}
public String getValue() {
return mValue;
}
private void setValue(String value) {
mValue = value;
}
private int getValueIndex() {
return findIndexOfValue(mValue);
}
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
public void displayDialog(@NonNull PreferenceFragmentCompat fragment) {
InternalDialogFragment df = InternalDialogFragment.newInstance(getKey());
df.setTargetFragment(fragment, 0);
df.show(fragment.getFragmentManager(), getKey());
}
private void saveValue() {
persistValue(mValue);
}
private void setSelectedOption(int which) {
if (which < 0) {
setValue(mDefaultValue);
} else {
setValue(mBackgroundValues[which]);
}
}
public static class InternalDialogFragment extends PreferenceDialogFragmentCompat {
private View mAlphaContainer;
private SeekBar mAlphaSlider;
public static InternalDialogFragment newInstance(String key) {
final InternalDialogFragment df = new InternalDialogFragment();
final Bundle args = new Bundle();
args.putString(PreferenceDialogFragmentCompat.ARG_KEY, key);
df.setArguments(args);
return df;
}
private int getSliderAlpha() {
return mAlphaSlider.getProgress() + MIN_ALPHA;
}
@Override
public void onDialogClosed(boolean positive) {
if (!positive) return;
final ThemeBackgroundPreference preference = (ThemeBackgroundPreference) getPreference();
final SharedPreferences preferences = preference.getSharedPreferences();
final SharedPreferences.Editor editor = preferences.edit();
editor.putInt(KEY_THEME_BACKGROUND_ALPHA, getSliderAlpha());
editor.apply();
preference.saveValue();
}
private void updateAlphaVisibility() {
if (mAlphaContainer == null) return;
final ThemeBackgroundPreference preference = (ThemeBackgroundPreference) getPreference();
final boolean isTransparent = VALUE_THEME_BACKGROUND_TRANSPARENT.equals(preference.getValue());
mAlphaContainer.setVisibility(isTransparent ? View.VISIBLE : View.GONE);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
final ThemeBackgroundPreference preference = (ThemeBackgroundPreference) getPreference();
final SharedPreferences preferences = preference.getSharedPreferences();
preference.setValue(preference.getPersistedString(null));
builder.setTitle(preference.getDialogTitle());
builder.setSingleChoiceItems(preference.mBackgroundEntries, preference.getValueIndex(), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
preference.setSelectedOption(which);
updateAlphaVisibility();
}
});
builder.setPositiveButton(android.R.string.ok, this);
builder.setNegativeButton(android.R.string.cancel, this);
final Dialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
final AlertDialog alertDialog = (AlertDialog) dialog;
DialogExtensionsKt.applyTheme(alertDialog);
if (preferences != null) {
final LayoutInflater inflater = alertDialog.getLayoutInflater();
final ListView listView = alertDialog.getListView();
assert listView != null;
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 = view.findViewById(R.id.alpha_slider);
mAlphaSlider.setMax(MAX_ALPHA - MIN_ALPHA);
mAlphaSlider.setProgress(preferences.getInt(KEY_THEME_BACKGROUND_ALPHA, DEFAULT_THEME_BACKGROUND_ALPHA) - MIN_ALPHA);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
preference.setSelectedOption(position);
updateAlphaVisibility();
}
});
updateAlphaVisibility();
}
}
});
return dialog;
}
}
}