mirror of
https://github.com/syncthing/syncthing-android.git
synced 2024-12-23 11:21:29 +00:00
Add proxy settings to settings UI (fixes #766)
This commit is contained in:
parent
69885e2aa2
commit
030ef4ee7b
5 changed files with 127 additions and 4 deletions
|
@ -13,6 +13,7 @@ import android.preference.EditTextPreference;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
@ -107,7 +108,11 @@ public class SettingsActivity extends SyncthingActivity {
|
||||||
|
|
||||||
private Preference mCategoryBackup;
|
private Preference mCategoryBackup;
|
||||||
|
|
||||||
|
/* Experimental options */
|
||||||
private CheckBoxPreference mUseRoot;
|
private CheckBoxPreference mUseRoot;
|
||||||
|
private CheckBoxPreference mUseTor;
|
||||||
|
private EditTextPreference mSocksProxyAddress;
|
||||||
|
private EditTextPreference mHttpProxyAddress;
|
||||||
|
|
||||||
private Preference mSyncthingVersion;
|
private Preference mSyncthingVersion;
|
||||||
|
|
||||||
|
@ -191,8 +196,10 @@ public class SettingsActivity extends SyncthingActivity {
|
||||||
Preference stResetDeltas = findPreference("st_reset_deltas");
|
Preference stResetDeltas = findPreference("st_reset_deltas");
|
||||||
|
|
||||||
mUseRoot = (CheckBoxPreference) findPreference(Constants.PREF_USE_ROOT);
|
mUseRoot = (CheckBoxPreference) findPreference(Constants.PREF_USE_ROOT);
|
||||||
Preference useWakelock = findPreference(Constants.PREF_USE_WAKE_LOCK);
|
Preference useWakelock = (CheckBoxPreference) findPreference(Constants.PREF_USE_WAKE_LOCK);
|
||||||
Preference useTor = findPreference(Constants.PREF_USE_TOR);
|
mUseTor = (CheckBoxPreference) findPreference(Constants.PREF_USE_TOR);
|
||||||
|
mSocksProxyAddress = (EditTextPreference) findPreference(Constants.PREF_SOCKS_PROXY_ADDRESS);
|
||||||
|
mHttpProxyAddress = (EditTextPreference) findPreference(Constants.PREF_HTTP_PROXY_ADDRESS);
|
||||||
|
|
||||||
mSyncthingVersion = findPreference("syncthing_version");
|
mSyncthingVersion = findPreference("syncthing_version");
|
||||||
Preference appVersion = screen.findPreference("app_version");
|
Preference appVersion = screen.findPreference("app_version");
|
||||||
|
@ -211,9 +218,20 @@ public class SettingsActivity extends SyncthingActivity {
|
||||||
stResetDatabase.setOnPreferenceClickListener(this);
|
stResetDatabase.setOnPreferenceClickListener(this);
|
||||||
stResetDeltas.setOnPreferenceClickListener(this);
|
stResetDeltas.setOnPreferenceClickListener(this);
|
||||||
|
|
||||||
|
/* Experimental options */
|
||||||
mUseRoot.setOnPreferenceClickListener(this);
|
mUseRoot.setOnPreferenceClickListener(this);
|
||||||
useWakelock.setOnPreferenceChangeListener((p, o) -> requireRestart());
|
useWakelock.setOnPreferenceChangeListener((p, o) -> requireRestart());
|
||||||
useTor.setOnPreferenceChangeListener((p, o) -> requireRestart());
|
mUseTor.setOnPreferenceChangeListener(this);
|
||||||
|
|
||||||
|
mSocksProxyAddress.setEnabled(!(Boolean) mUseTor.isChecked());
|
||||||
|
mSocksProxyAddress.setOnPreferenceChangeListener(this);
|
||||||
|
mHttpProxyAddress.setEnabled(!(Boolean) mUseTor.isChecked());
|
||||||
|
mHttpProxyAddress.setOnPreferenceChangeListener(this);
|
||||||
|
|
||||||
|
/* Initialize summaries */
|
||||||
|
mPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
||||||
|
handleSocksProxyPreferenceChange(screen.findPreference(Constants.PREF_SOCKS_PROXY_ADDRESS), mPreferences.getString(Constants.PREF_SOCKS_PROXY_ADDRESS, ""));
|
||||||
|
handleHttpProxyPreferenceChange(screen.findPreference(Constants.PREF_HTTP_PROXY_ADDRESS), mPreferences.getString(Constants.PREF_HTTP_PROXY_ADDRESS, ""));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
appVersion.setSummary(getActivity().getPackageManager()
|
appVersion.setSummary(getActivity().getPackageManager()
|
||||||
|
@ -392,6 +410,29 @@ public class SettingsActivity extends SyncthingActivity {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Constants.PREF_USE_TOR:
|
||||||
|
mSocksProxyAddress.setEnabled(!(Boolean) o);
|
||||||
|
mHttpProxyAddress.setEnabled(!(Boolean) o);
|
||||||
|
requireRestart();
|
||||||
|
break;
|
||||||
|
case Constants.PREF_SOCKS_PROXY_ADDRESS:
|
||||||
|
if (o.toString().trim().equals(mPreferences.getString(Constants.PREF_SOCKS_PROXY_ADDRESS, "")))
|
||||||
|
return false;
|
||||||
|
if (handleSocksProxyPreferenceChange(preference, o.toString().trim())) {
|
||||||
|
requireRestart();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Constants.PREF_HTTP_PROXY_ADDRESS:
|
||||||
|
if (o.toString().trim().equals(mPreferences.getString(Constants.PREF_HTTP_PROXY_ADDRESS, "")))
|
||||||
|
return false;
|
||||||
|
if (handleHttpProxyPreferenceChange(preference, o.toString().trim())) {
|
||||||
|
requireRestart();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -512,5 +553,43 @@ public class SettingsActivity extends SyncthingActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles a new user input for the SOCKS proxy preference.
|
||||||
|
* Returns if the changed setting requires a restart.
|
||||||
|
*/
|
||||||
|
private boolean handleSocksProxyPreferenceChange(Preference preference, String newValue) {
|
||||||
|
// Valid input is either a proxy address or an empty field to disable the proxy.
|
||||||
|
if (newValue.equals("")) {
|
||||||
|
preference.setSummary(getString(R.string.do_not_use_proxy) + " " + getString(R.string.generic_example) + ": " + getString(R.string.socks_proxy_address_example));
|
||||||
|
return true;
|
||||||
|
} else if (newValue.matches("^socks5://.*:\\d{1,5}$")) {
|
||||||
|
preference.setSummary(getString(R.string.use_proxy) + " " + newValue);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getActivity(), R.string.toast_invalid_socks_proxy_address, Toast.LENGTH_SHORT)
|
||||||
|
.show();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles a new user input for the HTTP(S) proxy preference.
|
||||||
|
* Returns if the changed setting requires a restart.
|
||||||
|
*/
|
||||||
|
private boolean handleHttpProxyPreferenceChange(Preference preference, String newValue) {
|
||||||
|
// Valid input is either a proxy address or an empty field to disable the proxy.
|
||||||
|
if (newValue.equals("")) {
|
||||||
|
preference.setSummary(getString(R.string.do_not_use_proxy) + " " + getString(R.string.generic_example) + ": " + getString(R.string.http_proxy_address_example));
|
||||||
|
return true;
|
||||||
|
} else if (newValue.matches("^http://.*:\\d{1,5}$")) {
|
||||||
|
preference.setSummary(getString(R.string.use_proxy) + " " + newValue);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getActivity(), R.string.toast_invalid_http_proxy_address, Toast.LENGTH_SHORT)
|
||||||
|
.show();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@ public class Constants {
|
||||||
public static final String PREF_NOTIFICATION_TYPE = "notification_type";
|
public static final String PREF_NOTIFICATION_TYPE = "notification_type";
|
||||||
public static final String PREF_USE_WAKE_LOCK = "wakelock_while_binary_running";
|
public static final String PREF_USE_WAKE_LOCK = "wakelock_while_binary_running";
|
||||||
public static final String PREF_USE_TOR = "use_tor";
|
public static final String PREF_USE_TOR = "use_tor";
|
||||||
|
public static final String PREF_SOCKS_PROXY_ADDRESS = "socks_proxy_address";
|
||||||
|
public static final String PREF_HTTP_PROXY_ADDRESS = "http_proxy_address";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On Android 8.1, ACCESS_COARSE_LOCATION is required to access WiFi SSID.
|
* On Android 8.1, ACCESS_COARSE_LOCATION is required to access WiFi SSID.
|
||||||
|
|
|
@ -376,6 +376,17 @@ public class SyncthingRunnable implements Runnable {
|
||||||
if (mPreferences.getBoolean(Constants.PREF_USE_TOR, false)) {
|
if (mPreferences.getBoolean(Constants.PREF_USE_TOR, false)) {
|
||||||
targetEnv.put("all_proxy", "socks5://localhost:9050");
|
targetEnv.put("all_proxy", "socks5://localhost:9050");
|
||||||
targetEnv.put("ALL_PROXY_NO_FALLBACK", "1");
|
targetEnv.put("ALL_PROXY_NO_FALLBACK", "1");
|
||||||
|
} else {
|
||||||
|
String socksProxyAddress = mPreferences.getString(Constants.PREF_SOCKS_PROXY_ADDRESS, "");
|
||||||
|
if (!socksProxyAddress.equals("")) {
|
||||||
|
targetEnv.put("all_proxy", socksProxyAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
String httpProxyAddress = mPreferences.getString(Constants.PREF_HTTP_PROXY_ADDRESS, "");
|
||||||
|
if (!httpProxyAddress.equals("")) {
|
||||||
|
targetEnv.put("http_proxy", httpProxyAddress);
|
||||||
|
targetEnv.put("https_proxy", httpProxyAddress);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (mPreferences.getBoolean("use_legacy_hashing", false))
|
if (mPreferences.getBoolean("use_legacy_hashing", false))
|
||||||
targetEnv.put("STHASHING", "standard");
|
targetEnv.put("STHASHING", "standard");
|
||||||
|
|
|
@ -18,6 +18,9 @@ Please report any problems you encounter via Github.</string>
|
||||||
|
|
||||||
<string name="cont">Continue</string>
|
<string name="cont">Continue</string>
|
||||||
|
|
||||||
|
<!-- Generic texts used everywhere -->
|
||||||
|
<string name="generic_example">Example</string>
|
||||||
|
|
||||||
<!-- MainActivity -->
|
<!-- MainActivity -->
|
||||||
|
|
||||||
|
|
||||||
|
@ -337,13 +340,29 @@ Please report any problems you encounter via Github.</string>
|
||||||
|
|
||||||
<string name="export_config">Export Configuration</string>
|
<string name="export_config">Export Configuration</string>
|
||||||
|
|
||||||
|
<!-- Experimental options -->
|
||||||
|
<string name="use_proxy">Connect through a proxy</string>
|
||||||
|
<string name="do_not_use_proxy">Do not connect through a proxy</string>
|
||||||
|
|
||||||
<string name="keep_wakelock_while_binary_running">Keep the CPU awake while Syncthing is running</string>
|
<string name="keep_wakelock_while_binary_running">Keep the CPU awake while Syncthing is running</string>
|
||||||
|
|
||||||
<string name="keep_wakelock_while_binary_running_summary">Use this setting if you experience unexpected disconnects while operating on battery. This will result in increased battery consumption.</string>
|
<string name="keep_wakelock_while_binary_running_summary">Use this setting if you experience unexpected disconnects while operating on battery. This will result in increased battery consumption.</string>
|
||||||
|
|
||||||
<string name="use_tor_title">Use Tor</string>
|
<string name="use_tor_title">Use Tor</string>
|
||||||
|
|
||||||
<string name="use_tor_summary">Force all traffic through Tor for increased privacy. Requires Orbot</string>
|
<string name="use_tor_summary">Force all traffic through Tor for increased privacy. Requires Orbot. Disables proxy options.</string>
|
||||||
|
|
||||||
|
<string name="socks_proxy_address_title">SOCKS5 proxy</string>
|
||||||
|
<string name="socks_proxy_address_example">socks5://192.168.0.1:1080</string>
|
||||||
|
|
||||||
|
<!-- Toast after entering invalid socks proxy address -->
|
||||||
|
<string name="toast_invalid_socks_proxy_address">Input violates proxy syntax \'socks5://[IP/HOSTNAME]:[PORT]\'</string>
|
||||||
|
|
||||||
|
<string name="http_proxy_address_title">HTTP(S) proxy</string>
|
||||||
|
<string name="http_proxy_address_example">http://192.168.0.1:8080</string>
|
||||||
|
|
||||||
|
<!-- Toast after entering invalid http proxy address -->
|
||||||
|
<string name="toast_invalid_http_proxy_address">Input violates proxy syntax \'http://[IP/HOSTNAME]:[PORT]\'</string>
|
||||||
|
|
||||||
<string name="use_legacy_hashing_title">Use legacy hashing</string>
|
<string name="use_legacy_hashing_title">Use legacy hashing</string>
|
||||||
|
|
||||||
|
|
|
@ -212,6 +212,18 @@
|
||||||
android:title="@string/use_tor_title"
|
android:title="@string/use_tor_title"
|
||||||
android:summary="@string/use_tor_summary" />
|
android:summary="@string/use_tor_summary" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="socks_proxy_address"
|
||||||
|
android:title="@string/socks_proxy_address_title"
|
||||||
|
android:summary=""
|
||||||
|
android:inputType="textUri|textNoSuggestions" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="http_proxy_address"
|
||||||
|
android:title="@string/http_proxy_address_title"
|
||||||
|
android:summary=""
|
||||||
|
android:inputType="textUri|textNoSuggestions" />
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="use_legacy_hashing"
|
android:key="use_legacy_hashing"
|
||||||
android:title="@string/use_legacy_hashing_title"
|
android:title="@string/use_legacy_hashing_title"
|
||||||
|
|
Loading…
Reference in a new issue