package ru.shutoff.cgstarter;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TimePicker;
public class TimePreference extends DialogPreference {
int start1 = 0;
int end1 = 0;
int start2 = 0;
int end2 = 0;
final static int FULL_DAY = 24 * 60;
private TimePicker start_picker;
private TimePicker end_picker;
RadioGroup state;
RadioButton interval1;
RadioButton interval2;
Context mContext;
boolean set_time = false;
public static int getHour(String time) {
try {
String[] pieces = time.split(":");
return (Integer.parseInt(pieces[0]));
} catch (Exception ex) {
// ignore
}
return 0;
}
public static int getMinute(String time) {
try {
String[] pieces = time.split(":");
return (Integer.parseInt(pieces[1]));
} catch (Exception ex) {
// ignore
}
return 0;
}
public TimePreference(Context ctxt, AttributeSet attrs) {
super(ctxt, attrs);
setPositiveButtonText(ctxt.getString(R.string.set));
setNegativeButtonText(ctxt.getString(R.string.cancel));
setDefaultValue("00:00-00:00");
mContext = ctxt;
}
@Override
protected View onCreateDialogView() {
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
View view = layoutInflater.inflate(R.layout.interval, null);
start_picker = (TimePicker) view.findViewById(R.id.start);
end_picker = (TimePicker) view.findViewById(R.id.end);
start_picker.setIs24HourView(true);
end_picker.setIs24HourView(true);
state = (RadioGroup) view.findViewById(R.id.state);
interval1 = (RadioButton) view.findViewById(R.id.interval);
interval2 = (RadioButton) view.findViewById(R.id.interval2);
TimePicker.OnTimeChangedListener changeListener = new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
if (set_time)
return;
if (state.getCheckedRadioButtonId() != R.id.interval2) {
state.check(R.id.interval);
start1 = start_picker.getCurrentHour() * 60 + start_picker.getCurrentMinute();
end1 = end_picker.getCurrentHour() * 60 + end_picker.getCurrentMinute();
} else {
start2 = start_picker.getCurrentHour() * 60 + start_picker.getCurrentMinute();
end2 = end_picker.getCurrentHour() * 60 + end_picker.getCurrentMinute();
}
setIntervalText();
}
};
state.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.interval:
setInterval(start1, end1);
break;
case R.id.interval2:
setInterval(start2, end2);
break;
case R.id.never:
start1 = 0;
end1 = 0;
start2 = 0;
end2 = 0;
setIntervalText();
break;
case R.id.always:
start1 = 0;
end1 = FULL_DAY;
start2 = 0;
end2 = 0;
setIntervalText();
break;
}
}
});
start_picker.setOnTimeChangedListener(changeListener);
end_picker.setOnTimeChangedListener(changeListener);
return view;
}
@Override
protected void onBindDialogView(View v) {
set_time = true;
start_picker.setCurrentHour((start1 / 60) % 24);
start_picker.setCurrentMinute(start1 % 60);
end_picker.setCurrentHour((end1 / 60) % 24);
end_picker.setCurrentMinute(end1 % 60);
set_time = false;
if ((start1 == 0) && (end1 == 0)) {
state.check(R.id.never);
} else if ((start1 == 0) && (end1 == FULL_DAY)) {
state.check(R.id.always);
} else {
state.check(R.id.interval);
}
setIntervalText();
super.onBindDialogView(v);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
String res = "";
switch (state.getCheckedRadioButtonId()) {
case R.id.never:
start1 = 0;
end1 = 0;
start2 = 0;
end2 = 0;
break;
case R.id.always:
start1 = 0;
end1 = FULL_DAY;
start2 = 0;
end2 = FULL_DAY;
res = "00:00-24:00";
break;
default:
start1 = start1 % FULL_DAY;
start2 = start2 % FULL_DAY;
end1 = end1 % FULL_DAY;
end2 = end2 % FULL_DAY;
if (start1 == end1) {
int r = start1;
start1 = start2;
start2 = r;
r = end1;
end1 = end2;
end2 = r;
}
if (start2 != end2) {
if (start2 < start1) {
int r = start1;
start1 = start2;
start2 = r;
r = end1;
end1 = end2;
end2 = r;
}
if (end1 < start1) {
end1 += FULL_DAY;
start2 += FULL_DAY;
end2 += FULL_DAY;
}
if (end2 < start2) {
end2 += FULL_DAY;
start1 += FULL_DAY;
end1 += FULL_DAY;
}
if (start2 < start1) {
int r = start1;
start1 = start2;
start2 = r;
r = end1;
end1 = end2;
end2 = r;
}
if (start2 < end1) {
if (end2 > end1)
end1 = end2;
start2 = 0;
end2 = 0;
}
}
if (start2 == end2) {
if (start1 != end1) {
if (end1 < start1)
end1 += FULL_DAY;
if (end1 - start1 >= FULL_DAY) {
res = "00:00-24:00";
} else {
res = toTime(start1) + "-" + toTime(end1);
}
}
} else {
if ((end1 - start1 >= FULL_DAY) || (end2 - start2 >= FULL_DAY)) {
res = "00:00-24:00";
} else {
res = toTime(start1) + "-" + toTime(end1) + ";" + toTime(start2) + "-" + toTime(end2);
}
}
}
if (callChangeListener(res))
persistString(res);
setSummary(summary(res));
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return (a.getString(index));
}
@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
String times = null;
if (restoreValue) {
if (defaultValue == null) {
times = getPersistedString("00:00-00:00");
} else {
times = getPersistedString(defaultValue.toString());
}
} else {
times = defaultValue.toString();
}
String[] parts = times.split(";");
if (parts.length > 0) {
String[] time = parts[0].split("-");
if (time.length > 0)
start1 = getHour(time[0]) * 60 + getMinute(time[0]);
if (time.length > 1)
end1 = getHour(time[1]) * 60 + getMinute(time[1]);
}
if (parts.length > 1) {
String[] time = parts[1].split("-");
if (time.length > 0)
start2 = getHour(time[0]) * 60 + getMinute(time[0]);
if (time.length > 1)
end2 = getHour(time[1]) * 60 + getMinute(time[1]);
}
setSummary(summary(times));
}
void setIntervalText() {
String text1 = getContext().getString(R.string.interval);
int end = end1;
if (end < start1)
end += FULL_DAY;
if ((end1 != start1) && (end - start1 < FULL_DAY))
text1 += " (" + toTime(start1) + "-" + toTime(end1) + ")";
interval1.setText(text1);
String text2 = getContext().getString(R.string.interval2);
end = end2;
if (end < start2)
end += FULL_DAY;
if ((end2 != start2) && (end - start2 < FULL_DAY))
text2 += " (" + toTime(start2) + "-" + toTime(end2) + ")";
interval2.setText(text2);
}
void setInterval(int start, int end) {
set_time = true;
start = start % FULL_DAY;
end = end % FULL_DAY;
start_picker.setCurrentHour(start / 60);
start_picker.setCurrentMinute(start % 60);
end_picker.setCurrentHour(end / 60);
end_picker.setCurrentMinute(end % 60);
set_time = false;
}
String summary(String value) {
if (value.equals(""))
value = "00:00-00:00";
if (value.equals("00:00-00:00"))
return mContext.getString(R.string.never);
if (value.equals("00:00-24:00"))
return mContext.getString(R.string.always);
return mContext.getString(R.string.interval) + " " + value;
}
String toTime(int time) {
time = time % FULL_DAY;
int hours = time / 60;
int min = time % 60;
return String.format("%02d:%02d", hours, min);
}
boolean positive_click;
void showDialog() {
Context context = getContext();
positive_click = false;
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle(getTitle())
.setPositiveButton(getPositiveButtonText(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
positive_click = true;
}
})
.setNegativeButton(getNegativeButtonText(), null);
View contentView = onCreateDialogView();
onBindDialogView(contentView);
builder.setView(contentView);
onPrepareDialogBuilder(builder);
final Dialog dialog = builder.create();
dialog.show();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
onDialogClosed(positive_click);
}
});
}
}