From 97084bfc35c2511419d6178b3107d3e8d189cd03 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 30 Jan 2021 15:28:43 +0100 Subject: [PATCH] Align relative to text direction --- .../main/java/eu/faircode/email/Helper.java | 25 +++++++++++++++++++ .../java/eu/faircode/email/HtmlHelper.java | 7 +++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 42db6dc76f..712cd2fde4 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -876,6 +876,31 @@ public class Helper { } // https://issuetracker.google.com/issues/37054851 + static boolean isRtl(String text) { + if (TextUtils.isEmpty(text)) + return false; + + int rtl = 0; + int ltr = 0; + for (int i = 0; i < text.length(); i++) + switch (Character.getDirectionality(text.charAt(i))) { + case java.lang.Character.DIRECTIONALITY_RIGHT_TO_LEFT: + case java.lang.Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC: + case java.lang.Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING: + case java.lang.Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE: + rtl++; + break; + + case java.lang.Character.DIRECTIONALITY_LEFT_TO_RIGHT: + case java.lang.Character.DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING: + case java.lang.Character.DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE: + ltr++; + break; + } + + return (rtl > ltr); + } + static DateFormat getTimeInstance(Context context) { return Helper.getTimeInstance(context, SimpleDateFormat.MEDIUM); } diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index ff8d3dfbcc..9f63081d6c 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -55,7 +55,6 @@ import android.text.style.URLSpan; import android.text.style.UnderlineSpan; import android.util.Base64; import android.util.Patterns; -import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -1951,7 +1950,6 @@ public class HtmlHelper { final int dp3 = Helper.dp2pixels(context, 3); final int dp6 = Helper.dp2pixels(context, 6); final int dp24 = Helper.dp2pixels(context, 24); - final boolean ltr = (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_LTR); int message_zoom = prefs.getInt("message_zoom", 100); float textSize = Helper.getTextSize(context, 0) * message_zoom / 100f; @@ -2185,17 +2183,18 @@ public class HtmlHelper { case "text-align": // https://developer.mozilla.org/en-US/docs/Web/CSS/text-align Layout.Alignment alignment = null; + boolean rtl = Helper.isRtl(ssb.subSequence(start, ssb.length()).toString()); switch (value) { case "left": case "start": - alignment = (ltr ? Layout.Alignment.ALIGN_NORMAL : Layout.Alignment.ALIGN_OPPOSITE); + alignment = (rtl ? Layout.Alignment.ALIGN_OPPOSITE : Layout.Alignment.ALIGN_NORMAL); break; case "center": alignment = Layout.Alignment.ALIGN_CENTER; break; case "right": case "end": - alignment = (ltr ? Layout.Alignment.ALIGN_OPPOSITE : Layout.Alignment.ALIGN_NORMAL); + alignment = (rtl ? Layout.Alignment.ALIGN_NORMAL : Layout.Alignment.ALIGN_OPPOSITE); break; } if (alignment != null)