package uk.org.smithfamily.mslogger.activity; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import uk.org.smithfamily.mslogger.ApplicationSettings; import uk.org.smithfamily.mslogger.ExtGPSManager; import uk.org.smithfamily.mslogger.GPSLocationManager; import uk.org.smithfamily.mslogger.R; import uk.org.smithfamily.mslogger.ecuDef.Megasquirt; import uk.org.smithfamily.mslogger.ecuDef.SettingGroup; import uk.org.smithfamily.mslogger.ecuDef.SettingGroup.SettingOption; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.location.Location; import android.location.LocationListener; import android.location.LocationProvider; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; /** * * */ public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener, LocationListener { public static final String DIRTY = "uk.org.smithfamily.mslogger.activity.PreferencesActivity.DIRTY"; private Boolean ecuDirty = false; private Set<String> settingFlags = new HashSet<String>(); private Set<String> alreadyDefined = new HashSet<String>(); private double extGPSFreq = 0; /** * */ private class ECUPreferenceChangeListener implements OnPreferenceChangeListener { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { resetECU(); return true; } } /** * * @param savedInstanceState */ @Override protected void onCreate(Bundle savedInstanceState) { ecuDirty = false; super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); Preference p = this.getPreferenceManager().findPreference("temptype"); p.setOnPreferenceChangeListener(new ECUPreferenceChangeListener()); p = this.getPreferenceManager().findPreference("maptype"); p.setOnPreferenceChangeListener(new ECUPreferenceChangeListener()); Megasquirt ecu = ApplicationSettings.INSTANCE.getEcuDefinition(); if (ecu != null && ecu.isConnected()) { PreferenceScreen ps = this.getPreferenceScreen(); buildAlreadyDefined(R.array.egotypes); buildAlreadyDefined(R.array.maptypes); buildAlreadyDefined(R.array.tempvalues); populateProjectSettings(ps); } for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { initSummary(getPreferenceScreen().getPreference(i)); } } protected void onResume() { super.onResume(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); ExtGPSManager.INSTANCE.addListener(this); ExtGPSManager.INSTANCE.requestStatusUpdate(); } protected void onPause() { super.onPause(); // Unregister the listener whenever a key changes getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); ExtGPSManager.INSTANCE.removeListener(this); } private void initSummary(Preference p) { if (p instanceof PreferenceCategory) { PreferenceCategory pCat = (PreferenceCategory) p; for (int i = 0; i < pCat.getPreferenceCount(); i++) { initSummary(pCat.getPreference(i)); } } else { updatePrefSummary(p); } } private void updatePrefSummary(Preference p) { if (p instanceof ListPreference) { ListPreference listPref = (ListPreference) p; p.setSummary(listPref.getEntry()); } if (p instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) p; p.setSummary(editTextPref.getText()); } } private void buildAlreadyDefined(int id) { String[] values = getResources().getStringArray(id); for (String value : values) { alreadyDefined.add(value); } } private void populateProjectSettings(PreferenceScreen ps) { Megasquirt ecu = ApplicationSettings.INSTANCE.getEcuDefinition(); List<SettingGroup> groups = ecu.getSettingGroups(); if (groups == null || groups.size() == 0) { return; } PreferenceCategory msSettingsCat = (PreferenceCategory) ps.findPreference("MSSettings"); for (SettingGroup g : groups) { ListPreference lp = new ListPreference(this); lp.setTitle(g.getDescription()); lp.setKey(g.getName()); lp.setEntries(getEntries(g)); lp.setEntryValues(getEntryValues(g)); msSettingsCat.addPreference(lp); } String[] flags = ecu.getControlFlags(); Arrays.sort(flags, String.CASE_INSENSITIVE_ORDER); for (String flag : flags) { if (!settingFlags.contains(flag) && !alreadyDefined.contains(flag)) { ListPreference lp = new ListPreference(this); lp.setTitle(flag); lp.setKey(flag); lp.setEntries(R.array.booleanTypes); lp.setEntryValues(R.array.booleanDisplayValues); lp.setDefaultValue("false"); msSettingsCat.addPreference(lp); } } } private String[] getEntryValues(SettingGroup g) { List<SettingOption> options = g.getOptions(); String[] values = new String[options.size()]; for (int i = 0; i < options.size(); i++) { values[i] = options.get(i).getFlag(); settingFlags.add(values[i]); } return values; } private String[] getEntries(SettingGroup g) { List<SettingOption> options = g.getOptions(); String[] values = new String[options.size()]; for (int i = 0; i < options.size(); i++) { values[i] = options.get(i).getDescription(); } return values; } /** * */ @Override public void finish() { Intent intent = new Intent(); intent.putExtra(DIRTY, ecuDirty); // Set result and finish this Activity setResult(Activity.RESULT_OK, intent); super.finish(); } /** * */ protected void resetECU() { ApplicationSettings.INSTANCE.refreshFlags(); ecuDirty = true; } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals("externalgpsactive")) { CheckBoxPreference cbp = (CheckBoxPreference) findPreference(key); if (cbp.isChecked()) { ExtGPSManager.INSTANCE.start(); ExtGPSManager.INSTANCE.addListener(GPSLocationManager.INSTANCE); } else { ExtGPSManager.INSTANCE.stop(); ExtGPSManager.INSTANCE.removeListener(GPSLocationManager.INSTANCE); } } else updatePrefSummary(findPreference(key)); } public void onLocationChanged(Location location) { } public void onProviderDisabled(String provider) { runOnUiThread(new Runnable() { public void run() { Preference p = getPreferenceManager().findPreference("externalgpsactive"); p.setSummary("GPS Disabled"); } }); } public void onProviderEnabled(String provider) { runOnUiThread(new Runnable() { public void run() { Preference p = getPreferenceManager().findPreference("externalgpsactive"); p.setSummary("GPS Starting..."); } }); } public void onStatusChanged(String provider, int status, Bundle extras) { String s = ""; switch (status) { case LocationProvider.AVAILABLE: s = "GPS Available"; if (extras != null && extras.containsKey("rps")) { extGPSFreq = extras.getDouble("rps"); } if (extras != null && extras.containsKey("satellites")) { s += " (sats=" + extras.get("satellites") + " freq=" + String.format("%.2f", extGPSFreq) + "Hz)"; } break; case LocationProvider.TEMPORARILY_UNAVAILABLE: s = "GPS Looking for satellites..."; break; case LocationProvider.OUT_OF_SERVICE: s = "GPS Disabled"; break; } final String sum = s; runOnUiThread(new Runnable() { public void run() { Preference p = getPreferenceManager().findPreference("externalgpsactive"); p.setSummary(sum); } }); } }