package org.tvbrowser.settings;
import org.tvbrowser.tvbrowser.R;
import org.tvbrowser.utils.IOUtils;
import org.tvbrowser.utils.UiUtils;
import org.tvbrowser.view.ColorView;
import android.content.Context;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.support.v4.content.ContextCompat;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.SeekBar;
public class PreferenceColorActivated extends DialogPreference {
private boolean mAlwaysActivated;
private boolean mActivated;
private CheckBox mActivatedSelection;
private ColorView mColorView;
private CheckBox mDialogActivatedSelection;
private ColorView mDialogColorView;
private int mColor;
private int mDefaultColor;
public PreferenceColorActivated(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
public PreferenceColorActivated(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
String namespace = "http://schemas.android.com/apk/res/android";
String value = attrs.getAttributeValue(namespace, "defaultValue");
if(value != null) {
int resId = attrs.getAttributeResourceValue(namespace, "defaultValue", -1);
if(resId != -1) {
TypedValue typedValue = new TypedValue();
context.getResources().getValue(resId, typedValue, true);
int[] values = new int[2];
if(typedValue.type == TypedValue.TYPE_STRING) {
values = IOUtils.getActivatedColorFor(typedValue.string.toString());
}
else {
values[0] = 1;
values[1] = ContextCompat.getColor(context, resId);
}
mActivated = values[0] == 1;
mColor = mDefaultColor = values[1];
}
else {
mActivated = false;
mColor = mDefaultColor = -16777216;
}
}
else {
mActivated = false;
mColor = mDefaultColor = -16777216;
}
String xmlns = "http://schemas.android.com/apk/res/org.tvbrowser.tvbrowser";
mAlwaysActivated = attrs.getAttributeBooleanValue(xmlns, "alwaysActivated", false);
if(mAlwaysActivated) {
mActivated = true;
}
setDialogLayoutResource(org.tvbrowser.tvbrowser.R.layout.color_preference_dialog);
setWidgetLayoutResource(org.tvbrowser.tvbrowser.R.layout.widget_color_activated);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
mActivatedSelection = (CheckBox)view.findViewById(R.id.widget_color_activated_selection);
mColorView = (ColorView)view.findViewById(R.id.widget_color_activated_color);
mActivatedSelection.setChecked(mActivated);
mColorView.setColor(mColor);
handleVisiblity();
}
private void handleVisiblity() {
if(mActivated) {
mColorView.setVisibility(View.VISIBLE);
mActivatedSelection.setVisibility(View.GONE);
}
else {
mColorView.setVisibility(View.GONE);
mActivatedSelection.setVisibility(View.VISIBLE);
}
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if(positiveResult && mDialogColorView != null) {
mColor = mDialogColorView.getColor();
mColorView.setColor(mColor);
mActivated = mDialogActivatedSelection.isChecked();
mActivatedSelection.setChecked(mActivated);
handleVisiblity();
if(mAlwaysActivated) {
persistInt(mColor);
}
else{
String value = String.valueOf(mActivated) + ";" + String.valueOf(mColor);
if (callChangeListener(value)) {
persistString(value);
}
}
}
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
mDialogActivatedSelection = (CheckBox)view.findViewById(R.id.color_pref_color_activated);
if(mAlwaysActivated) {
mDialogActivatedSelection.setVisibility(View.GONE);
mDialogActivatedSelection.setChecked(true);
}
else {
mDialogActivatedSelection.setVisibility(View.VISIBLE);
mDialogActivatedSelection.setChecked(mActivated);
}
mDialogColorView = (ColorView)view.findViewById(R.id.color_pref_color_view);
mDialogColorView.setColor(mColor);
int[] colors = UiUtils.getColorValues(mColor);
final SeekBar red = (SeekBar)view.findViewById(R.id.color_pref_red1);
final SeekBar green = (SeekBar)view.findViewById(R.id.color_pref_green1);
final SeekBar blue = (SeekBar)view.findViewById(R.id.color_pref_blue1);
final SeekBar alpha = (SeekBar)view.findViewById(R.id.color_pref_alpha1);
final EditText hex = (EditText)view.findViewById(R.id.color_pref_hex_input);
final Button reset = (Button)view.findViewById(R.id.color_pref_reset);
reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int[] colors = UiUtils.getColorValues(mDefaultColor);
red.setProgress(colors[1]);
green.setProgress(colors[2]);
blue.setProgress(colors[3]);
alpha.setProgress(colors[0]);
}
});
red.setProgress(colors[1]);
green.setProgress(colors[2]);
blue.setProgress(colors[3]);
alpha.setProgress(colors[0]);
hex.setText(String.format("%08x", mColor));
SeekBar.OnSeekBarChangeListener changeListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int index = -1;
if(seekBar.equals(red)) {
index = 1;
}
else if(seekBar.equals(green)) {
index = 2;
}
else if(seekBar.equals(blue)) {
index = 3;
}
else if(seekBar.equals(alpha)) {
index = 0;
}
if(index >= 0) {
int[] colorValues = UiUtils.getColorValues(mDialogColorView.getColor());
colorValues[index] = progress;
int color = UiUtils.getColorForValues(colorValues);
mDialogColorView.setColor(color);
hex.setText(String.format("%08x", color));
}
}
};
red.setOnSeekBarChangeListener(changeListener);
green.setOnSeekBarChangeListener(changeListener);
blue.setOnSeekBarChangeListener(changeListener);
alpha.setOnSeekBarChangeListener(changeListener);
CompoundButton.OnCheckedChangeListener checkChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mDialogColorView.setEnabled(isChecked);
hex.setEnabled(isChecked);
reset.setEnabled(isChecked);
red.setEnabled(isChecked);
green.setEnabled(isChecked);
blue.setEnabled(isChecked);
alpha.setEnabled(isChecked);
}
};
hex.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
String value = s.toString();
if(value.trim().length() == 8) {
try {
int[] colorValues = UiUtils.getColorValues((int)Long.parseLong(value, 16));
alpha.setProgress(colorValues[0]);
red.setProgress(colorValues[1]);
green.setProgress(colorValues[2]);
blue.setProgress(colorValues[3]);
}catch(NumberFormatException nfe) {
Log.d("info4", "", nfe);
}
}
}
});
checkChangeListener.onCheckedChanged(mActivatedSelection, mActivated);
mDialogActivatedSelection.setOnCheckedChangeListener(checkChangeListener);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
TypedValue v = new TypedValue();
a.getValue(index, v);
if(v.type == TypedValue.TYPE_STRING) {
return v.string.toString();
}
else {
return v.data;
}
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
if(!restorePersistedValue) {
if(defaultValue == null) {
if(mAlwaysActivated) {
mActivated = true;
mColor = getPersistedInt(-16777216);
}
else {
int[] values = IOUtils.getActivatedColorFor("false;-16777216");
mActivated = values[0] == 1;
mColor = values[1];
}
}
else {
if(mAlwaysActivated) {
mActivated = true;
mColor = (Integer)defaultValue;
}
else {
int[] values = IOUtils.getActivatedColorFor((String)defaultValue);
mActivated = values[0] == 1;
mColor = values[1];
}
}
}
else {
if(defaultValue == null) {
if(mAlwaysActivated) {
mActivated = true;
mColor = getPersistedInt(-16777216);
}
else {
int[] values = IOUtils.getActivatedColorFor(getPersistedString("false;-16777216"));
mActivated = values[0] == 1;
mColor = values[1];
}
}
else {
if(mAlwaysActivated) {
mActivated = true;
mColor = getPersistedInt((Integer)defaultValue);
}
else {
int[] values = IOUtils.getActivatedColorFor(getPersistedString((String)defaultValue));
mActivated = values[0] == 1;
mColor = values[1];
}
}
}
}
public void setColors(int color, int defaultColor) {
mColor = color;
if(mAlwaysActivated) {
persistInt(color);
}
else {
persistString(String.valueOf(mActivated) + ";" + String.valueOf(mColor));
}
mDefaultColor = defaultColor;
}
public int getColor() {
return mColor;
}
}