From 22fea07e1a11e595a035e75b2f153bc956bcd93b Mon Sep 17 00:00:00 2001 From: "ronnie@machine" Date: Wed, 22 May 2024 21:40:03 +0300 Subject: [PATCH] added ability to filter/select languages (#19) * added ability to filter/select languages * fixed string casing * fixed: dvorak missing from init of dialog * First step to moving to mutableSet for selected languages * use MutableSet to store selected languages * Added callback to selectedLanguagesToToggle to invoke the changes * Simplify code by saving languages in a mutable set of Ints instead of strings * switched to a recycler view for the language selection dialog * Rename preference and format code - Renamed 'Selected keyboard languages' to 'Manage keyboard languages' - Simplify/format code --------- Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> Co-authored-by: Naveen Singh --- .../keyboard/activities/SettingsActivity.kt | 20 ++++++- .../ManageKeyboardLanguagesAdapter.kt | 55 +++++++++++++++++++ .../keyboard/dialogs/ChangeLanguagePopup.kt | 4 +- .../dialogs/ManageKeyboardLanguagesDialog.kt | 28 ++++++++++ .../fossify/keyboard/extensions/Context.kt | 32 +++-------- .../org/fossify/keyboard/helpers/Config.kt | 13 ++++- .../org/fossify/keyboard/helpers/Constants.kt | 26 +++++++++ app/src/main/res/layout/activity_settings.xml | 15 +++++ .../dialog_manage_keyboard_languages.xml | 16 ++++++ .../res/layout/language_checkbox_item.xml | 23 ++++++++ app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 12 files changed, 205 insertions(+), 29 deletions(-) create mode 100644 app/src/main/kotlin/org/fossify/keyboard/adapters/ManageKeyboardLanguagesAdapter.kt create mode 100644 app/src/main/kotlin/org/fossify/keyboard/dialogs/ManageKeyboardLanguagesDialog.kt create mode 100644 app/src/main/res/layout/dialog_manage_keyboard_languages.xml create mode 100644 app/src/main/res/layout/language_checkbox_item.xml diff --git a/app/src/main/kotlin/org/fossify/keyboard/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/keyboard/activities/SettingsActivity.kt index 642a504a..292e7751 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/activities/SettingsActivity.kt @@ -8,9 +8,10 @@ import org.fossify.commons.helpers.NavigationIcon import org.fossify.commons.helpers.isTiramisuPlus import org.fossify.commons.models.RadioItem import org.fossify.keyboard.databinding.ActivitySettingsBinding +import org.fossify.keyboard.dialogs.ManageKeyboardLanguagesDialog import org.fossify.keyboard.extensions.config import org.fossify.keyboard.extensions.getKeyboardLanguageText -import org.fossify.keyboard.extensions.getKeyboardLanguages +import org.fossify.keyboard.extensions.getKeyboardLanguagesRadioItems import org.fossify.keyboard.helpers.* import java.util.Locale import kotlin.system.exitProcess @@ -41,6 +42,7 @@ class SettingsActivity : SimpleActivity() { setupVibrateOnKeypress() setupShowPopupOnKeypress() setupShowKeyBorders() + setupManageKeyboardLanguages() setupKeyboardLanguage() setupKeyboardHeightMultiplier() setupShowClipboardContent() @@ -134,11 +136,25 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupManageKeyboardLanguages() { + binding.apply { + settingsManageKeyboardLanguagesHolder.setOnClickListener { + ManageKeyboardLanguagesDialog(this@SettingsActivity) { selectedLanguages -> + config.selectedLanguages = selectedLanguages + if (config.keyboardLanguage !in selectedLanguages) { + config.keyboardLanguage = selectedLanguages.first() + } + settingsKeyboardLanguage.text = getKeyboardLanguageText(config.keyboardLanguage) + } + } + } + } + private fun setupKeyboardLanguage() { binding.apply { settingsKeyboardLanguage.text = getKeyboardLanguageText(config.keyboardLanguage) settingsKeyboardLanguageHolder.setOnClickListener { - val items = getKeyboardLanguages() + val items = getKeyboardLanguagesRadioItems() RadioGroupDialog(this@SettingsActivity, items, config.keyboardLanguage) { config.keyboardLanguage = it as Int settingsKeyboardLanguage.text = getKeyboardLanguageText(config.keyboardLanguage) diff --git a/app/src/main/kotlin/org/fossify/keyboard/adapters/ManageKeyboardLanguagesAdapter.kt b/app/src/main/kotlin/org/fossify/keyboard/adapters/ManageKeyboardLanguagesAdapter.kt new file mode 100644 index 00000000..b5ef81b4 --- /dev/null +++ b/app/src/main/kotlin/org/fossify/keyboard/adapters/ManageKeyboardLanguagesAdapter.kt @@ -0,0 +1,55 @@ +package org.fossify.keyboard.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.fossify.commons.views.MyAppCompatCheckbox +import org.fossify.keyboard.R +import org.fossify.keyboard.extensions.getKeyboardLanguageText +import org.fossify.keyboard.helpers.Config + +internal class ManageKeyboardLanguagesAdapter( + private val config: Config, + private var languagesList: List, +) : RecyclerView.Adapter() { + private val selectedLanguages = config.selectedLanguages + + internal inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var languageCheckboxItem: MyAppCompatCheckbox = view.findViewById(R.id.language_checkbox) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { + val itemView = LayoutInflater.from(parent.context) + .inflate(R.layout.language_checkbox_item, parent, false) + return MyViewHolder(itemView) + } + + override fun onBindViewHolder(holder: MyViewHolder, position: Int) { + val item = languagesList[position] + holder.languageCheckboxItem.apply { + text = config.context.getKeyboardLanguageText(item) + isChecked = selectedLanguages.contains(item) + + setOnClickListener { + if (isChecked) { + selectedLanguages.add(item) + } else { + selectedLanguages.remove(item) + } + } + } + } + + override fun getItemCount(): Int { + return languagesList.size + } + + fun getSelectedLanguages(): MutableSet { + val defaultLang = config.getDefaultLanguage() + if (selectedLanguages.size == 0) { + selectedLanguages.add(defaultLang) + } + return selectedLanguages + } +} diff --git a/app/src/main/kotlin/org/fossify/keyboard/dialogs/ChangeLanguagePopup.kt b/app/src/main/kotlin/org/fossify/keyboard/dialogs/ChangeLanguagePopup.kt index 26ac18c6..344815a7 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/dialogs/ChangeLanguagePopup.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/dialogs/ChangeLanguagePopup.kt @@ -2,7 +2,7 @@ package org.fossify.keyboard.dialogs import android.view.View import org.fossify.keyboard.extensions.config -import org.fossify.keyboard.extensions.getKeyboardLanguages +import org.fossify.keyboard.extensions.getKeyboardLanguagesRadioItems class ChangeLanguagePopup( inputView: View, @@ -12,7 +12,7 @@ class ChangeLanguagePopup( private val config = context.config init { - val items = context.getKeyboardLanguages() + val items = context.getKeyboardLanguagesRadioItems() KeyboardRadioGroupDialog(inputView, items, config.keyboardLanguage) { config.keyboardLanguage = it as Int onSelect.invoke() diff --git a/app/src/main/kotlin/org/fossify/keyboard/dialogs/ManageKeyboardLanguagesDialog.kt b/app/src/main/kotlin/org/fossify/keyboard/dialogs/ManageKeyboardLanguagesDialog.kt new file mode 100644 index 00000000..987987d0 --- /dev/null +++ b/app/src/main/kotlin/org/fossify/keyboard/dialogs/ManageKeyboardLanguagesDialog.kt @@ -0,0 +1,28 @@ +package org.fossify.keyboard.dialogs + +import org.fossify.commons.activities.BaseSimpleActivity +import org.fossify.commons.extensions.getAlertDialogBuilder +import org.fossify.commons.extensions.setupDialogStuff +import org.fossify.keyboard.R +import org.fossify.keyboard.adapters.ManageKeyboardLanguagesAdapter +import org.fossify.keyboard.databinding.DialogManageKeyboardLanguagesBinding +import org.fossify.keyboard.extensions.config +import org.fossify.keyboard.helpers.SUPPORTED_LANGUAGES + +class ManageKeyboardLanguagesDialog( + private val activity: BaseSimpleActivity, + private val callback: (MutableSet) -> Unit +) { + init { + val binding = DialogManageKeyboardLanguagesBinding.inflate(activity.layoutInflater) + val adapter = ManageKeyboardLanguagesAdapter(activity.config, SUPPORTED_LANGUAGES) + binding.keyboardLanguageList.adapter = adapter + + activity.getAlertDialogBuilder() + .setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() } + .setPositiveButton(R.string.ok) { _, _ -> callback(adapter.getSelectedLanguages()) } + .apply { + activity.setupDialogStuff(binding.root, this) + } + } +} diff --git a/app/src/main/kotlin/org/fossify/keyboard/extensions/Context.kt b/app/src/main/kotlin/org/fossify/keyboard/extensions/Context.kt index e69c4c02..52d29711 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/extensions/Context.kt @@ -167,30 +167,14 @@ fun Context.setupKeyboardDialogStuff( } } -fun Context.getKeyboardLanguages(): ArrayList { - return arrayListOf( - RadioItem(LANGUAGE_BENGALI, getKeyboardLanguageText(LANGUAGE_BENGALI)), - RadioItem(LANGUAGE_BULGARIAN, getKeyboardLanguageText(LANGUAGE_BULGARIAN)), - RadioItem(LANGUAGE_DANISH, getKeyboardLanguageText(LANGUAGE_DANISH)), - RadioItem(LANGUAGE_ENGLISH_QWERTY, getKeyboardLanguageText(LANGUAGE_ENGLISH_QWERTY)), - RadioItem(LANGUAGE_ENGLISH_QWERTZ, getKeyboardLanguageText(LANGUAGE_ENGLISH_QWERTZ)), - RadioItem(LANGUAGE_ENGLISH_DVORAK, getKeyboardLanguageText(LANGUAGE_ENGLISH_DVORAK)), - RadioItem(LANGUAGE_FRENCH_AZERTY, getKeyboardLanguageText(LANGUAGE_FRENCH_AZERTY)), - RadioItem(LANGUAGE_FRENCH_BEPO, getKeyboardLanguageText(LANGUAGE_FRENCH_BEPO)), - RadioItem(LANGUAGE_GERMAN, getKeyboardLanguageText(LANGUAGE_GERMAN)), - RadioItem(LANGUAGE_GREEK, getKeyboardLanguageText(LANGUAGE_GREEK)), - RadioItem(LANGUAGE_LITHUANIAN, getKeyboardLanguageText(LANGUAGE_LITHUANIAN)), - RadioItem(LANGUAGE_NORWEGIAN, getKeyboardLanguageText(LANGUAGE_NORWEGIAN)), - RadioItem(LANGUAGE_POLISH, getKeyboardLanguageText(LANGUAGE_POLISH)), - RadioItem(LANGUAGE_ROMANIAN, getKeyboardLanguageText(LANGUAGE_ROMANIAN)), - RadioItem(LANGUAGE_RUSSIAN, getKeyboardLanguageText(LANGUAGE_RUSSIAN)), - RadioItem(LANGUAGE_SLOVENIAN, getKeyboardLanguageText(LANGUAGE_SLOVENIAN)), - RadioItem(LANGUAGE_SPANISH, getKeyboardLanguageText(LANGUAGE_SPANISH)), - RadioItem(LANGUAGE_SWEDISH, getKeyboardLanguageText(LANGUAGE_SWEDISH)), - RadioItem(LANGUAGE_TURKISH_Q, getKeyboardLanguageText(LANGUAGE_TURKISH_Q)), - RadioItem(LANGUAGE_UKRAINIAN, getKeyboardLanguageText(LANGUAGE_UKRAINIAN)), - RadioItem(LANGUAGE_VIETNAMESE_TELEX, getKeyboardLanguageText(LANGUAGE_VIETNAMESE_TELEX)), - ) +fun Context.getKeyboardLanguagesRadioItems(): ArrayList { + val selectedLanguagesRadioItems = arrayListOf() + + for (lang in config.selectedLanguages) { + selectedLanguagesRadioItems.add(RadioItem(lang, getKeyboardLanguageText(lang))) + } + + return selectedLanguagesRadioItems } fun Context.getKeyboardLanguageText(language: Int): String { diff --git a/app/src/main/kotlin/org/fossify/keyboard/helpers/Config.kt b/app/src/main/kotlin/org/fossify/keyboard/helpers/Config.kt index 413c3f49..df821729 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/helpers/Config.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/helpers/Config.kt @@ -51,7 +51,18 @@ class Config(context: Context) : BaseConfig(context) { } set(showNumbersRow) = prefs.edit().putBoolean(SHOW_NUMBERS_ROW, showNumbersRow).apply() - private fun getDefaultLanguage(): Int { + var selectedLanguages: MutableSet + get() { + val defaultLanguage = getDefaultLanguage().toString() + val stringSet = prefs.getStringSet(SELECTED_LANGUAGES, hashSetOf(defaultLanguage))!! + return stringSet.map { it.toInt() }.toMutableSet() + } + set(selectedLanguages) { + val stringSet = selectedLanguages.map { it.toString() }.toSet() + prefs.edit().putStringSet(SELECTED_LANGUAGES, stringSet).apply() + } + + fun getDefaultLanguage(): Int { val conf = context.resources.configuration return if (conf.locale.toString().lowercase(Locale.getDefault()).startsWith("ru_")) { LANGUAGE_RUSSIAN diff --git a/app/src/main/kotlin/org/fossify/keyboard/helpers/Constants.kt b/app/src/main/kotlin/org/fossify/keyboard/helpers/Constants.kt index ed9ec921..7639cf98 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/helpers/Constants.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/helpers/Constants.kt @@ -20,6 +20,7 @@ const val KEYBOARD_LANGUAGE = "keyboard_language" const val HEIGHT_PERCENTAGE = "height_percentage" const val SHOW_CLIPBOARD_CONTENT = "show_clipboard_content" const val SHOW_NUMBERS_ROW = "show_numbers_row" +const val SELECTED_LANGUAGES = "selected_languages" // differentiate current and pinned clips at the keyboards' Clipboard section const val ITEM_SECTION_LABEL = 0 @@ -47,6 +48,31 @@ const val LANGUAGE_VIETNAMESE_TELEX = 18 const val LANGUAGE_POLISH = 19 const val LANGUAGE_UKRAINIAN = 20 +// Keep this sorted +val SUPPORTED_LANGUAGES = listOf( + LANGUAGE_BENGALI, + LANGUAGE_BULGARIAN, + LANGUAGE_DANISH, + LANGUAGE_ENGLISH_QWERTY, + LANGUAGE_ENGLISH_QWERTZ, + LANGUAGE_ENGLISH_DVORAK, + LANGUAGE_FRENCH_AZERTY, + LANGUAGE_FRENCH_BEPO, + LANGUAGE_GERMAN, + LANGUAGE_GREEK, + LANGUAGE_LITHUANIAN, + LANGUAGE_NORWEGIAN, + LANGUAGE_POLISH, + LANGUAGE_ROMANIAN, + LANGUAGE_RUSSIAN, + LANGUAGE_SLOVENIAN, + LANGUAGE_SPANISH, + LANGUAGE_SWEDISH, + LANGUAGE_TURKISH_Q, + LANGUAGE_UKRAINIAN, + LANGUAGE_VIETNAMESE_TELEX +) + // keyboard height percentage options const val KEYBOARD_HEIGHT_70_PERCENT = 70 const val KEYBOARD_HEIGHT_80_PERCENT = 80 diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index cc51a991..7c799e35 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -221,6 +221,21 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/language_checkbox_item.xml b/app/src/main/res/layout/language_checkbox_item.xml new file mode 100644 index 00000000..8247f9b3 --- /dev/null +++ b/app/src/main/res/layout/language_checkbox_item.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8505d689..f94e101f 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -14,6 +14,7 @@ تم تثبيت النص تغيير نوع لوحة المفاتيح شريط المسافة + إدارة لغات لوحة المفاتيح إظهار محتوى الحافظة إذا كان متوفرا إظهار نافذة منبثقة عند الضغط على المفاتيح يهتز عند ضغط الزر diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f07cc615..5409ed7e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Current Pinned Add a new item + Manage keyboard languages You can manage or add clips here for quick access. Clip text Pin text