package cri.sanity; import java.util.HashMap; import java.util.Map; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceGroup; import android.text.format.DateFormat; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import cri.sanity.util.*; public abstract class ScreenActivity extends PrefActivity implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String AUTHOR = "Cristiano Tagliamonte"; private static final String FIRST_YEAR = "2011"; private static final Map<Class<?>,Integer> mapScreenPref = new HashMap<Class<?>,Integer>(); private static final Map<Class<?>,Integer> mapScreenWidget = new HashMap<Class<?>,Integer>(); private static final Map<Class<?>,Integer> mapScreenMenu = new HashMap<Class<?>,Integer>(); private static final Map<Integer,Class<?>> mapMenuScreen = new HashMap<Integer,Class<?>>(); private static final Map<String,Object> mapSkipKeys = P.skipKeysMap(); private static boolean grant = false; protected static boolean nagDefault = true; protected boolean nag; protected boolean shortcut; protected boolean skipAllKeys = false; protected boolean secure = true; //---- Activity override @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); nag = nagDefault; shortcut = getIntent().getIntExtra(ShortcutActivity.EXTRA_KEY, 0) > 0; // called through shortcut? if(mapMenuScreen.isEmpty() && !isMainActivity()) screenerAll(); final Integer i = mapScreenPref.get(getClass()); if(i == null) return; addPreferencesFromResource(i); final Preference p = pref("logo"); if(p == null) return; p.setTitle(fullName()); p.setSummary(appDesc()); p.setPersistent(false); final Integer w = mapScreenWidget.get(getClass()); if(w != null) p.setWidgetLayoutResource(w); on(p, new Click(){ public boolean on(){ return Goto.marketSearchPub(AUTHOR); }}); } @Override public void onResume() { super.onResume(); protect(); nag(); A.prefs().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { super.onPause(); A.prefs().unregisterOnSharedPreferenceChangeListener(this); nag = nagDefault; if(!shortcut) return; ungrant(); finish(); // finish to allow other screens to be called through shortcut (otherwise this screen will be shown again) } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); final Integer i = mapScreenMenu.get(getClass()); if(i!=null && menu.findItem(i)!=null) menu.removeItem(i); MenuItem m = menu.add(R.string.help); m.setIcon(android.R.drawable.ic_menu_help); m.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Alert.msg(A.s(R.string.help), getGroupText(getPreferenceScreen(), false)); return true; } private String getGroupText(PreferenceGroup pg, boolean all) { String msg = ""; final int n = pg.getPreferenceCount(); for(int i=0; i<n; i++) { final Preference p = pg.getPreference(i); if(p instanceof PreferenceGroup) msg += "\n** "+p.getTitle().toString().toUpperCase()+"\n\n"+getGroupText((PreferenceGroup)p, true); else if(all || !p.getKey().equals("logo")) { msg += "- "+p.getTitle()+".\n"+p.getSummary()+'\n'; try { msg += A.s(A.rstring("help_"+p.getKey()))+'\n'; } catch(Exception e) {} msg += '\n'; } } return msg; } }); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { final Class<?> cls = mapMenuScreen.get(item.getItemId()); if(cls == null) return super.onOptionsItemSelected(item); if(!isMainActivity()) finish(); // to avoid big activity stack, terminate current activity if it isn't the main one startActivity(new Intent(A.app(), cls)); return true; } //---- public api public static final String fullName() { final int b = A.beta(); return A.name()+" v"+A.verName() + (b<1?"" : " beta"+(b>1? " "+b : "")); } public static final String appDesc() { String year = DateFormat.format("yyyy", A.time()).toString(); if(!year.equals(FIRST_YEAR)) year = FIRST_YEAR+'-'+year; return A.s(R.string.app_desc)+"\n(C) "+year+", "+AUTHOR+'.'; } public static final boolean alertChangeLog() { Alert.msg(A.s(R.string.changelog_title), A.rawstr(R.raw.changelog), Alert.NONE); return true; } /* public final void screener(String key, final Class<?> cls, int idPref, int idMenu, int widget) { screener(pref(key), cls, idPref, idMenu, widget); } */ public final void screener(Preference p, final Class<?> cls, int idPref, int idMenu, int widget) { mapScreenWidget.put(cls, widget); screener(p, cls, idPref, idMenu); } /* public final void screener(String key, final Class<?> cls, int idPref, int idMenu) { screener(pref(key), cls, idPref, idMenu); } */ public final void screener(Preference p, final Class<?> cls, int idPref, int idMenu) { screener(cls, idPref); if(idMenu > 0) { mapScreenMenu.put(cls, idMenu); mapMenuScreen.put(idMenu, cls); } if(p == null) return; on(p, new Click(){ public boolean on(){ startActivity(new Intent(A.app(), cls)); return true; }}); } public static final void screener(final Class<?> cls, int idPref) { mapScreenPref.put(cls, idPref); } public static final void screener(final Class<?> cls, int idPref, int widget) { mapScreenWidget.put(cls, widget); mapScreenPref .put(cls, idPref); } //---- protected api protected final void screenerAll() { // all preferences screens final Object[] s = PrefGroups.screens(); final int n = s.length; for(int i=0; i<n; i+=5) screener(pref((String)s[i+0]), (Class<?>)s[i+1], (Integer)s[i+2], (Integer)s[i+3], (Integer)s[i+4]); } protected void nag() { if(!nag || A.isFull()) return; final long now = A.time(); try { if(now-A.getl(K.NAG) < Conf.NAG_TIMEOUT) return; } catch(Exception e) { A.del(K.NAG); } A.putc(K.NAG, now); Alert.msg( A.rawstr(R.raw.nag), new Alert.Click(){ public void on(){ nag = true; Goto.marketDetails(License.FULL_PKG); }}, new Alert.Click(){ public void on(){ nag = true; }} ); nag = false; } protected void ungrant() { grant = false; Alert.resetPwd(); } //---- private api private void protect() { if(grant || !secure) return; final String pwd = A.gets(K.PWD); if(pwd.length() <= 0) return; Alert.pwdAsk( new Alert.Edited(){ public void on(String text){ if(text.equals(pwd)) grant = true; else protect(); }}, new Alert.Click(){ public void on(){ finish(); }} ); } //---- OnSharedPreferenceChangeListener implementation public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if(skipAllKeys || mapSkipKeys.containsKey(key) || key.startsWith("priv_")) return; if(A.has(K.PRF_NAME)) A.delc(K.PRF_NAME); } }