package com.hdweiss.morgand.settings; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import com.hdweiss.morgand.R; import com.hdweiss.morgand.synchronizer.calendar.CalendarWrapper; import java.util.List; public class SettingsActivity extends PreferenceActivity { @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.pref_headers, target); } public static class GeneralPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_general); } @Override public void onResume() { super.onResume(); try { String versionName = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0).versionName; findPreference("version").setSummary(versionName); } catch (PackageManager.NameNotFoundException ex) { } } } public static class InterfacePreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_interface); } } public static class DataSyncPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_data_sync); bindPreferenceSummaryToValue(findPreference("sync_mode")); bindPreferenceSummaryToValue(findPreference("sync_frequency")); bindPreferenceSummaryToValue(findPreference("todo_active")); bindPreferenceSummaryToValue(findPreference("todo_inactive")); bindPreferenceSummaryToValue(findPreference("priorities")); } } public static class GitPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_git); bindPreferenceSummaryToValue(findPreference("git_commit_author")); bindPreferenceSummaryToValue(findPreference("git_commit_email")); bindPreferenceSummaryToValue(findPreference("git_key_info")); bindPreferenceSummaryToValue(findPreference("git_username")); bindPreferenceSummaryToValue(findPreference("git_local_path")); bindPreferenceSummaryToValue(findPreference("git_merge_strategy")); bindPreferenceSummaryToValue(findPreference("git_branch")); bindPreferenceSummaryToValue(findPreference("git_url")); findPreference("git_url").setOnPreferenceChangeListener(sResetGitLocalPathListener); } @Override public void onResume() { super.onResume(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); // Update setting keys that are modified by starting another activity findPreference("git_local_path").setSummary(preferences.getString("git_local_path", "")); findPreference("git_key_info").setSummary(preferences.getString("git_key_info", "")); } } public static class CalendarPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_calendar); populateCalendarNames(); bindPreferenceSummaryToValue(findPreference("calendar_name")); bindPreferenceSummaryToValue(findPreference("calendar_reminder")); bindPreferenceSummaryToValue(findPreference("calendar_reminder_interval")); } private void populateCalendarNames() { try { ListPreference calendarName = (ListPreference) findPreference("calendar_name"); CharSequence[] calendars = CalendarWrapper .getCalendars(getActivity()); calendarName.setEntries(calendars); calendarName.setEntryValues(calendars); } catch (Exception e) { e.printStackTrace(); // Don't crash because of anything in calendar } } } private static Preference.OnPreferenceChangeListener sResetGitLocalPathListener = new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object value) { preference.setSummary(value.toString()); PreferenceUtils.set("git_local_path", ""); preference.getPreferenceManager().findPreference("git_local_path").setSummary(""); return true; } }; /** * A preference value change listener that updates the preference's summary to reflect its new * value. */ private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object value) { String stringValue = value.toString(); if (preference instanceof ListPreference) { // For list preferences, look up the correct display value in // the preference's 'entries' list. ListPreference listPreference = (ListPreference) preference; int index = listPreference.findIndexOfValue(stringValue); // Set the summary to reflect the new value. preference.setSummary( index >= 0 ? listPreference.getEntries()[index] : null ); } else { // For all other preferences, set the summary to the value's // simple string representation. preference.setSummary(stringValue); } return true; } }; /** * Binds a preference's summary to its value. More specifically, when the preference's value is * changed, its summary (line of text below the preference title) is updated to reflect the * value. The summary is also immediately updated upon calling this method. The exact display * format is dependent on the type of preference. * * @see #sBindPreferenceSummaryToValueListener */ private static void bindPreferenceSummaryToValue(Preference preference) { if (preference == null) return; // Set the listener to watch for value changes. preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); // Trigger the listener immediately with the preference's // current value. if (preference.getKey().equals("calendar_reminder")) { sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()) .getBoolean(preference.getKey(), false) ); } else { sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()) .getString(preference.getKey(), "") ); } } }