From d478b474fb3e1a143d9ad25ddd3464b42a0a8c54 Mon Sep 17 00:00:00 2001 From: Przemek Grondek <github@nerull7.info> Date: Thu, 21 Aug 2014 15:17:36 +0200 Subject: [PATCH] Connection error handling --- .../nerull7/mysqlbrowser/LoginFragment.java | 2 +- .../db/AsyncDatabaseConnector.java | 81 +++++++++++++------ app/src/main/res/values-pl/strings.xml | 3 + app/src/main/res/values/strings.xml | 4 + 4 files changed, 66 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/LoginFragment.java b/app/src/main/java/info/nerull7/mysqlbrowser/LoginFragment.java index b3b048c..d0a1eee 100644 --- a/app/src/main/java/info/nerull7/mysqlbrowser/LoginFragment.java +++ b/app/src/main/java/info/nerull7/mysqlbrowser/LoginFragment.java @@ -86,7 +86,7 @@ public class LoginFragment extends Fragment implements View.OnClickListener, Asy url = urlTextbox.getText().toString(); if(Static.isNetworkConnected(getActivity())) { - asyncDatabaseConnector = new AsyncDatabaseConnector(login, password, url); + asyncDatabaseConnector = new AsyncDatabaseConnector(login, password, url, getActivity().getResources()); asyncDatabaseConnector.setBooleanReturnListener(this); asyncDatabaseConnector.setOnPostExecuteListener(this); asyncDatabaseConnector.checkLogin(); diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java b/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java index 8a8872f..5c0bac3 100644 --- a/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java +++ b/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java @@ -1,5 +1,6 @@ package info.nerull7.mysqlbrowser.db; +import android.content.res.Resources; import android.os.AsyncTask; import android.util.Log; import android.widget.ArrayAdapter; @@ -12,12 +13,17 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; +import java.net.ConnectException; import java.net.HttpURLConnection; +import java.net.SocketException; +import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; +import info.nerull7.mysqlbrowser.R; + /** * Created by nerull7 on 07.07.14. * Database connector using Async calls @@ -39,6 +45,8 @@ public class AsyncDatabaseConnector { private String database; + private final Resources resources; + private BooleanReturnListener booleanReturnListener; private IntegerReturnListener integerReturnListener; private StringReturnListener stringReturnListener; @@ -48,10 +56,11 @@ public class AsyncDatabaseConnector { public static String errorMsg; private OnPostExecuteListener onPostExecuteListener; - public AsyncDatabaseConnector(String login, String password, String url){ + public AsyncDatabaseConnector(String login, String password, String url, Resources resources){ this.login = login; this.password = password; this.url = url; + this.resources = resources; booleanReturnListener=null; stringReturnListener=null; @@ -104,8 +113,9 @@ public class AsyncDatabaseConnector { if(listReturnListener!=null) { listReturnListener.onListReturn(list); } + errorMsg = error; } - }, onPostExecuteListener); + }, onPostExecuteListener, resources); downloader.execute(urlQuery); } @@ -119,8 +129,9 @@ public class AsyncDatabaseConnector { } catch (JSONException e) { e.printStackTrace(); } if(matrixReturnListener!=null) matrixReturnListener.onMatrixReturn(list); + errorMsg = error; } - }, onPostExecuteListener); + }, onPostExecuteListener, resources); downloader.execute(urlQuery); } @@ -161,10 +172,9 @@ public class AsyncDatabaseConnector { errorMsg = data; listenerData = false; } - booleanReturnListener.onBooleanReturn(listenerData); } - }, onPostExecuteListener); + }, onPostExecuteListener, resources); downloader.execute(actionUrlBuilder(ACTION_LOGIN)); return false; } @@ -226,8 +236,9 @@ public class AsyncDatabaseConnector { public void onFinished(String data, String error) { if(integerReturnListener!=null) integerReturnListener.onIntegerReturn(Integer.parseInt(data)); + errorMsg = error; } - }, onPostExecuteListener); + }, onPostExecuteListener, resources); downloader.execute(urlQuery); } @@ -280,8 +291,9 @@ public class AsyncDatabaseConnector { if(stringReturnListener!=null){ stringReturnListener.onStringReturn(data); } + errorMsg = error; } - }, onPostExecuteListener); + }, onPostExecuteListener, resources); downloader.execute(request); } @@ -321,8 +333,9 @@ public class AsyncDatabaseConnector { if(stringReturnListener!=null){ stringReturnListener.onStringReturn(data); } + errorMsg = error; } - }, onPostExecuteListener); + }, onPostExecuteListener, resources); downloader.execute(request); } @@ -378,14 +391,16 @@ public class AsyncDatabaseConnector { private OnFinishedListener onFinishedListener; private OnPostExecuteListener onPostExecuteListener; private String errorString; + private Resources resources; public static final String CONNECTION_REQUEST_METHOD = "GET"; public static final int CONNECTION_TIMEOUT = 15000; public static final int READ_TIMEOUT = 10000; - Downloader(OnFinishedListener onFinishedListener, OnPostExecuteListener onPostExecuteListener){ + Downloader(OnFinishedListener onFinishedListener, OnPostExecuteListener onPostExecuteListener, Resources resources){ this.onFinishedListener = onFinishedListener; this.onPostExecuteListener = onPostExecuteListener; + this.resources = resources; errorString = null; } @@ -400,22 +415,42 @@ public class AsyncDatabaseConnector { urlConnection.setReadTimeout(READ_TIMEOUT); urlConnection.setConnectTimeout(CONNECTION_TIMEOUT); urlConnection.setRequestMethod(CONNECTION_REQUEST_METHOD); - urlConnection.connect(); - if(urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { - try { - inputStream = urlConnection.getInputStream(); - response = readStream(inputStream); - } finally { - if(inputStream!=null) - inputStream.close(); - urlConnection.disconnect(); + try { + urlConnection.connect(); + + if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { + try { + inputStream = urlConnection.getInputStream(); + response = readStream(inputStream); + } finally { + if (inputStream != null) + inputStream.close(); + urlConnection.disconnect(); + } + return response; + } else { + errorString = "ERROR " + urlConnection.getResponseCode() + ": " + urlConnection.getResponseMessage(); } - return response; + } catch (Exception e) { + parseException(e); } - else { - errorString = "ERROR "+urlConnection.getResponseCode()+": "+urlConnection.getResponseMessage(); - return null; + return null; + } + + private void parseException(Exception e){ + if(e instanceof SocketException){ + if(e.getMessage().contains("ECONNREFUSED")) { + errorString = resources.getString(R.string.error_connection_refused); + } else if(e.getMessage().contains("EHOSTUNREACH")) { + errorString = resources.getString(R.string.error_connection_unreachable); + } else { + errorString = "Exception: " + e.getClass(); + } + } else if (e instanceof SocketTimeoutException){ + errorString = resources.getString(R.string.error_connection_timeout); + } else { + errorString = "Exception: " + e.getClass(); } } @@ -440,7 +475,7 @@ public class AsyncDatabaseConnector { protected String doInBackground(String... strings) { try { String data = httpRequest(strings[0]); - onFinishedListener.onFinished(data, errorMsg); // Can't be null cos we demand listener in constructor + onFinishedListener.onFinished(data, errorString); // Can't be null cos we demand listener in constructor } catch (IOException e) { e.printStackTrace(); } diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 35ba264..44d7f9e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -37,6 +37,9 @@ <string name="error_no_databases">Brak dostępnych baz</string> <string name="error_no_save">Twoje dane <b>NIE</b> zostaną zapisane! Czy chciałbyś kontynuować?</string> <string name="error_remove">Ten wpis zostanie usunięty z bazy. Tej akcji <b>NIE MOŻNA</b> cofnąć! Czy chciałbyś kontynuować?</string> + <string name="error_connection_timeout">Przekroczono czas połączenia</string> + <string name="error_connection_reset">Połączenie zostało zrestartowane</string> + <string name="error_connection_unreachable">No route to host</string> <string name="pref_entries_per_page">Ustaw limit wpisów na stronę</string> <string name="login_settings">Poświadczenia logowania</string> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d7b1d0e..ec32bc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,6 +43,10 @@ <string name="error_no_databases">No available databases</string> <string name="error_no_save">Your data will <b>NOT</b> be saved! Would you like to continue?</string> <string name="error_remove">This entry will be removed from database. This action <b>CAN NOT</b> be reversed! Would you like to continue?</string> + <string name="error_connection_timeout">Connection timeout</string> + <string name="error_connection_reset">Connection reset by peer</string> + <string name="error_connection_refused">Connection refused</string> + <string name="error_connection_unreachable">No route to host</string> <string name="pref_entries_per_page">Set number of entries per page</string> <string name="login_settings">Login credentials</string>