package co.sfng.calendarwidget;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.util.Log;
import java.util.HashMap;
public class SettingsFragment extends PreferenceFragment
implements OnSharedPreferenceChangeListener {
private static final String TAG = SettingsFragment.class.toString();
private Resources mResources;
private String mVersionName;
private HashMap<String, String> mThemeReverseLookup;
private HashMap<String, String> mWeekStartDayReverseLookup;
private HashMap<String, String> mOnDayClickActionReverseLookup;
public static final String PREF_VERSION = "version";
public static final String PREF_THEME = "theme";
public static final String PREF_WEEK_START_DAY = "week_start_day";
public static final String PREF_ON_DAY_CLICK = "on_day_click";
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mVersionName = getVersionName(activity);
mResources = getResources();
mThemeReverseLookup = createReverseLookup(mResources, R.array.themes, R.array.theme_values);
mWeekStartDayReverseLookup = createReverseLookup(
mResources, R.array.week_start_day, R.array.week_start_day_values);
mOnDayClickActionReverseLookup = createReverseLookup(
mResources, R.array.on_day_click, R.array.on_day_click_values);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// Add listener.
SharedPreferences sharedPref = getPreferenceScreen().getSharedPreferences();
sharedPref.registerOnSharedPreferenceChangeListener(this);
// Read preferences and set as summary.
PreferenceManager prefMgr = getPreferenceManager();
setSummary(prefMgr, PREF_VERSION, mVersionName);
setSummary(prefMgr, sharedPref, mThemeReverseLookup, PREF_THEME);
setSummary(prefMgr, sharedPref, mWeekStartDayReverseLookup, PREF_WEEK_START_DAY);
setSummary(prefMgr, sharedPref, mOnDayClickActionReverseLookup, PREF_ON_DAY_CLICK);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPref, String key) {
PreferenceManager prefMgr = getPreferenceManager();
Preference pref = prefMgr.findPreference(key);
assert(pref != null);
String value = sharedPref.getString(key, null);
assert(value != null);
if (key.equals(PREF_THEME)) {
setSummary(prefMgr, sharedPref, mThemeReverseLookup, key);
} else if (key.equals(PREF_WEEK_START_DAY)) {
setSummary(prefMgr, sharedPref, mWeekStartDayReverseLookup, key);
} else if (key.equals(PREF_ON_DAY_CLICK)) {
setSummary(prefMgr, sharedPref, mOnDayClickActionReverseLookup, key);
}
}
private HashMap<String, String> createReverseLookup(Resources res, int keyArrayId,
int valueArrayId) {
// Assumption: Android retrieves the array in the order in which it was defined.
HashMap<String, String> hashmap = new HashMap<String, String>();
String[] keys = res.getStringArray(keyArrayId);
String[] values = res.getStringArray(valueArrayId);
for (int i = 0; i < keys.length; i++) {
hashmap.put(values[i], keys[i]);
}
return hashmap;
}
private void setSummary(PreferenceManager prefMgr, String prefKey, String s) {
Preference pref = prefMgr.findPreference(prefKey);
pref.setSummary(s);
}
private void setSummary(PreferenceManager prefMgr, SharedPreferences sharedPref,
HashMap<String, String> lookupHashMap, String prefKey) {
String lookup = sharedPref.getString(prefKey, null);
assert (lookup != null);
setSummary(prefMgr, prefKey, lookupHashMap.get(lookup).toString());
}
private String getVersionName(Context context) {
String versionName = "";
String pkgName = context.getPackageName();
try {
versionName = context.getPackageManager().getPackageInfo(pkgName, 0).versionName;
} catch(PackageManager.NameNotFoundException e) {
Log.e(TAG, "Name not found while getting application version name.", e);
}
return versionName;
}
}