Skip to content

Instantly share code, notes, and snippets.

@theblang
Created December 10, 2014 14:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save theblang/c59671e080b3d1e573c6 to your computer and use it in GitHub Desktop.
Save theblang/c59671e080b3d1e573c6 to your computer and use it in GitHub Desktop.
A sample usage of a Support Preference Fragment from Machinarius
package edu.msstate.nsparc.mdes.fragments;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.github.machinarius.preferencefragment.PreferenceFragment;
import edu.msstate.nsparc.mdes.R;
import edu.msstate.nsparc.mdes.constants.Default;
import edu.msstate.nsparc.mdes.constants.PrefKey;
import edu.msstate.nsparc.mdes.constants.ResultCode;
import edu.msstate.nsparc.mdes.constants.SearchMethod;
import edu.msstate.nsparc.mdes.persistance.ZipCode;
import edu.msstate.nsparc.mdes.rest.MobileClient;
import edu.msstate.nsparc.mdes.rest.MobileResponse;
import retrofit.RetrofitError;
public class SettingsFragment extends PreferenceFragment
implements SharedPreferences.OnSharedPreferenceChangeListener {
public interface SettingsCallbacks {
}
private SettingsCallbacks callbacks;
public static SettingsFragment newInstance() {
return new SettingsFragment();
}
public SettingsFragment() {}
SharedPreferences preferences;
private SharedPreferences.Editor editor;
private ListPreference searchMethod;
private EditTextPreference zipCode;
private ListPreference searchDistance;
private ListPreference sortBy;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
callbacks = (SettingsCallbacks) activity;
activity.setTitle(R.string.title_fragment_settings);
}
catch(ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement required interfaces");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// http://stackoverflow.com/a/9685690/1747491
float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (getResources().getDimension(R.dimen.activity_horizontal_margin)* scale + 0.5f);
view.setPadding(dpAsPixels, dpAsPixels, dpAsPixels, dpAsPixels);
}
@Override
public void onResume() {
super.onResume();
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.settings);
preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
preferences.registerOnSharedPreferenceChangeListener(this);
editor = preferences.edit();
searchMethod = (ListPreference) findPreference(PrefKey.SEARCH_METHOD);
zipCode = (EditTextPreference) findPreference(PrefKey.Location.ZIP_CODE);
searchDistance = (ListPreference) findPreference(PrefKey.SEARCH_DISTANCE);
sortBy = (ListPreference) findPreference(PrefKey.SORT_BY);
// configure preference objects
zipCode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// if not five characters
if(newValue.toString().length() != 5) {
// set to default and don't update with newValue
setDefaultZip();
}
else {
// verify
new VerifyZipTask(newValue.toString()).execute();
}
return false; // signifies that we are handling the update of the Preference ourselves
}
});
// remove zipCode preference if user is using GPS
if(searchMethod.getValue().equals(SearchMethod.GPS)) {
getPreferenceScreen().removePreference(zipCode);
}
// configure summaries
searchMethod.setSummary(searchMethod.getEntry());
zipCode.setSummary(zipCode.getText());
searchDistance.setSummary(searchDistance.getEntry());
sortBy.setSummary(sortBy.getEntry());
}
@Override
public void onDetach() {
super.onDetach();
callbacks = null;
}
/**
* @see <a href="http://stackoverflow.com/a/531927/1747491">Set preference summary</a>
*/
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if(key.equals(PrefKey.SEARCH_METHOD)) {
searchMethod.setSummary(searchMethod.getEntry());
// enable or disable zipCode based on selection
if(searchMethod.getValue().equals(SearchMethod.ZIP_CODE))
getPreferenceScreen().addPreference(zipCode);
else
getPreferenceScreen().removePreference(zipCode);
}
else if(key.equals(PrefKey.Location.ZIP_CODE)) {
zipCode.setSummary(zipCode.getText());
}
else if(key.equals(PrefKey.SEARCH_DISTANCE)) {
searchDistance.setSummary(searchDistance.getEntry());
}
else if(key.equals(PrefKey.SORT_BY)) {
sortBy.setSummary(sortBy.getEntry());
}
else
return;
// if a preference changed, invalidate job search results
prefs.edit().putLong(PrefKey.LastUpdated.JOBS, 0).commit();
}
private void setDefaultZip() {
Toast.makeText(getActivity(), "Invalid zip code. Using Jackson, MS.", Toast.LENGTH_SHORT).show();
editor.putString(PrefKey.Location.ZIP_CODE, Default.ZIP_CODE);
editor.putFloat(PrefKey.Location.ZIP_CODE_LAT, Default.LAT);
editor.putFloat(PrefKey.Location.ZIP_CODE_LON, Default.LON);
editor.commit();
zipCode.setText(Default.ZIP_CODE);
zipCode.setSummary(Default.ZIP_CODE);
}
private class VerifyZipTask extends AsyncTask<String, Void, Integer> {
ProgressDialog progressDialog;
String newValue;
final VerifyZipTask task = this;
ZipCode result;
public VerifyZipTask(String newValue) {
this.newValue = newValue;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(getActivity(), "", "Verifying zip code", true, true, new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// if canceled just use Jackson, MS
task.cancel(true);
setDefaultZip();
}
});
}
@Override
protected Integer doInBackground(String... params) {
try {
MobileResponse<ZipCode> response = MobileClient.lookupZip(newValue);
if(response.isSuccessYN()) {
result = response.getResults().get(0);
return ResultCode.SUCCESS;
}
else {
return ResultCode.FAILURE;
}
}
catch(NullPointerException e) {
Log.e(getTag(), e.getMessage(), e);
return ResultCode.FAILURE;
}
catch(RetrofitError e) {
Log.e(getTag(), e.getMessage(), e);
return ResultCode.FAILURE;
}
}
@Override
protected void onPostExecute(Integer success) {
if(success == ResultCode.SUCCESS) {
// zip code validated
editor.putString(PrefKey.Location.ZIP_CODE, newValue);
editor.putFloat(PrefKey.Location.ZIP_CODE_LAT, result.getLatitude());
editor.putFloat(PrefKey.Location.ZIP_CODE_LON, result.getLongitude());
editor.commit();
zipCode.setText(newValue);
zipCode.setSummary(newValue);
}
else {
setDefaultZip();
}
progressDialog.dismiss();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment