Improve backward compatibility of plurals formatting.

icu4c's behavior changed such that it now looks at the absolute value of the
input. For now, preserve compatibility by treating all negative numbers as
being case OTHER.

Bug: 18429565
Bug: https://code.google.com/p/android/issues/detail?id=78962

(cherry picked from commit 099eddad18ef2fff2b995f661b8abde2d35fd539)

Change-Id: I230210bb875cdc3c393db45fbdc347bc3486338b
diff --git a/luni/src/main/java/libcore/icu/NativePluralRules.java b/luni/src/main/java/libcore/icu/NativePluralRules.java
index dbcf089..f9fe74b 100644
--- a/luni/src/main/java/libcore/icu/NativePluralRules.java
+++ b/luni/src/main/java/libcore/icu/NativePluralRules.java
@@ -55,6 +55,10 @@
      * to the first rule that matches the given value.
      */
     public int quantityForInt(int value) {
+        // Pre-L compatibility. http://b/18429565.
+        if (value < 0) {
+            return OTHER;
+        }
         return quantityForIntImpl(address, value);
     }
 
diff --git a/luni/src/test/java/libcore/icu/NativePluralRulesTest.java b/luni/src/test/java/libcore/icu/NativePluralRulesTest.java
index 703a94a..76179b4 100644
--- a/luni/src/test/java/libcore/icu/NativePluralRulesTest.java
+++ b/luni/src/test/java/libcore/icu/NativePluralRulesTest.java
@@ -19,6 +19,24 @@
 import java.util.Locale;
 
 public class NativePluralRulesTest extends junit.framework.TestCase {
+    public void testNegatives() throws Exception {
+        // icu4c's behavior changed, but we prefer to preserve compatibility.
+        NativePluralRules en_US = NativePluralRules.forLocale(new Locale("en", "US"));
+        assertEquals(NativePluralRules.OTHER, en_US.quantityForInt(2));
+        assertEquals(NativePluralRules.ONE, en_US.quantityForInt(1));
+        assertEquals(NativePluralRules.OTHER, en_US.quantityForInt(0));
+        assertEquals(NativePluralRules.OTHER, en_US.quantityForInt(-1));
+        assertEquals(NativePluralRules.OTHER, en_US.quantityForInt(-2));
+
+        NativePluralRules ar = NativePluralRules.forLocale(new Locale("ar"));
+        assertEquals(NativePluralRules.ZERO, ar.quantityForInt(0));
+        assertEquals(NativePluralRules.OTHER, ar.quantityForInt(-1)); // Not ONE.
+        assertEquals(NativePluralRules.OTHER, ar.quantityForInt(-2)); // Not TWO.
+        assertEquals(NativePluralRules.OTHER, ar.quantityForInt(-3)); // Not FEW.
+        assertEquals(NativePluralRules.OTHER, ar.quantityForInt(-11)); // Not MANY.
+        assertEquals(NativePluralRules.OTHER, ar.quantityForInt(-100));
+    }
+
     public void testEnglish() throws Exception {
         NativePluralRules npr = NativePluralRules.forLocale(new Locale("en", "US"));
         assertEquals(NativePluralRules.OTHER, npr.quantityForInt(0));