Skip to content

Commit

Permalink
Merge pull request getodk#1974 from grzesiek2010/COLLECT-1973
Browse files Browse the repository at this point in the history
Fixed java.lang.IllegalArgumentException
  • Loading branch information
lognaturel committed Mar 9, 2018
2 parents edd3ca1 + 78f0142 commit f92b55e
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 104 deletions.
Expand Up @@ -14,7 +14,6 @@
* limitations under the License.
*/


package org.odk.collect.android.preferences;

import android.os.Bundle;
Expand All @@ -27,8 +26,7 @@

import static org.odk.collect.android.preferences.PreferenceKeys.KEY_PROTOCOL;


public class ServerPreferences extends ServerPreferencesFragment implements Preference.OnPreferenceChangeListener {
public class ServerPreferences extends ServerPreferencesFragment {

@Override
public void onCreate(Bundle savedInstanceState) {
Expand Down Expand Up @@ -56,7 +54,7 @@ private void initProtocolPrefs() {
ListPreference protocolPref = (ListPreference) findPreference(KEY_PROTOCOL);

protocolPref.setSummary(protocolPref.getEntry());
protocolPref.setOnPreferenceChangeListener(this);
protocolPref.setOnPreferenceChangeListener(createChangeListener());

addPreferencesResource(protocolPref.getValue());
}
Expand All @@ -73,22 +71,21 @@ private void addPreferencesResource(CharSequence value) {
}
}

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
super.onPreferenceChange(preference, newValue);

if (preference.getKey().equals(KEY_PROTOCOL)) {
String stringValue = (String) newValue;
ListPreference lpref = (ListPreference) preference;
String oldValue = lpref.getValue();
lpref.setValue(stringValue);

if (!newValue.equals(oldValue)) {
removeTypeSettings();
initProtocolPrefs();
private Preference.OnPreferenceChangeListener createChangeListener() {
return (preference, newValue) -> {
if (preference.getKey().equals(KEY_PROTOCOL)) {
String stringValue = (String) newValue;
ListPreference lpref = (ListPreference) preference;
String oldValue = lpref.getValue();
lpref.setValue(stringValue);

if (!newValue.equals(oldValue)) {
removeTypeSettings();
initProtocolPrefs();
}
}
}
return true;
return true;
};
}

private void removeTypeSettings() {
Expand Down
Expand Up @@ -55,9 +55,8 @@
import static org.odk.collect.android.preferences.PreferenceKeys.KEY_SUBMISSION_URL;
import static org.odk.collect.android.utilities.gdrive.GoogleAccountsManager.REQUEST_ACCOUNT_PICKER;


public class ServerPreferencesFragment extends BasePreferenceFragment implements View.OnTouchListener,
Preference.OnPreferenceChangeListener, GoogleAccountsManager.GoogleAccountSelectionListener {
GoogleAccountsManager.GoogleAccountSelectionListener {
private static final String KNOWN_URL_LIST = "knownUrlList";
protected EditTextPreference serverUrlPreference;
protected EditTextPreference usernamePreference;
Expand Down Expand Up @@ -96,17 +95,17 @@ public void addAggregatePreferences() {

serverUrlPreference.getEditText().setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_drop_down, 0);
serverUrlPreference.getEditText().setOnTouchListener(this);
serverUrlPreference.setOnPreferenceChangeListener(this);
serverUrlPreference.setOnPreferenceChangeListener(createChangeListener());
serverUrlPreference.setSummary(serverUrlPreference.getText());
serverUrlPreference.getEditText().setFilters(
new InputFilter[]{new ControlCharacterFilter(), new WhitespaceFilter()});

usernamePreference.setOnPreferenceChangeListener(this);
usernamePreference.setOnPreferenceChangeListener(createChangeListener());
usernamePreference.setSummary(usernamePreference.getText());
usernamePreference.getEditText().setFilters(
new InputFilter[]{new ControlCharacterFilter()});

passwordPreference.setOnPreferenceChangeListener(this);
passwordPreference.setOnPreferenceChangeListener(createChangeListener());
maskPasswordSummary(passwordPreference.getText());
passwordPreference.getEditText().setFilters(
new InputFilter[]{new ControlCharacterFilter()});
Expand All @@ -118,7 +117,7 @@ public void addGooglePreferences() {

EditTextPreference googleSheetsUrlPreference = (EditTextPreference) findPreference(
PreferenceKeys.KEY_GOOGLE_SHEETS_URL);
googleSheetsUrlPreference.setOnPreferenceChangeListener(this);
googleSheetsUrlPreference.setOnPreferenceChangeListener(createChangeListener());

String currentGoogleSheetsURL = googleSheetsUrlPreference.getText();
if (currentGoogleSheetsURL != null && currentGoogleSheetsURL.length() > 0) {
Expand All @@ -143,11 +142,11 @@ public void addOtherPreferences() {

serverUrlPreference.getEditText().setFilters(filters);

formListUrlPreference.setOnPreferenceChangeListener(this);
formListUrlPreference.setOnPreferenceChangeListener(createChangeListener());
formListUrlPreference.setSummary(formListUrlPreference.getText());
formListUrlPreference.getEditText().setFilters(filters);

submissionUrlPreference.setOnPreferenceChangeListener(this);
submissionUrlPreference.setOnPreferenceChangeListener(createChangeListener());
submissionUrlPreference.setSummary(submissionUrlPreference.getText());
submissionUrlPreference.getEditText().setFilters(filters);
}
Expand Down Expand Up @@ -226,97 +225,96 @@ public boolean onTouch(View v, MotionEvent event) {
return false;
}

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {

switch (preference.getKey()) {
private Preference.OnPreferenceChangeListener createChangeListener() {
return (preference, newValue) -> {
switch (preference.getKey()) {
case PreferenceKeys.KEY_SERVER_URL:

case PreferenceKeys.KEY_SERVER_URL:
String url = newValue.toString();

String url = newValue.toString();

// remove all trailing "/"s
while (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}
// remove all trailing "/"s
while (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}

if (Validator.isUrlValid(url)) {
preference.setSummary(newValue.toString());
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getActivity().getApplicationContext());
String urlListString = prefs.getString(KNOWN_URL_LIST, "");

urlList =
new Gson().fromJson(urlListString,
new TypeToken<List<String>>() {
}.getType());

if (!urlList.contains(url)) {
// We store a list with at most 5 elements
if (urlList.size() == 5) {
urlList.remove(4);
if (Validator.isUrlValid(url)) {
preference.setSummary(newValue.toString());
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getActivity().getApplicationContext());
String urlListString = prefs.getString(KNOWN_URL_LIST, "");

urlList =
new Gson().fromJson(urlListString,
new TypeToken<List<String>>() {
}.getType());

if (!urlList.contains(url)) {
// We store a list with at most 5 elements
if (urlList.size() == 5) {
urlList.remove(4);
}
addUrlToPreferencesList(url, prefs);
setupUrlDropdownAdapter();
}
addUrlToPreferencesList(url, prefs);
setupUrlDropdownAdapter();
} else {
ToastUtils.showShortToast(R.string.url_error);
return false;
}
} else {
ToastUtils.showShortToast(R.string.url_error);
return false;
}
break;
break;

case PreferenceKeys.KEY_USERNAME:
String username = newValue.toString();
case PreferenceKeys.KEY_USERNAME:
String username = newValue.toString();

// do not allow leading and trailing whitespace
if (!username.equals(username.trim())) {
ToastUtils.showShortToast(R.string.username_error_whitespace);
return false;
}
// do not allow leading and trailing whitespace
if (!username.equals(username.trim())) {
ToastUtils.showShortToast(R.string.username_error_whitespace);
return false;
}

preference.setSummary(username);
clearCachedCrendentials();
preference.setSummary(username);
clearCachedCrendentials();

// To ensure we update current credentials in CredentialsProvider
credentialsHaveChanged = true;
// To ensure we update current credentials in CredentialsProvider
credentialsHaveChanged = true;

return true;
return true;

case PreferenceKeys.KEY_PASSWORD:
String pw = newValue.toString();
case PreferenceKeys.KEY_PASSWORD:
String pw = newValue.toString();

// do not allow leading and trailing whitespace
if (!pw.equals(pw.trim())) {
ToastUtils.showShortToast(R.string.password_error_whitespace);
return false;
}
// do not allow leading and trailing whitespace
if (!pw.equals(pw.trim())) {
ToastUtils.showShortToast(R.string.password_error_whitespace);
return false;
}

maskPasswordSummary(pw);
clearCachedCrendentials();
maskPasswordSummary(pw);
clearCachedCrendentials();

// To ensure we update current credentials in CredentialsProvider
credentialsHaveChanged = true;
break;
// To ensure we update current credentials in CredentialsProvider
credentialsHaveChanged = true;
break;

case PreferenceKeys.KEY_GOOGLE_SHEETS_URL:
url = newValue.toString();
case PreferenceKeys.KEY_GOOGLE_SHEETS_URL:
url = newValue.toString();

// remove all trailing "/"s
while (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}
// remove all trailing "/"s
while (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}

if (Validator.isUrlValid(url)) {
preference.setSummary(url + "\n\n" + getString(R.string.google_sheets_url_hint));
} else if (url.length() == 0) {
preference.setSummary(getString(R.string.google_sheets_url_hint));
} else {
ToastUtils.showShortToast(R.string.url_error);
return false;
}
break;
}
return true;
if (Validator.isUrlValid(url)) {
preference.setSummary(url + "\n\n" + getString(R.string.google_sheets_url_hint));
} else if (url.length() == 0) {
preference.setSummary(getString(R.string.google_sheets_url_hint));
} else {
ToastUtils.showShortToast(R.string.url_error);
return false;
}
break;
}
return true;
};
}

private void maskPasswordSummary(String password) {
Expand Down
Expand Up @@ -53,6 +53,7 @@
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.net.UnknownHostException;
Expand Down Expand Up @@ -164,10 +165,19 @@ private boolean uploadOneSubmission(String urlString, String id, String instance
WebUtils.enablePreemptiveBasicAuth(localContext, submissionUri.getHost());
}

URI uri;
try {
uri = URI.create(submissionUri.toString());
} catch (IllegalArgumentException e) {
Timber.i(e);
outcome.results.put(id, Collect.getInstance().getString(R.string.url_error));
return false;
}

// Issue a head request to confirm the server is an OpenRosa server and see if auth
// is required
// http://docs.opendatakit.org/openrosa-form-submission/#extended-transmission-considerations
HttpHead httpHead = WebUtils.createOpenRosaHttpHead(submissionUri);
HttpHead httpHead = WebUtils.createOpenRosaHttpHead(uri);

// prepare response
final HttpResponse response;
Expand Down
Expand Up @@ -177,8 +177,8 @@ private static void setOpenRosaHeaders(HttpRequest req) {
DateFormat.format("E, dd MMM yyyy hh:mm:ss zz", g).toString());
}

public static HttpHead createOpenRosaHttpHead(Uri u) {
HttpHead req = new HttpHead(URI.create(u.toString()));
public static HttpHead createOpenRosaHttpHead(URI uri) {
HttpHead req = new HttpHead(uri);
setCollectHeaders(req);
setOpenRosaHeaders(req);
return req;
Expand Down

0 comments on commit f92b55e

Please sign in to comment.