diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/settings/SettingsFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/settings/SettingsFragment.kt index 4b329498e70782d746b327c6a3e357b069637abd..9909cb82ff1d7a2f62dc33bf26a9ad4f9cd8655d 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/settings/SettingsFragment.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/settings/SettingsFragment.kt @@ -3,10 +3,12 @@ package org.briarproject.mailbox.android.ui.settings import android.os.Bundle import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope -import androidx.preference.Preference +import androidx.preference.Preference.OnPreferenceChangeListener import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -44,7 +46,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private lateinit var obfs4Pref: SwitchPreferenceCompat private lateinit var obfs4DefaultPref: SwitchPreferenceCompat private lateinit var vanillaPref: SwitchPreferenceCompat - private lateinit var brideTypePrefs: List<Preference> + private lateinit var brideTypePrefs: List<SwitchPreferenceCompat> private lateinit var bridgeTypesCategory: PreferenceCategory @Inject @@ -84,6 +86,17 @@ class SettingsFragment : PreferenceFragmentCompat() { brideTypePrefs = listOf( snowflakePref, meekPref, obfs4Pref, obfs4DefaultPref, vanillaPref ) + val typePrefChangedListener = OnPreferenceChangeListener { _, newValue -> + if (!(newValue as Boolean)) { + // allow change only if more than one bridge type is still checked + val allowChange = brideTypePrefs.count { it.isChecked } > 1 + if (!allowChange) showBridgeTypeSnackbar() + allowChange + } else true + } + brideTypePrefs.forEach { preference -> + preference.onPreferenceChangeListener = typePrefChangedListener + } bridgeTypesCategory = findPreference("bridgeTypesCategory")!! autoPref.setOnPreferenceChangeListener { _, newValue -> onAutoChanged(newValue as Boolean) @@ -95,6 +108,11 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + private fun showBridgeTypeSnackbar() { + val v = view ?: return + Snackbar.make(v, R.string.prefs_bridges_at_least_one, LENGTH_SHORT).show() + } + override fun onDestroy() { super.onDestroy() // apply settings only when user is leaving settings to prevent Tor changes on each toggle diff --git a/mailbox-android/src/main/res/values/strings.xml b/mailbox-android/src/main/res/values/strings.xml index c6caacd17879006ef68e0de40300ed2e81870f18..9d438cb95d7300d98dee3e28af6d6d1bcc10eb46 100644 --- a/mailbox-android/src/main/res/values/strings.xml +++ b/mailbox-android/src/main/res/values/strings.xml @@ -91,5 +91,6 @@ <string name="prefs_bridges_obfs4_title" translatable="false">Obfs4</string> <string name="prefs_bridges_obfs_builtin_title">Obfs4 from Tor Browser</string> <string name="prefs_bridges_meek_title" translatable="false">Meek</string> + <string name="prefs_bridges_at_least_one">At least one bridge type must be enabled, or disable \"Use bridges\".</string> </resources>