diff --git a/app/src/main/java/eu/faircode/email/ConnectionHelper.java b/app/src/main/java/eu/faircode/email/ConnectionHelper.java index 2a029b60b2..ec40cc5c54 100644 --- a/app/src/main/java/eu/faircode/email/ConnectionHelper.java +++ b/app/src/main/java/eu/faircode/email/ConnectionHelper.java @@ -265,7 +265,10 @@ public class ConnectionHelper { return null; } - if (caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean standalone_vpn = prefs.getBoolean("standalone_vpn", false); + if (standalone_vpn || + caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)) { // NET_CAPABILITY_NOT_METERED is unreliable on older Android versions boolean metered = cm.isActiveNetworkMetered(); Log.i("isMetered: active not VPN metered=" + metered); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java index 063986e92e..4459131739 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java @@ -61,6 +61,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre private SwitchCompat swRlah; private EditText etTimeout; private SwitchCompat swPreferIp4; + private SwitchCompat swStandaloneVpn; private SwitchCompat swTcpKeepAlive; private TextView tvTcpKeepAliveHint; private SwitchCompat swSslHarden; @@ -70,7 +71,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre private TextView tvNetworkInfo; private final static String[] RESET_OPTIONS = new String[]{ - "metered", "download", "roaming", "rlah", "timeout", "prefer_ip4", "tcp_keep_alive", "ssl_harden" + "metered", "download", "roaming", "rlah", "timeout", "prefer_ip4", "standalone_vpn", "tcp_keep_alive", "ssl_harden" }; @Override @@ -89,6 +90,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre swRlah = view.findViewById(R.id.swRlah); etTimeout = view.findViewById(R.id.etTimeout); swPreferIp4 = view.findViewById(R.id.swPreferIp4); + swStandaloneVpn = view.findViewById(R.id.swStandaloneVpn); swTcpKeepAlive = view.findViewById(R.id.swTcpKeepAlive); tvTcpKeepAliveHint = view.findViewById(R.id.tvTcpKeepAliveHint); swSslHarden = view.findViewById(R.id.swSslHarden); @@ -103,6 +105,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre // Wire controls final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + boolean debug = prefs.getBoolean("debug", false); swMetered.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -170,7 +173,15 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre } }); - boolean debug = prefs.getBoolean("debug", false); + swStandaloneVpn.setVisibility(debug || BuildConfig.DEBUG ? View.VISIBLE : View.GONE); + + swStandaloneVpn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("standalone_vpn", checked).apply(); + } + }); + swTcpKeepAlive.setVisibility(debug || BuildConfig.DEBUG ? View.VISIBLE : View.GONE); tvTcpKeepAliveHint.setVisibility(debug || BuildConfig.DEBUG ? View.VISIBLE : View.GONE); @@ -303,6 +314,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre etTimeout.setHint(Integer.toString(EmailService.DEFAULT_CONNECT_TIMEOUT)); swPreferIp4.setChecked(prefs.getBoolean("prefer_ip4", true)); + swStandaloneVpn.setChecked(prefs.getBoolean("standalone_vpn", false)); swTcpKeepAlive.setChecked(prefs.getBoolean("tcp_keep_alive", false)); swSslHarden.setChecked(prefs.getBoolean("ssl_harden", false)); } diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index d97596ffd1..98ab5c75f0 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -146,7 +146,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences "sync_kept", "sync_folders", "sync_shared_folders", - "prefer_ip4", "tcp_keep_alive", "ssl_harden", // force reconnect + "prefer_ip4", "standalone_vpn", "tcp_keep_alive", "ssl_harden", // force reconnect "badge", "unseen_ignored", // force update badge/widget "experiments", "debug", "protocol", // force reconnect "auth_plain", diff --git a/app/src/main/res/layout/fragment_options_connection.xml b/app/src/main/res/layout/fragment_options_connection.xml index ebff3abf65..cc483c1c69 100644 --- a/app/src/main/res/layout/fragment_options_connection.xml +++ b/app/src/main/res/layout/fragment_options_connection.xml @@ -196,6 +196,17 @@ app:layout_constraintTop_toBottomOf="@id/etTimeout" app:switchPadding="12dp" /> + + Roam like at home Connection timeout (seconds) Prefer IPv4 over IPv6 + Standalone VPN TCP keep alive Harden SSL connections Manage connectivity