package me.guillaumin.android.osmtracker.activity;
import java.io.File;
import java.io.FilenameFilter;
import me.guillaumin.android.osmtracker.OSMTracker;
import me.guillaumin.android.osmtracker.R;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Environment;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.provider.Settings;
/**
* Manages preferences screen.
*
* @author Nicolas Guillaumin
*
*/
public class Preferences extends PreferenceActivity {
@SuppressWarnings("unused")
private static final String TAG = Preferences.class.getSimpleName();
/**
* Directory containing user layouts, relative to storage dir.
*/
public static final String LAYOUTS_SUBDIR = "layouts";
/**
* File extension for layout files
*/
private static final String LAYOUT_FILE_EXTENSION = ".xml";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// Set summary of some preferences to their actual values
// and register a change listener to set again the summary in case of change
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// External storage directory
EditTextPreference storageDirPref = (EditTextPreference) findPreference(OSMTracker.Preferences.KEY_STORAGE_DIR);
storageDirPref.setSummary(prefs.getString(OSMTracker.Preferences.KEY_STORAGE_DIR, OSMTracker.Preferences.VAL_STORAGE_DIR));
storageDirPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Ensure there is always a leading slash
if (! ((String) newValue).startsWith(File.separator)) {
newValue = File.separator + (String) newValue;
}
// Set summary with the directory value
preference.setSummary((String) newValue);
// Re-populate layout list preference
populateLayoutPreference((String) newValue);
// Set layout to default layout
((ListPreference) findPreference(OSMTracker.Preferences.KEY_UI_BUTTONS_LAYOUT)).setValue(OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT);
return true;
}
});
populateLayoutPreference(storageDirPref.getText());
// Voice record duration
Preference pref = findPreference(OSMTracker.Preferences.KEY_VOICEREC_DURATION);
pref.setSummary(prefs.getString(OSMTracker.Preferences.KEY_VOICEREC_DURATION, OSMTracker.Preferences.VAL_VOICEREC_DURATION) + " " + getResources().getString(R.string.prefs_voicerec_duration_seconds));
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Set summary with the number of seconds, following by "seconds"
preference.setSummary(newValue+ " " + getResources().getString(R.string.prefs_voicerec_duration_seconds));
return true;
}
});
// Update GPS logging interval summary to the current value
pref = findPreference(OSMTracker.Preferences.KEY_GPS_LOGGING_INTERVAL);
pref.setSummary(
prefs.getString(OSMTracker.Preferences.KEY_GPS_LOGGING_INTERVAL, OSMTracker.Preferences.VAL_GPS_LOGGING_INTERVAL)
+ " " + getResources().getString(R.string.prefs_gps_logging_interval_seconds)
+ ". " + getResources().getString(R.string.prefs_gps_logging_interval_summary));
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Set summary with the interval and "seconds"
preference.setSummary(newValue
+ " " + getResources().getString(R.string.prefs_gps_logging_interval_seconds)
+ ". " + getResources().getString(R.string.prefs_gps_logging_interval_summary));
return true;
}
});
pref = findPreference(OSMTracker.Preferences.KEY_GPS_OSSETTINGS);
pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
return true;
}
});
// Button screen orientation option
pref = findPreference(OSMTracker.Preferences.KEY_UI_ORIENTATION);
ListPreference orientationListPreference = (ListPreference) pref;
String displayValueKey = prefs.getString(OSMTracker.Preferences.KEY_UI_ORIENTATION, OSMTracker.Preferences.VAL_UI_ORIENTATION);
int displayValueIndex = orientationListPreference.findIndexOfValue(displayValueKey);
String displayValue = orientationListPreference.getEntries()[displayValueIndex].toString();
orientationListPreference.setSummary(displayValue + ".\n"
+ getResources().getString(R.string.prefs_ui_orientation_summary));
// Set a listener to update the preference display after a change is made
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Set summary with the display text of the item and a description of the preference
ListPreference orientationListPreference = (ListPreference)preference;
// Pull the display string from the list preference rather than simply using the key value
int newValueIndex = orientationListPreference.findIndexOfValue((String)newValue);
String newPreferenceDisplayValue = orientationListPreference.getEntries()[newValueIndex].toString();
preference.setSummary(newPreferenceDisplayValue
+ ".\n" + getResources().getString(R.string.prefs_ui_orientation_summary));
return true;
}
});
// Clear OSM data: Disable if there's no OSM data stored
pref = findPreference(OSMTracker.Preferences.KEY_OSM_OAUTH_CLEAR_DATA);
if (prefs.contains(OSMTracker.Preferences.KEY_OSM_OAUTH_TOKEN)
&& prefs.contains(OSMTracker.Preferences.KEY_OSM_OAUTH_SECRET)) {
pref.setEnabled(true);
} else {
pref.setEnabled(false);
}
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Clear data
Editor editor = prefs.edit();
editor.remove(OSMTracker.Preferences.KEY_OSM_OAUTH_TOKEN);
editor.remove(OSMTracker.Preferences.KEY_OSM_OAUTH_SECRET);
editor.commit();
preference.setEnabled(false);
return false;
}
});
}
/**
* Populates the user layout list preference.
* @param storageDir Where to find layout files
*/
private void populateLayoutPreference(String storageDir) {
// Populate layout lists reading available layouts from external storage
ListPreference lf = (ListPreference) findPreference(OSMTracker.Preferences.KEY_UI_BUTTONS_LAYOUT);
String[] entries;
String[] values;
// Check for presence of layout directory
File layoutsDir = new File(Environment.getExternalStorageDirectory(), storageDir + File.separator + LAYOUTS_SUBDIR + File.separator);
if (layoutsDir.exists() && layoutsDir.canRead()) {
// List each layout file
String[] layoutFiles = layoutsDir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return filename.endsWith(LAYOUT_FILE_EXTENSION);
}
});
// Create array of values for each layout file + the default one
entries = new String[layoutFiles.length+1];
values = new String[layoutFiles.length+1];
entries[0] = getResources().getString(R.string.prefs_ui_buttons_layout_defaut);
values[0] = OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT;
for (int i=0; i<layoutFiles.length; i++) {
entries[i+1] = layoutFiles[i].substring(0, layoutFiles[i].length()-LAYOUT_FILE_EXTENSION.length());
values[i+1] = layoutFiles[i];
}
} else {
// No layout found, populate values with just the default entry.
entries = new String[] {getResources().getString(R.string.prefs_ui_buttons_layout_defaut)};
values = new String[] {OSMTracker.Preferences.VAL_UI_BUTTONS_LAYOUT};
}
lf.setEntries(entries);
lf.setEntryValues(values);
}
}