/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
package com.fr3ts0n.ecu.gui.androbd;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import com.fr3ts0n.ecu.EcuDataItem;
import com.fr3ts0n.ecu.prot.obd.ElmProt;
import com.fr3ts0n.ecu.prot.obd.ObdProt;
import java.util.HashSet;
import java.util.Vector;
public class SettingsActivity
extends Activity
{
/**
* app preferences
*/
static SharedPreferences prefs;
/**
* preference keys for extension files
*/
static final String[] extKeys =
{
"ext_file_conversions",
"ext_file_dataitems"
};
/**
* key ids for device network settings
*/
static final String[] networkKeys =
{
"device_address",
"device_port"
};
/**
* key ids for device network settings
*/
static final String[] bluetoothKeys =
{
"bt_secure_connection"
};
// Preference key for data items
static final String KEY_DATA_ITEMS = "data_items";
static final String KEY_PROT_SELECT = "protocol";
static final String KEY_COMM_MEDIUM = "comm_medium";
static final String ELM_MIN_TIMEOUT = "elm_min_timeout";
static final String ELM_CMD_DISABLE = "elm_cmd_disable";
/*
* (non-Javadoc)
*
* @see android.preference.PreferenceActivity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content,
new PrefsFragment()).commit();
}
public static class PrefsFragment
extends PreferenceFragment
implements Preference.OnPreferenceClickListener,
SharedPreferences.OnSharedPreferenceChangeListener
{
Vector<EcuDataItem> items;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.settings);
for (String key : extKeys)
{
setPrefsText(key);
}
// set up communication media selection
setupCommMediaSelection();
// set up protocol selection
setupProtoSelection();
// set up ELM command selection
setupElmCmdSelection();
// set up selectable PID list
setupPidSelection();
// update network selection fields
updateNetworkSelections();
// add handler for selection update
prefs.registerOnSharedPreferenceChangeListener(this);
}
/**
* set up protocol selection
*/
void setupProtoSelection()
{
ListPreference pref = (ListPreference) findPreference(KEY_PROT_SELECT);
ElmProt.PROT[] values = ElmProt.PROT.values();
CharSequence[] titles = new CharSequence[values.length];
CharSequence[] keys = new CharSequence[values.length];
int i = 0;
for (ElmProt.PROT proto : values)
{
titles[i] = proto.toString();
keys[i] = String.valueOf(proto.ordinal());
i++;
}
// set enries and keys
pref.setEntries(titles);
pref.setEntryValues(keys);
pref.setDefaultValue(titles[0]);
// show current selection
pref.setSummary(pref.getEntry());
}
/**
* set up protocol selection
*/
void setupElmCmdSelection()
{
MultiSelectListPreference pref =
(MultiSelectListPreference) findPreference(ELM_CMD_DISABLE);
ElmProt.CMD[] values = ElmProt.CMD.values();
HashSet<String> selections = new HashSet<String>();
CharSequence[] titles = new CharSequence[values.length];
CharSequence[] keys = new CharSequence[values.length];
int i = 0;
for (ElmProt.CMD cmd : values)
{
titles[i] = cmd.toString();
keys[i] = cmd.toString();
if(!cmd.isEnabled()) selections.add(cmd.toString());
i++;
}
// set enries and keys
pref.setEntries(titles);
pref.setEntryValues(keys);
pref.setValues(selections);
}
/**
* set up protocol selection
*/
void setupCommMediaSelection()
{
ListPreference pref = (ListPreference) findPreference(KEY_COMM_MEDIUM);
CommService.MEDIUM[] values = CommService.MEDIUM.values();
CharSequence[] titles = new CharSequence[values.length];
CharSequence[] keys = new CharSequence[values.length];
int i = 0;
for (CommService.MEDIUM proto : values)
{
titles[i] = proto.toString();
keys[i] = String.valueOf(proto.ordinal());
i++;
}
// set enries and keys
pref.setEntries(titles);
pref.setEntryValues(keys);
pref.setDefaultValue(titles[0]);
// show current selection
pref.setSummary(pref.getEntry());
}
/**
* set up selection for PIDs
*/
void setupPidSelection()
{
MultiSelectListPreference itemList =
(MultiSelectListPreference) findPreference(KEY_DATA_ITEMS);
// collect data items for selection
items = ObdProt.dataItems.getSvcDataItems(ObdProt.OBD_SVC_DATA);
HashSet<String> selections = new HashSet<String>();
CharSequence[] titles = new CharSequence[items.size()];
CharSequence[] keys = new CharSequence[items.size()];
// loop through data items
int i = 0;
for (EcuDataItem currItem : items)
{
titles[i] = currItem.label;
keys[i] = currItem.toString();
selections.add(currItem.toString());
i++;
}
// set enries and keys
itemList.setEntries(titles);
itemList.setEntryValues(keys);
// if there is no item selected, mark all as selected
if (itemList.getValues().size() == 0)
{
itemList.setValues(selections);
}
}
/**
* set up preference text for extension files
*
* @param key preference key to be set up
*/
void setPrefsText(String key)
{
Preference prefComp = findPreference(key);
prefComp.setOnPreferenceClickListener(this);
String value = prefs.getString(key, null);
if (value != null)
{
prefComp.setSummary(value);
}
}
/**
* Update fields for network parameters
*
* enable/disable elements for network parameters
* based on selection of communication medium
*/
public void updateNetworkSelections()
{
boolean networkSelected =
String.valueOf(CommService.MEDIUM.NETWORK.ordinal())
.equals(prefs.getString(KEY_COMM_MEDIUM,""));
boolean bluetoothSelected =
String.valueOf(CommService.MEDIUM.BLUETOOTH.ordinal())
.equals(prefs.getString(KEY_COMM_MEDIUM,""));
// enable/disable network specific entries
for(String key : networkKeys)
{
Preference pref = findPreference(key);
pref.setEnabled(networkSelected);
}
// enable/disable bluetooth specific entries
for(String key : bluetoothKeys)
{
Preference pref = findPreference(key);
pref.setEnabled(bluetoothSelected);
}
}
@Override
public boolean onPreferenceClick(Preference preference)
{
Intent intent = preference.getIntent();
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, preference.hashCode());
return true;
}
/**
* Handler for result messages from other activities
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
Preference pref;
SharedPreferences.Editor ed = prefs.edit();
String value = (resultCode == Activity.RESULT_OK) ? data.getData().toString() : null;
// find the right key
for (String key : extKeys)
{
pref = findPreference(key);
if (pref.hashCode() == requestCode)
{
ed.putString(key, value);
pref.setSummary(value != null ? value : getString(R.string.select_extension));
}
}
ed.apply();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
Preference pref = findPreference(key);
if (pref instanceof ListPreference)
{
ListPreference currPref = (ListPreference) pref;
currPref.setSummary(currPref.getEntry());
}
else
if (pref instanceof EditTextPreference)
{
EditTextPreference currPref = (EditTextPreference) pref;
currPref.setSummary(currPref.getText());
}
if(KEY_COMM_MEDIUM.equals(key))
updateNetworkSelections();
}
}
}