Created
December 10, 2014 14:17
-
-
Save theblang/c59671e080b3d1e573c6 to your computer and use it in GitHub Desktop.
A sample usage of a Support Preference Fragment from Machinarius
This file contains 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 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