Created
August 29, 2015 06:40
-
-
Save alayek/d02f9f6768e5b8a5c74d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.android.sunshine.app; | |
import android.annotation.TargetApi; | |
import android.content.Context; | |
import android.content.res.Configuration; | |
import android.media.Ringtone; | |
import android.media.RingtoneManager; | |
import android.net.Uri; | |
import android.os.Build; | |
import android.os.Bundle; | |
import android.preference.ListPreference; | |
import android.preference.Preference; | |
import android.preference.PreferenceActivity; | |
import android.preference.PreferenceCategory; | |
import android.preference.PreferenceFragment; | |
import android.preference.PreferenceManager; | |
import android.preference.RingtonePreference; | |
import android.text.TextUtils; | |
import android.view.MenuItem; | |
import android.support.v4.app.NavUtils; | |
import java.util.List; | |
/** | |
* A {@link PreferenceActivity} that presents a set of application settings. On | |
* handset devices, settings are presented as a single list. On tablets, | |
* settings are split by category, with category headers shown to the left of | |
* the list of settings. | |
* <p/> | |
* See <a href="http://developer.android.com/design/patterns/settings.html"> | |
* Android Design: Settings</a> for design guidelines and the <a | |
* href="http://developer.android.com/guide/topics/ui/settings.html">Settings | |
* API Guide</a> for more information on developing a Settings UI. | |
*/ | |
public class SettingsActivity extends PreferenceActivity | |
implements Preference.OnPreferenceChangeListener{ | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
// setupActionBar(); | |
addPreferencesFromResource(R.xml.pref_general); | |
bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key))); | |
} | |
/** | |
* Set up the {@link android.app.ActionBar}, if the API is available. | |
*/ | |
@TargetApi(Build.VERSION_CODES.HONEYCOMB) | |
private void setupActionBar() { | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { | |
// Show the Up button in the action bar. | |
getActionBar().setDisplayHomeAsUpEnabled(true); | |
} | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
int id = item.getItemId(); | |
if (id == android.R.id.home) { | |
// This ID represents the Home or Up button. In the case of this | |
// activity, the Up button is shown. Use NavUtils to allow users | |
// to navigate up one level in the application structure. For | |
// more details, see the Navigation pattern on Android Design: | |
// | |
// http://developer.android.com/design/patterns/navigation.html#up-vs-back | |
// | |
// TODO: If Settings has multiple levels, Up should navigate up | |
// that hierarchy. | |
NavUtils.navigateUpFromSameTask(this); | |
return true; | |
} | |
return super.onOptionsItemSelected(item); | |
} | |
/** | |
* {@inheritDoc} | |
*/ | |
@Override | |
public boolean onIsMultiPane() { | |
return isXLargeTablet(this); | |
} | |
/** | |
* Helper method to determine if the device has an extra-large screen. For | |
* example, 10" tablets are extra-large. | |
*/ | |
private static boolean isXLargeTablet(Context context) { | |
return (context.getResources().getConfiguration().screenLayout | |
& Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; | |
} | |
/** | |
* {@inheritDoc} | |
*/ | |
@Override | |
@TargetApi(Build.VERSION_CODES.HONEYCOMB) | |
public void onBuildHeaders(List<Header> target) { | |
loadHeadersFromResource(R.xml.pref_headers, target); | |
} | |
/** | |
* 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 if (preference instanceof RingtonePreference) { | |
// For ringtone preferences, look up the correct display value | |
// using RingtoneManager. | |
if (TextUtils.isEmpty(stringValue)) { | |
// Empty values correspond to 'silent' (no ringtone). | |
preference.setSummary(R.string.pref_ringtone_silent); | |
} else { | |
Ringtone ringtone = RingtoneManager.getRingtone( | |
preference.getContext(), Uri.parse(stringValue)); | |
if (ringtone == null) { | |
// Clear the summary if there was a lookup error. | |
preference.setSummary(null); | |
} else { | |
// Set the summary to reflect the new ringtone display | |
// name. | |
String name = ringtone.getTitle(preference.getContext()); | |
preference.setSummary(name); | |
} | |
} | |
} 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) { | |
// Set the listener to watch for value changes. | |
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); | |
// Trigger the listener immediately with the preference's | |
// current value. | |
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, | |
PreferenceManager | |
.getDefaultSharedPreferences(preference.getContext()) | |
.getString(preference.getKey(), "")); | |
} | |
/** | |
* Called when a Preference has been changed by the user. This is | |
* called before the state of the Preference is about to be updated and | |
* before the state is persisted. | |
* | |
* @param preference The changed Preference. | |
* @param newValue The new value of the Preference. | |
* @return True to update the state of the Preference with the new value. | |
*/ | |
@Override | |
public boolean onPreferenceChange(Preference preference, Object newValue) { | |
String stringValue = newValue.toString(); | |
if (preference instanceof ListPreference){ | |
// For Listpreferences, look up the correct display value | |
// in the entries list | |
ListPreference listPreference = (ListPreference)preference; | |
int prefIndex = listPreference.findIndexOfValue(stringValue); | |
if (prefIndex >= 0) { // found | |
preference.setSummary(listPreference.getEntries()[prefIndex]); | |
} | |
} | |
else { | |
// for other preferences, set the summary to the value's simple String representation | |
preference.setSummary(stringValue); | |
} | |
return true; | |
} | |
/** | |
* This fragment shows general preferences only. It is used when the | |
* activity is showing a two-pane settings UI. | |
*/ | |
@TargetApi(Build.VERSION_CODES.HONEYCOMB) | |
public static class GeneralPreferenceFragment extends PreferenceFragment { | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
addPreferencesFromResource(R.xml.pref_general); | |
// Bind the summaries of EditText/List/Dialog/Ringtone preferences | |
// to their values. When their values change, their summaries are | |
// updated to reflect the new value, per the Android Design | |
// guidelines. | |
bindPreferenceSummaryToValue(findPreference("example_text")); | |
bindPreferenceSummaryToValue(findPreference("example_list")); | |
} | |
} | |
/** | |
* This fragment shows notification preferences only. It is used when the | |
* activity is showing a two-pane settings UI. | |
*/ | |
@TargetApi(Build.VERSION_CODES.HONEYCOMB) | |
public static class NotificationPreferenceFragment extends PreferenceFragment { | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
addPreferencesFromResource(R.xml.pref_notification); | |
// Bind the summaries of EditText/List/Dialog/Ringtone preferences | |
// to their values. When their values change, their summaries are | |
// updated to reflect the new value, per the Android Design | |
// guidelines. | |
bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone")); | |
} | |
} | |
/** | |
* This fragment shows data and sync preferences only. It is used when the | |
* activity is showing a two-pane settings UI. | |
*/ | |
@TargetApi(Build.VERSION_CODES.HONEYCOMB) | |
public static class DataSyncPreferenceFragment extends PreferenceFragment { | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
addPreferencesFromResource(R.xml.pref_data_sync); | |
// Bind the summaries of EditText/List/Dialog/Ringtone preferences | |
// to their values. When their values change, their summaries are | |
// updated to reflect the new value, per the Android Design | |
// guidelines. | |
bindPreferenceSummaryToValue(findPreference("sync_frequency")); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment