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

Commit b27b3057 authored by Rayhaan Jaufeerally's avatar Rayhaan Jaufeerally
Browse files

Migrate Resources.java to use ICU4j drectly.

This change means that NativePluralRules can be removed in its entirety
because this is the only usage of that class.

Using a small benchmark from the NativePluralResources test, ICU4c code
takes 38.6 us and ICU4j code takes 49.2us to execute.

Change-Id: I5dbf643807c024a9c9c0f1292363fa8e39db965a
parent 43a2aca4
Loading
Loading
Loading
Loading
+14 −26
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.content.res;
import android.animation.Animator;
import android.animation.StateListAnimator;
import android.annotation.NonNull;
import android.icu.text.PluralRules;
import android.util.Pools.SynchronizedPool;
import android.view.ViewDebug;
import com.android.internal.util.XmlUtils;
@@ -49,8 +50,6 @@ import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.Locale;

import libcore.icu.NativePluralRules;

/**
 * Class for accessing an application's resources.  This sits on top of the
 * asset manager of the application (accessible through {@link #getAssets}) and
@@ -136,7 +135,7 @@ public class Resources {
    final DisplayMetrics mMetrics = new DisplayMetrics();

    private final Configuration mConfiguration = new Configuration();
    private NativePluralRules mPluralRule;
    private PluralRules mPluralRule;

    private CompatibilityInfo mCompatibilityInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;

@@ -321,9 +320,9 @@ public class Resources {
     *         possibly styled text information.
     */
    public CharSequence getQuantityText(int id, int quantity) throws NotFoundException {
        NativePluralRules rule = getPluralRule();
        PluralRules rule = getPluralRule();
        CharSequence res = mAssets.getResourceBagText(id,
                attrForQuantityCode(rule.quantityForInt(quantity)));
                attrForQuantityCode(rule.select(quantity)));
        if (res != null) {
            return res;
        }
@@ -333,40 +332,29 @@ public class Resources {
        }
        throw new NotFoundException("Plural resource ID #0x" + Integer.toHexString(id)
                + " quantity=" + quantity
                + " item=" + stringForQuantityCode(rule.quantityForInt(quantity)));
                + " item=" + rule.select(quantity));
    }

    private NativePluralRules getPluralRule() {
    private PluralRules getPluralRule() {
        synchronized (sSync) {
            if (mPluralRule == null) {
                mPluralRule = NativePluralRules.forLocale(mConfiguration.locale);
                mPluralRule = PluralRules.forLocale(mConfiguration.locale);
            }
            return mPluralRule;
        }
    }

    private static int attrForQuantityCode(int quantityCode) {
    private static int attrForQuantityCode(String quantityCode) {
        switch (quantityCode) {
            case NativePluralRules.ZERO: return 0x01000005;
            case NativePluralRules.ONE:  return 0x01000006;
            case NativePluralRules.TWO:  return 0x01000007;
            case NativePluralRules.FEW:  return 0x01000008;
            case NativePluralRules.MANY: return 0x01000009;
            case PluralRules.KEYWORD_ZERO: return 0x01000005;
            case PluralRules.KEYWORD_ONE:  return 0x01000006;
            case PluralRules.KEYWORD_TWO:  return 0x01000007;
            case PluralRules.KEYWORD_FEW:  return 0x01000008;
            case PluralRules.KEYWORD_MANY: return 0x01000009;
            default:                     return ID_OTHER;
        }
    }

    private static String stringForQuantityCode(int quantityCode) {
        switch (quantityCode) {
            case NativePluralRules.ZERO: return "zero";
            case NativePluralRules.ONE:  return "one";
            case NativePluralRules.TWO:  return "two";
            case NativePluralRules.FEW:  return "few";
            case NativePluralRules.MANY: return "many";
            default:                     return "other";
        }
    }

    /**
     * Return the string value associated with a particular resource ID.  It
     * will be stripped of any styled text information.
@@ -1852,7 +1840,7 @@ public class Resources {
        }
        synchronized (sSync) {
            if (mPluralRule != null) {
                mPluralRule = NativePluralRules.forLocale(config.locale);
                mPluralRule = PluralRules.forLocale(config.locale);
            }
        }
    }