diff --git a/res/values/strings.xml b/res/values/strings.xml index 9ece09ded0..ef4d7ed280 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -502,6 +502,9 @@ Manual MMS settings are required for your phone. Enabled Disabled + Not set + The text entered was not a valid URI + The text entered was not a valid host Unlock diff --git a/src/org/thoughtcrime/securesms/MmsPreferencesFragment.java b/src/org/thoughtcrime/securesms/MmsPreferencesFragment.java index 489d273ea9..918e42b6dd 100644 --- a/src/org/thoughtcrime/securesms/MmsPreferencesFragment.java +++ b/src/org/thoughtcrime/securesms/MmsPreferencesFragment.java @@ -20,12 +20,17 @@ import android.content.Context; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; import android.support.v4.preference.PreferenceFragment; +import android.text.TextUtils; import android.widget.Toast; import org.thoughtcrime.securesms.mms.OutgoingMmsConnection; import org.thoughtcrime.securesms.util.TextSecurePreferences; +import java.net.URI; +import java.net.URISyntaxException; + public class MmsPreferencesFragment extends PreferenceFragment { @@ -47,22 +52,15 @@ public class MmsPreferencesFragment extends PreferenceFragment { } else { addPreferencesFromResource(R.xml.preferences_manual_mms); } + this.findPreference(TextSecurePreferences.MMSC_HOST_PREF).setOnPreferenceChangeListener(new ValidUriVerificationListener()); + this.findPreference(TextSecurePreferences.MMSC_PROXY_HOST_PREF).setOnPreferenceChangeListener(new ValidHostnameVerificationListener()); + this.findPreference(TextSecurePreferences.MMSC_PROXY_PORT_PREF).setOnPreferenceChangeListener(new EditTextVerificationListener()); + this.findPreference(TextSecurePreferences.MMSC_USERNAME_PREF).setOnPreferenceChangeListener(new EditTextVerificationListener()); + this.findPreference(TextSecurePreferences.MMSC_PASSWORD_PREF).setOnPreferenceChangeListener(new EditTextVerificationListener()); } private void initializeEditTextSummary(final EditTextPreference preference) { - if (preference.getText() == null) { - preference.setSummary("Not set"); - } else { - preference.setSummary(preference.getText()); - } - - preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference pref, Object newValue) { - preference.setSummary(newValue == null ? "Not set" : ((String) newValue)); - return true; - } - }); + preference.setSummary(TextUtils.isEmpty(preference.getText()) ? getString(R.string.MmsPreferencesFragment__not_set) : preference.getText()); } private void initializeEditTextSummaries() { @@ -89,4 +87,57 @@ public class MmsPreferencesFragment extends PreferenceFragment { return context.getString(TextSecurePreferences.isUseLocalApnsEnabled(context) ? enabledResId : disabledResId); } + + private class EditTextVerificationListener implements OnPreferenceChangeListener { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + String newString = (String)newValue; + if (isValid(newString)) { + preference.setSummary(TextUtils.isEmpty(newString) ? getString(R.string.MmsPreferencesFragment__not_set) : newString); + return true; + } else { + Toast.makeText(getActivity(), getErrorMessage(), Toast.LENGTH_LONG).show(); + return false; + } + } + + protected boolean isValid(String newString) { return true; } + protected int getErrorMessage() { return 0; } + } + + private class ValidUriVerificationListener extends EditTextVerificationListener { + @Override + protected boolean isValid(String newString) { + if (TextUtils.isEmpty(newString)) return true; + try { + new URI(newString); + return true; + } catch (URISyntaxException mue) { + return false; + } + } + + @Override + protected int getErrorMessage() { + return R.string.MmsPreferencesFragment__invalid_uri; + } + } + + private class ValidHostnameVerificationListener extends EditTextVerificationListener { + @Override + protected boolean isValid(String newString) { + if (TextUtils.isEmpty(newString)) return true; + try { + URI uri = new URI(null, newString, null, null); + return true; + } catch (URISyntaxException mue) { + return false; + } + } + + @Override + protected int getErrorMessage() { + return R.string.MmsPreferencesFragment__invalid_host; + } + } } diff --git a/src/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java b/src/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java index b509dceee3..66a892089d 100644 --- a/src/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java +++ b/src/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java @@ -47,16 +47,20 @@ public class OutgoingMmsConnection extends MmsConnection { protected HttpUriRequest constructRequest(boolean useProxy) throws IOException { - HttpPostHC4 request = new HttpPostHC4(apn.getMmsc()); - request.addHeader("Accept", "*/*, application/vnd.wap.mms-message, application/vnd.wap.sic"); - request.addHeader("x-wap-profile", "http://www.google.com/oha/rdf/ua-profile-kila.xml"); - request.addHeader("Content-Type", "application/vnd.wap.mms-message"); - request.setEntity(new ByteArrayEntityHC4(mms)); - if (useProxy) { - HttpHost proxy = new HttpHost(apn.getProxy(), apn.getPort()); - request.setConfig(RequestConfig.custom().setProxy(proxy).build()); + try { + HttpPostHC4 request = new HttpPostHC4(apn.getMmsc()); + request.addHeader("Accept", "*/*, application/vnd.wap.mms-message, application/vnd.wap.sic"); + request.addHeader("x-wap-profile", "http://www.google.com/oha/rdf/ua-profile-kila.xml"); + request.addHeader("Content-Type", "application/vnd.wap.mms-message"); + request.setEntity(new ByteArrayEntityHC4(mms)); + if (useProxy) { + HttpHost proxy = new HttpHost(apn.getProxy(), apn.getPort()); + request.setConfig(RequestConfig.custom().setProxy(proxy).build()); + } + return request; + } catch (IllegalArgumentException iae) { + throw new IOException(iae); } - return request; } public void sendNotificationReceived(boolean usingMmsRadio, boolean useProxyIfAvailable)