1b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi/* 2b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project 3b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * 4b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 5b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * you may not use this file except in compliance with the License. 6b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * You may obtain a copy of the License at 7b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * 8b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 9b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * 10b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 11b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 12b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * See the License for the specific language governing permissions and 14b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * limitations under the License. 15b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi */ 16b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 17b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagipackage com.android.inputmethod.latin.makedict; 18b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 193ad4af2354e7003ac288dafe3600268fe860d752Keisuke Kuroyanagiimport com.android.inputmethod.latin.makedict.FormatSpec.DictionaryOptions; 20b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagiimport com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; 21b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 22b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi/** 23b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi * Class representing dictionary header. 24b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi */ 25b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagipublic final class DictionaryHeader { 26b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public final int mBodyOffset; 27b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public final DictionaryOptions mDictionaryOptions; 28b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public final FormatOptions mFormatOptions; 29b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 30b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // Note that these are corresponding definitions in native code in latinime::HeaderPolicy 31b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // and latinime::HeaderReadWriteUtils. 32b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // TODO: Standardize the key names and bump up the format version, taking care not to 33b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // break format version 2 dictionaries. 34b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String DICTIONARY_VERSION_KEY = "version"; 35b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String DICTIONARY_LOCALE_KEY = "locale"; 36b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String DICTIONARY_ID_KEY = "dictionary"; 37b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String DICTIONARY_DESCRIPTION_KEY = "description"; 38b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String DICTIONARY_DATE_KEY = "date"; 39b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String HAS_HISTORICAL_INFO_KEY = "HAS_HISTORICAL_INFO"; 40b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String USES_FORGETTING_CURVE_KEY = "USES_FORGETTING_CURVE"; 416112cc26a71d5dcbaae2ba7252a5cdecdc84209fKeisuke Kuroyanagi public static final String FORGETTING_CURVE_OCCURRENCES_TO_LEVEL_UP_KEY = 426112cc26a71d5dcbaae2ba7252a5cdecdc84209fKeisuke Kuroyanagi "FORGETTING_CURVE_OCCURRENCES_TO_LEVEL_UP"; 436112cc26a71d5dcbaae2ba7252a5cdecdc84209fKeisuke Kuroyanagi public static final String FORGETTING_CURVE_PROBABILITY_VALUES_TABLE_ID_KEY = 446112cc26a71d5dcbaae2ba7252a5cdecdc84209fKeisuke Kuroyanagi "FORGETTING_CURVE_PROBABILITY_VALUES_TABLE_ID"; 455128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi public static final String FORGETTING_CURVE_DURATION_TO_LEVEL_DOWN_IN_SECONDS_KEY = 465128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi "FORGETTING_CURVE_DURATION_TO_LEVEL_DOWN_IN_SECONDS"; 475128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi public static final String MAX_UNIGRAM_COUNT_KEY = "MAX_UNIGRAM_COUNT"; 485128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi public static final String MAX_BIGRAM_COUNT_KEY = "MAX_BIGRAM_COUNT"; 49b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public static final String ATTRIBUTE_VALUE_TRUE = "1"; 50b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 51b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public DictionaryHeader(final int headerSize, final DictionaryOptions dictionaryOptions, 52b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi final FormatOptions formatOptions) throws UnsupportedFormatException { 53b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi mDictionaryOptions = dictionaryOptions; 54b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi mFormatOptions = formatOptions; 55b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi mBodyOffset = formatOptions.mVersion < FormatSpec.VERSION4 ? headerSize : 0; 56b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi if (null == getLocaleString()) { 57b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi throw new UnsupportedFormatException("Cannot create a FileHeader without a locale"); 58b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 59b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi if (null == getVersion()) { 60b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi throw new UnsupportedFormatException( 61b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi "Cannot create a FileHeader without a version"); 62b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 63b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi if (null == getId()) { 64b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi throw new UnsupportedFormatException("Cannot create a FileHeader without an ID"); 65b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 66b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 67b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 68b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // Helper method to get the locale as a String 69b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public String getLocaleString() { 70b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi return mDictionaryOptions.mAttributes.get(DICTIONARY_LOCALE_KEY); 71b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 72b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 73b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // Helper method to get the version String 74b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public String getVersion() { 75b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi return mDictionaryOptions.mAttributes.get(DICTIONARY_VERSION_KEY); 76b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 77b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 78b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // Helper method to get the dictionary ID as a String 79b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public String getId() { 80b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi return mDictionaryOptions.mAttributes.get(DICTIONARY_ID_KEY); 81b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 82b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi 83b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // Helper method to get the description 84b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi public String getDescription() { 85b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // TODO: Right now each dictionary file comes with a description in its own language. 86b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi // It will display as is no matter the device's locale. It should be internationalized. 87b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi return mDictionaryOptions.mAttributes.get(DICTIONARY_DESCRIPTION_KEY); 88b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi } 89b986f78ba826fa360304a69565f1880bdd7ce0c5Keisuke Kuroyanagi}