diff --git a/app/src/main/java/com/sun/mail/auth/Ntlm.java b/app/src/main/java/com/sun/mail/auth/Ntlm.java index 882776fcca..624a7168d6 100644 --- a/app/src/main/java/com/sun/mail/auth/Ntlm.java +++ b/app/src/main/java/com/sun/mail/auth/Ntlm.java @@ -26,6 +26,7 @@ import java.io.PrintStream; import java.security.GeneralSecurityException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; import java.util.Locale; import java.util.Random; import java.util.logging.Level; @@ -396,7 +397,7 @@ public class Ntlm { type3flags |= NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY; byte[] nonce = new byte[8]; // XXX - allow user to specify Random instance via properties? - (new Random()).nextBytes(nonce); + (new SecureRandom()).nextBytes(nonce); byte[] nthash = calcNTHash(); lmresponse = calcV2Response(nthash, nonce, challenge); byte[] targetInfo = new byte[0]; diff --git a/app/src/main/java/com/sun/mail/util/LineInputStream.java b/app/src/main/java/com/sun/mail/util/LineInputStream.java index cb068f3ffb..e468ff9cd0 100644 --- a/app/src/main/java/com/sun/mail/util/LineInputStream.java +++ b/app/src/main/java/com/sun/mail/util/LineInputStream.java @@ -166,7 +166,7 @@ public class LineInputStream extends FilterInputStream { // fall through and treat it as an 8-bit charset } } - return new String(buf, 0, 0, offset); + return new String(buf, 0, offset, StandardCharsets.ISO_8859_1); } } } diff --git a/app/src/main/java/eu/faircode/email/ActivityEML.java b/app/src/main/java/eu/faircode/email/ActivityEML.java index e24d19b09b..a366c5e71f 100644 --- a/app/src/main/java/eu/faircode/email/ActivityEML.java +++ b/app/src/main/java/eu/faircode/email/ActivityEML.java @@ -488,10 +488,8 @@ public class ActivityEML extends ActivityBase { @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException || ex instanceof FileNotFoundException) - ToastEx.makeText(ActivityEML.this, ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getSupportFragmentManager(), ex); + boolean report = !(ex instanceof IllegalArgumentException || ex instanceof FileNotFoundException); + Log.unexpectedError(getSupportFragmentManager(), ex, report); } }.execute(this, args, "eml:attachment"); } diff --git a/app/src/main/java/eu/faircode/email/ActivitySetup.java b/app/src/main/java/eu/faircode/email/ActivitySetup.java index d30aee316e..474eee3943 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySetup.java +++ b/app/src/main/java/eu/faircode/email/ActivitySetup.java @@ -511,10 +511,8 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException) - ToastEx.makeText(ActivitySetup.this, ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getSupportFragmentManager(), ex); + boolean report = !(ex instanceof IllegalArgumentException); + Log.unexpectedError(getSupportFragmentManager(), ex, report); } }.execute(this, args, "debug:info"); diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index c08038be26..84c1d14cdf 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -1765,11 +1765,10 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB @Override protected void onException(Bundle args, Throwable ex) { - if (args.getBoolean("always")) - if (ex instanceof IllegalArgumentException || ex instanceof IOException) - ToastEx.makeText(ActivityView.this, ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getSupportFragmentManager(), ex); + if (args.getBoolean("always")) { + boolean report = !(ex instanceof IllegalArgumentException || ex instanceof IOException); + Log.unexpectedError(getSupportFragmentManager(), ex, report); + } } }.execute(this, args, "update:check"); } @@ -2323,10 +2322,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException) - ToastEx.makeText(ActivityView.this, ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getSupportFragmentManager(), ex); + boolean report = !(ex instanceof IllegalArgumentException); + Log.unexpectedError(getSupportFragmentManager(), ex, report); } }.execute(this, args, "debug:info"); diff --git a/app/src/main/java/eu/faircode/email/EditTextCompose.java b/app/src/main/java/eu/faircode/email/EditTextCompose.java index 45184cfe28..79165167a6 100644 --- a/app/src/main/java/eu/faircode/email/EditTextCompose.java +++ b/app/src/main/java/eu/faircode/email/EditTextCompose.java @@ -277,7 +277,7 @@ public class EditTextCompose extends FixedEditText { @Override protected void onException(Bundle args, Throwable ex) { - ToastEx.makeText(getContext(), ex.toString(), Toast.LENGTH_LONG).show(); + // Ignored } }.execute(activity, args, "dictionary:modify"); diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index a0fbb4d24d..f5c5fe4451 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -643,7 +643,7 @@ public class EntityMessage implements Serializable { long id = Long.parseLong(file.getName()); File target = getFile(context, id); if (!file.renameTo(target)) - throw new IllegalArgumentException("Failed moving " + file); + Log.e("Move failed: " + file); } catch (Throwable ex) { Log.e(ex); } diff --git a/app/src/main/java/eu/faircode/email/FragmentBase.java b/app/src/main/java/eu/faircode/email/FragmentBase.java index f0ade232cd..33b4479258 100644 --- a/app/src/main/java/eu/faircode/email/FragmentBase.java +++ b/app/src/main/java/eu/faircode/email/FragmentBase.java @@ -634,12 +634,10 @@ public class FragmentBase extends Fragment { return; } - if (ex instanceof IllegalArgumentException || + boolean report = !(ex instanceof IllegalArgumentException || ex instanceof FileNotFoundException || - ex instanceof SecurityException) - ToastEx.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getParentFragmentManager(), ex); + ex instanceof SecurityException); + Log.unexpectedError(getParentFragmentManager(), ex, report); } }.execute(this, args, "attachment:save"); } @@ -725,12 +723,10 @@ public class FragmentBase extends Fragment { return; } - if (ex instanceof IllegalArgumentException || + boolean report = !(ex instanceof IllegalArgumentException || ex instanceof FileNotFoundException || - ex instanceof SecurityException) - ToastEx.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getParentFragmentManager(), ex); + ex instanceof SecurityException); + Log.unexpectedError(getParentFragmentManager(), ex, report); } }.execute(this, args, "attachments:save"); } diff --git a/app/src/main/java/eu/faircode/email/FragmentContacts.java b/app/src/main/java/eu/faircode/email/FragmentContacts.java index 5be2478a7f..58c39ae630 100644 --- a/app/src/main/java/eu/faircode/email/FragmentContacts.java +++ b/app/src/main/java/eu/faircode/email/FragmentContacts.java @@ -820,10 +820,8 @@ public class FragmentContacts extends FragmentBase { @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException) - ToastEx.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getParentFragmentManager(), ex); + boolean report = !(ex instanceof IllegalArgumentException); + Log.unexpectedError(getParentFragmentManager(), ex, report); } }.execute(this, args, "contacts:name"); } diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java b/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java index 0552c2b129..091d7571a5 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java @@ -446,8 +446,8 @@ public class FragmentDialogPrint extends FragmentDialogBase { ex = new Throwable("A system app or component required for printing is missing." + " Is the print spooler still enabled?", ex); Log.unexpectedError(fm, ex, report); - } catch (IllegalStateException exex) { - ToastEx.makeText(context, Log.formatThrowable(ex), Toast.LENGTH_LONG).show(); + } catch (Throwable exex) { + Log.e(exex); } } finally { printWebView = null; diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java b/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java index 344681e969..b96e8d209b 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogRuleCheck.java @@ -136,10 +136,8 @@ public class FragmentDialogRuleCheck extends FragmentDialogBase { @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException) - ToastEx.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getParentFragmentManager(), ex); + boolean report = !(ex instanceof IllegalArgumentException); + Log.unexpectedError(getParentFragmentManager(), ex, report); } }.execute(FragmentDialogRuleCheck.this, args, "rule:execute"); } diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 34b5a125cb..0eaaaff0e9 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1892,10 +1892,8 @@ public class FragmentMessages extends FragmentBase @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException) - ToastEx.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getParentFragmentManager(), ex); + boolean report = !(ex instanceof IllegalArgumentException); + Log.unexpectedError(getParentFragmentManager(), ex, report); } }.execute(FragmentMessages.this, args, "messages:search"); } diff --git a/app/src/main/java/eu/faircode/email/FragmentOAuth.java b/app/src/main/java/eu/faircode/email/FragmentOAuth.java index a83771c3ee..31eb4581af 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOAuth.java +++ b/app/src/main/java/eu/faircode/email/FragmentOAuth.java @@ -85,13 +85,13 @@ import org.json.JSONObject; import java.io.FileNotFoundException; import java.net.URL; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Random; import java.util.Set; import javax.mail.AuthenticationFailedException; @@ -424,7 +424,7 @@ public class FragmentOAuth extends FragmentBase { Uri.parse(authorizationEndpoint), Uri.parse(tokenEndpoint)); - int random = Math.abs(new Random().nextInt()); + int random = Math.abs(new SecureRandom().nextInt()); AuthState authState = new AuthState(serviceConfig); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String key = "oauth." + provider.id + (graph ? ":graph" : ""); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index ad1c114f9d..ef4ee7bcac 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -1933,8 +1933,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc ssb.append("\n"); } } catch (PackageManager.NameNotFoundException ex) { - ssb.append(ex.toString()).append("\n") - .append(android.util.Log.getStackTraceString(ex)).append("\n"); + Log.e(ex); } ssb.append("\n"); diff --git a/app/src/main/java/eu/faircode/email/FragmentRules.java b/app/src/main/java/eu/faircode/email/FragmentRules.java index 47af1e5a06..07ca71e8b6 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRules.java +++ b/app/src/main/java/eu/faircode/email/FragmentRules.java @@ -543,11 +543,8 @@ public class FragmentRules extends FragmentBase { @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException || - ex instanceof FileNotFoundException) - ToastEx.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getParentFragmentManager(), ex); + boolean report = !(ex instanceof IllegalArgumentException || ex instanceof FileNotFoundException); + Log.unexpectedError(getParentFragmentManager(), ex, report); } }.execute(this, args, "rules:export"); } @@ -675,11 +672,10 @@ public class FragmentRules extends FragmentBase { protected void onException(Bundle args, Throwable ex) { if (ex instanceof NoStreamException) ((NoStreamException) ex).report(getActivity()); - else if (ex instanceof FileNotFoundException || - ex instanceof JSONException) - ToastEx.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); - else - Log.unexpectedError(getParentFragmentManager(), ex); + else { + boolean report = !(ex instanceof FileNotFoundException || ex instanceof JSONException); + Log.unexpectedError(getParentFragmentManager(), ex, report); + } } }.execute(this, args, "rules:import"); } diff --git a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java index f7694b2b97..726b2740c0 100644 --- a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java @@ -200,30 +200,50 @@ public class Fts4DbHelper extends SQLiteOpenHelper { String search = escape(processBreakText(query)); String select = ""; - if (account != null) - select += "account = " + account + " AND "; - if (folder != null) - select += "folder = " + folder + " AND "; + List args = new ArrayList<>(); + + if (account != null) { + select += "account = ? AND "; + args.add(Long.toString(account)); + } + + if (folder != null) { + select += "folder = ? AND "; + args.add(Long.toString(folder)); + } + if (exclude.length > 0) { select += "NOT folder IN ("; for (int i = 0; i < exclude.length; i++) { if (i > 0) select += ", "; - select += exclude[i]; + select += "?"; + args.add(Long.toString(exclude[i])); } select += ") AND "; } - if (criteria.after != null) - select += "time > " + criteria.after + " AND "; - if (criteria.before != null) - select += "time < " + criteria.before + " AND "; - Log.i("FTS select=" + select + " search=" + search + " query=" + query); + if (criteria.after != null) { + select += "time > ? AND "; + args.add(Long.toString(criteria.after)); + } + + if (criteria.before != null) { + select += "time < ? AND "; + args.add(Long.toString(criteria.before)); + } + + select += "message MATCH ?"; + args.add(search); + + Log.i("FTS select=" + select + + " args=" + TextUtils.join(", ", args) + + " query=" + query); List result = new ArrayList<>(); try (Cursor cursor = db.query( "message", new String[]{"rowid"}, - select + "message MATCH ?", - new String[]{search}, + select, + args.toArray(new String[0]), null, null, "time DESC", null)) { while (cursor != null && cursor.moveToNext()) result.add(cursor.getLong(0)); diff --git a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java index 62e5fce43f..6f6b6543db 100644 --- a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java @@ -130,8 +130,8 @@ public class Fts5DbHelper extends SQLiteOpenHelper { "SELECT term FROM message_terms" + " WHERE term LIKE ?" + " ORDER BY cnt" + - " LIMIT " + max, - new String[]{query})) { + " LIMIT ?", + new String[]{query, Integer.toString(max)})) { while (cursor != null && cursor.moveToNext()) result.add(cursor.getString(0)); } @@ -200,30 +200,50 @@ public class Fts5DbHelper extends SQLiteOpenHelper { String search = (sb.length() > 0 ? sb.toString() : escape(criteria.query)); String select = ""; - if (account != null) - select += "account = " + account + " AND "; - if (folder != null) - select += "folder = " + folder + " AND "; + List args = new ArrayList<>(); + + if (account != null) { + select += "account = ? AND "; + args.add(Long.toString(account)); + } + + if (folder != null) { + select += "folder = ? AND "; + args.add(Long.toString(folder)); + } + if (exclude.length > 0) { select += "NOT folder IN ("; for (int i = 0; i < exclude.length; i++) { if (i > 0) select += ", "; - select += exclude[i]; + select += "?"; + args.add(Long.toString(exclude[i])); } select += ") AND "; } - if (criteria.after != null) - select += "time > " + criteria.after + " AND "; - if (criteria.before != null) - select += "time < " + criteria.before + " AND "; - Log.i("FTS select=" + select + " search=" + search); + if (criteria.after != null) { + select += "time > ? AND "; + args.add(Long.toString(criteria.after)); + } + + if (criteria.before != null) { + select += "time < ? AND "; + args.add(Long.toString(criteria.before)); + } + + select += "message MATCH ?"; + args.add(search); + + Log.i("FTS select=" + select + + " args=" + TextUtils.join(", ", args) + + " query=" + criteria.query); List result = new ArrayList<>(); try (Cursor cursor = db.query( "message", new String[]{"rowid"}, - select + "message MATCH ?", - new String[]{search}, + select, + args.toArray(new String[0]), null, null, "time DESC", null)) { while (cursor != null && cursor.moveToNext()) result.add(cursor.getLong(0)); diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 3a86209eb2..7c35d560ed 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -1787,7 +1787,6 @@ public class Helper { context.startActivity(intent); } catch (Throwable ex) { Log.e(ex); - ToastEx.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); } } }); @@ -2649,8 +2648,9 @@ public class Helper { exists.put(dir, true); } + // CASA: External storage as well if (!dir.exists() && !dir.mkdirs()) - throw new IllegalArgumentException("Failed to create=" + dir); + throw new IllegalArgumentException("Failed to create directory"); return dir; } @@ -2850,7 +2850,7 @@ public class Helper { if (file.exists()) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { if (!file.delete()) - throw new FileNotFoundException(file.getAbsolutePath()); + Log.w("File not found: " + file); } else Files.delete(Paths.get(file.getAbsolutePath())); } @@ -3528,8 +3528,8 @@ public class Helper { Runtime.getRuntime().gc(); try { Thread.sleep(50); - } catch (InterruptedException e) { - e.printStackTrace(); + } catch (InterruptedException ex) { + Log.e(ex); } } } diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 0708dc5202..ac362ac841 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -3808,15 +3808,6 @@ public class HtmlHelper { setSpan(ssb, StyleHelper.getTypefaceSpan("Cousine", context), start, ssb.length()); } catch (Throwable ex) { Log.e(ex); - if (BuildConfig.DEBUG || debug) { - int s = ssb.length(); - ssb.append(ex.toString()).append('\n') - .append(android.util.Log.getStackTraceString(ex)).append('\n'); - setSpan(ssb, StyleHelper.getTypefaceSpan("Cousine", context), s, ssb.length()); - setSpan(ssb, new RelativeSizeSpan(HtmlHelper.FONT_SMALL), s, ssb.length()); - int colorWarning = Helper.resolveColor(context, R.attr.colorWarning); - setSpan(ssb, new ForegroundColorSpan(colorWarning), s, ssb.length()); - } } if ("true".equals(element.attr("x-block"))) diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index caab5fabcc..13ba51efb8 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -89,7 +89,6 @@ import android.view.ViewConfiguration; import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -300,7 +299,7 @@ public class Log { } }); } catch (Throwable ex) { - ex.printStackTrace(); + Log.i(ex); } return android.util.Log.e(TAG, msg); } @@ -323,7 +322,7 @@ public class Log { } }); } catch (Throwable ex1) { - ex1.printStackTrace(); + Log.i(ex1); } return android.util.Log.w(TAG, ex + "\n" + android.util.Log.getStackTraceString(ex)); } @@ -342,7 +341,7 @@ public class Log { } }); } catch (Throwable ex1) { - ex1.printStackTrace(); + Log.i(ex1); } return android.util.Log.e(TAG, ex + "\n" + android.util.Log.getStackTraceString(ex)); } @@ -362,7 +361,7 @@ public class Log { } }); } catch (Throwable ex1) { - ex1.printStackTrace(); + Log.i(ex1); } return android.util.Log.w(TAG, prefix + " " + ex + "\n" + android.util.Log.getStackTraceString(ex)); } @@ -378,7 +377,7 @@ public class Log { } }); } catch (Throwable ex1) { - ex1.printStackTrace(); + Log.i(ex1); } return android.util.Log.e(TAG, prefix + " " + ex + "\n" + android.util.Log.getStackTraceString(ex)); } @@ -402,7 +401,7 @@ public class Log { if (enabled) Bugsnag.startSession(); } catch (Throwable ex) { - ex.printStackTrace(); + Log.i(ex); } } @@ -454,7 +453,7 @@ public class Log { Log.i(sb.toString()); Bugsnag.leaveBreadcrumb(name, ocrumb, BreadcrumbType.LOG); } catch (Throwable ex) { - ex.printStackTrace(); + Log.e(ex); } } @@ -2020,10 +2019,7 @@ public class Log { @Override protected void onException(Bundle args, Throwable ex) { - if (ex instanceof IllegalArgumentException) - ToastEx.makeText(context, ex.getMessage(), Toast.LENGTH_LONG).show(); - else - ToastEx.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); + // Ignored } }.execute(getContext(), getActivity(), new Bundle(), "error:unexpected"); } diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index aa28b635f7..86d41ef523 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -1209,9 +1209,12 @@ public class MessageHelper { ContactsContract.CommonDataKinds.Website.TYPE, ContactsContract.CommonDataKinds.Website.URL }, - ContactsContract.Data.CONTACT_ID + " = " + contactId + - " AND " + ContactsContract.Contacts.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE + "'", - null, null)) { + ContactsContract.Data.CONTACT_ID + " = ?" + + " AND " + ContactsContract.Contacts.Data.MIMETYPE + " = ?", + new String[]{ + contactId, + ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE + }, null)) { while (web.moveToNext()) { int type = web.getInt(0); String url = web.getString(1); @@ -1226,8 +1229,10 @@ public class MessageHelper { ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.NUMBER }, - ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, - null, null)) { + ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", + new String[]{ + contactId + }, null)) { while (phones.moveToNext()) { int type = phones.getInt(0); String number = phones.getString(1); diff --git a/app/src/main/java/eu/faircode/email/ProtectedContent.java b/app/src/main/java/eu/faircode/email/ProtectedContent.java index 0a68f1086b..c4212c481c 100644 --- a/app/src/main/java/eu/faircode/email/ProtectedContent.java +++ b/app/src/main/java/eu/faircode/email/ProtectedContent.java @@ -46,7 +46,6 @@ import android.view.inputmethod.EditorInfo; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -388,7 +387,6 @@ public class ProtectedContent { @Override protected void onException(Bundle args, Throwable ex) { Log.e(ex); - ToastEx.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); } }.execute(context, owner, args, "protect"); } diff --git a/app/src/main/java/eu/faircode/email/TextHelper.java b/app/src/main/java/eu/faircode/email/TextHelper.java index 88897b61f3..97df815633 100644 --- a/app/src/main/java/eu/faircode/email/TextHelper.java +++ b/app/src/main/java/eu/faircode/email/TextHelper.java @@ -34,8 +34,10 @@ import android.view.textclassifier.TextClassifier; import androidx.annotation.RequiresApi; import androidx.preference.PreferenceManager; -import java.io.StringReader; -import java.io.StringWriter; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.parser.Parser; + import java.text.Normalizer; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -53,13 +55,6 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - public class TextHelper { private static final int MIN_WORDS = 7; private static final int MAX_DETECT_SAMPLE_SIZE = 8192; @@ -294,16 +289,9 @@ public class TextHelper { public static String formatXml(String xml, int indent) { try { - Source source = new StreamSource(new StringReader(xml)); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - TransformerFactory factory = TransformerFactory.newInstance(); - Transformer transformer = factory.newTransformer(); - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", Integer.toString(indent)); - transformer.transform(source, result); - return result.getWriter().toString(); + Document d = Jsoup.parse(xml, "", Parser.xmlParser()); + d.outputSettings().prettyPrint(true).outline(true).indentAmount(indent); + return d.html(); } catch (Throwable ex) { Log.e(ex); return xml;