public static ArrayList<DictionaryInfo> getCurrentDictionaryFileNameAndVersionInfo(
      final Context context) {
    final ArrayList<DictionaryInfo> dictList = CollectionUtils.newArrayList();

    // Retrieve downloaded dictionaries
    final File[] directoryList = getCachedDirectoryList(context);
    if (null != directoryList) {
      for (final File directory : directoryList) {
        final String localeString = getWordListIdFromFileName(directory.getName());
        File[] dicts = BinaryDictionaryGetter.getCachedWordLists(localeString, context);
        for (final File dict : dicts) {
          final String wordListId = getWordListIdFromFileName(dict.getName());
          if (!DictionaryInfoUtils.isMainWordListId(wordListId)) continue;
          final Locale locale = LocaleUtils.constructLocaleFromString(localeString);
          final AssetFileAddress fileAddress = AssetFileAddress.makeFromFile(dict);
          final DictionaryInfo dictionaryInfo = createDictionaryInfoFromFileAddress(fileAddress);
          // Protect against cases of a less-specific dictionary being found, like an
          // en dictionary being used for an en_US locale. In this case, the en dictionary
          // should be used for en_US but discounted for listing purposes.
          if (!dictionaryInfo.mLocale.equals(locale)) continue;
          addOrUpdateDictInfo(dictList, dictionaryInfo);
        }
      }
    }

    // Retrieve files from assets
    final Resources resources = context.getResources();
    final AssetManager assets = resources.getAssets();
    for (final String localeString : assets.getLocales()) {
      final Locale locale = LocaleUtils.constructLocaleFromString(localeString);
      final int resourceId =
          DictionaryInfoUtils.getMainDictionaryResourceIdIfAvailableForLocale(
              context.getResources(), locale);
      if (0 == resourceId) continue;
      final AssetFileAddress fileAddress =
          BinaryDictionaryGetter.loadFallbackResource(context, resourceId);
      final DictionaryInfo dictionaryInfo = createDictionaryInfoFromFileAddress(fileAddress);
      // Protect against cases of a less-specific dictionary being found, like an
      // en dictionary being used for an en_US locale. In this case, the en dictionary
      // should be used for en_US but discounted for listing purposes.
      if (!dictionaryInfo.mLocale.equals(locale)) continue;
      addOrUpdateDictInfo(dictList, dictionaryInfo);
    }

    return dictList;
  }
 private static DictionaryInfo createDictionaryInfoFromFileAddress(
     final AssetFileAddress fileAddress) {
   final FileHeader header =
       BinaryDictIOUtils.getDictionaryFileHeaderOrNull(
           new File(fileAddress.mFilename), fileAddress.mOffset, fileAddress.mLength);
   final String id = header.getId();
   final Locale locale = LocaleUtils.constructLocaleFromString(header.getLocaleString());
   final String description = header.getDescription();
   final String version = header.getVersion();
   return new DictionaryInfo(id, locale, description, fileAddress, Integer.parseInt(version));
 }
 // Update the current input locale from Locale string.
 private void updateInputLocale(String inputLocaleStr) {
   // example: inputLocaleStr = "en_US" "en" ""
   // "en_US" --> language: en  & country: US
   // "en" --> language: en
   // "" --> the system locale
   if (!TextUtils.isEmpty(inputLocaleStr)) {
     mInputLocale = LocaleUtils.constructLocaleFromString(inputLocaleStr);
     mInputLocaleStr = inputLocaleStr;
   } else {
     mInputLocale = mSystemLocale;
     String country = mSystemLocale.getCountry();
     mInputLocaleStr =
         mSystemLocale.getLanguage()
             + (TextUtils.isEmpty(country) ? "" : "_" + mSystemLocale.getLanguage());
   }
   mIsSystemLanguageSameAsInputLanguage =
       getSystemLocale().getLanguage().equalsIgnoreCase(getInputLocale().getLanguage());
   mNeedsToDisplayLanguage =
       !(getEnabledKeyboardLocaleCount() <= 1 && mIsSystemLanguageSameAsInputLanguage);
 }