From f32b19fc9e80a8406583a44e3f10375011542777 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 14 May 2021 19:20:01 +0200 Subject: [PATCH] Added span range checks and breadcrumbs --- app/src/main/java/eu/faircode/email/Log.java | 6 +++ .../java/eu/faircode/email/StyleHelper.java | 45 ++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index 83b28011ac..0bf8a52b20 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -274,6 +274,12 @@ public class Log { } } + static void breadcrumb(String name, String key, String value) { + Map crumb = new HashMap<>(); + crumb.put(key, value); + breadcrumb(name, crumb); + } + static void breadcrumb(String name, Map crumb) { try { Map ocrumb = new HashMap<>(); diff --git a/app/src/main/java/eu/faircode/email/StyleHelper.java b/app/src/main/java/eu/faircode/email/StyleHelper.java index 813daa3047..6cfeccd09f 100644 --- a/app/src/main/java/eu/faircode/email/StyleHelper.java +++ b/app/src/main/java/eu/faircode/email/StyleHelper.java @@ -84,8 +84,11 @@ public class StyleHelper { final int end = _end; if (action == R.id.menu_bold || action == R.id.menu_italic) { - int style = (action == R.id.menu_bold ? Typeface.BOLD : Typeface.ITALIC); + String name = (action == R.id.menu_bold ? "bold" : "italic"); + Log.breadcrumb("style", "action", name); + boolean has = false; + int style = (action == R.id.menu_bold ? Typeface.BOLD : Typeface.ITALIC); StyleSpan[] spans = edit.getSpans(start, end, StyleSpan.class); for (StyleSpan span : spans) if (span.getStyle() == style) { @@ -106,6 +109,8 @@ public class StyleHelper { return true; } else if (action == R.id.menu_underline) { + Log.breadcrumb("style", "action", "underline"); + boolean has = false; UnderlineSpan[] spans = edit.getSpans(start, end, UnderlineSpan.class); for (UnderlineSpan span : spans) { @@ -199,6 +204,8 @@ public class StyleHelper { } private boolean setSize(MenuItem item) { + Log.breadcrumb("style", "action", "size"); + Float size; if (item.getItemId() == R.id.menu_style_size_small) size = 0.8f; @@ -260,6 +267,8 @@ public class StyleHelper { } private void _setColor(Integer color) { + Log.breadcrumb("style", "action", "color"); + ForegroundColorSpan spans[] = edit.getSpans(start, end, ForegroundColorSpan.class); for (ForegroundColorSpan span : spans) { int s = edit.getSpanStart(span); @@ -279,6 +288,8 @@ public class StyleHelper { } private boolean setAlignment(MenuItem item) { + Log.breadcrumb("style", "action", "alignment"); + Pair paragraph = ensureParagraph(edit, start, end); int s = paragraph.first; int e = paragraph.second; @@ -309,6 +320,8 @@ public class StyleHelper { } private boolean setListLevel(MenuItem item) { + Log.breadcrumb("style", "action", "level"); + Context context = etBody.getContext(); int add = (item.getItemId() == R.id.menu_style_list_increase ? 1 : -1); @@ -334,6 +347,8 @@ public class StyleHelper { } private boolean setList(MenuItem item) { + Log.breadcrumb("style", "action", "list"); + Context context = etBody.getContext(); int colorAccent = Helper.resolveColor(context, R.attr.colorAccent); @@ -382,6 +397,8 @@ public class StyleHelper { } private boolean setFont(MenuItem item) { + Log.breadcrumb("style", "action", "font"); + int id = item.getItemId(); String[] names = anchor.getResources().getStringArray(R.array.fontNameValues); String face = (id < names.length ? names[id] : null); @@ -406,6 +423,8 @@ public class StyleHelper { } private boolean setBlockQuote(MenuItem item) { + Log.breadcrumb("style", "action", "quote"); + Context context = etBody.getContext(); int colorPrimary = Helper.resolveColor(context, R.attr.colorPrimary); @@ -454,6 +473,8 @@ public class StyleHelper { } private boolean setStrikeThrough(MenuItem item) { + Log.breadcrumb("style", "action", "strike"); + boolean has = false; StrikethroughSpan[] spans = edit.getSpans(start, end, StrikethroughSpan.class); for (StrikethroughSpan span : spans) { @@ -476,6 +497,8 @@ public class StyleHelper { } private boolean clear(MenuItem item) { + Log.breadcrumb("style", "action", "clear"); + int e = end; // Expand to paragraph (block quotes) @@ -506,6 +529,8 @@ public class StyleHelper { return true; } else if (action == R.id.menu_link) { + Log.breadcrumb("style", "action", "link"); + String url = (String) args[0]; List spans = new ArrayList<>(); @@ -534,6 +559,8 @@ public class StyleHelper { return true; } else if (action == R.id.menu_clear) { + Log.breadcrumb("style", "action", "clear/all"); + for (Object span : edit.getSpans(0, etBody.length(), Object.class)) if (!(span instanceof ImageSpan)) edit.removeSpan(span); @@ -551,6 +578,22 @@ public class StyleHelper { } static void splitSpan(Editable edit, int start, int end, int s, int e, int f, boolean extend, Object span1, Object span2) { + if (start < 0 || end < 0) { + Log.e(span1 + " invalid selection=" + start + "..." + end); + return; + } + + if (s < 0 || e < 0) { + Log.e(span1 + " not attached=" + s + "..." + e); + return; + } + + if (s > e) { + int tmp = s; + s = e; + e = tmp; + } + if (start < s && end > s && end < e) { // overlap before if (extend)