From c4a1384232fbaaef8223210bc4ee27d8203d207a Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 11 Dec 2023 22:04:19 +0100 Subject: [PATCH] Wrap throwables --- .../java/eu/faircode/email/ActivityDMARC.java | 8 +-- .../java/eu/faircode/email/AdapterRule.java | 4 +- .../eu/faircode/email/FragmentCompose.java | 4 +- .../email/FragmentDialogOpenLink.java | 2 +- .../email/FragmentDialogRuleCheck.java | 2 +- .../java/eu/faircode/email/FragmentGmail.java | 4 +- .../java/eu/faircode/email/FragmentOAuth.java | 2 +- .../eu/faircode/email/FragmentQuickSetup.java | 2 +- .../main/java/eu/faircode/email/Helper.java | 2 +- app/src/main/java/eu/faircode/email/Log.java | 16 ++--- .../java/eu/faircode/email/MessageHelper.java | 4 +- .../eu/faircode/email/ProtectedContent.java | 2 +- .../eu/faircode/email/ThrowableWrapper.java | 61 +++++++++++++++++++ 13 files changed, 87 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/ThrowableWrapper.java diff --git a/app/src/main/java/eu/faircode/email/ActivityDMARC.java b/app/src/main/java/eu/faircode/email/ActivityDMARC.java index 2411b04055..1c42fef338 100644 --- a/app/src/main/java/eu/faircode/email/ActivityDMARC.java +++ b/app/src/main/java/eu/faircode/email/ActivityDMARC.java @@ -155,7 +155,7 @@ public class ActivityDMARC extends ActivityBase { if (ex instanceof NoStreamException) ((NoStreamException) ex).report(ActivityDMARC.this); else - tvDmarc.setText(ex + "\n" + android.util.Log.getStackTraceString(ex)); + Log.unexpectedError(getSupportFragmentManager(), ex); grpReady.setVisibility(View.VISIBLE); } }.execute(this, args, "dmarc:decode"); @@ -583,7 +583,7 @@ public class ActivityDMARC extends ActivityBase { ssb.append(' '); } catch (Throwable ex) { Log.w(ex); - ssb.append(ex.toString()).append('\n'); + ssb.append(new ThrowableWrapper(ex).toSafeString()).append('\n'); } try { @@ -592,7 +592,7 @@ public class ActivityDMARC extends ActivityBase { ssb.append('(').append(info.org).append(") "); } catch (Throwable ex) { Log.w(ex); - ssb.append(ex.toString()).append('\n'); + ssb.append(new ThrowableWrapper(ex).toSafeString()).append('\n'); } } @@ -612,7 +612,7 @@ public class ActivityDMARC extends ActivityBase { } } catch (Throwable ex) { Log.w(ex); - ssb.append(ex.toString()).append('\n'); + ssb.append(new ThrowableWrapper(ex).toSafeString()).append('\n'); } return result; diff --git a/app/src/main/java/eu/faircode/email/AdapterRule.java b/app/src/main/java/eu/faircode/email/AdapterRule.java index cafec2345e..01ee5f25fc 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRule.java +++ b/app/src/main/java/eu/faircode/email/AdapterRule.java @@ -189,7 +189,7 @@ public class AdapterRule extends RecyclerView.Adapter { tvCondition.setText(ssb); } catch (Throwable ex) { - tvCondition.setText(ex.getMessage()); + tvCondition.setText(new ThrowableWrapper(ex).getSafeMessage()); } try { @@ -279,7 +279,7 @@ public class AdapterRule extends RecyclerView.Adapter { }.execute(context, owner, args, "rule:folder"); } } catch (Throwable ex) { - tvAction.setText(ex.getMessage()); + tvAction.setText(new ThrowableWrapper(ex).getSafeMessage()); } tvLastApplied.setText(rule.last_applied == null ? "-" : DF.format(rule.last_applied)); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 7375a41f6b..82a8144db2 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -7074,7 +7074,7 @@ public class FragmentCompose extends FragmentBase { R.string.title_address_duplicate, TextUtils.join(", ", dup))); } catch (AddressException ex) { - args.putString("address_error", ex.getMessage()); + args.putString("address_error", new ThrowableWrapper(ex).getSafeMessage()); } if (draft.to == null && draft.cc == null && draft.bcc == null && @@ -7479,7 +7479,7 @@ public class FragmentCompose extends FragmentBase { address.validate(); } catch (AddressException ex) { throw new AddressException(context.getString(R.string.title_address_parse_error, - MessageHelper.formatAddressesCompose(new Address[]{address}), ex.getMessage())); + MessageHelper.formatAddressesCompose(new Address[]{address}), new ThrowableWrapper(ex).getSafeMessage())); } } diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java b/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java index 5eda75ca13..f90dd3ae10 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java @@ -426,7 +426,7 @@ public class FragmentDialogOpenLink extends FragmentDialogBase { @Override protected void onException(Bundle args, Throwable ex) { tvHost.setText(ex.getClass().getName()); - tvOwner.setText(ex.getMessage()); + tvOwner.setText(new ThrowableWrapper(ex).getSafeMessage()); } }.execute(FragmentDialogOpenLink.this, args, "link:owner"); } diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java b/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java index b96e8d209b..ab1f1480eb 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java @@ -197,7 +197,7 @@ public class FragmentDialogRuleCheck extends FragmentDialogBase { @Override protected void onException(Bundle args, Throwable ex) { if (ex instanceof IllegalArgumentException) { - tvNoMessages.setText(ex.getMessage()); + tvNoMessages.setText(new ThrowableWrapper(ex).getSafeMessage()); tvNoMessages.setVisibility(View.VISIBLE); } else Log.unexpectedError(getParentFragmentManager(), ex); diff --git a/app/src/main/java/eu/faircode/email/FragmentGmail.java b/app/src/main/java/eu/faircode/email/FragmentGmail.java index 35be66119d..18c1f00f27 100644 --- a/app/src/main/java/eu/faircode/email/FragmentGmail.java +++ b/app/src/main/java/eu/faircode/email/FragmentGmail.java @@ -205,7 +205,7 @@ public class FragmentGmail extends FragmentBase { startActivityForResult(intent, ActivitySetup.REQUEST_CHOOSE_ACCOUNT); } catch (Throwable ex) { if (ex instanceof IllegalArgumentException) - tvError.setText(ex.getMessage()); + tvError.setText(new ThrowableWrapper(ex).getSafeMessage()); else tvError.setText(Log.formatThrowable(ex, false)); grpError.setVisibility(View.VISIBLE); @@ -631,7 +631,7 @@ public class FragmentGmail extends FragmentBase { Log.e(ex); if (ex instanceof IllegalArgumentException) - tvError.setText(ex.getMessage()); + tvError.setText(new ThrowableWrapper(ex).getSafeMessage()); else tvError.setText(Log.formatThrowable(ex, false)); grpError.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/eu/faircode/email/FragmentOAuth.java b/app/src/main/java/eu/faircode/email/FragmentOAuth.java index 122e37d084..add6530c1e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOAuth.java +++ b/app/src/main/java/eu/faircode/email/FragmentOAuth.java @@ -1092,7 +1092,7 @@ public class FragmentOAuth extends FragmentBase { return; if (ex instanceof IllegalArgumentException) - tvError.setText(ex.getMessage()); + tvError.setText(new ThrowableWrapper(ex).getSafeMessage()); else tvError.setText(Log.formatThrowable(ex, false)); diff --git a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java index 711095b80e..d0bb5bcd41 100644 --- a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java +++ b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java @@ -737,7 +737,7 @@ public class FragmentQuickSetup extends FragmentBase { grpManual.setVisibility(View.VISIBLE); if (ex instanceof IllegalArgumentException || ex instanceof UnknownHostException) { - tvError.setText(ex.getMessage()); + tvError.setText(new ThrowableWrapper(ex).getSafeMessage()); grpError.setVisibility(View.VISIBLE); getMainHandler().post(new Runnable() { diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 7c35d560ed..d5d75664d6 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -1760,7 +1760,7 @@ public class Helper { tvType.setText(type); - tvException.setText(ex == null ? null : ex.toString()); + tvException.setText(ex == null ? null : new ThrowableWrapper(ex).toSafeString()); tvException.setVisibility(ex == null ? View.GONE : View.VISIBLE); AlertDialog.Builder builder = new AlertDialog.Builder(context) diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index 3b1387054a..6255321026 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -246,7 +246,7 @@ public class Log { int def = (BuildConfig.DEBUG ? android.util.Log.INFO : android.util.Log.WARN); level = prefs.getInt("log_level", def); } - android.util.Log.d(TAG, "Log level=" + level); + Log.i("Log level=" + level); } public static boolean isDebugLogLevel() { @@ -288,7 +288,7 @@ public class Log { public static int e(String msg) { if (BuildConfig.BETA_RELEASE) try { - Throwable ex = new Throwable(msg); + Throwable ex = new ThrowableWrapper(msg); List ss = new ArrayList<>(Arrays.asList(ex.getStackTrace())); ss.remove(0); ex.setStackTrace(ss.toArray(new StackTraceElement[0])); @@ -1816,16 +1816,16 @@ public class Log { StringBuilder sb = new StringBuilder(); if (BuildConfig.DEBUG) - sb.append(ex.toString()); + sb.append(new ThrowableWrapper(ex).toSafeString()); else - sb.append(ex.getMessage() == null ? ex.getClass().getName() : ex.getMessage()); + sb.append(new ThrowableWrapper(ex).getSafeMessageOrName()); Throwable cause = ex.getCause(); while (cause != null) { if (BuildConfig.DEBUG) - sb.append(separator).append(cause.toString()); + sb.append(separator).append(new ThrowableWrapper(cause).toSafeString()); else - sb.append(separator).append(cause.getMessage() == null ? cause.getClass().getName() : cause.getMessage()); + sb.append(separator).append(new ThrowableWrapper(cause).getSafeMessageOrName()); cause = cause.getCause(); } @@ -1838,7 +1838,7 @@ public class Log { try (FileWriter out = new FileWriter(file, true)) { out.write(BuildConfig.VERSION_NAME + BuildConfig.REVISION + " " + new Date() + "\r\n"); - out.write(ex + "\r\n" + android.util.Log.getStackTraceString(ex) + "\r\n"); + out.write(ex + "\r\n" + new ThrowableWrapper(ex).getStackTraceString() + "\r\n"); } catch (IOException e) { Log.e(e); } @@ -3783,7 +3783,7 @@ public class Log { } ssb.append("\r\n"); } catch (Throwable ex) { - ssb.append(ex.toString()); + ssb.append(new ThrowableWrapper(ex).toSafeString()); } ssb.setSpan(new RelativeSizeSpan(HtmlHelper.FONT_SMALL), 0, ssb.length(), 0); diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 86d41ef523..1e03d46524 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -5567,12 +5567,12 @@ public class MessageHelper { getStructure(multipart.getBodyPart(i), ssb, level + 1, textColorLink); } catch (Throwable ex) { Log.w(ex); - ssb.append(ex.toString()).append('\n'); + ssb.append(new ThrowableWrapper(ex).toSafeString()).append('\n'); } } } catch (Throwable ex) { Log.w(ex); - ssb.append(ex.toString()).append('\n'); + ssb.append(new ThrowableWrapper(ex).toSafeString()).append('\n'); } } diff --git a/app/src/main/java/eu/faircode/email/ProtectedContent.java b/app/src/main/java/eu/faircode/email/ProtectedContent.java index c4212c481c..6778b3e2b3 100644 --- a/app/src/main/java/eu/faircode/email/ProtectedContent.java +++ b/app/src/main/java/eu/faircode/email/ProtectedContent.java @@ -292,7 +292,7 @@ public class ProtectedContent { @Override protected void onException(Bundle args, Throwable ex) { - tvError.setText(ex.getMessage()); + tvError.setText(new ThrowableWrapper(ex).getSafeMessage()); tvErrorDetail.setText(ex.toString()); tvError.setVisibility(View.VISIBLE); tvErrorDetail.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/eu/faircode/email/ThrowableWrapper.java b/app/src/main/java/eu/faircode/email/ThrowableWrapper.java new file mode 100644 index 0000000000..4d7e14a002 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/ThrowableWrapper.java @@ -0,0 +1,61 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FairEmail is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FairEmail. If not, see . + + Copyright 2018-2023 by Marcel Bokhorst (M66B) +*/ + +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +public class ThrowableWrapper extends Throwable { + private Throwable ex; + private String msg; + + ThrowableWrapper(String msg) { + this.ex = new Throwable(); + this.msg = msg; + } + + ThrowableWrapper(Throwable ex) { + this.ex = ex; + } + + @Nullable + @Override + public String getLocalizedMessage() { + return getSafeMessage(); + } + + public String getSafeMessage() { + return (TextUtils.isEmpty(msg) ? super.getMessage() : msg); + } + + public String getSafeMessageOrName() { + String msg = getSafeMessage(); + return (msg == null ? ex.getClass().getName() : msg); + } + + public String getStackTraceString() { + return android.util.Log.getStackTraceString(ex); + } + + public String toSafeString() { + return super.toString(); + } +}