add invisible view to block language switch when language has more than one layout

This commit is contained in:
Helium314 2023-10-20 13:44:14 +02:00
parent b8b0ea7dbb
commit a5fb604d2e
3 changed files with 47 additions and 28 deletions

View file

@ -11,7 +11,10 @@ import android.text.style.StyleSpan
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.* import android.widget.EditText
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.widget.SwitchCompat
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.widget.doAfterTextChanged import androidx.core.widget.doAfterTextChanged
@ -48,7 +51,7 @@ class LanguageFilterListFakePreference(searchField: EditText, recyclerView: Recy
} }
class LanguageAdapter(list: List<MutableList<SubtypeInfo>> = listOf(), context: Context) : private class LanguageAdapter(list: List<MutableList<SubtypeInfo>> = listOf(), context: Context) :
RecyclerView.Adapter<LanguageAdapter.ViewHolder>() { RecyclerView.Adapter<LanguageAdapter.ViewHolder>() {
var onlySystemLocales = false var onlySystemLocales = false
private val prefs = DeviceProtectedUtils.getSharedPreferences(context) private val prefs = DeviceProtectedUtils.getSharedPreferences(context)
@ -107,8 +110,8 @@ class LanguageAdapter(list: List<MutableList<SubtypeInfo>> = listOf(), context:
else isVisible = true else isVisible = true
} }
view.findViewById<Switch>(R.id.language_switch).apply { view.findViewById<SwitchCompat>(R.id.language_switch).apply {
isEnabled = !onlySystemLocales && infos.size == 1 isEnabled = !onlySystemLocales
// take care: isChecked changes if the language is scrolled out of view and comes back! // take care: isChecked changes if the language is scrolled out of view and comes back!
// disable the change listener when setting the checked status on scroll // disable the change listener when setting the checked status on scroll
// so it's only triggered on user interactions // so it's only triggered on user interactions
@ -116,26 +119,26 @@ class LanguageAdapter(list: List<MutableList<SubtypeInfo>> = listOf(), context:
isChecked = onlySystemLocales || infos.any { it.isEnabled } isChecked = onlySystemLocales || infos.any { it.isEnabled }
setOnCheckedChangeListener { _, b -> setOnCheckedChangeListener { _, b ->
if (b) { if (b) {
if (infos.size == 1) { if (!infos.first().hasDictionary)
if (!infos.first().hasDictionary) showMissingDictionaryDialog(context, infos.first().subtype.locale().toLocale())
showMissingDictionaryDialog(context, infos.first().subtype.locale().toLocale()) addEnabledSubtype(prefs, infos.first().subtype)
addEnabledSubtype(prefs, infos.first().subtype) infos.first().isEnabled = true
infos.single().isEnabled = true
} else {
// currently switch is disabled in this case
LanguageSettingsDialog(view.context, infos, fragment, onlySystemLocales, { setupDetailsTextAndSwitch() }).show()
}
} else { } else {
if (infos.size == 1) { removeEnabledSubtype(prefs, infos.first().subtype)
removeEnabledSubtype(prefs, infos.first().subtype) infos.first().isEnabled = false
infos.single().isEnabled = false
} else {
// currently switch is disabled in this case
LanguageSettingsDialog(view.context, infos, fragment, onlySystemLocales, { setupDetailsTextAndSwitch() }).show()
}
} }
} }
} }
view.findViewById<TextView>(R.id.blocker).apply {
if (infos.size < 2) {
isGone = true
return@apply
}
isVisible = true
setOnClickListener {
LanguageSettingsDialog(view.context, infos, fragment, onlySystemLocales, { setupDetailsTextAndSwitch() }).show()
}
}
} }
view.findViewById<TextView>(R.id.language_name).text = infos.first().displayName view.findViewById<TextView>(R.id.language_name).text = infos.first().displayName

View file

@ -8,8 +8,11 @@ import android.net.Uri
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.* import android.widget.ImageView
import android.widget.ScrollView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SwitchCompat
import androidx.core.view.get import androidx.core.view.get
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -99,7 +102,7 @@ class LanguageSettingsDialog(
SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype.subtype) SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype.subtype)
?: SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype.subtype) ?: SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype.subtype)
row.findViewById<View>(R.id.language_details).isGone = true row.findViewById<View>(R.id.language_details).isGone = true
row.findViewById<Switch>(R.id.language_switch).apply { row.findViewById<SwitchCompat>(R.id.language_switch).apply {
isChecked = subtype.isEnabled isChecked = subtype.isEnabled
isEnabled = !onlySystemLocales isEnabled = !onlySystemLocales
setOnCheckedChangeListener { _, b -> setOnCheckedChangeListener { _, b ->
@ -115,7 +118,7 @@ class LanguageSettingsDialog(
} }
} }
if (isAdditionalSubtype(subtype.subtype)) { if (isAdditionalSubtype(subtype.subtype)) {
row.findViewById<Switch>(R.id.language_switch).isEnabled = true row.findViewById<SwitchCompat>(R.id.language_switch).isEnabled = true
row.findViewById<ImageView>(R.id.delete_button).apply { row.findViewById<ImageView>(R.id.delete_button).apply {
isVisible = true isVisible = true
setOnClickListener { setOnClickListener {

View file

@ -35,11 +35,24 @@
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<Switch <RelativeLayout
android:id="@+id/language_switch"
android:padding="6dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" >
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/language_switch"
android:padding="6dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/blocker"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@id/language_switch"
android:layout_alignStart="@id/language_switch"
android:layout_alignBottom="@id/language_switch"
android:layout_alignTop="@id/language_switch" />
</RelativeLayout>
</LinearLayout> </LinearLayout>