package cri.sanity.screen; import android.content.Intent; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import cri.sanity.*; import cri.sanity.pref.*; public class FilterActivity extends ScreenActivity implements OnPreferenceChangeListener { public static final String EXTRA_SECT = "cri.sanity.Filter.id"; public static final String EXTRA_TITLE = "cri.sanity.Filter.title"; public static final String SEP = Conf.FILTER_SEP+""; private static final String ITEMS_FMT = A.s(R.string.msg_items); private static final int CODE_NUMS = 1; private static final int CODE_CONTACTS = 2; private static final int CODE_GROUPS = 3; private static final int CODE_DATETIME = 4; private static final int CODE_PREFIX = 5; public static PFilter pref; private String sect, title, sumNums, sumContacts, sumGroups, sumDt, sumPrefix; @Override public void onCreate(Bundle savedInstanceState) { skipAllKeys = true; screener(FilterActivity.class, R.xml.prefs_filter, R.layout.img_call); super.onCreate(savedInstanceState); Intent i = getIntent(); sect = i.getStringExtra(EXTRA_SECT ); title = i.getStringExtra(EXTRA_TITLE); if(!A.empty(title)) { Preference p = pref("filter"); p.setTitle(p.getTitle()+" - "+title); } initCheckbox("filter_enable", "filter_all", "filter_anonym", "filter_unknown", "filter_allcontacts", "filter_star"); initList("filter_mode"); Preference p = pref("filter_dt"); sumDt = p.getSummary().toString(); setSumDt(A.is(keySect("filter_dt")), p); on(p, new Click(){ public boolean on(){ return startAct(DateTimeActivity.class, CODE_DATETIME); }}); p = pref("filter_nums"); sumNums = p.getSummary().toString(); setSumNums(A.geti(keySect("filter_nums_count")), p); on(p, new Click(){ public boolean on(){ return startAct(NumsActivity.class, CODE_NUMS); }}); p = pref("filter_contacts"); sumContacts = p.getSummary().toString(); setSumContacts(A.geti(keySect("filter_contacts_count")), p); on(p, new Click(){ public boolean on(){ return startAct(ContactsActivity.class, CODE_CONTACTS); }}); p = pref("filter_groups"); sumGroups = p.getSummary().toString(); setSumGroups(A.geti(keySect("filter_groups_count")), p); on(p, new Click(){ public boolean on(){ return startAct(GroupsActivity.class, CODE_GROUPS); }}); p = pref("filter_prefix"); sumPrefix = p.getSummary().toString(); setSumPrefix(A.geti(keySect("filter_prefix_count")), p); on(p, new Click(){ public boolean on(){ return startAct(PrefixActivity.class, CODE_PREFIX); }}); } @Override public void onDestroy() { super.onDestroy(); if(pref == null) return; pref.updateSum(); pref = null; } @Override public void onActivityResult(int code, int res, Intent i) { if(i==null || res!=RESULT_OK) return; final int k = i.getIntExtra(EXTRA_SECT, -666); if(k == -666) return; switch(code) { case CODE_NUMS: setSumNums(k, null); break; case CODE_CONTACTS: if(k >= 0) setSumContacts(k, null); else { setSumContacts(0, null); setChecked("filter_allcontacts", true); setEnabled("filter_contacts", false); setEnabled("filter_groups" , false); } break; case CODE_GROUPS: setSumGroups(k, null); break; case CODE_DATETIME: setSumDt(k>0, null); break; case CODE_PREFIX: setSumPrefix(k, null); break; } } //---- private api private boolean startAct(Class<?> cls, int code) { Intent i = new Intent(A.app(), cls); i.putExtra(EXTRA_SECT , sect ); i.putExtra(EXTRA_TITLE, title); startActivityForResult(i, code); return true; } private String keySect(String k) { return k+'_'+sect; } private void initList(String ... keys) { for(String k : keys) { PList p = (PList)pref(k); p.setValue(Integer.toString(A.geti(keySect(k)))); p.setOnPreferenceChangeListener(this); } } private void initCheckbox(String ... keys) { for(String k : keys) { CheckBoxPreference p = (CheckBoxPreference)pref(k); boolean on = A.is(keySect(k)); p.setChecked(on); p.setOnPreferenceChangeListener(this); updateDeps(k, on); } } private void updateDeps(String key, boolean on) { if(key.equals("filter_allcontacts")) { pref("filter_star" ).setEnabled(!on); pref("filter_contacts").setEnabled(!on); pref("filter_groups" ).setEnabled(!on); } else if(key.equals("filter_unknown")) pref("filter_nums").setEnabled(!on); else if(key.equals("filter_all")) { pref("filter_anonym").setEnabled(!on); pref("filter_prefix").setEnabled(!on); CheckBoxPreference p = (CheckBoxPreference)pref("filter_allcontacts"); p.setEnabled(!on); boolean fon = !on && !p.isChecked(); pref("filter_star" ).setEnabled(fon); pref("filter_contacts").setEnabled(fon); pref("filter_groups" ).setEnabled(fon); p = (CheckBoxPreference)pref("filter_unknown"); p.setEnabled(!on); fon = !on && !p.isChecked(); pref("filter_nums").setEnabled(!on && !p.isChecked()); } } private void setSumDt(boolean active, Preference p) { if(p == null) p = pref("filter_dt"); p.setSummary(sumDt+" ("+A.s(active? R.string.active : R.string.always)+')'); } private void setSumNums(int cnt, Preference p) { if(p == null) p = pref("filter_nums"); p.setSummary(sumNums + itemsFmt(cnt)); } private void setSumPrefix(int cnt, Preference p) { if(p == null) p = pref("filter_prefix"); p.setSummary(sumPrefix + itemsFmt(cnt)); } private void setSumContacts(int cnt, Preference p) { if(p == null) p = pref("filter_contacts"); p.setSummary(sumContacts + itemsFmt(cnt)); } private void setSumGroups(int cnt, Preference p) { if(p == null) p = pref("filter_groups"); p.setSummary(sumGroups + itemsFmt(cnt)); } private static String itemsFmt(int cnt) { return " ("+String.format(ITEMS_FMT, Integer.toString(cnt))+')'; } @Override public boolean onPreferenceChange(Preference p, Object v) { final String kp = p.getKey(); final String ks = keySect(kp); if(p instanceof PList) A.putc(ks, Integer.parseInt((String)v)); else if(p instanceof CheckBoxPreference) { final boolean on = (Boolean)v; A.putc(ks, on); updateDeps(kp, on); } return true; } }