diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml index 44656030b..c586b99b3 100644 --- a/app/src/debug/res/values/strings.xml +++ b/app/src/debug/res/values/strings.xml @@ -4,7 +4,7 @@ --> OpenBoard debug - OpenBoard debug Spell Checker - OpenBoard debug Settings + OpenBoard debug Spell Checker + OpenBoard debug Settings diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java index 7e4b830c6..d967a79bf 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/DictionaryFactory.java @@ -7,12 +7,12 @@ package org.dslul.openboard.inputmethod.latin; import android.content.Context; -import android.content.res.AssetFileDescriptor; import android.os.Handler; import android.os.Looper; -import org.dslul.openboard.inputmethod.latin.utils.Log; import android.widget.Toast; +import androidx.annotation.NonNull; + import org.dslul.openboard.inputmethod.latin.makedict.DictionaryHeader; import org.dslul.openboard.inputmethod.latin.utils.DictionaryInfoUtils; @@ -25,25 +25,17 @@ import java.util.Locale; * Factory for dictionary instances. */ public final class DictionaryFactory { - private static final String TAG = DictionaryFactory.class.getSimpleName(); /** * Initializes a main dictionary collection from a dictionary pack, with explicit flags. - * + *

* This searches for a content provider providing a dictionary pack for the specified * locale. If none is found, it falls back to the built-in dictionary - if any. * @param context application context for reading resources * @param locale the locale for which to create the dictionary * @return an initialized instance of DictionaryCollection */ - public static DictionaryCollection createMainDictionaryFromManager(final Context context, - final Locale locale) { - if (null == locale) { - Log.e(TAG, "No locale defined for dictionary"); - return new DictionaryCollection(Dictionary.TYPE_MAIN, locale, - createReadOnlyBinaryDictionary(context, locale)); - } - + public static DictionaryCollection createMainDictionaryFromManager(final Context context, @NonNull final Locale locale) { final LinkedList dictList = new LinkedList<>(); ArrayList assetFileList = BinaryDictionaryGetter.getDictionaryFiles(locale, context, false); @@ -104,45 +96,4 @@ public final class DictionaryFactory { ); } } - - /** - * Initializes a read-only binary dictionary from a raw resource file - * @param context application context for reading resources - * @param locale the locale to use for the resource - * @return an initialized instance of ReadOnlyBinaryDictionary - */ - private static ReadOnlyBinaryDictionary createReadOnlyBinaryDictionary(final Context context, - final Locale locale) { - AssetFileDescriptor afd = null; - try { - final int resId = DictionaryInfoUtils.getMainDictionaryResourceIdIfAvailableForLocale( - context.getResources(), locale); - if (0 == resId) return null; - afd = context.getResources().openRawResourceFd(resId); - if (afd == null) { - Log.e(TAG, "Found the resource but it is compressed. resId=" + resId); - return null; - } - final String sourceDir = context.getApplicationInfo().sourceDir; - final File packagePath = new File(sourceDir); - // TODO: Come up with a way to handle a directory. - if (!packagePath.isFile()) { - Log.e(TAG, "sourceDir is not a file: " + sourceDir); - return null; - } - return new ReadOnlyBinaryDictionary(sourceDir, afd.getStartOffset(), afd.getLength(), - false /* useFullEditDistance */, locale, Dictionary.TYPE_MAIN); - } catch (android.content.res.Resources.NotFoundException e) { - Log.e(TAG, "Could not find the resource"); - return null; - } finally { - if (null != afd) { - try { - afd.close(); - } catch (java.io.IOException e) { - /* IOException on close ? What am I supposed to do ? */ - } - } - } - } } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java index 340ed59b7..23cff1cb6 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java @@ -73,7 +73,6 @@ import org.dslul.openboard.inputmethod.latin.settings.SettingsValues; import org.dslul.openboard.inputmethod.latin.suggestions.SuggestionStripView; import org.dslul.openboard.inputmethod.latin.suggestions.SuggestionStripViewAccessor; import org.dslul.openboard.inputmethod.latin.touchinputconsumer.GestureConsumer; -import org.dslul.openboard.inputmethod.latin.utils.ApplicationUtils; import org.dslul.openboard.inputmethod.latin.utils.ColorUtilKt; import org.dslul.openboard.inputmethod.latin.utils.InlineAutofillUtils; import org.dslul.openboard.inputmethod.latin.utils.InputMethodPickerKt; @@ -2008,8 +2007,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final Printer p = new PrintWriterPrinter(fout); p.println("LatinIME state :"); - p.println(" VersionCode = " + ApplicationUtils.getVersionCode(this)); - p.println(" VersionName = " + ApplicationUtils.getVersionName(this)); + p.println(" VersionCode = " + BuildConfig.VERSION_CODE); + p.println(" VersionName = " + BuildConfig.VERSION_NAME); final Keyboard keyboard = mKeyboardSwitcher.getKeyboard(); final int keyboardMode = keyboard != null ? keyboard.mId.mMode : -1; p.println(" Keyboard mode = " + keyboardMode); diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/DebugSettingsFragment.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/DebugSettingsFragment.java index bddbedb8a..c73d0521c 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/DebugSettingsFragment.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/DebugSettingsFragment.java @@ -21,7 +21,6 @@ import org.dslul.openboard.inputmethod.latin.BuildConfig; import org.dslul.openboard.inputmethod.latin.DictionaryDumpBroadcastReceiver; import org.dslul.openboard.inputmethod.latin.DictionaryFacilitatorImpl; import org.dslul.openboard.inputmethod.latin.R; -import org.dslul.openboard.inputmethod.latin.utils.ApplicationUtils; /** * "Debug mode" settings sub screen. @@ -109,7 +108,7 @@ public final class DebugSettingsFragment extends SubScreenFragment } private void updateDebugMode() { - final String version = getString(R.string.version_text, ApplicationUtils.getVersionName(getActivity())); + final String version = getString(R.string.version_text, BuildConfig.VERSION_NAME); mDebugMode.setSummary(version); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java index 3469daec9..00d6451a9 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java @@ -9,9 +9,7 @@ package org.dslul.openboard.inputmethod.latin.settings; import android.app.Activity; import android.content.Intent; import android.net.Uri; -import android.os.Build; import android.os.Bundle; -import android.provider.Settings.Secure; import android.view.inputmethod.InputMethodSubtype; import androidx.activity.result.ActivityResultLauncher; @@ -22,13 +20,11 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceScreen; import org.dslul.openboard.inputmethod.latin.BuildConfig; import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.common.FileUtils; import org.dslul.openboard.inputmethod.latin.define.DebugFlags; -import org.dslul.openboard.inputmethod.latin.utils.ApplicationUtils; import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils; import org.dslul.openboard.inputmethod.latin.utils.DictionaryUtilsKt; import org.dslul.openboard.inputmethod.latin.utils.ExecutorUtils; @@ -57,11 +53,9 @@ public final class SettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(@Nullable Bundle bundle, @Nullable String s) { addPreferencesFromResource(R.xml.prefs); - final PreferenceScreen preferenceScreen = getPreferenceScreen(); - preferenceScreen.setTitle(ApplicationUtils.getActivityTitleResId(getActivity(), SettingsActivity.class)); if (!JniUtils.sHaveGestureLib) { final Preference gesturePreference = findPreference(Settings.SCREEN_GESTURE); - preferenceScreen.removePreference(gesturePreference); + getPreferenceScreen().removePreference(gesturePreference); } ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD) .execute(() -> DictionaryUtilsKt.cleanUnusedMainDicts(requireContext())); @@ -89,13 +83,6 @@ public final class SettingsFragment extends PreferenceFragmentCompat { askAboutCrashReports(); } - private static boolean isUserSetupComplete(final Activity activity) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - return true; - } - return Secure.getInt(activity.getContentResolver(), "user_setup_complete", 0) != 0; - } - private String getEnabledSubtypesLabel() { final List subtypes = SubtypeSettingsKt.getEnabledSubtypes(DeviceProtectedUtils.getSharedPreferences(getActivity()), true); final StringBuilder sb = new StringBuilder(); diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java index db527520c..aa1073e34 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java @@ -15,11 +15,7 @@ import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.permissions.PermissionsManager; import org.dslul.openboard.inputmethod.latin.permissions.PermissionsUtil; import org.dslul.openboard.inputmethod.latin.settings.SubScreenFragment; -import org.dslul.openboard.inputmethod.latin.utils.ApplicationUtils; -import static org.dslul.openboard.inputmethod.latin.permissions.PermissionsManager.get; - -import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreferenceCompat; /** @@ -35,21 +31,13 @@ public final class SpellCheckerSettingsFragment extends SubScreenFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.spell_checker_settings); - final PreferenceScreen preferenceScreen = getPreferenceScreen(); - preferenceScreen.setTitle(ApplicationUtils.getActivityTitleResId(getActivity(), SpellCheckerSettingsActivity.class)); - mLookupContactsPreference = (SwitchPreferenceCompat) findPreference(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY); turnOffLookupContactsIfNoPermission(); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (!TextUtils.equals(key, AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY)) { - return; - } - - if (!sharedPreferences.getBoolean(key, false)) { - // don't care if the preference is turned off. + if (!TextUtils.equals(key, AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY) || sharedPreferences.getBoolean(key, false)) { return; } @@ -58,7 +46,7 @@ public final class SpellCheckerSettingsFragment extends SubScreenFragment return; // all permissions granted, no need to request permissions. } - get(requireContext()).requestPermissions(this, getActivity(), Manifest.permission.READ_CONTACTS); + PermissionsManager.get(requireContext()).requestPermissions(this, getActivity(), Manifest.permission.READ_CONTACTS); } @Override diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ApplicationUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ApplicationUtils.java deleted file mode 100644 index dff9a9a9d..000000000 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ApplicationUtils.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * modified - * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only - */ - -package org.dslul.openboard.inputmethod.latin.utils; - -import android.app.Activity; -import android.content.ComponentName; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import org.dslul.openboard.inputmethod.latin.utils.Log; - -public final class ApplicationUtils { - private static final String TAG = ApplicationUtils.class.getSimpleName(); - - private ApplicationUtils() { - // This utility class is not publicly instantiable. - } - - public static int getActivityTitleResId(final Context context, - final Class cls) { - final ComponentName cn = new ComponentName(context, cls); - try { - final ActivityInfo ai = context.getPackageManager().getActivityInfo(cn, 0); - if (ai != null) { - return ai.labelRes; - } - } catch (final NameNotFoundException e) { - Log.e(TAG, "Failed to get settings activity title res id.", e); - } - return 0; - } - - /** - * A utility method to get the application's PackageInfo.versionName - * @return the application's PackageInfo.versionName - */ - public static String getVersionName(final Context context) { - try { - if (context == null) { - return ""; - } - final String packageName = context.getPackageName(); - final PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); - return info.versionName; - } catch (final NameNotFoundException e) { - Log.e(TAG, "Could not find version info.", e); - } - return ""; - } - - /** - * A utility method to get the application's PackageInfo.versionCode - * @return the application's PackageInfo.versionCode - */ - public static int getVersionCode(final Context context) { - try { - if (context == null) { - return 0; - } - final String packageName = context.getPackageName(); - final PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); - return info.versionCode; - } catch (final NameNotFoundException e) { - Log.e(TAG, "Could not find version info.", e); - } - return 0; - } -} diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/AutoCorrectionUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/AutoCorrectionUtils.java index c2f9ae2b5..0ce4efdac 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/AutoCorrectionUtils.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/AutoCorrectionUtils.java @@ -6,8 +6,6 @@ package org.dslul.openboard.inputmethod.latin.utils; -import org.dslul.openboard.inputmethod.latin.utils.Log; - import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DictionaryInfoUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DictionaryInfoUtils.java index c22514916..aa38ac3a0 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DictionaryInfoUtils.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/DictionaryInfoUtils.java @@ -7,10 +7,7 @@ package org.dslul.openboard.inputmethod.latin.utils; import android.content.Context; -import android.content.res.AssetManager; -import android.content.res.Resources; import android.text.TextUtils; -import android.view.inputmethod.InputMethodSubtype; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -18,11 +15,7 @@ import androidx.annotation.Nullable; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; import org.dslul.openboard.inputmethod.annotations.UsedForTesting; -import org.dslul.openboard.inputmethod.latin.AssetFileAddress; import org.dslul.openboard.inputmethod.latin.BinaryDictionaryGetter; -import org.dslul.openboard.inputmethod.latin.R; -import org.dslul.openboard.inputmethod.latin.RichInputMethodManager; -import org.dslul.openboard.inputmethod.latin.common.LocaleUtils; import org.dslul.openboard.inputmethod.latin.define.DecoderSpecificConstants; import org.dslul.openboard.inputmethod.latin.makedict.DictionaryHeader; import org.dslul.openboard.inputmethod.latin.makedict.UnsupportedFormatException; @@ -30,9 +23,6 @@ import org.dslul.openboard.inputmethod.latin.settings.SpacingAndPunctuations; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import java.util.Locale; /** @@ -40,43 +30,12 @@ import java.util.Locale; */ public class DictionaryInfoUtils { private static final String TAG = DictionaryInfoUtils.class.getSimpleName(); - public static final String RESOURCE_PACKAGE_NAME = R.class.getPackage().getName(); public static final String DEFAULT_MAIN_DICT = "main"; public static final String MAIN_DICT_PREFIX = DEFAULT_MAIN_DICT + "_"; private static final String DICTIONARY_CATEGORY_SEPARATOR_EXPRESSION = "[" + BinaryDictionaryGetter.ID_CATEGORY_SEPARATOR + "_]"; - private static final String DECODER_DICT_SUFFIX = DecoderSpecificConstants.DECODER_DICT_SUFFIX; // 6 digits - unicode is limited to 21 bits private static final int MAX_HEX_DIGITS_FOR_CODEPOINT = 6; - public static class DictionaryInfo { - @NonNull public final String mId; - @NonNull public final Locale mLocale; - @Nullable public final String mDescription; - @Nullable public final String mFilename; - public final long mFilesize; - public final long mModifiedTimeMillis; - public final int mVersion; - - public DictionaryInfo(@NonNull String id, @NonNull Locale locale, - @Nullable String description, @Nullable String filename, - long filesize, long modifiedTimeMillis, int version) { - mId = id; - mLocale = locale; - mDescription = description; - mFilename = filename; - mFilesize = filesize; - mModifiedTimeMillis = modifiedTimeMillis; - mVersion = version; - } - - @Override - public String toString() { - return "DictionaryInfo : Id = '" + mId - + "' : Locale=" + mLocale - + " : Version=" + mVersion; - } - } - private DictionaryInfoUtils() { // Private constructor to forbid instantation of this helper class. } @@ -124,13 +83,6 @@ public class DictionaryInfoUtils { return context.getFilesDir() + File.separator + "dicts"; } - /** - * Helper method to get the top level cache directory. - */ - public static String getWordListStagingDirectory(final Context context) { - return context.getFilesDir() + File.separator + "staging"; - } - /** * Helper method to get the top level temp directory. */ @@ -167,10 +119,6 @@ public class DictionaryInfoUtils { return new File(DictionaryInfoUtils.getWordListCacheDirectory(context)).listFiles(); } - public static File[] getStagingDirectoryList(final Context context) { - return new File(DictionaryInfoUtils.getWordListStagingDirectory(context)).listFiles(); - } - /** * Returns the category for a given file name. *

@@ -219,60 +167,6 @@ public class DictionaryInfoUtils { return BinaryDictionaryGetter.MAIN_DICTIONARY_CATEGORY.equals(idArray[0]); } - /** - * Find out whether a dictionary is available for this locale. - * @param context the context on which to check resources. - * @param locale the locale to check for. - * @return whether a (non-placeholder) dictionary is available or not. - */ - public static boolean isDictionaryAvailable(final Context context, final Locale locale) { - final Resources res = context.getResources(); - return 0 != getMainDictionaryResourceIdIfAvailableForLocale(res, locale); - } - - /** - * Helper method to return a dictionary res id for a locale, or 0 if none. - * @param res resources for the app - * @param locale dictionary locale - * @return main dictionary resource id - */ - public static int getMainDictionaryResourceIdIfAvailableForLocale(final Resources res, - final Locale locale) { - int resId; - // Try to find main_language_country dictionary. - if (!locale.getCountry().isEmpty()) { - final String dictLanguageCountry = MAIN_DICT_PREFIX - + locale.toString().toLowerCase(Locale.ROOT) + DECODER_DICT_SUFFIX; - if ((resId = res.getIdentifier(dictLanguageCountry, "raw", RESOURCE_PACKAGE_NAME)) != 0) { - return resId; - } - } - - // Try to find main_language dictionary. - final String dictLanguage = MAIN_DICT_PREFIX + locale.getLanguage() + DECODER_DICT_SUFFIX; - if ((resId = res.getIdentifier(dictLanguage, "raw", RESOURCE_PACKAGE_NAME)) != 0) { - return resId; - } - - // Not found, return 0 - return 0; - } - - /** - * Returns a main dictionary resource id - * @param res resources for the app - * @param locale dictionary locale - * @return main dictionary resource id - */ - public static int getMainDictionaryResourceId(final Resources res, final Locale locale) { - int resourceId = getMainDictionaryResourceIdIfAvailableForLocale(res, locale); - if (0 != resourceId) { - return resourceId; - } - return res.getIdentifier(DEFAULT_MAIN_DICT + DecoderSpecificConstants.DECODER_DICT_SUFFIX, - "raw", RESOURCE_PACKAGE_NAME); - } - /** * Returns the id associated with the main word list for a specified locale. *

@@ -308,145 +202,6 @@ public class DictionaryInfoUtils { } } - /** - * Returns information of the dictionary. - * - * @param fileAddress the asset dictionary file address. - * @param locale Locale for this file. - * @return information of the specified dictionary. - */ - private static DictionaryInfo createDictionaryInfoFromFileAddress( - @NonNull final AssetFileAddress fileAddress, final Locale locale) { - final String id = getMainDictId(locale); - final int version = DictionaryHeaderUtils.getContentVersion(fileAddress); - final String description = SubtypeLocaleUtils - .getSubtypeLocaleDisplayName(locale.toString()); - // Do not store the filename on db as it will try to move the filename from db to the - // cached directory. If the filename is already in cached directory, this is not - // necessary. - final String filenameToStoreOnDb = null; - return new DictionaryInfo(id, locale, description, filenameToStoreOnDb, - fileAddress.mLength, new File(fileAddress.mFilename).lastModified(), version); - } - - /** - * Returns the information of the dictionary for the given {@link AssetFileAddress}. - * If the file is corrupted or a pre-fava file, then the file gets deleted and the null - * value is returned. - */ - @Nullable - private static DictionaryInfo createDictionaryInfoForUnCachedFile( - @NonNull final AssetFileAddress fileAddress, final Locale locale) { - final String id = getMainDictId(locale); - final int version = DictionaryHeaderUtils.getContentVersion(fileAddress); - - if (version == -1) { - // Purge the pre-fava/corrupted unused dictionaires. - fileAddress.deleteUnderlyingFile(); - return null; - } - - final String description = SubtypeLocaleUtils - .getSubtypeLocaleDisplayName(locale.toString()); - - final File unCachedFile = new File(fileAddress.mFilename); - // Store just the filename and not the full path. - final String filenameToStoreOnDb = unCachedFile.getName(); - return new DictionaryInfo(id, locale, description, filenameToStoreOnDb, fileAddress.mLength, - unCachedFile.lastModified(), version); - } - - /** - * Returns dictionary information for the given locale. - */ - private static DictionaryInfo createDictionaryInfoFromLocale(Locale locale) { - final String id = getMainDictId(locale); - final int version = -1; - final String description = SubtypeLocaleUtils - .getSubtypeLocaleDisplayName(locale.toString()); - return new DictionaryInfo(id, locale, description, null, 0L, 0L, version); - } - - private static void addOrUpdateDictInfo(final ArrayList dictList, - final DictionaryInfo newElement) { - final Iterator iter = dictList.iterator(); - while (iter.hasNext()) { - final DictionaryInfo thisDictInfo = iter.next(); - if (thisDictInfo.mLocale.equals(newElement.mLocale)) { - if (newElement.mVersion <= thisDictInfo.mVersion) { - return; - } - iter.remove(); - } - } - dictList.add(newElement); - } - - public static ArrayList getCurrentDictionaryFileNameAndVersionInfo(final Context context) { - final ArrayList dictList = new ArrayList<>(); - - // Retrieve downloaded dictionaries from cached directories - final File[] directoryList = getCachedDirectoryList(context); - if (null != directoryList) { - for (final File directory : directoryList) { - final String localeString = getWordListIdFromFileName(directory.getName()); - final File[] dicts = BinaryDictionaryGetter.getCachedWordLists( - localeString, context, false); - 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, locale); - // 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 == null || !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, locale); - // 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. - // TODO: Remove dictionaryInfo == null when the static LMs have the headers. - if (dictionaryInfo == null || !dictionaryInfo.mLocale.equals(locale)) { - continue; - } - addOrUpdateDictInfo(dictList, dictionaryInfo); - } - - // Generate the dictionary information from the enabled subtypes. This will not - // overwrite the real records. - RichInputMethodManager.init(context); - List enabledSubtypes = RichInputMethodManager - .getInstance().getMyEnabledInputMethodSubtypeList(true); - for (InputMethodSubtype subtype : enabledSubtypes) { - Locale locale = LocaleUtils.constructLocaleFromString(subtype.getLocale()); - DictionaryInfo dictionaryInfo = createDictionaryInfoFromLocale(locale); - addOrUpdateDictInfo(dictList, dictionaryInfo); - } - - return dictList; - } - @UsedForTesting public static boolean looksValidForDictionaryInsertion(final CharSequence text, final SpacingAndPunctuations spacingAndPunctuations) { diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml index 93d2522f9..d37e43d24 100644 --- a/app/src/main/res/xml/prefs.xml +++ b/app/src/main/res/xml/prefs.xml @@ -5,7 +5,7 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only --> + android:title="@string/ime_settings">