diff --git a/src/org/fdroid/fdroid/FDroid.java b/src/org/fdroid/fdroid/FDroid.java index e60a23fd9..f9cf3aabf 100644 --- a/src/org/fdroid/fdroid/FDroid.java +++ b/src/org/fdroid/fdroid/FDroid.java @@ -436,8 +436,7 @@ public class FDroid extends TabActivity implements OnItemClickListener, @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (resultCode == 1) { - Toast.makeText(FDroid.this, - getString(R.string.connection_error_msg), + Toast.makeText(FDroid.this, resultData.getString("errmsg"), Toast.LENGTH_LONG).show(); } else { populateLists(true); diff --git a/src/org/fdroid/fdroid/RepoXMLHandler.java b/src/org/fdroid/fdroid/RepoXMLHandler.java index 128c88e54..10a717637 100644 --- a/src/org/fdroid/fdroid/RepoXMLHandler.java +++ b/src/org/fdroid/fdroid/RepoXMLHandler.java @@ -38,6 +38,7 @@ import java.util.Vector; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import javax.net.ssl.SSLHandshakeException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; @@ -292,8 +293,10 @@ public class RepoXMLHandler extends DefaultHandler { // Do an update from the given repo. All applications found, and their // APKs, are added to 'apps'. (If 'apps' already contains an app, its - // APKs are merged into the existing one) - public static boolean doUpdate(Context ctx, DB.Repo repo, + // APKs are merged into the existing one). + // Returns null if successful, otherwise an error message to be displayed + // to the user (if there is an interactive user!) + public static String doUpdate(Context ctx, DB.Repo repo, Vector apps) { try { @@ -333,13 +336,13 @@ public class RepoXMLHandler extends DefaultHandler { in.close(); } catch (SecurityException e) { Log.e("FDroid", "Invalid hash for index file"); - return false; + return "Invalid hash for index file"; } Certificate[] certs = je.getCertificates(); jar.close(); if (certs == null) { Log.d("FDroid", "No signature found in index"); - return false; + return "No signature found in index"; } Log.d("FDroid", "Index has " + certs.length + " signature" + (certs.length > 1 ? "s." : ".")); @@ -354,7 +357,7 @@ public class RepoXMLHandler extends DefaultHandler { } if (!match) { Log.d("FDroid", "Index signature mismatch"); - return false; + return "Index signature mismatch"; } } else { @@ -390,16 +393,20 @@ public class RepoXMLHandler extends DefaultHandler { } } + } catch (SSLHandshakeException sslex) { + Log.e("FDroid", "SSLHandShakeException updating from " + repo.address + ":\n" + + Log.getStackTraceString(sslex)); + return "A problem occurred while establishing an SSL connection. If this problem persists, AND you have a very old device, you could try using http instead of https for the repo URL."; } catch (Exception e) { Log.e("FDroid", "Exception updating from " + repo.address + ":\n" + Log.getStackTraceString(e)); - return false; + return "Failed to update - " + e.getMessage(); } finally { ctx.deleteFile("tempindex.xml"); ctx.deleteFile("tempindex.jar"); } - return true; + return null; } } diff --git a/src/org/fdroid/fdroid/UpdateService.java b/src/org/fdroid/fdroid/UpdateService.java index 52c9a5033..bf07087c5 100644 --- a/src/org/fdroid/fdroid/UpdateService.java +++ b/src/org/fdroid/fdroid/UpdateService.java @@ -73,6 +73,7 @@ public class UpdateService extends IntentService { ResultReceiver receiver = intent.getParcelableExtra("receiver"); long startTime = System.currentTimeMillis(); + String errmsg = ""; try { @@ -120,10 +121,16 @@ public class UpdateService extends IntentService { boolean success = true; for (DB.Repo repo : repos) { if (repo.inuse) { - if (!RepoXMLHandler.doUpdate(getBaseContext(), repo, apps)) { - Log.d("FDroid", "Update failed for repo " - + repo.address); + String err = RepoXMLHandler.doUpdate(getBaseContext(), + repo, apps); + if (err != null) { success = false; + err = "Update failed for " + repo.address + " - " + err; + Log.d("FDroid", err); + if (errmsg.length() == 0) + errmsg = err; + else + errmsg += "\n" + err; } } } @@ -142,6 +149,7 @@ public class UpdateService extends IntentService { db.cancelUpdate(); Log.e("FDroid", "Exception during update processing:\n" + Log.getStackTraceString(ex)); + errmsg = "Exception during processing - " + ex.getMessage(); success = false; } finally { DB.releaseDB(); @@ -173,7 +181,14 @@ public class UpdateService extends IntentService { if (receiver != null) { Bundle resultData = new Bundle(); - receiver.send(0, resultData); + if (!success) { + if (errmsg.length() == 0) + errmsg = "Unknown error"; + resultData.putString("errmsg", errmsg); + receiver.send(1, resultData); + } else { + receiver.send(0, resultData); + } } } catch (Exception e) { @@ -182,6 +197,9 @@ public class UpdateService extends IntentService { + Log.getStackTraceString(e)); if (receiver != null) { Bundle resultData = new Bundle(); + if (errmsg.length() == 0) + errmsg = "Unknown error"; + resultData.putString("errmsg", errmsg); receiver.send(1, resultData); } } finally {