mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-04-21 14:49:10 +00:00
solve a bunch of recent todos
This commit is contained in:
parent
86f15e11d8
commit
ff27d1f1c5
13 changed files with 95 additions and 70 deletions
|
@ -369,7 +369,7 @@ private constructor(val themeId: Int, @JvmField val mStyleId: Int) {
|
||||||
colorsString.split(";").forEach {
|
colorsString.split(";").forEach {
|
||||||
val ct = try {
|
val ct = try {
|
||||||
ColorType.valueOf(it.substringBefore(",").uppercase())
|
ColorType.valueOf(it.substringBefore(",").uppercase())
|
||||||
} catch (_: Exception) { // todo: which one?
|
} catch (_: IllegalArgumentException) {
|
||||||
return@forEach
|
return@forEach
|
||||||
}
|
}
|
||||||
val i = it.substringAfter(",").toIntOrNull() ?: return@forEach
|
val i = it.substringAfter(",").toIntOrNull() ?: return@forEach
|
||||||
|
|
|
@ -186,7 +186,6 @@ object LocaleUtils {
|
||||||
return getLocaleDisplayNameInLocale(locale, context.resources, context.resources.configuration.locale())
|
return getLocaleDisplayNameInLocale(locale, context.resources, context.resources.configuration.locale())
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: use this instead of getLocaleDisplayNameInSystemLocale in .kt files
|
|
||||||
fun Locale.localizedDisplayName(context: Context) =
|
fun Locale.localizedDisplayName(context: Context) =
|
||||||
getLocaleDisplayNameInLocale(this, context.resources, context.resources.configuration.locale())
|
getLocaleDisplayNameInLocale(this, context.resources, context.resources.configuration.locale())
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ enum class LayoutType {
|
||||||
val LayoutType.folder get() = "layouts${File.separator}${name.lowercase()}${File.separator}"
|
val LayoutType.folder get() = "layouts${File.separator}${name.lowercase()}${File.separator}"
|
||||||
|
|
||||||
val LayoutType.displayNameId get() = when (this) {
|
val LayoutType.displayNameId get() = when (this) {
|
||||||
MAIN -> TODO()
|
MAIN -> R.string.subtype_no_language
|
||||||
SYMBOLS -> R.string.layout_symbols
|
SYMBOLS -> R.string.layout_symbols
|
||||||
MORE_SYMBOLS -> R.string.layout_symbols_shifted
|
MORE_SYMBOLS -> R.string.layout_symbols_shifted
|
||||||
FUNCTIONAL -> R.string.layout_functional_keys
|
FUNCTIONAL -> R.string.layout_functional_keys
|
||||||
|
|
|
@ -102,7 +102,6 @@ object SubtypeSettings {
|
||||||
prefs.edit { putString(Settings.PREF_SELECTED_SUBTYPE, subtypeString) }
|
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 isAdditionalSubtype(subtype: InputMethodSubtype): Boolean = subtype in additionalSubtypes
|
||||||
|
|
||||||
fun getAdditionalSubtypes(): List<InputMethodSubtype> = additionalSubtypes.toList()
|
fun getAdditionalSubtypes(): List<InputMethodSubtype> = additionalSubtypes.toList()
|
||||||
|
|
|
@ -9,8 +9,8 @@ import helium314.keyboard.latin.R
|
||||||
import helium314.keyboard.latin.common.Constants.Separators
|
import helium314.keyboard.latin.common.Constants.Separators
|
||||||
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue
|
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue
|
||||||
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET
|
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.constructLocale
|
||||||
|
import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName
|
||||||
import helium314.keyboard.latin.define.DebugFlags
|
import helium314.keyboard.latin.define.DebugFlags
|
||||||
import helium314.keyboard.latin.settings.Defaults
|
import helium314.keyboard.latin.settings.Defaults
|
||||||
import helium314.keyboard.latin.settings.Settings
|
import helium314.keyboard.latin.settings.Settings
|
||||||
|
@ -72,7 +72,7 @@ fun getResourceSubtypes(resources: Resources): List<InputMethodSubtype> {
|
||||||
fun InputMethodSubtype.displayName(context: Context): String {
|
fun InputMethodSubtype.displayName(context: Context): String {
|
||||||
val layoutName = SubtypeLocaleUtils.getMainLayoutName(this)
|
val layoutName = SubtypeLocaleUtils.getMainLayoutName(this)
|
||||||
if (LayoutUtilsCustom.isCustomLayout(layoutName))
|
if (LayoutUtilsCustom.isCustomLayout(layoutName))
|
||||||
return "${LocaleUtils.getLocaleDisplayNameInSystemLocale(locale(), context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})"
|
return "${locale().localizedDisplayName(context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})"
|
||||||
return SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(this)
|
return SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,10 @@ import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.widget.RelativeLayout
|
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.appcompat.app.AppCompatActivity
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.ui.platform.ComposeView
|
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.ExecutorUtils
|
||||||
import helium314.keyboard.latin.utils.cleanUnusedMainDicts
|
import helium314.keyboard.latin.utils.cleanUnusedMainDicts
|
||||||
import helium314.keyboard.latin.utils.prefs
|
import helium314.keyboard.latin.utils.prefs
|
||||||
|
import helium314.keyboard.settings.dialogs.ConfirmationDialog
|
||||||
import helium314.keyboard.settings.dialogs.NewDictionaryDialog
|
import helium314.keyboard.settings.dialogs.NewDictionaryDialog
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import java.io.BufferedOutputStream
|
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
|
val prefChanged = MutableStateFlow(0) // simple counter, as the only relevant information is that something changed
|
||||||
private val dictUriFlow = MutableStateFlow<Uri?>(null)
|
private val dictUriFlow = MutableStateFlow<Uri?>(null)
|
||||||
private val cachedDictionaryFile by lazy { File(this.cacheDir.path + File.separator + "temp_dict") }
|
private val cachedDictionaryFile by lazy { File(this.cacheDir.path + File.separator + "temp_dict") }
|
||||||
|
private val crashReportFiles = MutableStateFlow<List<File>>(emptyList())
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@ -57,7 +57,7 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen
|
||||||
}
|
}
|
||||||
ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute { cleanUnusedMainDicts(this) }
|
ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute { cleanUnusedMainDicts(this) }
|
||||||
if (BuildConfig.DEBUG || DebugFlags.DEBUG_ENABLED)
|
if (BuildConfig.DEBUG || DebugFlags.DEBUG_ENABLED)
|
||||||
askAboutCrashReports()
|
crashReportFiles.value = findCrashReports()
|
||||||
|
|
||||||
// with this the layout edit dialog is not covered by the keyboard
|
// 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
|
// alternative of Modifier.imePadding() and properties = DialogProperties(decorFitsSystemWindows = false) has other weird side effects
|
||||||
|
@ -79,6 +79,8 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen
|
||||||
Theme {
|
Theme {
|
||||||
Surface {
|
Surface {
|
||||||
val dictUri by dictUriFlow.collectAsState()
|
val dictUri by dictUriFlow.collectAsState()
|
||||||
|
val crashReports by crashReportFiles.collectAsState()
|
||||||
|
val crashFilePicker = filePicker { saveCrashReports(it) }
|
||||||
if (spellchecker)
|
if (spellchecker)
|
||||||
Column { // lazy way of implementing spell checker settings
|
Column { // lazy way of implementing spell checker settings
|
||||||
settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference()
|
settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference()
|
||||||
|
@ -100,6 +102,23 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen
|
||||||
mainLocale = null
|
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
|
forceOppositeTheme = opposite
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: crash report stuff just just taken from old SettingsFragment and kotlinized
|
private fun findCrashReports(): List<File> {
|
||||||
// it should be updated to use compose, and maybe move to MainSettingsScreen
|
|
||||||
private val crashReportFiles = mutableListOf<File>()
|
|
||||||
private fun askAboutCrashReports() {
|
|
||||||
// find crash report files
|
// find crash report files
|
||||||
val dir: File = getExternalFilesDir(null) ?: return
|
val dir: File = getExternalFilesDir(null) ?: return emptyList()
|
||||||
val allFiles = dir.listFiles() ?: return
|
val allFiles = dir.listFiles() ?: return emptyList()
|
||||||
crashReportFiles.clear()
|
return allFiles.filter { it.name.startsWith("crash_report") }
|
||||||
for (file in allFiles) {
|
|
||||||
if (file.name.startsWith("crash_report")) crashReportFiles.add(file)
|
|
||||||
}
|
}
|
||||||
if (crashReportFiles.isEmpty()) return
|
|
||||||
AlertDialog.Builder(this)
|
private fun saveCrashReports(uri: Uri) {
|
||||||
.setMessage("Crash report files found")
|
val files = findCrashReports()
|
||||||
.setPositiveButton("get") { _, _ ->
|
if (files.isEmpty()) return
|
||||||
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()
|
|
||||||
}
|
|
||||||
private val crashReportFilePicker: ActivityResultLauncher<Intent> = 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
|
|
||||||
try {
|
try {
|
||||||
contentResolver.openOutputStream(uri)?.use {
|
contentResolver.openOutputStream(uri)?.use {
|
||||||
val bos = BufferedOutputStream(it)
|
val bos = BufferedOutputStream(it)
|
||||||
val z = ZipOutputStream(bos)
|
val z = ZipOutputStream(bos)
|
||||||
for (file in crashReportFiles) {
|
for (file in files) {
|
||||||
val f = FileInputStream(file)
|
val f = FileInputStream(file)
|
||||||
z.putNextEntry(ZipEntry(file.name))
|
z.putNextEntry(ZipEntry(file.name))
|
||||||
FileUtils.copyStreamToOtherStream(f, z)
|
FileUtils.copyStreamToOtherStream(f, z)
|
||||||
|
@ -198,10 +191,9 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen
|
||||||
}
|
}
|
||||||
z.close()
|
z.close()
|
||||||
bos.close()
|
bos.close()
|
||||||
for (file in crashReportFiles) {
|
for (file in files) {
|
||||||
file.delete()
|
file.delete()
|
||||||
}
|
}
|
||||||
crashReportFiles.clear()
|
|
||||||
}
|
}
|
||||||
} catch (ignored: IOException) {
|
} catch (ignored: IOException) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ import androidx.compose.ui.unit.dp
|
||||||
import helium314.keyboard.compat.locale
|
import helium314.keyboard.compat.locale
|
||||||
import helium314.keyboard.latin.Dictionary
|
import helium314.keyboard.latin.Dictionary
|
||||||
import helium314.keyboard.latin.R
|
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.latin.utils.DictionaryInfoUtils
|
||||||
import helium314.keyboard.settings.dictionaryFilePicker
|
import helium314.keyboard.settings.dictionaryFilePicker
|
||||||
import helium314.keyboard.settings.screens.getUserAndInternalDictionaries
|
import helium314.keyboard.settings.screens.getUserAndInternalDictionaries
|
||||||
|
@ -44,7 +44,7 @@ fun DictionaryDialog(
|
||||||
onConfirmed = {},
|
onConfirmed = {},
|
||||||
confirmButtonText = null,
|
confirmButtonText = null,
|
||||||
cancelButtonText = stringResource(R.string.dialog_close),
|
cancelButtonText = stringResource(R.string.dialog_close),
|
||||||
title = { Text(LocaleUtils.getLocaleDisplayNameInSystemLocale(locale, ctx)) },
|
title = { Text(locale.localizedDisplayName(ctx)) },
|
||||||
text = {
|
text = {
|
||||||
Column {
|
Column {
|
||||||
if (hasInternal) {
|
if (hasInternal) {
|
||||||
|
|
|
@ -34,14 +34,17 @@ import androidx.compose.ui.text.input.TextFieldValue
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import helium314.keyboard.latin.R
|
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.Defaults.default
|
||||||
import helium314.keyboard.latin.settings.Settings
|
import helium314.keyboard.latin.settings.Settings
|
||||||
import helium314.keyboard.latin.utils.LayoutType
|
import helium314.keyboard.latin.utils.LayoutType
|
||||||
import helium314.keyboard.latin.utils.LayoutUtils
|
import helium314.keyboard.latin.utils.LayoutUtils
|
||||||
import helium314.keyboard.latin.utils.LayoutUtilsCustom
|
import helium314.keyboard.latin.utils.LayoutUtilsCustom
|
||||||
import helium314.keyboard.latin.utils.Log
|
import helium314.keyboard.latin.utils.Log
|
||||||
|
import helium314.keyboard.latin.utils.SubtypeSettings
|
||||||
import helium314.keyboard.latin.utils.getActivity
|
import helium314.keyboard.latin.utils.getActivity
|
||||||
import helium314.keyboard.latin.utils.getStringResourceOrName
|
import helium314.keyboard.latin.utils.getStringResourceOrName
|
||||||
|
import helium314.keyboard.latin.utils.mainLayoutName
|
||||||
import helium314.keyboard.latin.utils.prefs
|
import helium314.keyboard.latin.utils.prefs
|
||||||
import helium314.keyboard.settings.Setting
|
import helium314.keyboard.settings.Setting
|
||||||
import helium314.keyboard.settings.SettingsActivity
|
import helium314.keyboard.settings.SettingsActivity
|
||||||
|
@ -190,10 +193,15 @@ private fun LayoutItemRow(
|
||||||
IconButton(
|
IconButton(
|
||||||
onClick = { showDeleteDialog = true }
|
onClick = { showDeleteDialog = true }
|
||||||
) { Icon(painterResource(R.drawable.ic_bin), null) }
|
) { 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(
|
ConfirmationDialog(
|
||||||
onDismissRequest = { showDeleteDialog = false },
|
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),
|
confirmButtonText = stringResource(R.string.delete),
|
||||||
onConfirmed = {
|
onConfirmed = {
|
||||||
showDeleteDialog = false
|
showDeleteDialog = false
|
||||||
|
@ -201,6 +209,7 @@ private fun LayoutItemRow(
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
IconButton(
|
IconButton(
|
||||||
onClick = { onClickEdit(layoutName to (if (isCustom) null else LayoutUtils.getContent(layoutType, layoutName, ctx))) }
|
onClick = { onClickEdit(layoutName to (if (isCustom) null else LayoutUtils.getContent(layoutType, layoutName, ctx))) }
|
||||||
) { Icon(painterResource(R.drawable.ic_edit), null) }
|
) { Icon(painterResource(R.drawable.ic_edit), null) }
|
||||||
|
|
|
@ -2,6 +2,8 @@ package helium314.keyboard.settings.dialogs
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import androidx.compose.foundation.layout.Column
|
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.MaterialTheme
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
@ -9,20 +11,24 @@ import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import helium314.keyboard.compat.locale
|
import helium314.keyboard.compat.locale
|
||||||
import helium314.keyboard.dictionarypack.DictionaryPackConstants
|
import helium314.keyboard.dictionarypack.DictionaryPackConstants
|
||||||
import helium314.keyboard.latin.Dictionary
|
import helium314.keyboard.latin.Dictionary
|
||||||
import helium314.keyboard.latin.R
|
import helium314.keyboard.latin.R
|
||||||
import helium314.keyboard.latin.ReadOnlyBinaryDictionary
|
import helium314.keyboard.latin.ReadOnlyBinaryDictionary
|
||||||
import helium314.keyboard.latin.common.LocaleUtils
|
|
||||||
import helium314.keyboard.latin.common.LocaleUtils.constructLocale
|
import helium314.keyboard.latin.common.LocaleUtils.constructLocale
|
||||||
|
import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName
|
||||||
import helium314.keyboard.latin.makedict.DictionaryHeader
|
import helium314.keyboard.latin.makedict.DictionaryHeader
|
||||||
import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX
|
import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX
|
||||||
import helium314.keyboard.latin.utils.DictionaryInfoUtils
|
import helium314.keyboard.latin.utils.DictionaryInfoUtils
|
||||||
import helium314.keyboard.latin.utils.ScriptUtils.script
|
import helium314.keyboard.latin.utils.ScriptUtils.script
|
||||||
import helium314.keyboard.latin.utils.SubtypeSettings
|
import helium314.keyboard.latin.utils.SubtypeSettings
|
||||||
|
import helium314.keyboard.latin.utils.locale
|
||||||
|
import helium314.keyboard.latin.utils.prefs
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
|
@ -40,17 +46,20 @@ fun NewDictionaryDialog(
|
||||||
val ctx = LocalContext.current
|
val ctx = LocalContext.current
|
||||||
val dictLocale = header.mLocaleString.constructLocale()
|
val dictLocale = header.mLocaleString.constructLocale()
|
||||||
var locale by remember { mutableStateOf(mainLocale ?: dictLocale) }
|
var locale by remember { mutableStateOf(mainLocale ?: dictLocale) }
|
||||||
val comparer = compareBy<Locale>({ it != mainLocale}, { it != dictLocale }, { it.script() != dictLocale.script() })
|
val enabledLanguages = SubtypeSettings.getEnabledSubtypes(ctx.prefs()).map { it.locale().language }
|
||||||
|
val comparer = compareBy<Locale>({ it != mainLocale }, { it != dictLocale }, { it.language !in enabledLanguages }, { it.script() != dictLocale.script() })
|
||||||
val locales = SubtypeSettings.getAvailableSubtypeLocales().sortedWith(comparer)
|
val locales = SubtypeSettings.getAvailableSubtypeLocales().sortedWith(comparer)
|
||||||
val cacheDir = DictionaryInfoUtils.getCacheDirectoryForLocale(locale, ctx)
|
val cacheDir = DictionaryInfoUtils.getCacheDirectoryForLocale(locale, ctx)
|
||||||
val dictFile = File(cacheDir, header.mIdString.substringBefore(":") + "_" + USER_DICTIONARY_SUFFIX)
|
val dictFile = File(cacheDir, header.mIdString.substringBefore(":") + "_" + USER_DICTIONARY_SUFFIX)
|
||||||
|
val type = header.mIdString.substringBefore(":")
|
||||||
|
val info = header.info(ctx.resources.configuration.locale())
|
||||||
ThreeButtonAlertDialog(
|
ThreeButtonAlertDialog(
|
||||||
onDismissRequest = { onDismissRequest(); cachedFile.delete() },
|
onDismissRequest = { onDismissRequest(); cachedFile.delete() },
|
||||||
onConfirmed = {
|
onConfirmed = {
|
||||||
dictFile.parentFile?.mkdirs()
|
dictFile.parentFile?.mkdirs()
|
||||||
dictFile.delete()
|
dictFile.delete()
|
||||||
cachedFile.renameTo(dictFile)
|
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
|
// replaced main dict, remove the one created from internal data
|
||||||
val internalMainDictFile = File(cacheDir, DictionaryInfoUtils.getExtractedMainDictFilename())
|
val internalMainDictFile = File(cacheDir, DictionaryInfoUtils.getExtractedMainDictFilename())
|
||||||
internalMainDictFile.delete()
|
internalMainDictFile.delete()
|
||||||
|
@ -60,7 +69,7 @@ fun NewDictionaryDialog(
|
||||||
},
|
},
|
||||||
text = {
|
text = {
|
||||||
Column {
|
Column {
|
||||||
Text(header.info(LocalContext.current.resources.configuration.locale()))
|
Text(info)
|
||||||
// todo: dropdown takes very long to load, should be lazy!
|
// todo: dropdown takes very long to load, should be lazy!
|
||||||
// but can't be lazy because of measurements (has width of widest element)
|
// but can't be lazy because of measurements (has width of widest element)
|
||||||
// -> what do?
|
// -> what do?
|
||||||
|
@ -68,11 +77,25 @@ fun NewDictionaryDialog(
|
||||||
selectedItem = locale,
|
selectedItem = locale,
|
||||||
onSelected = { locale = it },
|
onSelected = { locale = it },
|
||||||
items = locales
|
items = locales
|
||||||
) { Text(LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx)) }
|
) { Text(it.localizedDisplayName(ctx)) }
|
||||||
if (locale.script() != dictLocale.script())
|
if (locale.script() != dictLocale.script()) {
|
||||||
Text("wrong script", color = MaterialTheme.colorScheme.error) // todo: string resource
|
// whatever, still allow it if the user wants
|
||||||
if (dictFile.exists())
|
HorizontalDivider()
|
||||||
Text("will overwrite existing dictionary", color = MaterialTheme.colorScheme.error) // todo: string resource
|
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)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -43,8 +43,8 @@ import helium314.keyboard.keyboard.internal.keyboard_parser.morePopupKeysResId
|
||||||
import helium314.keyboard.latin.R
|
import helium314.keyboard.latin.R
|
||||||
import helium314.keyboard.latin.common.Constants.Separators
|
import helium314.keyboard.latin.common.Constants.Separators
|
||||||
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue
|
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.constructLocale
|
||||||
|
import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName
|
||||||
import helium314.keyboard.latin.settings.Defaults
|
import helium314.keyboard.latin.settings.Defaults
|
||||||
import helium314.keyboard.latin.settings.Settings
|
import helium314.keyboard.latin.settings.Settings
|
||||||
import helium314.keyboard.latin.utils.LayoutType
|
import helium314.keyboard.latin.utils.LayoutType
|
||||||
|
@ -134,11 +134,12 @@ fun SubtypeDialog(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (showLayoutDeleteDialog) {
|
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(
|
ConfirmationDialog(
|
||||||
onDismissRequest = { showLayoutDeleteDialog = false },
|
onDismissRequest = { showLayoutDeleteDialog = false },
|
||||||
confirmButtonText = stringResource(R.string.delete),
|
confirmButtonText = stringResource(R.string.delete),
|
||||||
title = { Text(stringResource(R.string.delete_layout, LayoutUtilsCustom.getDisplayName(it))) },
|
title = { Text(stringResource(R.string.delete_layout, LayoutUtilsCustom.getDisplayName(it))) },
|
||||||
|
text = { if (others) Text(stringResource(R.string.layout_in_use)) },
|
||||||
onConfirmed = {
|
onConfirmed = {
|
||||||
if (it == currentSubtype.mainLayoutName())
|
if (it == currentSubtype.mainLayoutName())
|
||||||
currentSubtype = currentSubtype.withoutLayout(LayoutType.MAIN)
|
currentSubtype = currentSubtype.withoutLayout(LayoutType.MAIN)
|
||||||
|
@ -193,7 +194,7 @@ fun SubtypeDialog(
|
||||||
WithSmallTitle(stringResource(R.string.secondary_locale)) {
|
WithSmallTitle(stringResource(R.string.secondary_locale)) {
|
||||||
TextButton(onClick = { showSecondaryLocaleDialog = true }) {
|
TextButton(onClick = { showSecondaryLocaleDialog = true }) {
|
||||||
val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") {
|
val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") {
|
||||||
LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx)
|
it.localizedDisplayName(ctx)
|
||||||
}.ifEmpty { stringResource(R.string.action_none) }
|
}.ifEmpty { stringResource(R.string.action_none) }
|
||||||
Text(text, Modifier.fillMaxWidth(), style = MaterialTheme.typography.bodyLarge)
|
Text(text, Modifier.fillMaxWidth(), style = MaterialTheme.typography.bodyLarge)
|
||||||
}
|
}
|
||||||
|
@ -299,7 +300,7 @@ fun SubtypeDialog(
|
||||||
items = availableLocalesForScript,
|
items = availableLocalesForScript,
|
||||||
initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES)
|
initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES)
|
||||||
?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(),
|
?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(),
|
||||||
getItemName = { LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx) }
|
getItemName = { it.localizedDisplayName(ctx) }
|
||||||
)
|
)
|
||||||
if (showKeyOrderDialog) {
|
if (showKeyOrderDialog) {
|
||||||
val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER)
|
val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER)
|
||||||
|
|
|
@ -21,6 +21,7 @@ import helium314.keyboard.latin.Dictionary
|
||||||
import helium314.keyboard.latin.R
|
import helium314.keyboard.latin.R
|
||||||
import helium314.keyboard.latin.common.LocaleUtils
|
import helium314.keyboard.latin.common.LocaleUtils
|
||||||
import helium314.keyboard.latin.common.LocaleUtils.constructLocale
|
import helium314.keyboard.latin.common.LocaleUtils.constructLocale
|
||||||
|
import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName
|
||||||
import helium314.keyboard.latin.common.splitOnWhitespace
|
import helium314.keyboard.latin.common.splitOnWhitespace
|
||||||
import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX
|
import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX
|
||||||
import helium314.keyboard.latin.utils.DICTIONARY_URL
|
import helium314.keyboard.latin.utils.DICTIONARY_URL
|
||||||
|
@ -56,7 +57,7 @@ fun DictionaryScreen(
|
||||||
if (term.isBlank()) dictionaryLocales
|
if (term.isBlank()) dictionaryLocales
|
||||||
else dictionaryLocales.filter {
|
else dictionaryLocales.filter {
|
||||||
it.language != SubtypeLocaleUtils.NO_LANGUAGE &&
|
it.language != SubtypeLocaleUtils.NO_LANGUAGE &&
|
||||||
LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx).replace("(", "")
|
it.localizedDisplayName(ctx).replace("(", "")
|
||||||
.splitOnWhitespace().any { it.startsWith(term, true) }
|
.splitOnWhitespace().any { it.startsWith(term, true) }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -73,7 +74,7 @@ fun DictionaryScreen(
|
||||||
val types = dicts.mapTo(mutableListOf()) { it.name.substringBefore("_${USER_DICTIONARY_SUFFIX}") }
|
val types = dicts.mapTo(mutableListOf()) { it.name.substringBefore("_${USER_DICTIONARY_SUFFIX}") }
|
||||||
if (hasInternal && !types.contains(Dictionary.TYPE_MAIN))
|
if (hasInternal && !types.contains(Dictionary.TYPE_MAIN))
|
||||||
types.add(0, stringResource(R.string.internal_dictionary_summary))
|
types.add(0, stringResource(R.string.internal_dictionary_summary))
|
||||||
Text(LocaleUtils.getLocaleDisplayNameInSystemLocale(it, ctx))
|
Text(it.localizedDisplayName(ctx))
|
||||||
Text(
|
Text(
|
||||||
types.joinToString(", "),
|
types.joinToString(", "),
|
||||||
style = MaterialTheme.typography.bodyMedium,
|
style = MaterialTheme.typography.bodyMedium,
|
||||||
|
|
|
@ -25,8 +25,8 @@ import androidx.compose.ui.unit.dp
|
||||||
import helium314.keyboard.latin.R
|
import helium314.keyboard.latin.R
|
||||||
import helium314.keyboard.latin.common.Constants.Separators
|
import helium314.keyboard.latin.common.Constants.Separators
|
||||||
import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue
|
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.constructLocale
|
||||||
|
import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName
|
||||||
import helium314.keyboard.latin.common.splitOnWhitespace
|
import helium314.keyboard.latin.common.splitOnWhitespace
|
||||||
import helium314.keyboard.latin.settings.Defaults
|
import helium314.keyboard.latin.settings.Defaults
|
||||||
import helium314.keyboard.latin.settings.USER_DICTIONARY_SUFFIX
|
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.displayName
|
||||||
import helium314.keyboard.latin.utils.getActivity
|
import helium314.keyboard.latin.utils.getActivity
|
||||||
import helium314.keyboard.latin.utils.locale
|
import helium314.keyboard.latin.utils.locale
|
||||||
import helium314.keyboard.latin.utils.mainLayoutName
|
|
||||||
import helium314.keyboard.latin.utils.prefs
|
import helium314.keyboard.latin.utils.prefs
|
||||||
import helium314.keyboard.settings.SearchScreen
|
import helium314.keyboard.settings.SearchScreen
|
||||||
import helium314.keyboard.settings.SettingsActivity
|
import helium314.keyboard.settings.SettingsActivity
|
||||||
|
@ -86,7 +85,7 @@ fun LanguageScreen(
|
||||||
Column(modifier = Modifier.weight(1f)) {
|
Column(modifier = Modifier.weight(1f)) {
|
||||||
Text(item.displayName(ctx), style = MaterialTheme.typography.bodyLarge)
|
Text(item.displayName(ctx), style = MaterialTheme.typography.bodyLarge)
|
||||||
val description = item.getExtraValueOf(ExtraValue.SECONDARY_LOCALES)?.split(Separators.KV)
|
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
|
if (description != null) // todo: description should clarify when it's a default subtype that can't be changed / will be cloned
|
||||||
Text(
|
Text(
|
||||||
text = description,
|
text = description,
|
||||||
|
|
|
@ -529,8 +529,10 @@ disposition rather than other common dispositions for Latin languages. [CHAR LIM
|
||||||
<string name="button_copy_existing_layout">Copy existing layout</string>
|
<string name="button_copy_existing_layout">Copy existing layout</string>
|
||||||
<!-- Title text for choosing a layout name -->
|
<!-- Title text for choosing a layout name -->
|
||||||
<string name="title_layout_name_select">Set layout name</string>
|
<string name="title_layout_name_select">Set layout name</string>
|
||||||
<!-- Message when deleting a layouts -->
|
<!-- Message when deleting a layout -->
|
||||||
<string name="delete_layout">Really delete custom layout %s?</string>
|
<string name="delete_layout">Really delete custom layout %s?</string>
|
||||||
|
<!-- Message when layout to be deleted is in use -->
|
||||||
|
<string name="layout_in_use">Warning: layout is in currently use</string>
|
||||||
<!-- Message on layout error -->
|
<!-- Message on layout error -->
|
||||||
<string name="layout_error">Layout error: %s</string>
|
<string name="layout_error">Layout error: %s</string>
|
||||||
<!-- Text hint for editing layout -->
|
<!-- Text hint for editing layout -->
|
||||||
|
|
Loading…
Add table
Reference in a new issue