From 3363d08c17676c3e6ddb6c2a72a1b1adf215cb91 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Tue, 16 May 2023 14:17:18 -0300 Subject: [PATCH] Don't allow unchecking all bridge types --- .../android/ui/settings/SettingsFragment.kt | 22 +++++++++++++++++-- .../src/main/res/values/strings.xml | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) 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 4b329498..9909cb82 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 c6caacd1..9d438cb9 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> -- GitLab