Merge "Fix IllegalStateException of ViewGroup"
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 7afd657..f785835 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -140,7 +140,7 @@
         // only, which right now use format 2 (dicts using format 4 use Decaying*, which overrides
         // this method).
         // TODO: Migrate these dicts to ver4 format, and remove this function.
-        return formatVersion == 2;
+        return formatVersion == FormatSpec.VERSION2;
     }
 
     public boolean isValidDictionary() {
diff --git a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
index 2f6f194..af54805 100644
--- a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
+++ b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java
@@ -351,18 +351,19 @@
         public static final String DICTIONARY_ID_ATTRIBUTE = "dictionary";
         private static final String DICTIONARY_DESCRIPTION_ATTRIBUTE = "description";
         public FileHeader(final int headerSize, final DictionaryOptions dictionaryOptions,
-                final FormatOptions formatOptions) {
+                final FormatOptions formatOptions) throws UnsupportedFormatException {
             mDictionaryOptions = dictionaryOptions;
             mFormatOptions = formatOptions;
             mBodyOffset = formatOptions.mVersion < VERSION4 ? headerSize : 0;
             if (null == getLocaleString()) {
-                throw new RuntimeException("Cannot create a FileHeader without a locale");
+                throw new UnsupportedFormatException("Cannot create a FileHeader without a locale");
             }
             if (null == getVersion()) {
-                throw new RuntimeException("Cannot create a FileHeader without a version");
+                throw new UnsupportedFormatException(
+                        "Cannot create a FileHeader without a version");
             }
             if (null == getId()) {
-                throw new RuntimeException("Cannot create a FileHeader without an ID");
+                throw new UnsupportedFormatException("Cannot create a FileHeader without an ID");
             }
         }
 
diff --git a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
index 9b573b4..3a5c115 100644
--- a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
+++ b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
@@ -53,7 +53,7 @@
     public static final int FREQUENCY_FOR_WORDS_IN_DICTS = FREQUENCY_FOR_TYPED;
     public static final int FREQUENCY_FOR_WORDS_NOT_IN_DICTS = Dictionary.NOT_A_PROBABILITY;
 
-    public static final int REQUIRED_BINARY_DICTIONARY_VERSION = 4;
+    public static final int REQUIRED_BINARY_DICTIONARY_VERSION = FormatSpec.VERSION4;
 
     /** Locale for which this user history dictionary is storing words */
     private final Locale mLocale;
diff --git a/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java b/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
index 9e397f1..0c11f86 100644
--- a/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
+++ b/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
@@ -42,9 +42,16 @@
     private static final int TEST_FREQ = 37; // Some arbitrary value unlikely to happen by chance
 
     public void testGetRawDictWorks() throws IOException, UnsupportedFormatException {
+        final String VERSION = "1";
+        final String LOCALE = "test";
+        final String ID = "main:test";
+
         // Create a thrice-compressed dictionary file.
-        final FusionDictionary dict = new FusionDictionary(new PtNodeArray(),
-                new DictionaryOptions(new HashMap<String, String>()));
+        final DictionaryOptions testOptions = new DictionaryOptions(new HashMap<String, String>());
+        testOptions.mAttributes.put(FormatSpec.FileHeader.DICTIONARY_VERSION_ATTRIBUTE, VERSION);
+        testOptions.mAttributes.put(FormatSpec.FileHeader.DICTIONARY_LOCALE_ATTRIBUTE, LOCALE);
+        testOptions.mAttributes.put(FormatSpec.FileHeader.DICTIONARY_ID_ATTRIBUTE, ID);
+        final FusionDictionary dict = new FusionDictionary(new PtNodeArray(), testOptions);
         dict.add("foo", TEST_FREQ, null, false /* isNotAWord */);
         dict.add("fta", 1, null, false /* isNotAWord */);
         dict.add("ftb", 1, null, false /* isNotAWord */);
@@ -72,6 +79,12 @@
         final FusionDictionary resultDict = dictDecoder.readDictionaryBinary(
                 null /* dict : an optional dictionary to add words to, or null */,
                 false /* deleteDictIfBroken */);
+        assertEquals("Wrong version attribute", VERSION, resultDict.mOptions.mAttributes.get(
+                FormatSpec.FileHeader.DICTIONARY_VERSION_ATTRIBUTE));
+        assertEquals("Wrong locale attribute", LOCALE, resultDict.mOptions.mAttributes.get(
+                FormatSpec.FileHeader.DICTIONARY_LOCALE_ATTRIBUTE));
+        assertEquals("Wrong id attribute", ID, resultDict.mOptions.mAttributes.get(
+                FormatSpec.FileHeader.DICTIONARY_ID_ATTRIBUTE));
         assertEquals("Dictionary can't be read back correctly",
                 FusionDictionary.findWordInTree(resultDict.mRootNodeArray, "foo").getFrequency(),
                 TEST_FREQ);