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 6653b916edf7b8cb6e06a52bd3fabb35a798e378..d1a1405c7e46bf4c7ddb531d27ba062038321f47 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 @@ -12,6 +12,7 @@ import kotlinx.coroutines.withContext import org.briarproject.mailbox.R import org.briarproject.mailbox.android.ui.MailboxViewModel import org.briarproject.mailbox.core.settings.SettingsManager +import org.briarproject.mailbox.core.system.LocationUtils import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_AUTO import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_MEEK @@ -20,6 +21,12 @@ import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_OBFS4_DEFAULT import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_SNOWFLAKE import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_VANILLA import org.briarproject.mailbox.core.tor.TorConstants.SETTINGS_NAMESPACE +import org.briarproject.onionwrapper.CircumventionProvider +import org.briarproject.onionwrapper.CircumventionProvider.BridgeType.DEFAULT_OBFS4 +import org.briarproject.onionwrapper.CircumventionProvider.BridgeType.MEEK +import org.briarproject.onionwrapper.CircumventionProvider.BridgeType.NON_DEFAULT_OBFS4 +import org.briarproject.onionwrapper.CircumventionProvider.BridgeType.SNOWFLAKE +import org.briarproject.onionwrapper.CircumventionProvider.BridgeType.VANILLA import javax.inject.Inject @AndroidEntryPoint @@ -29,9 +36,16 @@ class SettingsFragment : PreferenceFragmentCompat() { @Inject lateinit var settingsManager: SettingsManager + @Inject lateinit var torSettingsStore: TorSettingsStore + @Inject + lateinit var locationUtils: LocationUtils + + @Inject + lateinit var circumventionProvider: CircumventionProvider + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val autoPref = findPreference<SwitchPreferenceCompat>(BRIDGE_AUTO)!! @@ -44,14 +58,31 @@ class SettingsFragment : PreferenceFragmentCompat() { lifecycleScope.launch(Dispatchers.IO) { val settings = settingsManager.getSettings(SETTINGS_NAMESPACE) withContext(Dispatchers.Main) { - // TODO get better defaults based on locations autoPref.isChecked = settings.getBoolean(BRIDGE_AUTO, true) - usePref.isChecked = settings.getBoolean(BRIDGE_USE, false) - snowflakePref.isChecked = settings.getBoolean(BRIDGE_USE_SNOWFLAKE, false) - meekPref.isChecked = settings.getBoolean(BRIDGE_USE_MEEK, false) - obfs4Pref.isChecked = settings.getBoolean(BRIDGE_USE_OBFS4, false) - obfs4DefaultPref.isChecked = settings.getBoolean(BRIDGE_USE_OBFS4_DEFAULT, false) - vanillaPref.isChecked = settings.getBoolean(BRIDGE_USE_VANILLA, false) + val country = locationUtils.currentCountry + val doBridgesWork = circumventionProvider.doBridgesWork(country) + usePref.isChecked = settings.getBoolean(BRIDGE_USE, doBridgesWork) + val defaultTypes = circumventionProvider.getSuitableBridgeTypes(country) + snowflakePref.isChecked = settings.getBoolean( + key = BRIDGE_USE_SNOWFLAKE, + defaultValue = defaultTypes.contains(SNOWFLAKE), + ) + meekPref.isChecked = settings.getBoolean( + key = BRIDGE_USE_MEEK, + defaultValue = defaultTypes.contains(MEEK), + ) + obfs4Pref.isChecked = settings.getBoolean( + key = BRIDGE_USE_OBFS4, + defaultValue = defaultTypes.contains(NON_DEFAULT_OBFS4), + ) + obfs4DefaultPref.isChecked = settings.getBoolean( + key = BRIDGE_USE_OBFS4_DEFAULT, + defaultValue = defaultTypes.contains(DEFAULT_OBFS4), + ) + vanillaPref.isChecked = settings.getBoolean( + key = BRIDGE_USE_VANILLA, + defaultValue = defaultTypes.contains(VANILLA), + ) preferenceManager.preferenceDataStore = torSettingsStore } } @@ -59,6 +90,7 @@ class SettingsFragment : PreferenceFragmentCompat() { override fun onDestroy() { super.onDestroy() + // apply settings only when user is leaving settings to prevent Tor changes on each toggle viewModel.onSettingsChanged() } } diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/AbstractTorPlugin.java b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/AbstractTorPlugin.java index f9bd904543619e9c5e4d6ddc3f15e9f73c5092bf..adc20c3a19e0dc2bd6059b6e8e991b6eb69d710b 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/AbstractTorPlugin.java +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/AbstractTorPlugin.java @@ -332,19 +332,31 @@ public abstract class AbstractTorPlugin implements TorPlugin, EventListener { LOG.info("Not using bridges"); } } else { - boolean useBridges = settings.getBoolean(BRIDGE_USE, false); + boolean useBridges = settings.getBoolean(BRIDGE_USE, bridgesNeeded); if (useBridges) { + List<BridgeType> defaultTypes = + circumventionProvider.getSuitableBridgeTypes(country); ArrayList<BridgeType> types = new ArrayList<>(); - if (settings.getBoolean(BRIDGE_USE_SNOWFLAKE, false)) + if (settings.getBoolean(BRIDGE_USE_SNOWFLAKE, + defaultTypes.contains(SNOWFLAKE))) { types.add(SNOWFLAKE); - if (settings.getBoolean(BRIDGE_USE_MEEK, false)) + } + if (settings.getBoolean(BRIDGE_USE_MEEK, + defaultTypes.contains(MEEK))) { types.add(MEEK); - if (settings.getBoolean(BRIDGE_USE_OBFS4, false)) + } + if (settings.getBoolean(BRIDGE_USE_OBFS4, + defaultTypes.contains(NON_DEFAULT_OBFS4))) { types.add(NON_DEFAULT_OBFS4); - if (settings.getBoolean(BRIDGE_USE_OBFS4_DEFAULT, false)) + } + if (settings.getBoolean(BRIDGE_USE_OBFS4_DEFAULT, + defaultTypes.contains(DEFAULT_OBFS4))) { types.add(DEFAULT_OBFS4); - if (settings.getBoolean(BRIDGE_USE_VANILLA, false)) + } + if (settings.getBoolean(BRIDGE_USE_VANILLA, + defaultTypes.contains(VANILLA))) { types.add(VANILLA); + } bridgeTypes = types; if (LOG.isInfoEnabled()) { LOG.info("Using bridge types " + bridgeTypes);