From 7533fc067c2ccde9c14253b6cd9ea6e76660eb27 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 10 May 2019 17:29:07 +0200 Subject: [PATCH] Added setting for roam-like-at-home --- .../email/FragmentOptionsConnection.java | 13 ++++- .../main/java/eu/faircode/email/Helper.java | 58 ++++++++++++++++++- .../layout/fragment_options_connection.xml | 12 +++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 81 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java index 21103bcc86..a988beca25 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java @@ -48,11 +48,12 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre private SwitchCompat swMetered; private Spinner spDownload; private SwitchCompat swRoaming; + private SwitchCompat swRlah; private TextView tvConnectionType; private TextView tvConnectionRoaming; private final static String[] RESET_OPTIONS = new String[]{ - "metered", "download", "roaming" + "metered", "download", "roaming", "rlah" }; @Override @@ -68,6 +69,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre swMetered = view.findViewById(R.id.swMetered); spDownload = view.findViewById(R.id.spDownload); swRoaming = view.findViewById(R.id.swRoaming); + swRlah = view.findViewById(R.id.swRlah); tvConnectionType = view.findViewById(R.id.tvConnectionType); tvConnectionRoaming = view.findViewById(R.id.tvConnectionRoaming); @@ -107,6 +109,14 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre } }); + swRlah.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("rlah", checked).apply(); + ServiceSynchronize.reload(getContext(), "rlah=" + checked); + } + }); + PreferenceManager.getDefaultSharedPreferences(getContext()).registerOnSharedPreferenceChangeListener(this); tvConnectionType.setVisibility(View.GONE); @@ -183,6 +193,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre } swRoaming.setChecked(prefs.getBoolean("roaming", true)); + swRlah.setChecked(prefs.getBoolean("rlah", false)); } private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 914729a8f1..890e95d0ff 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -46,6 +46,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.PowerManager; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.format.Time; @@ -100,6 +101,8 @@ import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; @@ -144,6 +147,42 @@ public class Helper { } }; + // Roam like at home + // https://en.wikipedia.org/wiki/European_Union_roaming_regulations + private static final List RLAH_COUNTRY_CODES = Collections.unmodifiableList(Arrays.asList( + "AT", // Austria + "BE", // Belgium + "BG", // Bulgaria + "HR", // Croatia + "CY", // Cyprus + "CZ", // Czech Republic + "DK", // Denmark + "EE", // Estonia + "FI", // Finland + "FR", // France + "DE", // Germany + "GR", // Greece + "HU", // Hungary + "IS", // Iceland + "IE", // Ireland + "IT", // Italy + "LV", // Latvia + "LI", // Liechtenstein + "LT", // Lithuania + "LU", // Luxembourg + "MT", // Malta + "NL", // Netherlands + "NO", // Norway + "PL", // Poland + "PT", // Portugal + "RO", // Romania + "SK", // Slovakia + "SI", // Slovenia + "ES", // Spain + "SE", // Sweden + "GB" // United Kingdom + )); + static boolean hasPermission(Context context, String name) { return (ContextCompat.checkSelfPermission(context, name) == PackageManager.PERMISSION_GRANTED); } @@ -828,6 +867,7 @@ public class Helper { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean metered = prefs.getBoolean("metered", true); boolean roaming = prefs.getBoolean("roaming", true); + boolean rlah = prefs.getBoolean("rlah", false); NetworkState state = new NetworkState(); Boolean isMetered = isMetered(context); @@ -837,7 +877,7 @@ public class Helper { if (state.connected && !roaming) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { NetworkInfo ani = cm.getActiveNetworkInfo(); if (ani != null) state.roaming = ani.isRoaming(); @@ -849,6 +889,22 @@ public class Helper { state.roaming = !caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); } } + + if (state.roaming && rlah) + try { + TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + if (tm != null) { + String sim = tm.getSimCountryIso(); + String network = tm.getNetworkCountryIso(); + Log.i("Country SIM=" + sim + " network=" + network); + if (sim != null && network != null && + RLAH_COUNTRY_CODES.contains(sim) && + RLAH_COUNTRY_CODES.contains(network)) + state.roaming = false; + } + } catch (Throwable ex) { + Log.w(ex); + } } return state; diff --git a/app/src/main/res/layout/fragment_options_connection.xml b/app/src/main/res/layout/fragment_options_connection.xml index d904a22a78..caaaa26fcd 100644 --- a/app/src/main/res/layout/fragment_options_connection.xml +++ b/app/src/main/res/layout/fragment_options_connection.xml @@ -85,6 +85,16 @@ app:layout_constraintTop_toBottomOf="@id/spDownload" app:switchPadding="12dp" /> + + + app:layout_constraintTop_toBottomOf="@+id/swRlah" /> Use metered connections Automatically download messages and attachments on a metered connection up to Download messages and attachments while roaming + Roam like at home EU Browse messages on the server Show on start screen