package net.sourceforge.servestream.fragment;
import java.util.HashMap;
import net.sourceforge.servestream.R;
import net.sourceforge.servestream.bean.UriBean;
import net.sourceforge.servestream.database.StreamDatabase;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
public class UriEditorFragment extends net.sourceforge.servestream.preference.PreferenceFragment
implements Preference.OnPreferenceChangeListener {
private HashMap<String, String> mValues = new HashMap<String, String>();
private EditTextPreference mNickname;
private EditTextPreference mProtocol;
private EditTextPreference mUsername;
private EditTextPreference mPassword;
private EditTextPreference mHostname;
private EditTextPreference mPort;
private EditTextPreference mPath;
private EditTextPreference mQuery;
private EditTextPreference mReference;
private UriBean mBean;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
addPreferencesFromResource(R.xml.stream_prefs);
long streamId = getActivity().getIntent().getLongExtra(Intent.EXTRA_TITLE, -1);
mNickname = (EditTextPreference) findPreference("nickname");
mNickname.setOnPreferenceChangeListener(mListener);
mValues.put("nickname", StreamDatabase.FIELD_STREAM_NICKNAME);
mProtocol = (EditTextPreference) findPreference("protocol");
mProtocol.setOnPreferenceChangeListener(mListener);
mValues.put("protocol", StreamDatabase.FIELD_STREAM_PROTOCOL);
mUsername = (EditTextPreference) findPreference("username");
mUsername.setOnPreferenceChangeListener(mListener);
mValues.put("username", StreamDatabase.FIELD_STREAM_USERNAME);
mPassword = (EditTextPreference) findPreference("password");
mPassword.setOnPreferenceChangeListener(mListener);
mValues.put("password", StreamDatabase.FIELD_STREAM_PASSWORD);
mHostname = (EditTextPreference) findPreference("hostname");
mHostname.setOnPreferenceChangeListener(mListener);
mValues.put("hostname", StreamDatabase.FIELD_STREAM_HOSTNAME);
mPort = (EditTextPreference) findPreference("port");
mPort.setOnPreferenceChangeListener(mListener);
mValues.put("port", StreamDatabase.FIELD_STREAM_PORT);
mPath = (EditTextPreference) findPreference("path");
mPath.setOnPreferenceChangeListener(mListener);
mValues.put("path", StreamDatabase.FIELD_STREAM_PATH);
mQuery = (EditTextPreference) findPreference("query");
mQuery.setOnPreferenceChangeListener(mListener);
mValues.put("query", StreamDatabase.FIELD_STREAM_QUERY);
mReference = (EditTextPreference) findPreference("reference");
mReference.setOnPreferenceChangeListener(mListener);
mValues.put("reference", StreamDatabase.FIELD_STREAM_REFERENCE);
StreamDatabase database = new StreamDatabase(getActivity());
mBean = database.findUri((int) streamId);
database.close();
updatePrefs(mBean);
}
private OnPreferenceChangeListener mListener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference.getKey().equals("port") && newValue != null && newValue.equals("")) {
newValue = "-1";
}
if (newValue != null && newValue.equals("")) {
newValue = null;
}
String val = (String) newValue;
// Set the summary based on the new label.
preference.setSummary(val);
return UriEditorFragment.this.onPreferenceChange(preference, newValue);
}
};
// Used to post runnables asynchronously.
private static final Handler sHandler = new Handler();
@Override
public boolean onPreferenceChange(final Preference preference, final Object newValue) {
// Asynchronously save the alarm since this method is called _before_
// the value of the preference has changed.
sHandler.post(new Runnable() {
public void run() {
saveUri(preference, newValue);
}
});
return true;
}
private void updatePrefs(UriBean bean) {
mNickname.setSummary(bean.getNickname());
mNickname.setText(bean.getNickname());
mProtocol.setSummary(bean.getProtocol());
mProtocol.setText(bean.getProtocol());
mUsername.setSummary(bean.getUsername());
mUsername.setText(bean.getUsername());
mPassword.setSummary(scrubField(bean.getPassword()));
mPassword.setText(bean.getPassword());
mHostname.setSummary(bean.getHostname());
mHostname.setText(bean.getHostname());
mPort.setSummary(String.valueOf(bean.getPort()));
mPort.setText(String.valueOf(bean.getPort()));
mPath.setSummary(bean.getPath());
mPath.setText(bean.getPath());
mQuery.setSummary(bean.getQuery());
mQuery.setText(bean.getQuery());
mReference.setSummary(bean.getReference());
mReference.setText(bean.getReference());
}
private String scrubField(String value) {
if (value != null) {
return new String(new char[value.length()]).replace("\0", "*");
}
return value;
}
private void saveUri(final Preference preference, Object newValue) {
String value = (String) newValue;
ContentValues values = new ContentValues();
values.put(mValues.get(preference.getKey()), value);
StreamDatabase database = new StreamDatabase(getActivity());
SQLiteDatabase db = database.getWritableDatabase();
db.update(StreamDatabase.TABLE_STREAMS, values, "_id = ?", new String[] { String.valueOf(mBean.getId()) });
database.close();
db.close();
}
}