From 8d2e0f7898ef7ab9b8775d88a2f8af2eea365c51 Mon Sep 17 00:00:00 2001 From: Roozbeh Pournader Date: Thu, 16 Jul 2015 15:28:58 -0700 Subject: [PATCH] Bidi-wrap the results of format[Short]FileSize(). Previously, users of the results of formatFileSize() and formatShortFileSize() needed to unicodeWrap the results themselves using BidiFormatter, which resulted in several bugs and inconsistencies across the platform when they didn't, especially in Hebrew and Urdu locales: Hebrew and Urdu use Latin abbreviations like 'MB' for file sizes which cause undesired reorderings (or incorrect detection of the string direction when the formatted file size starts the string). With this patch, the results are now bidi-wrapped before being returned if the locale of the context passed in to the formatter is a right-to-left locale. Bug: 22237132 Bug: 22273176 Change-Id: If076636d15828fc810feef6f0fa8806ef52aed5d --- core/java/android/text/format/Formatter.java | 31 ++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java index 82689b98e64b7..b5068b2e7cccb 100644 --- a/core/java/android/text/format/Formatter.java +++ b/core/java/android/text/format/Formatter.java @@ -16,12 +16,18 @@ package android.text.format; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.content.res.Resources; +import android.text.BidiFormatter; +import android.text.TextUtils; +import android.view.View; import android.net.NetworkUtils; import android.net.TrafficStats; +import java.util.Locale; + /** * Utility class to aid in formatting common values that are not covered * by the {@link java.util.Formatter} class in {@link java.util} @@ -46,8 +52,23 @@ public final class Formatter { } } + /* Wraps the source string in bidi formatting characters in RTL locales */ + private static String bidiWrap(@NonNull Context context, String source) { + final Locale locale = context.getResources().getConfiguration().locale; + if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) { + return BidiFormatter.getInstance(true /* RTL*/).unicodeWrap(source); + } else { + return source; + } + } + /** - * Formats a content size to be in the form of bytes, kilobytes, megabytes, etc + * Formats a content size to be in the form of bytes, kilobytes, megabytes, etc. + * + * If the context has a right-to-left locale, the returned string is wrapped in bidi formatting + * characters to make sure it's displayed correctly if inserted inside a right-to-left string. + * (This is useful in cases where the unit strings, like "MB", are left-to-right, but the + * locale is right-to-left.) * * @param context Context to use to load the localized units * @param sizeBytes size value to be formatted, in bytes @@ -58,8 +79,8 @@ public final class Formatter { return ""; } final BytesResult res = formatBytes(context.getResources(), sizeBytes, 0); - return context.getString(com.android.internal.R.string.fileSizeSuffix, - res.value, res.units); + return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix, + res.value, res.units)); } /** @@ -71,8 +92,8 @@ public final class Formatter { return ""; } final BytesResult res = formatBytes(context.getResources(), sizeBytes, FLAG_SHORTER); - return context.getString(com.android.internal.R.string.fileSizeSuffix, - res.value, res.units); + return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix, + res.value, res.units)); } /** {@hide} */