package cri.sanity.screen; import cri.sanity.*; import cri.sanity.util.*; import java.io.File; import java.io.FilenameFilter; import java.util.Comparator; import java.util.Stack; import java.util.Arrays; import java.util.Vector; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceCategory; import android.preference.CheckBoxPreference; import android.provider.ContactsContract.PhoneLookup; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; public class BrowseActivity extends ScreenActivity { private static final String SEP_SUM = " * "; private static final char SEP_SHOW = '/'; private static final String SEP_MAIN = Conf.REC_SEP+""; private static final String SEP_DATE = Conf.REC_DATE_PATTERN.charAt(4)+""; private static final String PREFIX = Conf.REC_PREFIX; private static final int PREFIX_LEN = PREFIX.length(); private static final String IN = " ("+A.s(R.string.call_in)+')'; private static final String OUT = " ("+A.s(R.string.call_out)+')'; private static final String ANONYM = A.s(R.string.anonymous); private static final ContentResolver resolver = A.resolver(); private static final String[] proj = new String[]{ PhoneLookup.DISPLAY_NAME }; private PreferenceCategory prefGroup; private Stack<Pref> selected = new Stack<Pref>(); private String dir; private boolean empty = false; //---- overriding @Override public void onCreate(Bundle savedInstanceState) { skipAllKeys = true; screener(BrowseActivity.class, R.xml.prefs_browse, R.layout.img_browse); super.onCreate(savedInstanceState); prefGroup = (PreferenceCategory)pref("rec_browse"); dir = A.sdcardDir(); if(dir == null) { empty(R.string.err, R.string.err_dir); return; } String[] recs = new File(dir).list(new FilenameFilter() { @Override public boolean accept(File dir, String fn) { return fn.startsWith(PREFIX) && !fn.endsWith(".txt") && !fn.endsWith(Conf.PRF_EXT); } }); if(recs.length <= 0) { empty(); return; } Arrays.sort(recs, 0, recs.length, new Comparator<String>() { public int compare(String s1, String s2) { return s2.compareTo(s1); } }); for(String fn : recs) prefGroup.addPreference(new Pref(fn)); } @Override public boolean onCreateOptionsMenu(Menu menu) { if(empty) return super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.browse, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if(empty) return super.onOptionsItemSelected(item); switch(item.getItemId()) { case R.id.open : open(); break; case R.id.del : delete(); break; case R.id.selall : selall(); break; case R.id.selnone: selnone(); break; default: return super.onOptionsItemSelected(item); } return true; } @Override public boolean isMainActivity() { return !empty; } //---- private api private void empty() { empty(R.string.empty, R.string.msg_rec_empty); } private void empty(int idTitle, int idSummary) { final Preference p = new Preference(this); p.setPersistent(false); p.setSelectable(false); p.setTitle(idTitle); p.setSummary(idSummary); prefGroup.addPreference(p); empty = true; } private void open() { if(selected.isEmpty()) return; final Intent i = new Intent(Intent.ACTION_VIEW); //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setDataAndType(Uri.parse("file://"+dir+'/'+selected.peek().fn), "audio/3gp"); startActivity(i); } private void delete() { final int n = selected.size(); if(n < 1) return; Alert.msg(n>1? String.format(A.s(R.string.ask_del_all), n+"") : A.s(R.string.ask_del_one), new Alert.Click() { @SuppressWarnings("unchecked") public void on() { int err = 0; for(Pref p : (Stack<Pref>)selected.clone()) { if(!new File(dir,p.fn).delete()) ++err; else { prefGroup.removePreference(p); selected.remove(p); } } if(err > 0) Alert.msg(String.format(A.s(R.string.err_del), err+"")); } }, null, Alert.OKCANC ); } private void selall() { final int n = prefGroup.getPreferenceCount(); if(n <= 0) return; selected.clear(); for(int i=0; i<n; i++) { final Pref p = (Pref)prefGroup.getPreference(i); p.setChecked(true); selected.add(p); } if(n > 2) A.toast(String.format(A.s(R.string.msg_selected_all), n+"")); } private void selnone() { for(Pref p : selected) p.setChecked(false); selected.clear(); } //---- inner class private class Pref extends CheckBoxPreference implements OnPreferenceChangeListener { private String fn; Pref(String fn) { super(BrowseActivity.this); setPersistent(false); this.fn = new String(fn); // split filename + ext fn = fn.substring(PREFIX_LEN); String ext; final int p = fn.lastIndexOf('.'); if(p != fn.length()-4) ext = ""; else { ext = fn.substring(p+1); fn = fn.substring(0,p); } // split each filename part separated by SEP_MAIN final Vector<String> fnSplit = A.split(SEP_MAIN, fn, 4); //final String[] fnSplit = fn.split(SEP_MAIN); // set title String date = fnSplit.get(0); String time = fnSplit.get(1); final Vector<String> dSplit = A.split(SEP_DATE, date, 3); //final String[] dSplit = date.split(SEP_DATE); date = dSplit.get(2) + SEP_SHOW + dSplit.get(1) + SEP_SHOW + dSplit.get(0); setTitle(date + ", " + time); // set summary if( ext.equals("m4a")) ext = "MPEG4"; else if(ext.equals("3gp")) ext = "3GPP"; else if(ext.equals("amr")) ext = "AMR"; String sum; final int n = fnSplit.size(); if(n<=2 || A.empty(fnSplit.get(2))) sum = ANONYM+SEP_SUM+ext; else { String num; if(n > 3) { num = fnSplit.get(3); sum = num + (fnSplit.get(2).equals("in") ? IN : OUT); } else { num = fnSplit.get(2); if(!num.equals("in") && !num.equals("out")) sum = new String(num); // Sanity versions prior to 1.93 have no "in" or "out" in filename! else { sum = ANONYM + (num.equals("in") ? IN : OUT); num = ""; } } if(num.length() > 1) { final Cursor c = resolver.query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(num)), proj, null, null, null); if(c.moveToFirst()) { final String name = c.getString(c.getColumnIndex(PhoneLookup.DISPLAY_NAME)); if(!A.empty(name)) sum += '\n'+name; } c.close(); } sum += SEP_SUM+ext; } setSummary(sum); // set listener setOnPreferenceChangeListener(this); } @Override public boolean onPreferenceChange(Preference p, Object v) { if((Boolean)v) selected.push(this); else selected.remove(this); return true; } } }