diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt index 5a171916b..d1cc42298 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/internal/keyboard_parser/KeyboardParser.kt @@ -3,8 +3,6 @@ package org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser import android.content.Context import android.content.res.Configuration -import android.content.res.Resources -import android.os.Build import org.dslul.openboard.inputmethod.latin.utils.Log import android.view.inputmethod.EditorInfo import androidx.annotation.StringRes @@ -28,7 +26,7 @@ import org.dslul.openboard.inputmethod.latin.utils.CUSTOM_LAYOUT_PREFIX import org.dslul.openboard.inputmethod.latin.utils.InputTypeUtils import org.dslul.openboard.inputmethod.latin.utils.MORE_KEYS_LAYOUT import org.dslul.openboard.inputmethod.latin.utils.MORE_KEYS_NUMBER -import org.dslul.openboard.inputmethod.latin.utils.RunInLocale +import org.dslul.openboard.inputmethod.latin.utils.runInLocale import org.dslul.openboard.inputmethod.latin.utils.sumOf import java.io.File import java.util.Locale @@ -667,17 +665,13 @@ abstract class KeyboardParser(private val params: KeyboardParams, private val co } private fun getInLocale(@StringRes id: Int): String { - val ril = object : RunInLocale() { - override fun job(res: Resources) = res.getString(id) - } - // crappy workaround... val locale = when (params.mId.locale.toString().lowercase()) { // todo: improve this when switching (rich input) subtype to use language tag "hi_zz" -> Locale("en", "IN") "sr_zz" -> Locale.forLanguageTag("sr-Latn") else -> params.mId.locale } - return ril.runInLocale(context.resources, locale) + return runInLocale(context, locale) { it.getString(id) } } private fun getToSymbolLabel() = diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java index e1c09d451..bb9546956 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/Settings.java @@ -37,7 +37,7 @@ import org.dslul.openboard.inputmethod.latin.utils.ColorUtilKt; import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils; import org.dslul.openboard.inputmethod.latin.utils.JniUtils; import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils; -import org.dslul.openboard.inputmethod.latin.utils.RunInLocale; +import org.dslul.openboard.inputmethod.latin.utils.RunInLocaleKt; import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils; import org.dslul.openboard.inputmethod.latin.utils.StatsUtils; import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt; @@ -51,6 +51,8 @@ import java.util.List; import java.util.Locale; import java.util.concurrent.locks.ReentrantLock; +import kotlin.jvm.functions.Function1; + public final class Settings implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = Settings.class.getSimpleName(); // Settings screens @@ -228,13 +230,8 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang try { final SharedPreferences prefs = mPrefs; Log.i(TAG, "loadSettings"); - final RunInLocale job = new RunInLocale<>() { - @Override - protected SettingsValues job(final Resources res) { - return new SettingsValues(context, prefs, res, inputAttributes); - } - }; - mSettingsValues = job.runInLocale(mRes, locale); + mSettingsValues = RunInLocaleKt.runInLocale(context, locale, + (Function1) ctx -> new SettingsValues(ctx, prefs, ctx.getResources(), inputAttributes)); } finally { mSettingsValuesLock.unlock(); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java index a9cc1cce4..c4e18bd86 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsValues.java @@ -38,7 +38,7 @@ import java.util.Locale; /** * When you call the constructor of this class, you may want to change the current system locale by - * using {@link org.dslul.openboard.inputmethod.latin.utils.RunInLocale}. + * using {@link org.dslul.openboard.inputmethod.latin.utils.RunInLocaleKt}. */ // Non-final for testing via mock library. public class SettingsValues { diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SentenceLevelAdapter.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SentenceLevelAdapter.java index daf98a57d..0dcee81f3 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SentenceLevelAdapter.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SentenceLevelAdapter.java @@ -13,11 +13,13 @@ import android.view.textservice.TextInfo; import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.settings.SpacingAndPunctuations; -import org.dslul.openboard.inputmethod.latin.utils.RunInLocale; +import org.dslul.openboard.inputmethod.latin.utils.RunInLocaleKt; import java.util.ArrayList; import java.util.Locale; +import kotlin.jvm.functions.Function1; + /** * This code is mostly lifted directly from android.service.textservice.SpellCheckerService in * the framework; maybe that should be protected instead, so that implementers don't have to @@ -65,13 +67,8 @@ public class SentenceLevelAdapter { private static class WordIterator { private final SpacingAndPunctuations mSpacingAndPunctuations; public WordIterator(final Resources res, final Locale locale) { - final RunInLocale job = new RunInLocale<>() { - @Override - protected SpacingAndPunctuations job(final Resources r) { - return new SpacingAndPunctuations(r, false); - } - }; - mSpacingAndPunctuations = job.runInLocale(res, locale); + mSpacingAndPunctuations = RunInLocaleKt.runInLocale(res, locale, + (Function1) r -> new SpacingAndPunctuations(r, false)); } public int getEndOfWord(final CharSequence sequence, final int fromIndex) { diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/RunInLocale.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/RunInLocale.java deleted file mode 100644 index 6c07e3459..000000000 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/RunInLocale.java +++ /dev/null @@ -1,43 +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.content.res.Configuration; -import android.content.res.Resources; - -import java.util.Locale; - -public abstract class RunInLocale { - private static final Object sLockForRunInLocale = new Object(); - - protected abstract T job(final Resources res); - - /** - * Execute {@link #job(Resources)} method in specified system locale exclusively. - * - * @param res the resources to use. - * @param newLocale the locale to change to. Run in system locale if null. - * @return the value returned from {@link #job(Resources)}. - */ - public T runInLocale(final Resources res, final Locale newLocale) { - synchronized (sLockForRunInLocale) { - final Configuration conf = res.getConfiguration(); - if (newLocale == null || newLocale.equals(conf.locale)) { - return job(res); - } - final Locale savedLocale = conf.locale; - try { - conf.locale = newLocale; - res.updateConfiguration(conf, null); - return job(res); - } finally { - conf.locale = savedLocale; - res.updateConfiguration(conf, null); - } - } - } -} diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/RunInLocale.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/RunInLocale.kt new file mode 100644 index 000000000..3a650b400 --- /dev/null +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/RunInLocale.kt @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0-only +package org.dslul.openboard.inputmethod.latin.utils + +import android.content.Context +import android.content.res.Configuration +import android.content.res.Resources +import java.util.Locale + +fun runInLocale(context: Context, locale: Locale, run: (Context) -> T): T { + val config = Configuration(context.resources.configuration) + config.setLocale(locale) + val localeContext = context.createConfigurationContext(config) + return run(localeContext) +} + +// slower than context and deprecated, but still better than original style +fun runInLocale(resources: Resources, locale: Locale, run: (Resources) -> T): T { + val config = Configuration(resources.configuration) + config.setLocale(locale) + @Suppress("deprecation") val res = Resources(resources.assets, resources.displayMetrics, config) + return run(res) +} diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java index 3cbf35e0b..b7d603375 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/SubtypeLocaleUtils.java @@ -24,6 +24,8 @@ import static org.dslul.openboard.inputmethod.latin.common.Constants.Subtype.Ext import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import kotlin.jvm.functions.Function1; + /** * A helper class to deal with subtype locales. */ @@ -186,13 +188,8 @@ public final class SubtypeLocaleUtils { final String displayName; if (exceptionalNameResId != null) { - final RunInLocale getExceptionalName = new RunInLocale() { - @Override - protected String job(final Resources res) { - return res.getString(exceptionalNameResId); - } - }; - displayName = getExceptionalName.runInLocale(sResources, displayLocale); + displayName = RunInLocaleKt.runInLocale(sResources, displayLocale, + (Function1) res -> res.getString(exceptionalNameResId)); } else { displayName = LocaleUtils.constructLocaleFromString(localeString) .getDisplayName(displayLocale); @@ -248,11 +245,10 @@ public final class SubtypeLocaleUtils { final String replacementString = getReplacementString(subtype, displayLocale); // TODO: rework this for multi-lingual subtypes final int nameResId = subtype.getNameResId(); - final RunInLocale getSubtypeName = new RunInLocale() { - @Override - protected String job(final Resources res) { + return RunInLocaleKt.runInLocale(sResources, displayLocale, + (Function1) res -> { try { - return res.getString(nameResId, replacementString); + return StringUtils.capitalizeFirstCodePoint(res.getString(nameResId, replacementString), displayLocale); } catch (Resources.NotFoundException e) { // TODO: Remove this catch when InputMethodManager.getCurrentInputMethodSubtype // is fixed. @@ -263,10 +259,7 @@ public final class SubtypeLocaleUtils { + "\n" + DebugLogUtils.getStackTrace()); return ""; } - } - }; - return StringUtils.capitalizeFirstCodePoint( - getSubtypeName.runInLocale(sResources, displayLocale), displayLocale); + }); } @NonNull