package vandy.mooc.view;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import vandy.mooc.R;
import vandy.mooc.common.Utils;
public class SettingsActivity extends Activity
{
public static final String KEY_PREFERENCE_PROTOCOL =
"pref_key_protocol";
public static final String KEY_PREFERENCE_IP_ADDRESS =
"pref_key_ip_address";
public static final String KEY_PREFERENCE_PORT =
"pref_key_port";
public static final String KEY_PREFERENCE_USER_NAME =
"pref_key_username";
public static final String KEY_PREFERENCE_PASSWORD =
"pref_key_password";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
public class SettingsFragment extends PreferenceFragment
implements OnSharedPreferenceChangeListener{
private static final String IPADDRESS_PATTERN =
"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
private Pattern pattern;
private Matcher matcher;
public SettingsFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
pattern = Pattern.compile(IPADDRESS_PATTERN);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
setPreferenceSummary(prefs, KEY_PREFERENCE_PROTOCOL);
setPreferenceSummary(prefs, KEY_PREFERENCE_IP_ADDRESS);
setPreferenceSummary(prefs, KEY_PREFERENCE_PORT);
setPreferenceSummary(prefs, KEY_PREFERENCE_USER_NAME);
setPreferenceSummary(prefs, KEY_PREFERENCE_PASSWORD);
}
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPrefs, String key) {
setPreferenceSummary(sharedPrefs, key);
}
private void setPreferenceSummary(SharedPreferences prefs, String key){
SharedPreferences.Editor editor = prefs.edit();
Preference pref = findPreference(key);
if (TextUtils.equals(key, KEY_PREFERENCE_PROTOCOL)) {
ListPreference lp = (ListPreference) pref;
pref.setSummary(lp.getEntry());
}else if(TextUtils.equals(key, KEY_PREFERENCE_IP_ADDRESS)){
EditTextPreference etp = (EditTextPreference) pref;
String ip = etp.getText();
if(TextUtils.isEmpty(ip)){
editor.putString(KEY_PREFERENCE_IP_ADDRESS, "0.0.0.0");
etp.setDefaultValue("0.0.0.0");
Utils.showToast(getActivity(), "IP Address cannot be empty");
}else if(! validateIp(ip)) {
editor.putString(KEY_PREFERENCE_IP_ADDRESS, "0.0.0.0");
etp.setDefaultValue("0.0.0.0");
Utils.showToast(getActivity(), "IP Address is invalid");
}else{
pref.setSummary(etp.getText());
}
}else if(TextUtils.equals(key, KEY_PREFERENCE_PORT)){
EditTextPreference etp = (EditTextPreference) pref;
String portNo = etp.getText();
if(TextUtils.isEmpty(portNo)){
editor.putString(KEY_PREFERENCE_PORT, "8080");
etp.setDefaultValue("8080");
Utils.showToast(getActivity(), "Port number cannot be empty");
}else if(! validatePortNo(portNo)){
editor.putString(KEY_PREFERENCE_PORT, "8080");
etp.setDefaultValue("8080");
Utils.showToast(getActivity(), "Port number is invalid");
}else{
pref.setSummary(etp.getText());
}
}else if(TextUtils.equals(key, KEY_PREFERENCE_USER_NAME)){
EditTextPreference etp = (EditTextPreference) pref;
String userName = etp.getText();
if(TextUtils.isEmpty(userName)){
editor.putString(KEY_PREFERENCE_USER_NAME, "admin");
etp.setDefaultValue("admin");
Utils.showToast(getActivity(), "UserName cannot be empty");
}else{
pref.setSummary(etp.getText());
}
}else if(TextUtils.equals(key, KEY_PREFERENCE_PASSWORD)){
EditTextPreference etp = (EditTextPreference) pref;
String password = etp.getText();
if(TextUtils.isEmpty(password)){
editor.putString(KEY_PREFERENCE_PASSWORD, "pass");
etp.setDefaultValue("pass");
Utils.showToast(getActivity(), "Password cannot be empty");
}else{
pref.setSummary(etp.getText());
}
}
editor.commit();
}
/**
* Validate ip address with regular expression
* @param ip ip address for validation
* @return true valid ip address, false invalid ip address
*/
public boolean validateIp(final String ip){
matcher = pattern.matcher(ip);
return matcher.matches();
}
public boolean validatePortNo(String portNo){
//match a number with optional '-' and decimal.
return portNo.matches("\\d+");
}
}
}