Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd4161b1 authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

Fix bug #5371909 Hebrew & Arabic mails are sent as LTR intead of RTL

- make paragraphs aware of text direction

Change-Id: I0b0cf5a47c7da870dea836cb6150aa83e9de0e90
parent f64dfccd
Loading
Loading
Loading
Loading
+20 −5
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package android.text;
package android.text;


import com.android.internal.util.ArrayUtils;
import org.ccil.cowan.tagsoup.HTMLSchema;
import org.ccil.cowan.tagsoup.HTMLSchema;
import org.ccil.cowan.tagsoup.Parser;
import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.Attributes;
import org.xml.sax.Attributes;
@@ -45,13 +46,11 @@ import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.text.style.UnderlineSpan;
import android.util.Log;


import com.android.internal.util.XmlUtils;
import com.android.internal.util.XmlUtils;


import java.io.IOException;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringReader;
import java.nio.CharBuffer;
import java.util.HashMap;
import java.util.HashMap;


/**
/**
@@ -203,9 +202,26 @@ public class Html {
        }
        }
    }
    }


    private static String getOpenParaTagWithDirection(Spanned text, int start, int end) {
        final int len = end - start;
        final byte[] levels = new byte[ArrayUtils.idealByteArraySize(len)];
        final char[] buffer = TextUtils.obtain(len);
        TextUtils.getChars(text, start, end, buffer, 0);

        int paraDir = AndroidBidi.bidi(Layout.DIR_REQUEST_DEFAULT_LTR, buffer, levels, len,
                false /* no info */);
        switch(paraDir) {
            case Layout.DIR_RIGHT_TO_LEFT:
                return "<p dir=rtl>";
            case Layout.DIR_LEFT_TO_RIGHT:
            default:
                return "<p dir=ltr>";
        }
    }

    private static void withinBlockquote(StringBuilder out, Spanned text,
    private static void withinBlockquote(StringBuilder out, Spanned text,
                                         int start, int end) {
                                         int start, int end) {
        out.append("<p>");
        out.append(getOpenParaTagWithDirection(text, start, end));


        int next;
        int next;
        for (int i = start; i < end; i = next) {
        for (int i = start; i < end; i = next) {
@@ -340,7 +356,7 @@ public class Html {
            }
            }
        }
        }


        String p = last ? "" : "</p>\n<p>";
        String p = last ? "" : "</p>\n" + getOpenParaTagWithDirection(text, start, end);


        if (nl == 1) {
        if (nl == 1) {
            out.append("<br>\n");
            out.append("<br>\n");
@@ -350,7 +366,6 @@ public class Html {
            for (int i = 2; i < nl; i++) {
            for (int i = 2; i < nl; i++) {
                out.append("<br>");
                out.append("<br>");
            }
            }

            out.append(p);
            out.append(p);
        }
        }
    }
    }