package com.roiding.rterm;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import tw.kenshinn.keyboardTerm.R;
import tw.kenshinn.keyboardTerm.R.string;
import tw.kenshinn.keyboardTerm.R.xml;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.Preference.OnPreferenceChangeListener;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import com.roiding.rterm.bean.Host;
import com.roiding.rterm.util.DBUtils;
public class EditHostActivity extends PreferenceActivity {
private Host h;
private Map<String, String> valuesMap = new HashMap<String, String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.addPreferencesFromResource(R.xml.host);
valuesMap.put("name", "");
valuesMap.put("host", "");
valuesMap.put("port", "23");
valuesMap.put("protocal", "Telnet");
String lang = Locale.getDefault().getCountry();
if("CN".equals(lang)){
valuesMap.put("encoding", "GBK");
}
else{
valuesMap.put("encoding", "Big5");
}
valuesMap.put("user", "");
valuesMap.put("pass", "");
h = (Host) getIntent().getSerializableExtra("host");
if (h != null)
extractValuesFromHost(h);
updatePreferenceDisplay();
System.out.println(getPreferenceScreen().getPreferenceCount());
OnPreferenceChangeListener listener = new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference,
Object newValue) {
String key = preference.getKey();
String value = newValue.toString();
Log.i("TT", "onPreferenceChange," + key + ":" + value);
valuesMap.put(key, value);
updatePreferenceDisplay();
return false;
};
};
for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
Preference p = getPreferenceScreen().getPreference(i);
if (p instanceof PreferenceCategory) {
PreferenceCategory p2 = (PreferenceCategory) p;
for (int j = 0; j < p2.getPreferenceCount(); j++) {
p2.getPreference(j).setOnPreferenceChangeListener(listener);
}
} else {
getPreferenceScreen().getPreference(i)
.setOnPreferenceChangeListener(listener);
}
}
}
private void extractValuesFromHost(Host host) {
Map<String, String> m = valuesMap;
m.put("name", host.getName());
m.put("host", host.getHost());
m.put("port", String.valueOf(host.getPort()));
m.put("protocal", host.getProtocal());
m.put("encoding", host.getEncoding());
m.put("user", host.getUser());
m.put("pass", host.getPass());
}
private void updatePreferenceDisplay() {
// if h is null, then create a new Host, otherwise, update a exist Host
for (String key : valuesMap.keySet()) {
Preference pref = this.findPreference(key);
if (pref != null) {
String value = valuesMap.get(key);
if (pref instanceof EditTextPreference) {
EditTextPreference textPref = (EditTextPreference) pref;
if (!key.equalsIgnoreCase("pass") && value != null
&& value.length() > 0)
textPref.setTitle(value);
textPref.setText(value);
} else if (pref instanceof ListPreference) {
ListPreference listPref = (ListPreference) pref;
if (!key.equalsIgnoreCase("pass") && value != null
&& value.length() > 0)
listPref.setTitle(value);
listPref.setValue(value);
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem save = menu.add(R.string.edithost_done).setIcon(
android.R.drawable.ic_menu_save);
save.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
autoSave = true;
finish();
return true;
}
});
MenuItem cancel = menu.add(R.string.edithost_revert).setIcon(
android.R.drawable.ic_menu_close_clear_cancel);
cancel.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
autoSave = false;
finish();
return true;
}
});
MenuItem delete = menu.add(R.string.addressbook_delete_host).setIcon(
android.R.drawable.ic_menu_delete);
delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
autoSave = false;
delete();
finish();
return true;
}
});
return true;
}
private boolean autoSave = true;
@Override
public void onResume() {
super.onResume();
autoSave = true;
}
@Override
public void onPause() {
super.onPause();
if (autoSave)
save();
}
private void delete() {
if (h != null) {
DBUtils dbUtils = new DBUtils(this);
dbUtils.hostDelegate.delete(h);
dbUtils.close();
}
}
private void save() {
DBUtils dbUtils = new DBUtils(this);
String hostName = valuesMap.get("name");
String hostHost = valuesMap.get("host");
String hostProtocal = valuesMap.get("protocal");
String hostPort = valuesMap.get("port");
String hostEncoding = valuesMap.get("encoding");
String hostUser = valuesMap.get("user");
String hostPass = valuesMap.get("pass");
if (h != null) {
h.setName(hostName);
h.setHost(hostHost);
h.setProtocal(hostProtocal);
h.setEncoding(hostEncoding);
h.setUser(hostUser);
h.setPass(hostPass);
try {
h.setPort(Integer.parseInt(hostPort));
} catch (Exception e) {
if (hostProtocal.equalsIgnoreCase("telnet"))
h.setPort(23);
else if (hostProtocal.equalsIgnoreCase("ssh"))
h.setPort(22);
}
dbUtils.hostDelegate.update(h);
} else {
h = new Host();
h.setName(hostName);
h.setHost(hostHost);
h.setProtocal(hostProtocal);
h.setEncoding(hostEncoding);
h.setUser(hostUser);
h.setPass(hostPass);
try {
h.setPort(Integer.parseInt(hostPort));
} catch (Exception e) {
if (hostProtocal.equalsIgnoreCase("telnet"))
h.setPort(23);
else if (hostProtocal.equalsIgnoreCase("ssh"))
h.setPort(22);
}
dbUtils.hostDelegate.insert(h);
}
dbUtils.close();
}
}