diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
index c62ecb854..ee732b7b7 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
@@ -76,6 +76,7 @@ import static net.freehaven.tor.control.TorControlCommands.HS_ADDRESS;
import static net.freehaven.tor.control.TorControlCommands.HS_PRIVKEY;
import static org.briarproject.bramble.api.plugin.TorConstants.CONTROL_PORT;
import static org.briarproject.bramble.api.plugin.TorConstants.ID;
+import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_DISABLE_BLOCKED;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_ALWAYS;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_NEVER;
@@ -128,8 +129,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
LocationUtils locationUtils, SocketFactory torSocketFactory,
Clock clock, CircumventionProvider circumventionProvider,
Backoff backoff, DuplexPluginCallback callback,
- String architecture,
- int maxLatency, int maxIdleTime) {
+ String architecture, int maxLatency, int maxIdleTime) {
this.ioExecutor = ioExecutor;
this.appContext = appContext;
this.networkManager = networkManager;
@@ -661,6 +661,8 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
circumventionProvider.isTorProbablyBlocked(country);
Settings s = callback.getSettings();
int network = s.getInt(PREF_TOR_NETWORK, PREF_TOR_NETWORK_ALWAYS);
+ boolean disableWhenBlocked =
+ s.getBoolean(PREF_TOR_DISABLE_BLOCKED, true);
if (LOG.isLoggable(INFO)) {
LOG.info("Online: " + online + ", wifi: " + wifi);
@@ -681,9 +683,12 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
LOG.info("Enabling network, using bridges");
enableBridges(true);
enableNetwork(true);
- } else {
+ } else if (disableWhenBlocked) {
LOG.info("Disabling network, country is blocked");
enableNetwork(false);
+ } else {
+ LOG.info("Enabling network but country is blocked");
+ enableNetwork(true);
}
} else {
LOG.info("Enabling network");
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java
index 8f265a95e..6e9f712f9 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java
@@ -14,6 +14,7 @@ public interface TorConstants {
String PREF_TOR_NETWORK = "network";
String PREF_TOR_PORT = "port";
+ String PREF_TOR_DISABLE_BLOCKED = "disableWhenBlocked";
int PREF_TOR_NETWORK_NEVER = 0;
int PREF_TOR_NETWORK_WIFI = 1;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
index f5c38f23c..fbd69b7f8 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
@@ -70,6 +70,7 @@ import static android.widget.Toast.LENGTH_SHORT;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
import static org.briarproject.bramble.api.plugin.BluetoothConstants.PREF_BT_ENABLE;
+import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_DISABLE_BLOCKED;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_ALWAYS;
import static org.briarproject.bramble.util.LogUtils.logDuration;
@@ -104,6 +105,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
public static final String TOR_NAMESPACE = TorConstants.ID.getString();
public static final String LANGUAGE = "pref_key_language";
public static final String NOTIFY_SIGN_IN = "pref_key_notify_sign_in";
+ public static final String TOR_LOCATION = "pref_key_tor_location";
private static final Logger LOG =
Logger.getLogger(SettingsFragment.class.getName());
@@ -112,6 +114,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
private ListPreference language;
private ListPreference enableBluetooth;
private ListPreference torNetwork;
+ private CheckBoxPreference torBlocked;
private CheckBoxPreference notifyPrivateMessages;
private CheckBoxPreference notifyGroupMessages;
private CheckBoxPreference notifyForumPosts;
@@ -150,6 +153,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
(ListPreference) findPreference("pref_key_theme");
enableBluetooth = (ListPreference) findPreference("pref_key_bluetooth");
torNetwork = (ListPreference) findPreference("pref_key_tor_network");
+ torBlocked = (CheckBoxPreference) findPreference(TOR_LOCATION);
CheckBoxPreference notifySignIn =
(CheckBoxPreference) findPreference(NOTIFY_SIGN_IN);
notifyPrivateMessages = (CheckBoxPreference) findPreference(
@@ -189,6 +193,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
});
enableBluetooth.setOnPreferenceChangeListener(this);
torNetwork.setOnPreferenceChangeListener(this);
+ torBlocked.setOnPreferenceChangeListener(this);
if (SDK_INT >= 21) {
notifyLockscreen.setVisible(true);
notifyLockscreen.setOnPreferenceChangeListener(this);
@@ -299,19 +304,24 @@ public class SettingsFragment extends PreferenceFragmentCompat
logDuration(LOG, "Loading settings", start);
boolean btSetting =
btSettings.getBoolean(PREF_BT_ENABLE, false);
- int torSetting = torSettings.getInt(PREF_TOR_NETWORK,
+ int torNetworkSetting = torSettings.getInt(PREF_TOR_NETWORK,
PREF_TOR_NETWORK_ALWAYS);
- displaySettings(btSetting, torSetting);
+ boolean torBlockedSetting =
+ torSettings.getBoolean(PREF_TOR_DISABLE_BLOCKED, true);
+ displaySettings(btSetting, torNetworkSetting,
+ torBlockedSetting);
} catch (DbException e) {
logException(LOG, WARNING, e);
}
});
}
- private void displaySettings(boolean btSetting, int torSetting) {
+ private void displaySettings(boolean btSetting, int torNetworkSetting,
+ boolean torBlockedSetting) {
listener.runOnUiThreadUnlessDestroyed(() -> {
enableBluetooth.setValue(Boolean.toString(btSetting));
- torNetwork.setValue(Integer.toString(torSetting));
+ torNetwork.setValue(Integer.toString(torNetworkSetting));
+ torBlocked.setChecked(torBlockedSetting);
if (SDK_INT < 26) {
notifyPrivateMessages.setChecked(settings.getBoolean(
@@ -371,6 +381,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
// - pref_key_notify_sign_in
enableBluetooth.setEnabled(enabled);
torNetwork.setEnabled(enabled);
+ torBlocked.setEnabled(enabled);
notifyPrivateMessages.setEnabled(enabled);
notifyGroupMessages.setEnabled(enabled);
notifyForumPosts.setEnabled(enabled);
@@ -430,8 +441,11 @@ public class SettingsFragment extends PreferenceFragmentCompat
boolean btSetting = Boolean.valueOf((String) newValue);
storeBluetoothSettings(btSetting);
} else if (preference == torNetwork) {
- int torSetting = Integer.valueOf((String) newValue);
- storeTorSettings(torSetting);
+ int torNetworkSetting = Integer.valueOf((String) newValue);
+ storeTorNetworkSetting(torNetworkSetting);
+ } else if (preference == torBlocked) {
+ boolean torBlockedSetting = (Boolean) newValue;
+ storeTorBlockedSetting(torBlockedSetting);
} else if (preference == notifyPrivateMessages) {
Settings s = new Settings();
s.putBoolean(PREF_NOTIFY_PRIVATE, (Boolean) newValue);
@@ -480,39 +494,33 @@ public class SettingsFragment extends PreferenceFragmentCompat
builder.show();
}
- private void storeTorSettings(int torSetting) {
- listener.runOnDbThread(() -> {
- try {
- Settings s = new Settings();
- s.putInt(PREF_TOR_NETWORK, torSetting);
- long start = now();
- settingsManager.mergeSettings(s, TOR_NAMESPACE);
- logDuration(LOG, "Merging settings", start);
- } catch (DbException e) {
- logException(LOG, WARNING, e);
- }
- });
+ private void storeTorNetworkSetting(int torNetworkSetting) {
+ Settings s = new Settings();
+ s.putInt(PREF_TOR_NETWORK, torNetworkSetting);
+ mergeSettings(s, TOR_NAMESPACE);
+ }
+
+ private void storeTorBlockedSetting(boolean torBlockedSetting) {
+ Settings s = new Settings();
+ s.putBoolean(PREF_TOR_DISABLE_BLOCKED, torBlockedSetting);
+ mergeSettings(s, TOR_NAMESPACE);
}
private void storeBluetoothSettings(boolean btSetting) {
- listener.runOnDbThread(() -> {
- try {
- Settings s = new Settings();
- s.putBoolean(PREF_BT_ENABLE, btSetting);
- long start = now();
- settingsManager.mergeSettings(s, BT_NAMESPACE);
- logDuration(LOG, "Merging settings", start);
- } catch (DbException e) {
- logException(LOG, WARNING, e);
- }
- });
+ Settings s = new Settings();
+ s.putBoolean(PREF_BT_ENABLE, btSetting);
+ mergeSettings(s, BT_NAMESPACE);
}
- private void storeSettings(Settings settings) {
+ private void storeSettings(Settings s) {
+ mergeSettings(s, SETTINGS_NAMESPACE);
+ }
+
+ private void mergeSettings(Settings s, String namespace) {
listener.runOnDbThread(() -> {
try {
long start = now();
- settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
+ settingsManager.mergeSettings(s, namespace);
logDuration(LOG, "Merging settings", start);
} catch (DbException e) {
logException(LOG, WARNING, e);
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 06a09ddce..d51576c29 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -348,6 +348,8 @@
Never
Only when using Wi-Fi
When using Wi-Fi or mobile data
+ Disable Tor based on location
+ Disable Tor in countries where it is likely to be blocked
Security
diff --git a/briar-android/src/main/res/xml/settings.xml b/briar-android/src/main/res/xml/settings.xml
index c81fbb2ad..6d78bbc69 100644
--- a/briar-android/src/main/res/xml/settings.xml
+++ b/briar-android/src/main/res/xml/settings.xml
@@ -44,6 +44,13 @@
android:summary="%s"
android:title="@string/tor_network_setting"/>
+
+