package cri.sanity.screen;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceGroup;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import cri.sanity.*;
import cri.sanity.util.*;
public class DateTimeActivity extends ScreenActivity implements OnPreferenceChangeListener
{
private static final char SEP_TIME = ':';
private static final String SEP_RANGE = " >>> ";
private static final String FILTER_DAY = "filter_dt_day";
private final static String[] DAYS = new String[]{ "2", "3", "4", "5", "6", "7", "1" }; // mon, tue, wed, thu, fri, sat, sun
private PreferenceGroup prefGroup, prefTimes;
private boolean changedDay, changedTime;
private String sect;
//---- public api
@Override
public void onCreate(Bundle savedInstanceState) {
skipAllKeys = true;
screener(DateTimeActivity.class, R.xml.filter_datetime, R.layout.img_history);
super.onCreate(savedInstanceState);
prefGroup = (PreferenceGroup)pref("group");
prefTimes = (PreferenceGroup)pref("times");
Intent i = getIntent();
sect = i.getStringExtra(FilterActivity.EXTRA_SECT );
String t = i.getStringExtra(FilterActivity.EXTRA_TITLE);
if(!A.empty(t)) prefGroup.setTitle(prefGroup.getTitle()+" ("+t+')');
initCheckbox("filter_dt");
initDays();
initTimes();
changedDay = changedTime = false;
}
@Override
public void onBackPressed() {
if(isFinishing()) return;
final boolean hasDt = is("filter_dt");
if(hasDt && !hasDays()) {
Alert.msg(A.s(R.string.err_datetime_day));
return;
}
if(changedDay) {
String k = keySect("filter_dt_days");
String selDays = "";
if(hasDt)
for(String d : DAYS)
if(is(FILTER_DAY+d)) selDays += d;
if(!hasDt || selDays.length()==7) A.del(k);
else A.put(k, selDays);
}
if(changedTime) {
final String keyCount = keySect("filter_dt_time_count");
final int oldTimes = A.geti(keyCount);
final int newTimes = prefTimes.getPreferenceCount() - 1;
for(int i=1; i<=newTimes; i++)
A.put(keySect("filter_dt_time"+i), ((Pref)prefTimes.getPreference(i)).getTime());
for(int i=newTimes+1; i<=oldTimes; i++)
A.del(keySect("filter_dt_time"+i));
A.put(keyCount, newTimes);
}
if(changedDay || changedTime) A.commit();
Intent i = new Intent();
i.putExtra(FilterActivity.EXTRA_SECT, hasDt ? 1 : 0);
setResult(RESULT_OK, i);
super.onBackPressed();
}
//---- private api
private void initCheckbox(String key) {
final CheckBoxPreference p = (CheckBoxPreference)pref(key);
p.setChecked(A.is(keySect(key)));
p.setOnPreferenceChangeListener(this);
}
private void initDays() {
on("alldays", new Click(){ public boolean on(){
final boolean enable = !hasAllDays();
for(String d : DAYS) setChecked(FILTER_DAY+d, enable);
return changedDay = true;
}});
final String checkedDays = A.gets(keySect("filter_dt_days"));
final boolean all = checkedDays.length() == 0;
final Change change = new Change(){ public boolean on(){ return changedDay = true; }};
for(String d : DAYS) {
final CheckBoxPreference p = (CheckBoxPreference)pref(FILTER_DAY+d);
p.setChecked(all || checkedDays.indexOf(d)>=0);
on(p, change);
}
}
private void initTimes()
{
Preference p = pref("add");
p.setTitle(">> "+p.getTitle()+" <<");
on(p, new Click(){ public boolean on(){
time(0,0,0,0, new OnTime(){ public void got(int h1, int m1, int h2, int m2){ new Pref(h1, m1, h2, m2); }});
return true;
}});
final int n = A.geti(keySect("filter_dt_time_count"));
for(int i=1; i<=n; i++) {
final int[] t = int2range(A.geti(keySect("filter_dt_time"+i)));
new Pref(t[0], t[1], t[2], t[3]);
}
}
private static void time(final int h1, final int m1, final int h2, final int m2, final OnTime onTime) {
Alert.time(A.s(R.string.filter_dt_add_start), new Alert.Timed(h1, m1){ public void on() {
dlg.dismiss();
final int hour1 = hour;
final int mins1 = mins;
Alert.time(A.s(R.string.filter_dt_add_stop), new Alert.Timed(h2>0?h2:hour, h2>0?m2:mins){ public void on() {
if(hour1>hour || (hour1==hour && mins1>=mins))
A.toast(R.string.err_datetime_time);
else
onTime.got(hour1, mins1, hour, mins);
}});
}});
}
private String keySect(String k) { return k+'_'+sect; }
private boolean hasAllDays() {
boolean all = true;
for(String d : DAYS)
all &= is(FILTER_DAY+d);
return all;
}
private boolean hasDays() {
boolean has = false;
for(String d : DAYS)
has |= is(FILTER_DAY+d);
return has;
}
private static int[] int2range(int i) { return new int[]{ (i>>24)&0xff, (i>>16)&0xff, (i>>8)&0xff, i&0xff }; }
private static int range2int(int h1, int m1, int h2, int m2) { return (h1<<24) | (m1<<16) | (h2<<8) | m2; }
private static String range2str(int h1, int m1, int h2, int m2) { return v(h1)+SEP_TIME+v(m1)+SEP_RANGE+v(h2)+SEP_TIME+v(m2); }
private static String v(int v) { return v>9 ? Integer.toString(v) : "0"+v; }
//---- interface implementation
@Override
public boolean onPreferenceChange(Preference p, Object v) {
A.putc(keySect(p.getKey()), (Boolean)v);
return true;
}
//---- inner class
private interface OnTime { public void got(int h1, int m1, int h2, int m2); }
private final class Pref extends Preference implements OnPreferenceClickListener, OnTime
{
private int h1, m1, h2, m2;
private Pref(int h1, int m1, int h2, int m2) {
super(DateTimeActivity.this);
setPersistent(false);
setOnPreferenceClickListener(this);
prefTimes.addPreference(this);
setDependency("filter_dt");
got(h1, m1, h2, m2);
}
private int getTime() { return range2int(h1, m1, h2, m2); }
@Override
public boolean onPreferenceClick(Preference p) {
Alert.choose(getTitle().toString(), new int[]{ R.string.change, R.string.del, R.string.canc }, new Alert.Click() {
@Override
public void on(){
switch(which) {
case 0: // change
time(h1, m1, h2, m2, Pref.this);
break;
case 1: // delete
prefTimes.removePreference(Pref.this);
changedTime = true;
break;
}
}
});
return true;
}
@Override
public void got(int h1, int m1, int h2, int m2) {
setTitle(range2str(this.h1=h1, this.m1=m1, this.h2=h2, this.m2=m2));
changedTime = true;
}
}
}