package cri.sanity.screen;
import cri.sanity.*;
import cri.sanity.util.*;
import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import android.content.Intent;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceCategory;
import android.preference.CheckBoxPreference;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuInflater;
public class GroupsActivity extends ScreenActivity
{
private static final String SEP = FilterActivity.SEP;
private PreferenceCategory prefGroup;
private String sect;
private boolean changed;
//---- overriding
@Override
public void onCreate(Bundle savedInstanceState)
{
skipAllKeys = true;
screener(GroupsActivity.class, R.xml.filter_groups, R.layout.img_groups);
super.onCreate(savedInstanceState);
prefGroup = (PreferenceCategory)pref("filter_groups");
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+')');
readGroups();
changed = false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.contacts, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId()) {
case R.id.selall : selall(); break;
case R.id.selnone: selnone(); break;
case R.id.canc : canc(); break;
default: return super.onOptionsItemSelected(item);
}
return true;
}
@Override
public void onBackPressed()
{
if(isFinishing()) return;
Intent i = new Intent();
i.putExtra(FilterActivity.EXTRA_SECT, saveList());
setResult(RESULT_OK, i);
super.onBackPressed();
}
//---- private api
private void readGroups()
{
String[][] groups = Contacts.fullGroups();
final int n = groups.length;
if(n <= 0) return;
final String sysgroup = "* "+A.s(R.string.sysgroup)+" *";
Map<String,Pref> prefs = new HashMap<String,Pref>(n);
Pref[] arr = new Pref[n];
// read all groups
int i = 0;
for(String[] g : groups) {
String id = g[Contacts.GRP_ID];
Pref p = new Pref(id, g[Contacts.GRP_TITLE]);
prefs.put(id, p);
arr[i++] = p;
String sum = g[Contacts.GRP_ACC];
if(!A.empty(g[Contacts.GRP_SID])) {
if(sum.length() > 0) sum += '\n';
sum += sysgroup;
}
p.setSummary(sum);
}
// first, put all already selected groups
for(String id : A.gets(keyAll()).split(SEP)) {
Pref p = prefs.get(id);
if(p == null) continue;
prefGroup.addPreference(p);
p.setChecked(true);
}
// after, put all remaining groups
Arrays.sort(arr);
for(Pref p : arr)
if(!p.isChecked())
prefGroup.addPreference(p);
}
private int saveList()
{
if(changed)
for(String id : A.gets(keyAll()).split(SEP))
A.del(keySect(id));
String ids = "";
int k = 0;
int n = prefGroup.getPreferenceCount();
if(n > 0) {
final StringBuilder sb = new StringBuilder(256);
boolean first = true;
for(int i=0; i<n; i++) {
Pref pref = (Pref)prefGroup.getPreference(i);
if(!pref.isChecked()) continue;
++k;
if(!changed) continue;
String id = pref.id;
A.put(keySect(id), true);
if(first) first = false;
else sb.append(SEP);
sb.append(id);
}
if(n > k) ids = sb.toString();
}
if(changed)
A.put(keyAll(), ids).putc(keyCount(), k);
return k; // return number of selected groups
}
private String keyAll() { return "filter_groups_"+sect; }
private String keyCount() { return "filter_groups_count_"+sect; }
private String keySect(String val) { return "filter_group_"+val+sect; }
private void selall()
{
final int n = prefGroup.getPreferenceCount();
if(n < 1) return;
for(int i=0; i<n; i++)
((Pref)prefGroup.getPreference(i)).setChecked(true);
A.toast(String.format(A.s(R.string.msg_selected_all), n+""));
changed = true;
}
private void selnone()
{
final int n = prefGroup.getPreferenceCount();
if(n < 1) return;
for(int i=0; i<n; i++)
((Pref)prefGroup.getPreference(i)).setChecked(false);
changed = true;
}
private void canc()
{
if(!changed) { finish(); return; }
Alert.msg(
A.s(R.string.ask_canc_all),
new Alert.Click(){ public void on(){ changed = false; dismiss(); finish(); }},
null,
Alert.OKCANC
);
}
//---- inner class
private class Pref extends CheckBoxPreference implements OnPreferenceChangeListener
{
private String id, title;
private Pref(String id, String title) {
super(GroupsActivity.this);
this.id = id;
this.title = title;
setPersistent(false);
setTitle(title);
setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceChange(Preference p, Object v) { return changed = true; }
@Override
public int compareTo(Preference p) { return title.compareTo(((Pref)p).title); }
}
}