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}