mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-04-19 13:49:13 +00:00
properly load secondary dictionary (like main)
This commit is contained in:
parent
6afc90c014
commit
c5c76fa82b
1 changed files with 76 additions and 21 deletions
|
@ -319,6 +319,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
@Nullable
|
@Nullable
|
||||||
static DictionaryGroup findDictionaryGroupWithLocale(final DictionaryGroup dictionaryGroup,
|
static DictionaryGroup findDictionaryGroupWithLocale(final DictionaryGroup dictionaryGroup,
|
||||||
final Locale locale) {
|
final Locale locale) {
|
||||||
|
if (dictionaryGroup == null) return null;
|
||||||
return locale.equals(dictionaryGroup.mLocale) ? dictionaryGroup : null;
|
return locale.equals(dictionaryGroup.mLocale) ? dictionaryGroup : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,41 +400,73 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
DictionaryGroup newDictionaryGroup =
|
DictionaryGroup newDictionaryGroup =
|
||||||
new DictionaryGroup(newLocale, mainDict, account, subDicts);
|
new DictionaryGroup(newLocale, mainDict, account, subDicts);
|
||||||
|
|
||||||
|
// create / load secondary dictionary
|
||||||
|
final Locale secondaryLocale = Settings.getInstance().getCurrent().mSecondaryLocale;
|
||||||
|
final DictionaryGroup newSecondaryDictionaryGroup;
|
||||||
|
final Map<String, ExpandableBinaryDictionary> secondarySubDicts = new HashMap<>();
|
||||||
|
|
||||||
|
if (secondaryLocale != null &&
|
||||||
|
ScriptUtils.getScriptFromSpellCheckerLocale(secondaryLocale) == ScriptUtils.getScriptFromSpellCheckerLocale(newLocale)) {
|
||||||
|
final ArrayList<String> dictTypesToCleanUp = new ArrayList<>();
|
||||||
|
for (final String dictType : ALL_DICTIONARY_TYPES) {
|
||||||
|
if (mSecondaryDictionaryGroup != null && mSecondaryDictionaryGroup.hasDict(dictType, account)) {
|
||||||
|
dictTypesToCleanUp.add(dictType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (final String subDictType : subDictTypesToUse) {
|
||||||
|
final ExpandableBinaryDictionary subDict =
|
||||||
|
getSubDict(subDictType, context, secondaryLocale, null, dictNamePrefix, account);
|
||||||
|
secondarySubDicts.put(subDictType, subDict);
|
||||||
|
dictTypesToCleanUp.remove(subDictType);
|
||||||
|
}
|
||||||
|
final Dictionary secondaryMainDict;
|
||||||
|
if (forceReloadMainDictionary || findDictionaryGroupWithLocale(mSecondaryDictionaryGroup, secondaryLocale) == null
|
||||||
|
|| !mSecondaryDictionaryGroup.hasDict(Dictionary.TYPE_MAIN, account)) {
|
||||||
|
secondaryMainDict = null;
|
||||||
|
} else {
|
||||||
|
if (mSecondaryDictionaryGroup == null)
|
||||||
|
secondaryMainDict = null;
|
||||||
|
else
|
||||||
|
secondaryMainDict = mSecondaryDictionaryGroup.getDict(Dictionary.TYPE_MAIN);
|
||||||
|
dictTypesToCleanUp.remove(Dictionary.TYPE_MAIN);
|
||||||
|
}
|
||||||
|
newSecondaryDictionaryGroup = new DictionaryGroup(secondaryLocale, secondaryMainDict, account, secondarySubDicts);
|
||||||
|
|
||||||
|
// do the cleanup like for main dict: look like this is for removing dictionaries
|
||||||
|
// after user changed enabled types (e.g. disable personalized suggestions)
|
||||||
|
existingDictionariesToCleanup.put(secondaryLocale, dictTypesToCleanUp);
|
||||||
|
} else {
|
||||||
|
newSecondaryDictionaryGroup = null;
|
||||||
|
}
|
||||||
|
|
||||||
// Replace Dictionaries.
|
// Replace Dictionaries.
|
||||||
final DictionaryGroup oldDictionaryGroup;
|
final DictionaryGroup oldDictionaryGroup;
|
||||||
|
final DictionaryGroup oldSecondaryDictionaryGroup;
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
oldDictionaryGroup = mDictionaryGroup;
|
oldDictionaryGroup = mDictionaryGroup;
|
||||||
mDictionaryGroup = newDictionaryGroup;
|
mDictionaryGroup = newDictionaryGroup;
|
||||||
|
oldSecondaryDictionaryGroup = mSecondaryDictionaryGroup;
|
||||||
|
mSecondaryDictionaryGroup = newSecondaryDictionaryGroup;
|
||||||
if (hasAtLeastOneUninitializedMainDictionary()) {
|
if (hasAtLeastOneUninitializedMainDictionary()) {
|
||||||
asyncReloadUninitializedMainDictionaries(context, newLocale, listener);
|
asyncReloadUninitializedMainDictionaries(context, newLocale,
|
||||||
|
mSecondaryDictionaryGroup == null ? null : secondaryLocale, listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary());
|
listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary());
|
||||||
}
|
}
|
||||||
|
|
||||||
// create / load secondary dictionary
|
|
||||||
final Locale secondaryLocale = Settings.getInstance().getCurrent().mSecondaryLocale;
|
|
||||||
final Map<String, ExpandableBinaryDictionary> secondarySubDicts = new HashMap<>();
|
|
||||||
if (secondaryLocale != null && mDictionaryGroup != null && mDictionaryGroup.mLocale != null &&
|
|
||||||
ScriptUtils.getScriptFromSpellCheckerLocale(secondaryLocale) == ScriptUtils.getScriptFromSpellCheckerLocale(mDictionaryGroup.mLocale)) {
|
|
||||||
for (final String subDictType : subDictTypesToUse) {
|
|
||||||
final ExpandableBinaryDictionary subDict =
|
|
||||||
getSubDict(subDictType, context, secondaryLocale, 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 =
|
||||||
existingDictionariesToCleanup.get(localeToCleanUp);
|
existingDictionariesToCleanup.get(localeToCleanUp);
|
||||||
final DictionaryGroup dictionarySetToCleanup =
|
DictionaryGroup dictionarySetToCleanup =
|
||||||
findDictionaryGroupWithLocale(oldDictionaryGroup, localeToCleanUp);
|
findDictionaryGroupWithLocale(oldDictionaryGroup, localeToCleanUp);
|
||||||
|
if (dictionarySetToCleanup == null)
|
||||||
|
dictionarySetToCleanup =
|
||||||
|
findDictionaryGroupWithLocale(oldSecondaryDictionaryGroup, localeToCleanUp);
|
||||||
|
if (dictionarySetToCleanup == null)
|
||||||
|
continue;
|
||||||
for (final String dictType : dictTypesToCleanUp) {
|
for (final String dictType : dictTypesToCleanUp) {
|
||||||
dictionarySetToCleanup.closeDict(dictType);
|
dictionarySetToCleanup.closeDict(dictType);
|
||||||
}
|
}
|
||||||
|
@ -445,20 +478,20 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void asyncReloadUninitializedMainDictionaries(final Context context,
|
private void asyncReloadUninitializedMainDictionaries(final Context context,
|
||||||
final Locale locale, final DictionaryInitializationListener listener) {
|
final Locale locale, final Locale secondaryLocale, final DictionaryInitializationListener listener) {
|
||||||
final CountDownLatch latchForWaitingLoadingMainDictionary = new CountDownLatch(1);
|
final CountDownLatch latchForWaitingLoadingMainDictionary = new CountDownLatch(1);
|
||||||
mLatchForWaitingLoadingMainDictionaries = latchForWaitingLoadingMainDictionary;
|
mLatchForWaitingLoadingMainDictionaries = latchForWaitingLoadingMainDictionary;
|
||||||
ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(new Runnable() {
|
ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
doReloadUninitializedMainDictionaries(
|
doReloadUninitializedMainDictionaries(
|
||||||
context, locale, listener, latchForWaitingLoadingMainDictionary);
|
context, locale, secondaryLocale, listener, latchForWaitingLoadingMainDictionary);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void doReloadUninitializedMainDictionaries(final Context context, final Locale locale,
|
void doReloadUninitializedMainDictionaries(final Context context, final Locale locale,
|
||||||
final DictionaryInitializationListener listener,
|
final Locale secondaryLocale, final DictionaryInitializationListener listener,
|
||||||
final CountDownLatch latchForWaitingLoadingMainDictionary) {
|
final CountDownLatch latchForWaitingLoadingMainDictionary) {
|
||||||
final DictionaryGroup dictionaryGroup =
|
final DictionaryGroup dictionaryGroup =
|
||||||
findDictionaryGroupWithLocale(mDictionaryGroup, locale);
|
findDictionaryGroupWithLocale(mDictionaryGroup, locale);
|
||||||
|
@ -469,6 +502,18 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
}
|
}
|
||||||
final Dictionary mainDict =
|
final Dictionary mainDict =
|
||||||
DictionaryFactory.createMainDictionaryFromManager(context, locale);
|
DictionaryFactory.createMainDictionaryFromManager(context, locale);
|
||||||
|
|
||||||
|
final DictionaryGroup secondaryDictionaryGroup;
|
||||||
|
if (secondaryLocale == null)
|
||||||
|
secondaryDictionaryGroup = null;
|
||||||
|
else
|
||||||
|
secondaryDictionaryGroup = findDictionaryGroupWithLocale(mSecondaryDictionaryGroup, secondaryLocale);
|
||||||
|
final Dictionary secondaryMainDict;
|
||||||
|
if (secondaryLocale == null)
|
||||||
|
secondaryMainDict = null;
|
||||||
|
else
|
||||||
|
secondaryMainDict = DictionaryFactory.createMainDictionaryFromManager(context, secondaryLocale);
|
||||||
|
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
if (locale.equals(dictionaryGroup.mLocale)) {
|
if (locale.equals(dictionaryGroup.mLocale)) {
|
||||||
dictionaryGroup.setMainDict(mainDict);
|
dictionaryGroup.setMainDict(mainDict);
|
||||||
|
@ -476,6 +521,10 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
// Dictionary facilitator has been reset for another locale.
|
// Dictionary facilitator has been reset for another locale.
|
||||||
mainDict.close();
|
mainDict.close();
|
||||||
}
|
}
|
||||||
|
if (secondaryDictionaryGroup != null && secondaryLocale.equals(secondaryDictionaryGroup.mLocale))
|
||||||
|
secondaryDictionaryGroup.setMainDict(secondaryMainDict);
|
||||||
|
else if (secondaryMainDict != null)
|
||||||
|
secondaryMainDict.close();
|
||||||
}
|
}
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary());
|
listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary());
|
||||||
|
@ -543,8 +592,14 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
|
||||||
return mainDict != null && mainDict.isInitialized();
|
return mainDict != null && mainDict.isInitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// also checks for main dictionary of secondary locale
|
||||||
public boolean hasAtLeastOneUninitializedMainDictionary() {
|
public boolean hasAtLeastOneUninitializedMainDictionary() {
|
||||||
final Dictionary mainDict = mDictionaryGroup.getDict(Dictionary.TYPE_MAIN);
|
final Dictionary mainDict = mDictionaryGroup.getDict(Dictionary.TYPE_MAIN);
|
||||||
|
if (mSecondaryDictionaryGroup != null) {
|
||||||
|
final Dictionary secondaryDict = mSecondaryDictionaryGroup.getDict(Dictionary.TYPE_MAIN);
|
||||||
|
if (secondaryDict == null || !secondaryDict.isInitialized())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return mainDict == null || !mainDict.isInitialized();
|
return mainDict == null || !mainDict.isInitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue