diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt b/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt index 7f6d6e30..99d4e3ea 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt @@ -369,7 +369,7 @@ private constructor(val themeId: Int, @JvmField val mStyleId: Int) { colorsString.split(";").forEach { val ct = try { ColorType.valueOf(it.substringBefore(",").uppercase()) - } catch (_: Exception) { // todo: which one? + } catch (_: IllegalArgumentException) { return@forEach } val i = it.substringAfter(",").toIntOrNull() ?: return@forEach diff --git a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt index 42ec3ed7..f645032f 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt @@ -186,7 +186,6 @@ object LocaleUtils { return getLocaleDisplayNameInLocale(locale, context.resources, context.resources.configuration.locale()) } - // todo: use this instead of getLocaleDisplayNameInSystemLocale in .kt files fun Locale.localizedDisplayName(context: Context) = getLocaleDisplayNameInLocale(this, context.resources, context.resources.configuration.locale()) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt b/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt index d1d42277..4aec8d22 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt @@ -25,7 +25,7 @@ enum class LayoutType { val LayoutType.folder get() = "layouts${File.separator}${name.lowercase()}${File.separator}" val LayoutType.displayNameId get() = when (this) { - MAIN -> TODO() + MAIN -> R.string.subtype_no_language SYMBOLS -> R.string.layout_symbols MORE_SYMBOLS -> R.string.layout_symbols_shifted FUNCTIONAL -> R.string.layout_functional_keys diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index b8f5a170..c8272aa7 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -102,7 +102,6 @@ object SubtypeSettings { prefs.edit { putString(Settings.PREF_SELECTED_SUBTYPE, subtypeString) } } - // todo: use this or the version in SubtypeUtilsAdditional? fun isAdditionalSubtype(subtype: InputMethodSubtype): Boolean = subtype in additionalSubtypes fun getAdditionalSubtypes(): List = additionalSubtypes.toList() diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt index 506221f1..0f3a1600 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt @@ -9,8 +9,8 @@ import helium314.keyboard.latin.R import helium314.keyboard.latin.common.Constants.Separators import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET -import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.define.DebugFlags import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings @@ -72,7 +72,7 @@ fun getResourceSubtypes(resources: Resources): List { fun InputMethodSubtype.displayName(context: Context): String { val layoutName = SubtypeLocaleUtils.getMainLayoutName(this) if (LayoutUtilsCustom.isCustomLayout(layoutName)) - return "${LocaleUtils.getLocaleDisplayNameInSystemLocale(locale(), context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" + return "${locale().localizedDisplayName(context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" return SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(this) } diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index cf6f5ee2..aaa2b2e1 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -7,12 +7,10 @@ import android.net.Uri import android.os.Bundle import android.view.inputmethod.EditorInfo import android.widget.RelativeLayout -import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.Column import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.ComposeView @@ -28,6 +26,7 @@ import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.ExecutorUtils import helium314.keyboard.latin.utils.cleanUnusedMainDicts import helium314.keyboard.latin.utils.prefs +import helium314.keyboard.settings.dialogs.ConfirmationDialog import helium314.keyboard.settings.dialogs.NewDictionaryDialog import kotlinx.coroutines.flow.MutableStateFlow import java.io.BufferedOutputStream @@ -48,6 +47,7 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen val prefChanged = MutableStateFlow(0) // simple counter, as the only relevant information is that something changed private val dictUriFlow = MutableStateFlow(null) private val cachedDictionaryFile by lazy { File(this.cacheDir.path + File.separator + "temp_dict") } + private val crashReportFiles = MutableStateFlow>(emptyList()) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -57,7 +57,7 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen } ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute { cleanUnusedMainDicts(this) } if (BuildConfig.DEBUG || DebugFlags.DEBUG_ENABLED) - askAboutCrashReports() + crashReportFiles.value = findCrashReports() // with this the layout edit dialog is not covered by the keyboard // alternative of Modifier.imePadding() and properties = DialogProperties(decorFitsSystemWindows = false) has other weird side effects @@ -79,6 +79,8 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen Theme { Surface { val dictUri by dictUriFlow.collectAsState() + val crashReports by crashReportFiles.collectAsState() + val crashFilePicker = filePicker { saveCrashReports(it) } if (spellchecker) Column { // lazy way of implementing spell checker settings settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference() @@ -100,6 +102,23 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen mainLocale = null ) } + if (crashReports.isNotEmpty()) { + ConfirmationDialog( + cancelButtonText = "ignore", + onDismissRequest = { crashReportFiles.value = emptyList() }, + neutralButtonText = "delete", + onNeutral = { crashReports.forEach { it.delete() }; crashReportFiles.value = emptyList() }, + confirmButtonText = "get", + onConfirmed = { + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) + intent.addCategory(Intent.CATEGORY_OPENABLE) + intent.putExtra(Intent.EXTRA_TITLE, "crash_reports.zip") + intent.setType("application/zip") + crashFilePicker.launch(intent) + }, + text = { Text("Crash report files found") }, + ) + } } } } @@ -149,47 +168,21 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen forceOppositeTheme = opposite } - // todo: crash report stuff just just taken from old SettingsFragment and kotlinized - // it should be updated to use compose, and maybe move to MainSettingsScreen - private val crashReportFiles = mutableListOf() - private fun askAboutCrashReports() { + private fun findCrashReports(): List { // find crash report files - val dir: File = getExternalFilesDir(null) ?: return - val allFiles = dir.listFiles() ?: return - crashReportFiles.clear() - for (file in allFiles) { - if (file.name.startsWith("crash_report")) crashReportFiles.add(file) - } - if (crashReportFiles.isEmpty()) return - AlertDialog.Builder(this) - .setMessage("Crash report files found") - .setPositiveButton("get") { _, _ -> - val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) - intent.addCategory(Intent.CATEGORY_OPENABLE) - intent.putExtra(Intent.EXTRA_TITLE, "crash_reports.zip") - intent.setType("application/zip") - crashReportFilePicker.launch(intent) - } - .setNeutralButton("delete") { _, _ -> - for (file in crashReportFiles) { - file.delete() // don't care whether it fails, though user will complain - } - } - .setNegativeButton("ignore", null) - .show() + val dir: File = getExternalFilesDir(null) ?: return emptyList() + val allFiles = dir.listFiles() ?: return emptyList() + return allFiles.filter { it.name.startsWith("crash_report") } } - private val crashReportFilePicker: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode != RESULT_OK || it.data == null) return@registerForActivityResult - val uri = it.data!!.data - if (uri != null) ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute { saveCrashReport(uri) } - } - private fun saveCrashReport(uri: Uri?) { - if (uri == null || crashReportFiles.isEmpty()) return + + private fun saveCrashReports(uri: Uri) { + val files = findCrashReports() + if (files.isEmpty()) return try { contentResolver.openOutputStream(uri)?.use { val bos = BufferedOutputStream(it) val z = ZipOutputStream(bos) - for (file in crashReportFiles) { + for (file in files) { val f = FileInputStream(file) z.putNextEntry(ZipEntry(file.name)) FileUtils.copyStreamToOtherStream(f, z) @@ -198,10 +191,9 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen } z.close() bos.close() - for (file in crashReportFiles) { + for (file in files) { file.delete() } - crashReportFiles.clear() } } catch (ignored: IOException) { } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt index 03b79dbd..496726ee 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.unit.dp import helium314.keyboard.compat.locale import helium314.keyboard.latin.Dictionary import helium314.keyboard.latin.R -import helium314.keyboard.latin.common.LocaleUtils +import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.utils.DictionaryInfoUtils import helium314.keyboard.settings.dictionaryFilePicker import helium314.keyboard.settings.screens.getUserAndInternalDictionaries @@ -44,7 +44,7 @@ fun DictionaryDialog( onConfirmed = {}, confirmButtonText = null, cancelButtonText = stringResource(R.string.dialog_close), - title = { Text(LocaleUtils.getLocaleDisplayNameInSystemLocale(locale, ctx)) }, + title = { Text(locale.localizedDisplayName(ctx)) }, text = { Column { if (hasInternal) { diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt index 945fe76b..0c63d073 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt @@ -34,14 +34,17 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import helium314.keyboard.latin.R +import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue import helium314.keyboard.latin.settings.Defaults.default import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.LayoutType import helium314.keyboard.latin.utils.LayoutUtils import helium314.keyboard.latin.utils.LayoutUtilsCustom import helium314.keyboard.latin.utils.Log +import helium314.keyboard.latin.utils.SubtypeSettings import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.getStringResourceOrName +import helium314.keyboard.latin.utils.mainLayoutName import helium314.keyboard.latin.utils.prefs import helium314.keyboard.settings.Setting import helium314.keyboard.settings.SettingsActivity @@ -190,16 +193,22 @@ private fun LayoutItemRow( IconButton( onClick = { showDeleteDialog = true } ) { Icon(painterResource(R.drawable.ic_bin), null) } - if (showDeleteDialog) + if (showDeleteDialog) { + val inUse = SubtypeSettings.getAdditionalSubtypes().any { st -> + val map = LayoutType.getLayoutMap(st.getExtraValueOf(ExtraValue.KEYBOARD_LAYOUT_SET)) + map[layoutType] == layoutName + } ConfirmationDialog( onDismissRequest = { showDeleteDialog = false }, - text = { Text(stringResource(R.string.delete_layout, LayoutUtilsCustom.getDisplayName(layoutName))) }, + title = { Text(stringResource(R.string.delete_layout, LayoutUtilsCustom.getDisplayName(layoutName))) }, + text = { if (inUse) Text(stringResource(R.string.layout_in_use)) }, confirmButtonText = stringResource(R.string.delete), onConfirmed = { showDeleteDialog = false onDelete(layoutName) } ) + } } IconButton( onClick = { onClickEdit(layoutName to (if (isCustom) null else LayoutUtils.getContent(layoutType, layoutName, ctx))) } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt index 16267d39..66dce945 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt @@ -2,6 +2,8 @@ package helium314.keyboard.settings.dialogs import android.content.Intent import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -9,20 +11,24 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import helium314.keyboard.compat.locale import helium314.keyboard.dictionarypack.DictionaryPackConstants import helium314.keyboard.latin.Dictionary import helium314.keyboard.latin.R import helium314.keyboard.latin.ReadOnlyBinaryDictionary -import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.makedict.DictionaryHeader import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX import helium314.keyboard.latin.utils.DictionaryInfoUtils import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.SubtypeSettings +import helium314.keyboard.latin.utils.locale +import helium314.keyboard.latin.utils.prefs import java.io.File import java.util.Locale @@ -40,17 +46,20 @@ fun NewDictionaryDialog( val ctx = LocalContext.current val dictLocale = header.mLocaleString.constructLocale() var locale by remember { mutableStateOf(mainLocale ?: dictLocale) } - val comparer = compareBy({ it != mainLocale}, { it != dictLocale }, { it.script() != dictLocale.script() }) + val enabledLanguages = SubtypeSettings.getEnabledSubtypes(ctx.prefs()).map { it.locale().language } + val comparer = compareBy({ it != mainLocale }, { it != dictLocale }, { it.language !in enabledLanguages }, { it.script() != dictLocale.script() }) val locales = SubtypeSettings.getAvailableSubtypeLocales().sortedWith(comparer) val cacheDir = DictionaryInfoUtils.getCacheDirectoryForLocale(locale, ctx) val dictFile = File(cacheDir, header.mIdString.substringBefore(":") + "_" + USER_DICTIONARY_SUFFIX) + val type = header.mIdString.substringBefore(":") + val info = header.info(ctx.resources.configuration.locale()) ThreeButtonAlertDialog( onDismissRequest = { onDismissRequest(); cachedFile.delete() }, onConfirmed = { dictFile.parentFile?.mkdirs() dictFile.delete() cachedFile.renameTo(dictFile) - if (header.mIdString.substringBefore(":") == Dictionary.TYPE_MAIN) { + if (type == Dictionary.TYPE_MAIN) { // replaced main dict, remove the one created from internal data val internalMainDictFile = File(cacheDir, DictionaryInfoUtils.getExtractedMainDictFilename()) internalMainDictFile.delete() @@ -60,7 +69,7 @@ fun NewDictionaryDialog( }, text = { Column { - Text(header.info(LocalContext.current.resources.configuration.locale())) + Text(info) // todo: dropdown takes very long to load, should be lazy! // but can't be lazy because of measurements (has width of widest element) // -> what do? @@ -68,11 +77,25 @@ fun NewDictionaryDialog( selectedItem = locale, onSelected = { locale = it }, items = locales - ) { Text(LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx)) } - if (locale.script() != dictLocale.script()) - Text("wrong script", color = MaterialTheme.colorScheme.error) // todo: string resource - if (dictFile.exists()) - Text("will overwrite existing dictionary", color = MaterialTheme.colorScheme.error) // todo: string resource + ) { Text(it.localizedDisplayName(ctx)) } + if (locale.script() != dictLocale.script()) { + // whatever, still allow it if the user wants + HorizontalDivider() + Text( + stringResource(R.string.dictionary_file_wrong_script), + color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(bottom = 8.dp, top = 4.dp) + ) + } + if (dictFile.exists()) { + val oldInfo = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(dictFile, 0, dictFile.length())?.info(ctx.resources.configuration.locale()) + HorizontalDivider() + Text( + stringResource(R.string.replace_dictionary_message, type, oldInfo ?: "(no info)", info), + color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(top = 4.dp) + ) + } } } ) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt index 0aeb92ae..4a32d253 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt @@ -43,8 +43,8 @@ import helium314.keyboard.keyboard.internal.keyboard_parser.morePopupKeysResId import helium314.keyboard.latin.R import helium314.keyboard.latin.common.Constants.Separators import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue -import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.LayoutType @@ -134,11 +134,12 @@ fun SubtypeDialog( } } if (showLayoutDeleteDialog) { - // todo: if layout used by other subtypes: either disable button, or explicitly mention in text + val others = SubtypeSettings.getAdditionalSubtypes().filter { st -> st.mainLayoutName() == it }.any { it != subtype } ConfirmationDialog( onDismissRequest = { showLayoutDeleteDialog = false }, confirmButtonText = stringResource(R.string.delete), title = { Text(stringResource(R.string.delete_layout, LayoutUtilsCustom.getDisplayName(it))) }, + text = { if (others) Text(stringResource(R.string.layout_in_use)) }, onConfirmed = { if (it == currentSubtype.mainLayoutName()) currentSubtype = currentSubtype.withoutLayout(LayoutType.MAIN) @@ -193,7 +194,7 @@ fun SubtypeDialog( WithSmallTitle(stringResource(R.string.secondary_locale)) { TextButton(onClick = { showSecondaryLocaleDialog = true }) { val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { - LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx) + it.localizedDisplayName(ctx) }.ifEmpty { stringResource(R.string.action_none) } Text(text, Modifier.fillMaxWidth(), style = MaterialTheme.typography.bodyLarge) } @@ -299,7 +300,7 @@ fun SubtypeDialog( items = availableLocalesForScript, initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES) ?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(), - getItemName = { LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx) } + getItemName = { it.localizedDisplayName(ctx) } ) if (showKeyOrderDialog) { val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt index ef0e05d6..c1d95c07 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt @@ -21,6 +21,7 @@ import helium314.keyboard.latin.Dictionary import helium314.keyboard.latin.R import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.common.splitOnWhitespace import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX import helium314.keyboard.latin.utils.DICTIONARY_URL @@ -56,7 +57,7 @@ fun DictionaryScreen( if (term.isBlank()) dictionaryLocales else dictionaryLocales.filter { it.language != SubtypeLocaleUtils.NO_LANGUAGE && - LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx).replace("(", "") + it.localizedDisplayName(ctx).replace("(", "") .splitOnWhitespace().any { it.startsWith(term, true) } } }, @@ -73,7 +74,7 @@ fun DictionaryScreen( val types = dicts.mapTo(mutableListOf()) { it.name.substringBefore("_${USER_DICTIONARY_SUFFIX}") } if (hasInternal && !types.contains(Dictionary.TYPE_MAIN)) types.add(0, stringResource(R.string.internal_dictionary_summary)) - Text(LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx)) + Text(it.localizedDisplayName(ctx)) Text( types.joinToString(", "), style = MaterialTheme.typography.bodyMedium, diff --git a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt index 0f5d6dd4..05d19516 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt @@ -25,8 +25,8 @@ import androidx.compose.ui.unit.dp import helium314.keyboard.latin.R import helium314.keyboard.latin.common.Constants.Separators import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue -import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.common.splitOnWhitespace import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX @@ -39,7 +39,6 @@ import helium314.keyboard.latin.utils.SubtypeUtilsAdditional import helium314.keyboard.latin.utils.displayName import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.locale -import helium314.keyboard.latin.utils.mainLayoutName import helium314.keyboard.latin.utils.prefs import helium314.keyboard.settings.SearchScreen import helium314.keyboard.settings.SettingsActivity @@ -86,7 +85,7 @@ fun LanguageScreen( Column(modifier = Modifier.weight(1f)) { Text(item.displayName(ctx), style = MaterialTheme.typography.bodyLarge) val description = item.getExtraValueOf(ExtraValue.SECONDARY_LOCALES)?.split(Separators.KV) - ?.joinToString(", ") { LocaleUtils.getLocaleDisplayNameInSystemLocale(it.constructLocale(), ctx) } + ?.joinToString(", ") { it.constructLocale().localizedDisplayName(ctx) } if (description != null) // todo: description should clarify when it's a default subtype that can't be changed / will be cloned Text( text = description, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bca7242c..2d28ab00 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -529,8 +529,10 @@ disposition rather than other common dispositions for Latin languages. [CHAR LIM Copy existing layout Set layout name - + Really delete custom layout %s? + + Warning: layout is in currently use Layout error: %s