package com.electronapps.LJPro; import java.util.HashMap; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.preference.RingtonePreference; import android.preference.Preference.OnPreferenceChangeListener; public class LJProPrefs extends PreferenceActivity { LJDB LJDBAdapter; Editor mEditor; String mScope="All"; String[] prefKeys={"backgroundSync","syncFrequency","syncWifi","notifyEnabled","notifyWhat","notifyVibrate", "alwaysRefetchOnAdd","notifySound","cacheDuration","otherJournalsCache","journalCache","photoProvider"}; HashMap<String,String> depMap=new HashMap<String,String>(); private Cursor mAccounts; private SharedPreferences appPrefs; @Override public void onCreate(Bundle savedInstanceState) { Intent intent=getIntent(); mScope=intent.getStringExtra("scope"); super.onCreate(savedInstanceState); this.addPreferencesFromResource(R.xml.prefs); appPrefs=PreferenceManager.getDefaultSharedPreferences(this); mEditor=appPrefs.edit(); setupListeners(); setupDependencies(); GetAccounts setupAccounts=new GetAccounts(); setupAccounts.execute(); } private void setupListeners() { for (int i=0;i<prefKeys.length;i++){ Preference pref=findPreference(prefKeys[i]); pref.setOnPreferenceChangeListener(applyToAll); } } private void setupDependencies() { String [] syncPrefs={"syncFrequency","syncWifi"}; String [] notifyPrefs={"notifyWhat","notifyVibrate","notifySound"}; for (int i=0;i<syncPrefs.length;i++) { depMap.put(syncPrefs[i],"backgroundSync"); } for (int i=0;i<notifyPrefs.length;i++) { depMap.put(notifyPrefs[i],"notifyEnabled"); } } private class GetAccounts extends AsyncTask<Void,Void,CharSequence[]>{ @Override protected CharSequence[] doInBackground(Void... params) { LJDBAdapter= LJDB.getDB(getApplicationContext()); LJDBAdapter.open(); String[] columns={LJDB.KEY_ACCOUNTNAME}; mAccounts=LJDBAdapter.getAllAccounts(columns); mAccounts.moveToFirst(); int numAccounts=mAccounts.getCount(); CharSequence[] choices=new CharSequence[numAccounts+1]; choices[0]="All"; for (int i=0;i<numAccounts;i++){ choices[i+1]=mAccounts.getString(0); mAccounts.moveToNext(); } return choices; } @Override protected void onPostExecute(CharSequence[] choices){ ListPreference accChoices=(ListPreference) findPreference("settingScope"); accChoices.setEntries(choices); accChoices.setEntryValues(choices); accChoices.setDefaultValue("All"); String currScope=(String)accChoices.getValue(); if (currScope==null) { mScope=currScope="All"; accChoices.setValue("All"); } if (!currScope.equals("All")) { changeKeys(currScope); } accChoices.setOnPreferenceChangeListener(updateKeys); } } OnPreferenceChangeListener updateKeys=new OnPreferenceChangeListener(){ public boolean onPreferenceChange(Preference preference, Object newValue) { changeKeys((String)newValue); return true; } }; OnPreferenceChangeListener applyToAll=new OnPreferenceChangeListener(){ public boolean onPreferenceChange(Preference preference, Object newValue) { if (mScope.equals("All")){ mAccounts.moveToFirst(); while (!mAccounts.isAfterLast()){ String account=mAccounts.getString(0); if(newValue instanceof Boolean){ mEditor.putBoolean(account+"_"+preference.getKey(), (Boolean)newValue); } else mEditor.putString(account+"_"+preference.getKey(),(String)newValue); mAccounts.moveToNext(); } mEditor.commit(); if(preference.getKey().contains("backgroundSync")) { Long frequency=Long.parseLong(appPrefs.getString("syncFrequency", "900000")); ((LJPro)getApplicationContext()).setupAlarms(mAccounts,null,(Boolean)newValue,frequency); } else if(preference.getKey().contains("syncFrequency")){ ((LJPro)getApplicationContext()).setupAlarms(mAccounts,null,true,Long.parseLong((String)newValue)); } } else { if(preference.getKey().contains("backgroundSync")) { Long frequency=Long.parseLong(appPrefs.getString("syncFrequency", "900000")); ((LJPro)getApplicationContext()).setupAlarms(null,mScope,(Boolean)newValue,frequency); } else if(preference.getKey().contains("syncFrequency")){ ((LJPro)getApplicationContext()).setupAlarms(null,mScope,true,Long.parseLong((String)newValue)); } } return true; } }; private void changeKeys(String scope){ String prefix=null; String oldPrefix=null; if(scope.equals("All")) { prefix=""; } else prefix=scope+"_"; if (mScope.equals("All")){ oldPrefix=""; } else{ oldPrefix=mScope+"_"; } mScope=scope; for (int i=0;i<prefKeys.length;i++){ Preference p=findPreference(oldPrefix+prefKeys[i]); String oldKey=p.getKey(); String keyname=null; if (oldKey.contains("_")) { keyname=oldKey.split("_")[1]; } else keyname=oldKey; if (depMap.get(keyname)!=null) { p.setDependency(prefix+depMap.get(keyname)); } p.setKey(prefix+keyname); if (p instanceof CheckBoxPreference) { ((CheckBoxPreference)p).setChecked(appPrefs.getBoolean(prefix+keyname,false)); } else if (p instanceof ListPreference) ((ListPreference)p).setValue(appPrefs.getString(prefix+keyname,"")); } } @Override protected void onDestroy() { super.onDestroy(); mAccounts.close(); } }