package com.evancharlton.mileage; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.SharedPreferences; public class PreferencesProvider { private static PreferencesProvider s_instance = null; private Activity m_activity; private SharedPreferences m_settings; private CalculationEngine m_calcEngine; private static final String PREFS_NAME = "MileageSettings"; private static final int BOOLEAN = 0; private static final int FLOAT = 1; private static final int INT = 2; private static final int LONG = 3; private static final int STRING = 4; private static final int US_ENGINE = 0; private PreferencesProvider(Activity activity) { m_activity = activity; m_settings = m_activity.getSharedPreferences(PREFS_NAME, 0); } public static PreferencesProvider getInstance(Activity activity) { if (s_instance == null) { s_instance = new PreferencesProvider(activity); } return s_instance; } public boolean write(String key, boolean value) { return write(key, value, BOOLEAN); } public boolean write(String key, float value) { return write(key, value, FLOAT); } public boolean write(String key, int value) { return write(key, value, INT); } public boolean write(String key, long value) { return write(key, value, LONG); } public boolean write(String key, String value) { return write(key, value, STRING); } private boolean write(String key, Object value, int type) { SharedPreferences.Editor editor = m_settings.edit(); switch (type) { case BOOLEAN: editor.putBoolean(key, (Boolean) value); break; case FLOAT: editor.putFloat(key, (Float) value); break; case INT: editor.putInt(key, (Integer) value); break; case LONG: editor.putLong(key, (Long) value); break; case STRING: editor.putString(key, (String) value); break; default: throw new IllegalArgumentException("Unrecognized type: " + value.toString()); } return editor.commit(); } public boolean getBoolean(String key, boolean defValue) { return m_settings.getBoolean(key, defValue); } public float getFloat(String key, float defValue) { return m_settings.getFloat(key, defValue); } public int getInt(String key, int defValue) { return m_settings.getInt(key, defValue); } public long getLong(String key, long defValue) { return m_settings.getLong(key, defValue); } public String getString(String key, String defValue) { return m_settings.getString(key, defValue); } public String getString(int array, String key) { try { int index = getInt(key, 0); String data = m_activity.getResources().getStringArray(array)[index]; return data; } catch (IndexOutOfBoundsException e) { return ""; } } public String getCurrency() { return getString(R.array.currencies, SettingsView.CURRENCY); } public CalculationEngine getCalculator() { int calc = getInt(SettingsView.CALCULATIONS, 0); if (calc == US_ENGINE) { m_calcEngine = new USCalculationEngine(); } else { m_calcEngine = new MetricCalculationEngine(); } return m_calcEngine; } public String format(double number) { // TODO: support this in the future DecimalFormat formatter = new DecimalFormat("#,##0.00"); return formatter.format(number); } public String format(Date d) { SimpleDateFormat format = new SimpleDateFormat(); format.applyPattern(getString(R.array.date_patterns, SettingsView.DATE)); return format.format(d); } }