Add a test to ensure a backward compatible set of Transliterator Ids

- If a ICU change/upgrade breaks the backward compatibility,
  the test should fail

Bug: 109663008
Test: AndroidTransliteratorAvailableIdsTest
Change-Id: I2bf480c76cd9c55ae560a62eb67d112930211bf8
diff --git a/android_icu4j/Android.bp b/android_icu4j/Android.bp
index d47bb37..ffa4464 100644
--- a/android_icu4j/Android.bp
+++ b/android_icu4j/Android.bp
@@ -55,7 +55,10 @@
         "src/main/tests/**/*.java",
         "testing/src/**/*.java",
     ],
-    java_resource_dirs: ["src/main/tests"],
+    java_resource_dirs: [
+        "src/main/tests",
+        "testing/src"
+    ],
     static_libs: [
         "junit",
         "junit-params",
diff --git a/android_icu4j/testing/src/android/icu/extratest/AndroidTransliteratorAvailableIdsTest.java b/android_icu4j/testing/src/android/icu/extratest/AndroidTransliteratorAvailableIdsTest.java
index 2ea4b03..729fafa 100644
--- a/android_icu4j/testing/src/android/icu/extratest/AndroidTransliteratorAvailableIdsTest.java
+++ b/android_icu4j/testing/src/android/icu/extratest/AndroidTransliteratorAvailableIdsTest.java
@@ -30,6 +30,7 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
@@ -47,13 +48,33 @@
 @MainTestShard
 @RunWith(JUnit4.class)
 public class AndroidTransliteratorAvailableIdsTest {
-    private static final String ID_LIST_FILE = "expected_transliteration_id_list.txt";
 
     @Test
     public void testGetAvailableIDs_containingAllExpectedIds() throws IOException {
+        assertContainingAllExpectedIds("expected_transliteration_id_list.txt",
+                Collections.emptyList());
+    }
+
+    /**
+     * Test that the current set of transliteration ids is backwards compatible, i.e.
+     * contains all ids when Transliteration API is first exposed as public Android API
+     * in Android Q.
+     * If a breaking change has to be made, i.e. a missing transliteration id is expected,
+     * please add the id into the exclusion list.
+     */
+    @Test
+    public void testGetAvailableIDs_containingAllExpectedIdsInFirstRelease() throws IOException {
+        assertContainingAllExpectedIds("expected_transliteration_id_list_release_1.txt",
+                Arrays.asList(
+                        /* Deliberately empty: No missing Id. */
+                ));
+    }
+
+    private void assertContainingAllExpectedIds(String resourceFileName,
+            List<String> excludedIds) throws IOException {
         List<String> expectedIds = new ArrayList<>();
         try (BufferedReader reader = new BufferedReader(new InputStreamReader(
-                AndroidICUVersionTest.class.getResourceAsStream(ID_LIST_FILE)))) {
+                AndroidICUVersionTest.class.getResourceAsStream(resourceFileName)))) {
             String line;
             while((line = reader.readLine()) != null) {
                 if (!line.isEmpty()) {
@@ -62,6 +83,8 @@
             }
         }
 
+        expectedIds.removeAll(excludedIds);
+
         // Sanity check. The list size shouldn't be 0.
         assertNotEquals("At least one transliteration id is expected",
                 0, expectedIds.size());
diff --git a/android_icu4j/testing/src/android/icu/extratest/expected_transliteration_id_list_release_1.txt b/android_icu4j/testing/src/android/icu/extratest/expected_transliteration_id_list_release_1.txt
new file mode 100644
index 0000000..dde80eb
--- /dev/null
+++ b/android_icu4j/testing/src/android/icu/extratest/expected_transliteration_id_list_release_1.txt
@@ -0,0 +1,672 @@
+ASCII-Latin
+Accents-Any
+Amharic-Latin/BGN
+Any-Accents
+Any-Publishing
+Arab-Latn
+Arabic-Latin
+Arabic-Latin/BGN
+Armenian-Latin
+Armenian-Latin/BGN
+Armn-Latn
+Azerbaijani-Latin/BGN
+Belarusian-Latin/BGN
+Beng-Arab
+Beng-Deva
+Beng-Gujr
+Beng-Guru
+Beng-Knda
+Beng-Latn
+Beng-Mlym
+Beng-Orya
+Beng-Taml
+Beng-Telu
+Beng-ur
+Bengali-Arabic
+Bengali-Devanagari
+Bengali-Gujarati
+Bengali-Gurmukhi
+Bengali-Kannada
+Bengali-Latin
+Bengali-Malayalam
+Bengali-Oriya
+Bengali-Tamil
+Bengali-Telugu
+Bopo-Latn
+Bopomofo-Latin
+Bulgarian-Latin/BGN
+Cyrillic-Latin
+Cyrl-Latn
+Deva-Arab
+Deva-Beng
+Deva-Gujr
+Deva-Guru
+Deva-Knda
+Deva-Latn
+Deva-Mlym
+Deva-Orya
+Deva-Taml
+Deva-Telu
+Deva-ur
+Devanagari-Arabic
+Devanagari-Bengali
+Devanagari-Gujarati
+Devanagari-Gurmukhi
+Devanagari-Kannada
+Devanagari-Latin
+Devanagari-Malayalam
+Devanagari-Oriya
+Devanagari-Tamil
+Devanagari-Telugu
+Digit-Tone
+Fullwidth-Halfwidth
+Geor-Latn
+Georgian-Latin
+Georgian-Latin/BGN
+Greek-Latin
+Greek-Latin/BGN
+Greek-Latin/UNGEGN
+Grek-Latn
+Grek-Latn/UNGEGN
+Gujarati-Arabic
+Gujarati-Bengali
+Gujarati-Devanagari
+Gujarati-Gurmukhi
+Gujarati-Kannada
+Gujarati-Latin
+Gujarati-Malayalam
+Gujarati-Oriya
+Gujarati-Tamil
+Gujarati-Telugu
+Gujr-Arab
+Gujr-Beng
+Gujr-Deva
+Gujr-Guru
+Gujr-Knda
+Gujr-Latn
+Gujr-Mlym
+Gujr-Orya
+Gujr-Taml
+Gujr-Telu
+Gujr-ur
+Gurmukhi-Arabic
+Gurmukhi-Bengali
+Gurmukhi-Devanagari
+Gurmukhi-Gujarati
+Gurmukhi-Kannada
+Gurmukhi-Latin
+Gurmukhi-Malayalam
+Gurmukhi-Oriya
+Gurmukhi-Tamil
+Gurmukhi-Telugu
+Guru-Arab
+Guru-Beng
+Guru-Deva
+Guru-Gujr
+Guru-Knda
+Guru-Latn
+Guru-Mlym
+Guru-Orya
+Guru-Taml
+Guru-Telu
+Guru-ur
+Halfwidth-Fullwidth
+Han-Latin
+Han-Latin/Names
+Hang-Latn
+Hangul-Latin
+Hani-Latn
+Hans-Hant
+Hant-Hans
+Hebr-Latn
+Hebrew-Latin
+Hebrew-Latin/BGN
+Hira-Kana
+Hira-Latn
+Hiragana-Katakana
+Hiragana-Latin
+IPA-XSampa
+Jamo-Latin
+Jamo-Latn
+Kana-Hira
+Kana-Latn
+Kannada-Arabic
+Kannada-Bengali
+Kannada-Devanagari
+Kannada-Gujarati
+Kannada-Gurmukhi
+Kannada-Latin
+Kannada-Malayalam
+Kannada-Oriya
+Kannada-Tamil
+Kannada-Telugu
+Katakana-Hiragana
+Katakana-Latin
+Katakana-Latin/BGN
+Kazakh-Latin/BGN
+Kirghiz-Latin/BGN
+Knda-Arab
+Knda-Beng
+Knda-Deva
+Knda-Gujr
+Knda-Guru
+Knda-Latn
+Knda-Mlym
+Knda-Orya
+Knda-Taml
+Knda-Telu
+Knda-ur
+Korean-Latin/BGN
+Latin-ASCII
+Latin-Arabic
+Latin-Armenian
+Latin-Bengali
+Latin-Bopomofo
+Latin-Cyrillic
+Latin-Devanagari
+Latin-Georgian
+Latin-Greek
+Latin-Greek/UNGEGN
+Latin-Gujarati
+Latin-Gurmukhi
+Latin-Hangul
+Latin-Hebrew
+Latin-Hiragana
+Latin-Jamo
+Latin-Kannada
+Latin-Katakana
+Latin-Malayalam
+Latin-NumericPinyin
+Latin-Oriya
+Latin-Russian/BGN
+Latin-Syriac
+Latin-Tamil
+Latin-Telugu
+Latin-Thaana
+Latin-Thai
+Latn-Arab
+Latn-Armn
+Latn-Beng
+Latn-Bopo
+Latn-Cyrl
+Latn-Deva
+Latn-Geor
+Latn-Grek
+Latn-Grek/UNGEGN
+Latn-Gujr
+Latn-Guru
+Latn-Hang
+Latn-Hebr
+Latn-Hira
+Latn-Jamo
+Latn-Kana
+Latn-Knda
+Latn-Mlym
+Latn-Orya
+Latn-Syrc
+Latn-Taml
+Latn-Telu
+Latn-Thaa
+Latn-Thai
+Macedonian-Latin/BGN
+Malayalam-Arabic
+Malayalam-Bengali
+Malayalam-Devanagari
+Malayalam-Gujarati
+Malayalam-Gurmukhi
+Malayalam-Kannada
+Malayalam-Latin
+Malayalam-Oriya
+Malayalam-Tamil
+Malayalam-Telugu
+Maldivian-Latin/BGN
+Mlym-Arab
+Mlym-Beng
+Mlym-Deva
+Mlym-Gujr
+Mlym-Guru
+Mlym-Knda
+Mlym-Latn
+Mlym-Orya
+Mlym-Taml
+Mlym-Telu
+Mlym-ur
+Mongolian-Latin/BGN
+NumericPinyin-Latin
+NumericPinyin-Pinyin
+Oriya-Arabic
+Oriya-Bengali
+Oriya-Devanagari
+Oriya-Gujarati
+Oriya-Gurmukhi
+Oriya-Kannada
+Oriya-Latin
+Oriya-Malayalam
+Oriya-Tamil
+Oriya-Telugu
+Orya-Arab
+Orya-Beng
+Orya-Deva
+Orya-Gujr
+Orya-Guru
+Orya-Knda
+Orya-Latn
+Orya-Mlym
+Orya-Taml
+Orya-Telu
+Orya-ur
+Pashto-Latin/BGN
+Persian-Latin/BGN
+Pinyin-NumericPinyin
+Publishing-Any
+Russian-Latin/BGN
+Serbian-Latin/BGN
+Simplified-Traditional
+Syrc-Latn
+Syriac-Latin
+Tamil-Arabic
+Tamil-Bengali
+Tamil-Devanagari
+Tamil-Gujarati
+Tamil-Gurmukhi
+Tamil-Kannada
+Tamil-Latin
+Tamil-Malayalam
+Tamil-Oriya
+Tamil-Telugu
+Taml-Arab
+Taml-Beng
+Taml-Deva
+Taml-Gujr
+Taml-Guru
+Taml-Knda
+Taml-Latn
+Taml-Mlym
+Taml-Orya
+Taml-Telu
+Taml-ur
+Telu-Arab
+Telu-Beng
+Telu-Deva
+Telu-Gujr
+Telu-Guru
+Telu-Knda
+Telu-Latn
+Telu-Mlym
+Telu-Orya
+Telu-Taml
+Telu-ur
+Telugu-Arabic
+Telugu-Bengali
+Telugu-Devanagari
+Telugu-Gujarati
+Telugu-Gurmukhi
+Telugu-Kannada
+Telugu-Latin
+Telugu-Malayalam
+Telugu-Oriya
+Telugu-Tamil
+Thaa-Latn
+Thaana-Latin
+Thai-Latin
+Thai-Latn
+Tone-Digit
+Traditional-Simplified
+Turkmen-Latin/BGN
+Ukrainian-Latin/BGN
+Uzbek-Latin/BGN
+XSampa-IPA
+Zawgyi-my
+am-am_FONIPA
+am-am_Latn/BGN
+am-ar
+am-chr
+am-fa
+am_FONIPA-am
+ar-ar_Latn/BGN
+az-Lower
+az-Title
+az-Upper
+az_Cyrl-az/BGN
+be-be_Latn/BGN
+bg-bg_Latn/BGN
+blt-blt_FONIPA
+ch-am
+ch-ar
+ch-ch_FONIPA
+ch-chr
+ch-fa
+chr-chr_FONIPA
+cs-am
+cs-ar
+cs-chr
+cs-cs_FONIPA
+cs-fa
+cs-ja
+cs-ko
+cs_FONIPA-ja
+cs_FONIPA-ko
+cy-cy_FONIPA
+de-ASCII
+dsb-dsb_FONIPA
+dv-dv_Latn/BGN
+el-Lower
+el-Title
+el-Upper
+el-el_Latn/BGN
+eo-am
+eo-ar
+eo-chr
+eo-eo_FONIPA
+eo-fa
+es-am
+es-ar
+es-chr
+es-es_FONIPA
+es-fa
+es-ja
+es-zh
+es_419-am
+es_419-ar
+es_419-chr
+es_419-fa
+es_419-ja
+es_419-zh
+es_FONIPA-am
+es_FONIPA-es_419_FONIPA
+es_FONIPA-ja
+es_FONIPA-zh
+fa-fa_FONIPA
+fa-fa_Latn/BGN
+ha-ha_NE
+he-he_Latn/BGN
+hy-am
+hy-ar
+hy-chr
+hy-fa
+hy-hy_FONIPA
+hy-hy_Latn/BGN
+hy_AREVMDA-am
+hy_AREVMDA-ar
+hy_AREVMDA-chr
+hy_AREVMDA-fa
+hy_AREVMDA-hy_AREVMDA_FONIPA
+ia-am
+ia-ar
+ia-chr
+ia-fa
+ia-ia_FONIPA
+it-am
+it-ja
+ja_Hrkt-ja_Latn/BGN
+ja_Latn-ko
+ja_Latn-ru
+ka-ka_Latn/BGN
+ka-ka_Latn/BGN_1981
+kk-am
+kk-ar
+kk-chr
+kk-fa
+kk-kk_FONIPA
+kk-kk_Latn/BGN
+ko-ko_Latn/BGN
+ky-am
+ky-ar
+ky-chr
+ky-fa
+ky-ky_FONIPA
+ky-ky_Latn/BGN
+la-la_FONIPA
+lt-Lower
+lt-Title
+lt-Upper
+mk-mk_Latn/BGN
+mn-mn_Latn/BGN
+mn-mn_Latn/MNS
+my-Zawgyi
+my-am
+my-ar
+my-chr
+my-fa
+my-my_FONIPA
+nl-Title
+nv-nv_FONIPA
+pl-am
+pl-ar
+pl-chr
+pl-fa
+pl-ja
+pl-pl_FONIPA
+pl_FONIPA-ja
+ps-ps_Latn/BGN
+rm_SURSILV-am
+rm_SURSILV-ar
+rm_SURSILV-chr
+rm_SURSILV-fa
+rm_SURSILV-rm_FONIPA_SURSILV
+ro-am
+ro-ar
+ro-chr
+ro-fa
+ro-ja
+ro-ro_FONIPA
+ro_FONIPA-ja
+ru-ja
+ru-ru_Latn/BGN
+ru-zh
+ru_Latn-ru/BGN
+sat-am
+sat-ar
+sat-chr
+sat-fa
+sat_Olck-sat_FONIPA
+si-am
+si-ar
+si-chr
+si-fa
+si-si_FONIPA
+si-si_Latn
+sk-am
+sk-ar
+sk-chr
+sk-fa
+sk-ja
+sk-sk_FONIPA
+sk_FONIPA-ja
+sr-sr_Latn/BGN
+ta-ta_FONIPA
+tk_Cyrl-tk/BGN
+tlh-am
+tlh-ar
+tlh-chr
+tlh-fa
+tlh-tlh_FONIPA
+tr-Lower
+tr-Title
+tr-Upper
+ug-ug_FONIPA
+uk-uk_Latn/BGN
+und_FONIPA-ar
+und_FONIPA-chr
+und_FONIPA-fa
+und_FONIPA-und_FONXSAMP
+und_FONXSAMP-und_FONIPA
+uz_Cyrl-uz/BGN
+uz_Cyrl-uz_Latn
+uz_Latn-uz_Cyrl
+vec-vec_FONIPA
+xh-am
+xh-ar
+xh-chr
+xh-fa
+xh-xh_FONIPA
+yo-yo_BJ
+zh_Latn_PINYIN-ru
+zu-am
+zu-ar
+zu-chr
+zu-fa
+zu-zu_FONIPA
+Any-Null
+Any-Remove
+Any-Hex/Unicode
+Any-Hex/Java
+Any-Hex/C
+Any-Hex/XML
+Any-Hex/XML10
+Any-Hex/Perl
+Any-Hex/Plain
+Any-Hex
+Hex-Any/Unicode
+Hex-Any/Java
+Hex-Any/C
+Hex-Any/XML
+Hex-Any/XML10
+Hex-Any/Perl
+Hex-Any
+Any-Lower
+Any-Upper
+Any-Title
+Any-CaseFold
+Any-Name
+Name-Any
+Any-NFC
+Any-NFD
+Any-NFKC
+Any-NFKD
+Any-FCD
+Any-FCC
+Any-ps_Latn/BGN
+Any-Katakana
+Any-Latin
+Any-ar
+Any-hy_Latn/BGN
+Any-hy_FONIPA
+Any-fa
+Any-am
+Any-chr
+Any-Mlym
+Any-Guru
+Any-Deva
+Any-Knda
+Any-Gujr
+Any-Taml
+Any-Telu
+Any-Latn
+Any-ur
+Any-Arab
+Any-Orya
+Any-Beng
+Any-ja
+Any-es_419_FONIPA
+Any-zh
+Any-yo_BJ
+Any-ia_FONIPA
+Any-Any
+Any-Any/Unicode
+Any-Any/Java
+Any-Any/C
+Any-Any/XML
+Any-Any/XML10
+Any-Any/Perl
+Any-Bopomofo
+Any-Devanagari
+Any-Hiragana
+Any-Gujarati
+Any-Hebrew
+Any-Kannada
+Any-Hangul
+Any-Gurmukhi
+Any-Tamil
+Any-Malayalam
+Any-Arabic
+Any-Bengali
+Any-Telugu
+Any-Thaana
+Any-Georgian
+Any-Greek
+Any-Greek/UNGEGN
+Any-Syriac
+Any-Jamo
+Any-Armenian
+Any-Thai
+Any-Cyrillic
+Any-Oriya
+Any-Latin/BGN
+Any-am_FONIPA
+Any-am_Latn/BGN
+Any-ar_Latn/BGN
+Any-my
+Any-zu_FONIPA
+Any-ro_FONIPA
+Any-be_Latn/BGN
+Any-ru_Latn/BGN
+Any-bg_Latn/BGN
+Any-Hant
+Any-Hans
+Any-ka_Latn/BGN
+Any-ka_Latn/BGN_1981
+Any-si_FONIPA
+Any-si_Latn
+Any-sk_FONIPA
+Any-rm_FONIPA_SURSILV
+Any-uz/BGN
+Any-uz_Latn
+Any-sr_Latn/BGN
+Any-kk_Latn/BGN
+Any-kk_FONIPA
+Any-ko_Latn/BGN
+Any-ch_FONIPA
+Any-blt_FONIPA
+Any-ta_FONIPA
+Any-ky_FONIPA
+Any-ky_Latn/BGN
+Any-ko
+Any-cs_FONIPA
+Any-la_FONIPA
+Any-cy_FONIPA
+Any-sat_FONIPA
+Any-und_FONIPA
+Any-dv_Latn/BGN
+Any-ug_FONIPA
+Any-Latin/Names
+Any-vec_FONIPA
+Any-uk_Latn/BGN
+Any-Hira
+Any-Grek
+Any-Grek/UNGEGN
+Any-Syrc
+Any-Bopo
+Any-Hang
+Any-Thaa
+Any-Geor
+Any-Kana
+Any-Hebr
+Any-Cyrl
+Any-Armn
+Any-mk_Latn/BGN
+Any-mn_Latn/BGN
+Any-mn_Latn/MNS
+Any-az/BGN
+Any-el_Latn/BGN
+Any-eo_FONIPA
+Any-tk/BGN
+Any-chr_FONIPA
+Any-my_FONIPA
+Any-es_FONIPA
+Any-ru/BGN
+Any-dsb_FONIPA
+Any-und_FONXSAMP
+Any-fa_FONIPA
+Any-fa_Latn/BGN
+Any-ja_Latn/BGN
+Any-nv_FONIPA
+Any-hy_AREVMDA_FONIPA
+Any-uz_Cyrl
+Any-ru
+Any-Latin/UNGEGN
+Any-Latn/UNGEGN
+Any-xh_FONIPA
+Any-ha_NE
+Any-pl_FONIPA
+Any-he_Latn/BGN