package com.example.android.sunshine;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.preference.CheckBoxPreference;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.PreferenceScreen;
/**
* The SettingsFragment serves as the display for all of the user's settings. In Sunshine, the
* user will be able to change their preference for units of measurement from metric to imperial,
* set their preferred weather location, and indicate whether or not they'd like to see
* notifications.
*
* Please note: If you are using our dummy weather services, the location returned will always be
* Mountain View, California.
*/
// COMPLETED (4) Create SettingsFragment and extend PreferenceFragmentCompat
public class SettingsFragment extends PreferenceFragmentCompat implements
// COMPLETED (10) Implement OnSharedPreferenceChangeListener from SettingsFragment
SharedPreferences.OnSharedPreferenceChangeListener {
// COMPLETED (8) Create a method called setPreferenceSummary that accepts a Preference and an Object and sets the summary of the preference
private void setPreferenceSummary(Preference preference, Object value) {
String stringValue = value.toString();
String key = preference.getKey();
if (preference instanceof ListPreference) {
/* For list preferences, look up the correct display value in */
/* the preference's 'entries' list (since they have separate labels/values). */
ListPreference listPreference = (ListPreference) preference;
int prefIndex = listPreference.findIndexOfValue(stringValue);
if (prefIndex >= 0) {
preference.setSummary(listPreference.getEntries()[prefIndex]);
}
} else {
// For other preferences, set the summary to the value's simple string representation.
preference.setSummary(stringValue);
}
}
// COMPLETED (5) Override onCreatePreferences and add the preference xml file using addPreferencesFromResource
@Override
public void onCreatePreferences(Bundle bundle, String s) {
/* Add 'general' preferences, defined in the XML file */
addPreferencesFromResource(R.xml.pref_general);
// COMPLETED (9) Set the preference summary on each preference that isn't a CheckBoxPreference
SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
PreferenceScreen prefScreen = getPreferenceScreen();
int count = prefScreen.getPreferenceCount();
for (int i = 0; i < count; i++) {
Preference p = prefScreen.getPreference(i);
if (!(p instanceof CheckBoxPreference)) {
String value = sharedPreferences.getString(p.getKey(), "");
setPreferenceSummary(p, value);
}
}
}
// COMPLETED (13) Unregister SettingsFragment (this) as a SharedPreferenceChangedListener in onStop
@Override
public void onStop() {
super.onStop();
/* Unregister the preference change listener */
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
// COMPLETED (12) Register SettingsFragment (this) as a SharedPreferenceChangedListener in onStart
@Override
public void onStart() {
super.onStart();
/* Register the preference change listener */
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
// COMPLETED (11) Override onSharedPreferenceChanged to update non CheckBoxPreferences when they are changed
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference preference = findPreference(key);
if (null != preference) {
if (!(preference instanceof CheckBoxPreference)) {
setPreferenceSummary(preference, sharedPreferences.getString(key, ""));
}
}
}
}