From f81f6a7f7d74494efc99c4a43c78aded5b192f50 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 1 Jun 2025 17:03:16 +0200 Subject: [PATCH] some additional safety, so we show at least a working keyboard in case dictionary or native library loading fails --- .../inputmethod/keyboard/ProximityInfo.java | 7 +++- .../latin/DictionaryFacilitatorImpl.kt | 35 ++++++++++--------- .../helium314/keyboard/latin/LatinIME.java | 7 +++- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/android/inputmethod/keyboard/ProximityInfo.java b/app/src/main/java/com/android/inputmethod/keyboard/ProximityInfo.java index 878cd08fe..9015f3e6d 100644 --- a/app/src/main/java/com/android/inputmethod/keyboard/ProximityInfo.java +++ b/app/src/main/java/com/android/inputmethod/keyboard/ProximityInfo.java @@ -70,7 +70,12 @@ public class ProximityInfo { return; } computeNearestNeighbors(); - mNativeProximityInfo = createNativeProximityInfo(touchPositionCorrection); + try { + mNativeProximityInfo = createNativeProximityInfo(touchPositionCorrection); + } catch (Throwable e) { + Log.e(TAG, "could not create proximity info", e); + mNativeProximityInfo = 0; + } } private long mNativeProximityInfo; diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index bb4b4c1d8..453317397 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -31,10 +31,7 @@ import helium314.keyboard.latin.utils.locale import helium314.keyboard.latin.utils.prefs import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async -import kotlinx.coroutines.awaitAll import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import java.io.File import java.io.IOException import java.util.Locale @@ -231,23 +228,27 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { val latchForWaitingLoadingMainDictionary = CountDownLatch(1) mLatchForWaitingLoadingMainDictionaries = latchForWaitingLoadingMainDictionary scope.launch { - val dictGroupsWithNewMainDict = locales.mapNotNull { - val dictionaryGroup = findDictionaryGroupWithLocale(dictionaryGroups, it) - if (dictionaryGroup == null) { - Log.w(TAG, "Expected a dictionary group for $it but none found") - return@mapNotNull null // This should never happen + try { + val dictGroupsWithNewMainDict = locales.mapNotNull { + val dictionaryGroup = findDictionaryGroupWithLocale(dictionaryGroups, it) + if (dictionaryGroup == null) { + Log.w(TAG, "Expected a dictionary group for $it but none found") + return@mapNotNull null // This should never happen + } + if (dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.isInitialized == true) null + else dictionaryGroup to DictionaryFactory.createMainDictionaryCollection(context, it) } - if (dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.isInitialized == true) null - else dictionaryGroup to DictionaryFactory.createMainDictionaryCollection(context, it) - } - synchronized(this) { - dictGroupsWithNewMainDict.forEach { (dictGroup, mainDict) -> - dictGroup.setMainDict(mainDict) + synchronized(this) { + dictGroupsWithNewMainDict.forEach { (dictGroup, mainDict) -> + dictGroup.setMainDict(mainDict) + } } - } - listener?.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary()) - latchForWaitingLoadingMainDictionary.countDown() + listener?.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary()) + latchForWaitingLoadingMainDictionary.countDown() + } catch (e: Throwable) { + Log.e(TAG, "could not initialize main dictionaries for $locales", e) + } } } diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index 36107954f..0ef4dfdfc 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -755,9 +755,14 @@ public class LatinIME extends InputMethodService implements // TODO: make sure the current settings always have the right locales, and read from them. private void resetDictionaryFacilitator(@NonNull final Locale locale) { final SettingsValues settingsValues = mSettings.getCurrent(); - mDictionaryFacilitator.resetDictionaries(this, locale, + try { + mDictionaryFacilitator.resetDictionaries(this, locale, settingsValues.mUseContactsDictionary, settingsValues.mUseAppsDictionary, settingsValues.mUsePersonalizedDicts, false, "", this); + } catch (Throwable e) { + // this should not happen, but in case it does we at least want to show a keyboard + Log.e(TAG, "Could not reset dictionary facilitator, please fix ASAP", e); + } mInputLogic.mSuggest.setAutoCorrectionThreshold(settingsValues.mAutoCorrectionThreshold); }