Get nicer output of make-keyboard-text

Change-Id: I6d30127aac2198d55b1335002f7a66b4aaebf82d
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index 14991f5..e8e9743 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -3476,60 +3476,61 @@
     // TODO: Use the language + "_" + region representation for the locale string key.
     // Currently we are dropping the region from the key.
     private static final Object[] LANGUAGES_AND_TEXTS = {
-        "DEFAULT", LANGUAGE_DEFAULT, /* default */
-        "af", LANGUAGE_af, /* Afrikaans */
-        "ar", LANGUAGE_ar, /* Arabic */
-        "az" /* "az_AZ" */, LANGUAGE_az_AZ, /* Azerbaijani (Azerbaijan) */
-        "be" /* "be_BY" */, LANGUAGE_be_BY, /* Belarusian (Belarus) */
-        "bg", LANGUAGE_bg, /* Bulgarian */
-        "ca", LANGUAGE_ca, /* Catalan */
-        "cs", LANGUAGE_cs, /* Czech */
-        "da", LANGUAGE_da, /* Danish */
-        "de", LANGUAGE_de, /* German */
-        "el", LANGUAGE_el, /* Greek */
-        "en", LANGUAGE_en, /* English */
-        "eo", LANGUAGE_eo, /* Esperanto */
-        "es", LANGUAGE_es, /* Spanish */
-        "et" /* "et_EE" */, LANGUAGE_et_EE, /* Estonian (Estonia) */
-        "fa", LANGUAGE_fa, /* Persian */
-        "fi", LANGUAGE_fi, /* Finnish */
-        "fr", LANGUAGE_fr, /* French */
-        "hi", LANGUAGE_hi, /* Hindi */
-        "hr", LANGUAGE_hr, /* Croatian */
-        "hu", LANGUAGE_hu, /* Hungarian */
-        "hy" /* "hy_AM" */, LANGUAGE_hy_AM, /* Armenian (Armenia) */
-        "is", LANGUAGE_is, /* Icelandic */
-        "it", LANGUAGE_it, /* Italian */
-        "iw", LANGUAGE_iw, /* Hebrew */
-        "ka" /* "ka_GE" */, LANGUAGE_ka_GE, /* Georgian (Georgia) */
-        "kk", LANGUAGE_kk, /* Kazakh */
-        "km" /* "km_KH" */, LANGUAGE_km_KH, /* Khmer (Cambodia) */
-        "ky", LANGUAGE_ky, /* Kirghiz */
-        "lo" /* "lo_LA" */, LANGUAGE_lo_LA, /* Lao (Laos) */
-        "lt", LANGUAGE_lt, /* Lithuanian */
-        "lv", LANGUAGE_lv, /* Latvian */
-        "mk", LANGUAGE_mk, /* Macedonian */
-        "mn" /* "mn_MN" */, LANGUAGE_mn_MN, /* Mongolian (Mongolia) */
-        "nb", LANGUAGE_nb, /* Norwegian Bokmål */
-        "ne" /* "ne_NP" */, LANGUAGE_ne_NP, /* Nepali (Nepal) */
-        "nl", LANGUAGE_nl, /* Dutch */
-        "pl", LANGUAGE_pl, /* Polish */
-        "pt", LANGUAGE_pt, /* Portuguese */
-        "rm", LANGUAGE_rm, /* Raeto-Romance */
-        "ro", LANGUAGE_ro, /* Romanian */
-        "ru", LANGUAGE_ru, /* Russian */
-        "sk", LANGUAGE_sk, /* Slovak */
-        "sl", LANGUAGE_sl, /* Slovenian */
-        "sr", LANGUAGE_sr, /* Serbian */
-        "sv", LANGUAGE_sv, /* Swedish */
-        "sw", LANGUAGE_sw, /* Swahili */
-        "th", LANGUAGE_th, /* Thai */
-        "tl", LANGUAGE_tl, /* Tagalog */
-        "tr", LANGUAGE_tr, /* Turkish */
-        "uk", LANGUAGE_uk, /* Ukrainian */
-        "vi", LANGUAGE_vi, /* Vietnamese */
-        "zu", LANGUAGE_zu, /* Zulu */
-        "zz", LANGUAGE_zz, /* Alphabet */
+    // "locale", TEXT_ARRAY,  /* numberOfNonNullText/lengthOf_TEXT_ARRAY localeName */
+        "DEFAULT", LANGUAGE_DEFAULT, /* 156/156 default */
+        "af", LANGUAGE_af,    /*   8/  9 Afrikaans */
+        "ar", LANGUAGE_ar,    /*  48/119 Arabic */
+        "az", LANGUAGE_az_AZ, /*   8/ 16 Azerbaijani (Azerbaijan) */
+        "be", LANGUAGE_be_BY, /*  10/ 54 Belarusian (Belarus) */
+        "bg", LANGUAGE_bg,    /*   2/ 54 Bulgarian */
+        "ca", LANGUAGE_ca,    /*  11/126 Catalan */
+        "cs", LANGUAGE_cs,    /*  17/ 56 Czech */
+        "da", LANGUAGE_da,    /*  19/ 56 Danish */
+        "de", LANGUAGE_de,    /*  16/ 56 German */
+        "el", LANGUAGE_el,    /*   1/ 52 Greek */
+        "en", LANGUAGE_en,    /*   8/  8 English */
+        "eo", LANGUAGE_eo,    /*  26/126 Esperanto */
+        "es", LANGUAGE_es,    /*   8/ 60 Spanish */
+        "et", LANGUAGE_et_EE, /*  22/ 54 Estonian (Estonia) */
+        "fa", LANGUAGE_fa,    /*  49/119 Persian */
+        "fi", LANGUAGE_fi,    /*  10/ 25 Finnish */
+        "fr", LANGUAGE_fr,    /*  13/ 51 French */
+        "hi", LANGUAGE_hi,    /*  24/ 91 Hindi */
+        "hr", LANGUAGE_hr,    /*   9/ 56 Croatian */
+        "hu", LANGUAGE_hu,    /*   9/ 56 Hungarian */
+        "hy", LANGUAGE_hy_AM, /*   7/117 Armenian (Armenia) */
+        "is", LANGUAGE_is,    /*  13/ 54 Icelandic */
+        "it", LANGUAGE_it,    /*   5/  5 Italian */
+        "iw", LANGUAGE_iw,    /*  14/ 68 Hebrew */
+        "ka", LANGUAGE_ka_GE, /*   3/ 54 Georgian (Georgia) */
+        "kk", LANGUAGE_kk,    /*  16/ 52 Kazakh */
+        "km", LANGUAGE_km_KH, /*   2/ 57 Khmer (Cambodia) */
+        "ky", LANGUAGE_ky,    /*  11/ 52 Kirghiz */
+        "lo", LANGUAGE_lo_LA, /*   2/ 58 Lao (Laos) */
+        "lt", LANGUAGE_lt,    /*  18/ 54 Lithuanian */
+        "lv", LANGUAGE_lv,    /*  18/ 54 Latvian */
+        "mk", LANGUAGE_mk,    /*   9/ 54 Macedonian */
+        "mn", LANGUAGE_mn_MN, /*   2/ 58 Mongolian (Mongolia) */
+        "nb", LANGUAGE_nb,    /*  11/ 54 Norwegian Bokmål */
+        "ne", LANGUAGE_ne_NP, /*  24/ 91 Nepali (Nepal) */
+        "nl", LANGUAGE_nl,    /*   9/ 54 Dutch */
+        "pl", LANGUAGE_pl,    /*  10/ 54 Polish */
+        "pt", LANGUAGE_pt,    /*   6/  8 Portuguese */
+        "rm", LANGUAGE_rm,    /*   1/  4 Raeto-Romance */
+        "ro", LANGUAGE_ro,    /*   6/ 54 Romanian */
+        "ru", LANGUAGE_ru,    /*  10/ 54 Russian */
+        "sk", LANGUAGE_sk,    /*  20/ 56 Slovak */
+        "sl", LANGUAGE_sl,    /*   8/ 56 Slovenian */
+        "sr", LANGUAGE_sr,    /*  11/ 56 Serbian */
+        "sv", LANGUAGE_sv,    /*  21/ 56 Swedish */
+        "sw", LANGUAGE_sw,    /*   9/ 16 Swahili */
+        "th", LANGUAGE_th,    /*   2/ 58 Thai */
+        "tl", LANGUAGE_tl,    /*   7/  8 Tagalog */
+        "tr", LANGUAGE_tr,    /*   7/ 16 Turkish */
+        "uk", LANGUAGE_uk,    /*  12/ 58 Ukrainian */
+        "vi", LANGUAGE_vi,    /*   8/ 58 Vietnamese */
+        "zu", LANGUAGE_zu,    /*   8/  8 Zulu */
+        "zz", LANGUAGE_zz,    /*  19/ 20 Alphabet */
     };
 
     static {
diff --git a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
index d95de29..eadeb1e 100644
--- a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
+++ b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.tmpl
@@ -77,6 +77,7 @@
     // TODO: Use the language + "_" + region representation for the locale string key.
     // Currently we are dropping the region from the key.
     private static final Object[] LANGUAGES_AND_TEXTS = {
+    // "locale", TEXT_ARRAY,  /* numberOfNonNullText/lengthOf_TEXT_ARRAY localeName */
         /* @LANGUAGES_AND_TEXTS@ */
     };
 
diff --git a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java
index 331003e..d2763e0 100644
--- a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java
+++ b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/ArrayInitializerFormatter.java
@@ -29,12 +29,16 @@
     private int mBufferedLen;
     private int mBufferedIndex = Integer.MIN_VALUE;
 
-    public ArrayInitializerFormatter(PrintStream out, int width, String indent) {
+    public ArrayInitializerFormatter(final PrintStream out, final int width, final String indent) {
         mOut = out;
         mMaxWidth = width - indent.length();
         mIndent = indent;
     }
 
+    public int getCurrentIndex() {
+        return mCurrentIndex;
+    }
+
     public void flush() {
         if (mBuffer.length() == 0) {
             return;
@@ -59,13 +63,13 @@
         mBufferedLen = 0;
     }
 
-    public void outCommentLines(String lines) {
+    public void outCommentLines(final String lines) {
         flush();
         mOut.print(lines);
         mFixedElement = null;
     }
 
-    public void outElement(String element) {
+    public void outElement(final String element) {
         if (!element.equals(mFixedElement)) {
             flush();
             mBufferedIndex = mCurrentIndex;
diff --git a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
index dddb3d6..97a12d7 100644
--- a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
+++ b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/MoreKeysResources.java
@@ -38,7 +38,6 @@
     private static final String MARK_TEXTS = "@TEXTS@";
     private static final String MARK_LANGUAGES_AND_TEXTS = "@LANGUAGES_AND_TEXTS@";
     private static final String DEFAULT_LANGUAGE_NAME = "DEFAULT";
-    private static final String ARRAY_NAME_FOR_LANGUAGE = "LANGUAGE_%s";
     private static final String EMPTY_STRING_VAR = "EMPTY";
 
     private static final String NO_LANGUAGE_CODE = "zz";
@@ -144,7 +143,12 @@
 
     private void dumpDefaultTexts(final PrintStream out) {
         final StringResourceMap defaultResMap = mResourcesMap.get(DEFAULT_LANGUAGE_NAME);
-        dumpTextsInternal(out, defaultResMap, defaultResMap);
+        final int outputArraySize = dumpTextsInternal(out, defaultResMap, defaultResMap);
+        defaultResMap.setOutputArraySize(outputArraySize);
+    }
+
+    private static String getArrayNameForLanguage(final String language) {
+        return "LANGUAGE_" + language;
     }
 
     private void dumpTexts(final PrintStream out) {
@@ -157,8 +161,8 @@
                 continue;
             }
             out.format("    /* Language %s: %s */\n", language, getLanguageDisplayName(language));
-            out.format("    private static final String[] " + ARRAY_NAME_FOR_LANGUAGE + " = {\n",
-                    language);
+            out.format("    private static final String[] " + getArrayNameForLanguage(language)
+                    + " = {\n");
             final StringResourceMap resMap = mResourcesMap.get(language);
             for (final StringResource res : resMap.getResources()) {
                 if (!defaultResMap.contains(res.mName)) {
@@ -166,7 +170,8 @@
                             + " doesn't have default resource");
                 }
             }
-            dumpTextsInternal(out, resMap, defaultResMap);
+            final int outputArraySize = dumpTextsInternal(out, resMap, defaultResMap);
+            resMap.setOutputArraySize(outputArraySize);
             out.format("    };\n\n");
         }
     }
@@ -176,13 +181,15 @@
         allLanguages.addAll(mResourcesMap.keySet());
         Collections.sort(allLanguages);
         for (final String language : allLanguages) {
+            final StringResourceMap resMap = mResourcesMap.get(language);
             final Locale locale = LocaleUtils.constructLocaleFromString(language);
-            // If we use a different key, dump the original as comment for now.
             final String languageKeyToDump = locale.getCountry().isEmpty()
                     ? String.format("\"%s\"", language)
-                    : String.format("\"%s\" /* \"%s\" */", locale.getLanguage(), language);
-            out.format("        %s, " + ARRAY_NAME_FOR_LANGUAGE + ", /* %s */\n",
-                    languageKeyToDump, language, getLanguageDisplayName(language));
+                    : String.format("\"%s\"", locale.getLanguage());
+            out.format("        %s, %-15s /* %3d/%3d %s */\n",
+                    languageKeyToDump, getArrayNameForLanguage(language) + ",",
+                    resMap.getResources().size(), resMap.getOutputArraySize(),
+                    getLanguageDisplayName(language));
         }
     }
 
@@ -194,10 +201,11 @@
         return locale.getDisplayName(Locale.ENGLISH);
     }
 
-    private static void dumpTextsInternal(final PrintStream out, final StringResourceMap resMap,
+    private static int dumpTextsInternal(final PrintStream out, final StringResourceMap resMap,
             final StringResourceMap defaultResMap) {
         final ArrayInitializerFormatter formatter =
                 new ArrayInitializerFormatter(out, 100, "        ");
+        int outputArraySize = 0;
         boolean successiveNull = false;
         for (final StringResource defaultRes : defaultResMap.getResources()) {
             if (resMap.contains(defaultRes.mName)) {
@@ -212,6 +220,7 @@
                     formatter.outElement(String.format("\"%s\",", escaped));
                 }
                 successiveNull = false;
+                outputArraySize = formatter.getCurrentIndex();
             } else {
                 formatter.outElement("null,");
                 successiveNull = true;
@@ -220,6 +229,7 @@
         if (!successiveNull) {
             formatter.flush();
         }
+        return outputArraySize;
     }
 
     private static String addPrefix(final String prefix, final String lines) {
diff --git a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/StringResourceMap.java b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/StringResourceMap.java
index cc7ff6a..4eff8a2 100644
--- a/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/StringResourceMap.java
+++ b/tools/make-keyboard-text/src/com/android/inputmethod/keyboard/tools/StringResourceMap.java
@@ -39,6 +39,12 @@
     // Name to string resource map.
     private final Map<String, StringResource> mResourcesMap;
 
+    // The length of String[] that is created from this {@link StringResourceMap}. The length is
+    // calculated in {@link MoreKeysResources#dumpTexts(OutputStream)} and recorded by
+    // {@link #setOutputArraySize(int)}. The recorded length is used as a part of comment by
+    // {@link MoreKeysResources#dumpLanguageMap(OutputStream)} via {@link #getOutputArraySize()}.
+    private int mOutputArraySize;
+
     public StringResourceMap(final InputStream is) {
         final StringResourceHandler handler = new StringResourceHandler();
         final SAXParserFactory factory = SAXParserFactory.newInstance();
@@ -77,6 +83,14 @@
         return mResourcesMap.get(name);
     }
 
+    public void setOutputArraySize(final int arraySize) {
+        mOutputArraySize = arraySize;
+    }
+
+    public int getOutputArraySize() {
+        return mOutputArraySize;
+    }
+
     static class StringResourceHandler extends DefaultHandler2 {
         private static final String TAG_RESOURCES = "resources";
         private static final String TAG_STRING = "string";