mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-06-06 06:40:17 +00:00
make secondary language selectable by user
This commit is contained in:
parent
3fe1e2f30b
commit
26efc80981
6 changed files with 129 additions and 9 deletions
|
@ -31,8 +31,10 @@ import org.dslul.openboard.inputmethod.latin.common.Constants;
|
||||||
import org.dslul.openboard.inputmethod.latin.common.StringUtils;
|
import org.dslul.openboard.inputmethod.latin.common.StringUtils;
|
||||||
import org.dslul.openboard.inputmethod.latin.permissions.PermissionsUtil;
|
import org.dslul.openboard.inputmethod.latin.permissions.PermissionsUtil;
|
||||||
import org.dslul.openboard.inputmethod.latin.personalization.UserHistoryDictionary;
|
import org.dslul.openboard.inputmethod.latin.personalization.UserHistoryDictionary;
|
||||||
|
import org.dslul.openboard.inputmethod.latin.settings.Settings;
|
||||||
import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion;
|
import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion;
|
||||||
import org.dslul.openboard.inputmethod.latin.utils.ExecutorUtils;
|
import org.dslul.openboard.inputmethod.latin.utils.ExecutorUtils;
|
||||||
|
import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils;
|
||||||
import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults;
|
import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -70,7 +72,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
|
|
||||||
private DictionaryGroup mDictionaryGroup = new DictionaryGroup();
|
private DictionaryGroup mDictionaryGroup = new DictionaryGroup();
|
||||||
private DictionaryGroup mSecondaryDictionaryGroup = new DictionaryGroup();
|
private DictionaryGroup mSecondaryDictionaryGroup = new DictionaryGroup();
|
||||||
private Locale mSecondaryLocale = Locale.GERMAN;
|
|
||||||
private volatile CountDownLatch mLatchForWaitingLoadingMainDictionaries = new CountDownLatch(0);
|
private volatile CountDownLatch mLatchForWaitingLoadingMainDictionaries = new CountDownLatch(0);
|
||||||
// To synchronize assigning mDictionaryGroup to ensure closing dictionaries.
|
// To synchronize assigning mDictionaryGroup to ensure closing dictionaries.
|
||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
|
@ -152,7 +153,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
// typing in. For now, this is simply the number of times a word from this language
|
// typing in. For now, this is simply the number of times a word from this language
|
||||||
// has been committed in a row, with an exception when typing a single word not contained
|
// has been committed in a row, with an exception when typing a single word not contained
|
||||||
// in this language.
|
// in this language.
|
||||||
private int mConfidence = 0;
|
private int mConfidence = 1;
|
||||||
|
|
||||||
// allow to go above max confidence for better determination of current preferred language
|
// allow to go above max confidence for better determination of current preferred language
|
||||||
// but when decreasing confidence or getting weight factor, limit to maximum
|
// but when decreasing confidence or getting weight factor, limit to maximum
|
||||||
|
@ -162,7 +163,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
|
|
||||||
public void decreaseConfidence() {
|
public void decreaseConfidence() {
|
||||||
if (mConfidence > MAX_CONFIDENCE)
|
if (mConfidence > MAX_CONFIDENCE)
|
||||||
mConfidence = MAX_CONFIDENCE - 1;
|
mConfidence = MAX_CONFIDENCE;
|
||||||
else if (mConfidence > MIN_CONFIDENCE)
|
else if (mConfidence > MIN_CONFIDENCE)
|
||||||
mConfidence -= 1;
|
mConfidence -= 1;
|
||||||
}
|
}
|
||||||
|
@ -392,14 +393,9 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
dictTypesToCleanupForLocale.remove(subDictType);
|
dictTypesToCleanupForLocale.remove(subDictType);
|
||||||
}
|
}
|
||||||
subDicts.put(subDictType, subDict);
|
subDicts.put(subDictType, subDict);
|
||||||
// what is dictNamePrefix? apparently empty string...
|
|
||||||
secondarySubDicts.put(subDictType, getSubDict(subDictType, context, mSecondaryLocale, null, dictNamePrefix, account));
|
|
||||||
}
|
}
|
||||||
DictionaryGroup newDictionaryGroup =
|
DictionaryGroup newDictionaryGroup =
|
||||||
new DictionaryGroup(newLocale, mainDict, account, subDicts);
|
new DictionaryGroup(newLocale, mainDict, account, subDicts);
|
||||||
// TODO: get secondary locale from prefs or whatever (context!)
|
|
||||||
mSecondaryDictionaryGroup = new DictionaryGroup(mSecondaryLocale, null, account, secondarySubDicts);
|
|
||||||
mSecondaryDictionaryGroup.setMainDict(DictionaryFactory.createMainDictionaryFromManager(context, mSecondaryLocale));
|
|
||||||
|
|
||||||
// Replace Dictionaries.
|
// Replace Dictionaries.
|
||||||
final DictionaryGroup oldDictionaryGroup;
|
final DictionaryGroup oldDictionaryGroup;
|
||||||
|
@ -414,6 +410,21 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary());
|
listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create / load secondary dictionary
|
||||||
|
final Locale secondaryLocale = Settings.getInstance().getCurrent().mSecondaryLocale;
|
||||||
|
if (secondaryLocale != null && mainDict != null &&
|
||||||
|
ScriptUtils.getScriptFromSpellCheckerLocale(secondaryLocale) == ScriptUtils.getScriptFromSpellCheckerLocale(mainDict.mLocale)) {
|
||||||
|
for (final String subDictType : subDictTypesToUse) {
|
||||||
|
final ExpandableBinaryDictionary subDict =
|
||||||
|
getSubDict(subDictType, context, newLocale, null, dictNamePrefix, account);
|
||||||
|
secondarySubDicts.put(subDictType, subDict);
|
||||||
|
}
|
||||||
|
mSecondaryDictionaryGroup = new DictionaryGroup(secondaryLocale, null, account, secondarySubDicts);
|
||||||
|
mSecondaryDictionaryGroup.setMainDict(DictionaryFactory.createMainDictionaryFromManager(context, secondaryLocale));
|
||||||
|
} else {
|
||||||
|
mSecondaryDictionaryGroup = null;
|
||||||
|
}
|
||||||
|
|
||||||
// Clean up old dictionaries.
|
// Clean up old dictionaries.
|
||||||
for (final Locale localeToCleanUp : existingDictionariesToCleanup.keySet()) {
|
for (final Locale localeToCleanUp : existingDictionariesToCleanup.keySet()) {
|
||||||
final ArrayList<String> dictTypesToCleanUp =
|
final ArrayList<String> dictTypesToCleanUp =
|
||||||
|
|
|
@ -16,14 +16,35 @@
|
||||||
|
|
||||||
package org.dslul.openboard.inputmethod.latin.settings;
|
package org.dslul.openboard.inputmethod.latin.settings;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.LocaleList;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.core.os.LocaleListCompat;
|
||||||
|
|
||||||
|
import org.dslul.openboard.inputmethod.dictionarypack.DictionaryPackConstants;
|
||||||
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
|
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
|
||||||
import org.dslul.openboard.inputmethod.latin.R;
|
import org.dslul.openboard.inputmethod.latin.R;
|
||||||
import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver;
|
import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver;
|
||||||
|
import org.dslul.openboard.inputmethod.latin.common.LocaleUtils;
|
||||||
|
import org.dslul.openboard.inputmethod.latin.utils.DialogUtils;
|
||||||
|
import org.dslul.openboard.inputmethod.latin.utils.DictionaryInfoUtils;
|
||||||
|
import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "Advanced" settings sub screen.
|
* "Advanced" settings sub screen.
|
||||||
|
@ -57,6 +78,16 @@ public final class AdvancedSettingsFragment extends SubScreenFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
setupKeyLongpressTimeoutSettings();
|
setupKeyLongpressTimeoutSettings();
|
||||||
|
|
||||||
|
final Preference setSecondaryLocale = findPreference("pref_secondary_locale");
|
||||||
|
if (setSecondaryLocale != null)
|
||||||
|
setSecondaryLocale.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
showSecondaryLocaleDialog();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -105,4 +136,57 @@ public final class AdvancedSettingsFragment extends SubScreenFragment {
|
||||||
SystemBroadcastReceiver.toggleAppIcon(getActivity());
|
SystemBroadcastReceiver.toggleAppIcon(getActivity());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showSecondaryLocaleDialog() {
|
||||||
|
// only latin for now
|
||||||
|
final List<String> locales = new ArrayList<String>(getAvailableDictionaryLocalesForScript(ScriptUtils.SCRIPT_LATIN));
|
||||||
|
final AlertDialog.Builder builder = new AlertDialog.Builder(
|
||||||
|
DialogUtils.getPlatformDialogThemeContext(getActivity()))
|
||||||
|
.setTitle(R.string.select_language)
|
||||||
|
.setPositiveButton(android.R.string.ok, null);
|
||||||
|
if (locales.isEmpty()) {
|
||||||
|
builder.setMessage(R.string.no_secondary_locales)
|
||||||
|
.show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
locales.add(getResources().getString(R.string.secondary_locale_none));
|
||||||
|
final CharSequence[] titles = locales.toArray(new CharSequence[0]);
|
||||||
|
for (int i = 0; i < titles.length -1 ; i++) {
|
||||||
|
titles[i] = LocaleUtils.constructLocaleFromString(titles[i].toString()).getDisplayLanguage();
|
||||||
|
}
|
||||||
|
Locale currentSecondaryLocale = Settings.getInstance().getCurrent().mSecondaryLocale;
|
||||||
|
int checkedItem;
|
||||||
|
if (currentSecondaryLocale == null)
|
||||||
|
checkedItem = locales.size() - 1;
|
||||||
|
else
|
||||||
|
checkedItem = locales.indexOf(currentSecondaryLocale.toString());
|
||||||
|
|
||||||
|
builder.setSingleChoiceItems(titles, checkedItem, (dialogInterface, i) -> {
|
||||||
|
String locale = locales.get(i);
|
||||||
|
if (locale.equals(getResources().getString(R.string.secondary_locale_none)))
|
||||||
|
locale = "";
|
||||||
|
getSharedPreferences().edit().putString(Settings.PREF_SECONDARY_LOCALE, locale).apply();
|
||||||
|
final Intent newDictBroadcast = new Intent(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION);
|
||||||
|
getActivity().sendBroadcast(newDictBroadcast);
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<String> getAvailableDictionaryLocalesForScript(int script) {
|
||||||
|
final Set<String> locales = new HashSet<>();
|
||||||
|
// TODO: get from assets
|
||||||
|
// need merged "compress" PR
|
||||||
|
// filter by script!
|
||||||
|
final File[] directoryList = DictionaryInfoUtils.getCachedDirectoryList(getActivity());
|
||||||
|
for (File directory : directoryList) {
|
||||||
|
if (!directory.isDirectory()) continue;
|
||||||
|
final String dirLocale =
|
||||||
|
DictionaryInfoUtils.getWordListIdFromFileName(directory.getName());
|
||||||
|
final Locale locale = LocaleUtils.constructLocaleFromString(dirLocale);
|
||||||
|
if (ScriptUtils.getScriptFromSpellCheckerLocale(locale) != script) continue;
|
||||||
|
locales.add(locale.toString());
|
||||||
|
}
|
||||||
|
return locales;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import android.view.Gravity;
|
||||||
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
|
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
|
||||||
import org.dslul.openboard.inputmethod.latin.InputAttributes;
|
import org.dslul.openboard.inputmethod.latin.InputAttributes;
|
||||||
import org.dslul.openboard.inputmethod.latin.R;
|
import org.dslul.openboard.inputmethod.latin.R;
|
||||||
|
import org.dslul.openboard.inputmethod.latin.common.LocaleUtils;
|
||||||
import org.dslul.openboard.inputmethod.latin.common.StringUtils;
|
import org.dslul.openboard.inputmethod.latin.common.StringUtils;
|
||||||
import org.dslul.openboard.inputmethod.latin.utils.AdditionalSubtypeUtils;
|
import org.dslul.openboard.inputmethod.latin.utils.AdditionalSubtypeUtils;
|
||||||
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
|
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
|
||||||
|
@ -126,6 +127,8 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
|
||||||
public static final String PREF_ENABLE_CLIPBOARD_HISTORY = "pref_enable_clipboard_history";
|
public static final String PREF_ENABLE_CLIPBOARD_HISTORY = "pref_enable_clipboard_history";
|
||||||
public static final String PREF_CLIPBOARD_HISTORY_RETENTION_TIME = "pref_clipboard_history_retention_time";
|
public static final String PREF_CLIPBOARD_HISTORY_RETENTION_TIME = "pref_clipboard_history_retention_time";
|
||||||
|
|
||||||
|
public static final String PREF_SECONDARY_LOCALE = "pref_secondary_locale";
|
||||||
|
|
||||||
// This preference key is deprecated. Use {@link #PREF_SHOW_LANGUAGE_SWITCH_KEY} instead.
|
// This preference key is deprecated. Use {@link #PREF_SHOW_LANGUAGE_SWITCH_KEY} instead.
|
||||||
// This is being used only for the backward compatibility.
|
// This is being used only for the backward compatibility.
|
||||||
private static final String PREF_SUPPRESS_LANGUAGE_SWITCH_KEY =
|
private static final String PREF_SUPPRESS_LANGUAGE_SWITCH_KEY =
|
||||||
|
@ -509,6 +512,13 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
|
||||||
return prefs.getInt(PREF_LAST_SHOWN_EMOJI_CATEGORY_PAGE_ID, defValue);
|
return prefs.getInt(PREF_LAST_SHOWN_EMOJI_CATEGORY_PAGE_ID, defValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Locale readSecondaryLocale(final SharedPreferences prefs) {
|
||||||
|
final String localeString = prefs.getString(PREF_SECONDARY_LOCALE, "");
|
||||||
|
if (localeString.isEmpty())
|
||||||
|
return null;
|
||||||
|
return LocaleUtils.constructLocaleFromString(localeString);
|
||||||
|
}
|
||||||
|
|
||||||
private void upgradeAutocorrectionSettings(final SharedPreferences prefs, final Resources res) {
|
private void upgradeAutocorrectionSettings(final SharedPreferences prefs, final Resources res) {
|
||||||
final String thresholdSetting =
|
final String thresholdSetting =
|
||||||
prefs.getString(PREF_AUTO_CORRECTION_THRESHOLD_OBSOLETE, null);
|
prefs.getString(PREF_AUTO_CORRECTION_THRESHOLD_OBSOLETE, null);
|
||||||
|
|
|
@ -84,6 +84,7 @@ public class SettingsValues {
|
||||||
public final long mClipboardHistoryRetentionTime;
|
public final long mClipboardHistoryRetentionTime;
|
||||||
public final boolean mOneHandedModeEnabled;
|
public final boolean mOneHandedModeEnabled;
|
||||||
public final int mOneHandedModeGravity;
|
public final int mOneHandedModeGravity;
|
||||||
|
public final Locale mSecondaryLocale;
|
||||||
// Use bigrams to predict the next word when there is no input for it yet
|
// Use bigrams to predict the next word when there is no input for it yet
|
||||||
public final boolean mBigramPredictionEnabled;
|
public final boolean mBigramPredictionEnabled;
|
||||||
public final boolean mGestureInputEnabled;
|
public final boolean mGestureInputEnabled;
|
||||||
|
@ -241,6 +242,7 @@ public class SettingsValues {
|
||||||
mClipboardHistoryRetentionTime = Settings.readClipboardHistoryRetentionTime(prefs, res);
|
mClipboardHistoryRetentionTime = Settings.readClipboardHistoryRetentionTime(prefs, res);
|
||||||
mOneHandedModeEnabled = Settings.readOneHandedModeEnabled(prefs);
|
mOneHandedModeEnabled = Settings.readOneHandedModeEnabled(prefs);
|
||||||
mOneHandedModeGravity = Settings.readOneHandedModeGravity(prefs);
|
mOneHandedModeGravity = Settings.readOneHandedModeGravity(prefs);
|
||||||
|
mSecondaryLocale = Settings.readSecondaryLocale(prefs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isMetricsLoggingEnabled() {
|
public boolean isMetricsLoggingEnabled() {
|
||||||
|
|
|
@ -184,6 +184,14 @@
|
||||||
<string name="delete_swipe_summary">Perform a swipe from the delete key to select and remove bigger portions of text at once</string>
|
<string name="delete_swipe_summary">Perform a swipe from the delete key to select and remove bigger portions of text at once</string>
|
||||||
<!-- Preferences item for enabling trackpad space key -->
|
<!-- Preferences item for enabling trackpad space key -->
|
||||||
<string name="space_trackpad">Space bar trackpad</string>
|
<string name="space_trackpad">Space bar trackpad</string>
|
||||||
|
<!-- Preferences item for choosing secondary language -->
|
||||||
|
<string name="secondary_locale">Multilingual typing</string>
|
||||||
|
<!-- Description for "secondary_locale" option. -->
|
||||||
|
<string name="secondary_locale_summary">Select a secondary dictionary to use alongside main language</string>
|
||||||
|
<!-- Text when no secondary locale chosen -->
|
||||||
|
<string name="secondary_locale_none">None</string>
|
||||||
|
<!-- Message shown when no secondary locales available -->
|
||||||
|
<string name="no_secondary_locales">No secondary locales available</string>
|
||||||
<!-- Description for "space_trackpad" option. -->
|
<!-- Description for "space_trackpad" option. -->
|
||||||
<string name="space_trackpad_summary">Swipe on the spacebar to move the cursor</string>
|
<string name="space_trackpad_summary">Swipe on the spacebar to move the cursor</string>
|
||||||
<!-- Preferences item for disabling word learning -->
|
<!-- Preferences item for disabling word learning -->
|
||||||
|
|
|
@ -76,6 +76,11 @@
|
||||||
android:summary="@string/delete_swipe_summary"
|
android:summary="@string/delete_swipe_summary"
|
||||||
android:defaultValue="true" />
|
android:defaultValue="true" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="pref_secondary_locale"
|
||||||
|
android:title="@string/secondary_locale"
|
||||||
|
android:summary="@string/secondary_locale_summary" />
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue