diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java
index 0897b3a974..e6566dcbed 100644
--- a/app/src/main/java/eu/faircode/email/Core.java
+++ b/app/src/main/java/eu/faircode/email/Core.java
@@ -1417,6 +1417,9 @@ class Core {
Context context,
EntityFolder folder, IMAPFolder ifolder,
IMAPMessage imessage, long id, State state) throws MessagingException, IOException {
+ if (state.getNetworkState().isRoaming())
+ return;
+
DB db = DB.getInstance(context);
EntityMessage message = db.message().getMessage(id);
if (message == null)
diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java
index 26b7725f13..7011303c2b 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptions.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java
@@ -68,6 +68,7 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
private TextView tvScheduleEnd;
private TextView tvConnectionType;
+ private TextView tvConnectionRoaming;
private SwitchCompat swMetered;
private Spinner spDownload;
@@ -151,6 +152,7 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
tvScheduleEnd = view.findViewById(R.id.tvScheduleEnd);
tvConnectionType = view.findViewById(R.id.tvConnectionType);
+ tvConnectionRoaming = view.findViewById(R.id.tvConnectionRoaming);
swMetered = view.findViewById(R.id.swMetered);
spDownload = view.findViewById(R.id.spDownload);
@@ -789,6 +791,7 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
tvConnectionType.setText(networkState.isUnmetered() ? R.string.title_legend_unmetered : R.string.title_legend_metered);
tvConnectionType.setVisibility(networkState.isConnected() ? View.VISIBLE : View.GONE);
+ tvConnectionRoaming.setVisibility(networkState.isRoaming() ? View.VISIBLE : View.GONE);
}
}
});
diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java
index f9522b104d..93fa44eb69 100644
--- a/app/src/main/java/eu/faircode/email/Helper.java
+++ b/app/src/main/java/eu/faircode/email/Helper.java
@@ -780,6 +780,7 @@ public class Helper {
private Boolean connected = null;
private Boolean suitable = null;
private Boolean unmetered = null;
+ private Boolean roaming = null;
boolean isConnected() {
return (connected != null && connected);
@@ -793,6 +794,10 @@ public class Helper {
return (unmetered != null && unmetered);
}
+ boolean isRoaming() {
+ return (roaming != null && roaming);
+ }
+
public void update(NetworkState newState) {
connected = newState.connected;
unmetered = newState.unmetered;
@@ -809,6 +814,23 @@ public class Helper {
state.connected = (isMetered != null);
state.unmetered = (isMetered != null && !isMetered);
state.suitable = (isMetered != null && (metered || !isMetered));
+
+ if (state.connected) {
+ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ NetworkInfo ani = cm.getActiveNetworkInfo();
+ if (ani != null)
+ state.roaming = ani.isRoaming();
+ } else {
+ Network active = cm.getActiveNetwork();
+ if (active != null) {
+ NetworkCapabilities caps = cm.getNetworkCapabilities(active);
+ if (caps != null)
+ state.roaming = !caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
+ }
+ }
+ }
+
return state;
}
diff --git a/app/src/main/res/layout/fragment_options.xml b/app/src/main/res/layout/fragment_options.xml
index a78b4fbb35..938369d8f5 100644
--- a/app/src/main/res/layout/fragment_options.xml
+++ b/app/src/main/res/layout/fragment_options.xml
@@ -149,6 +149,19 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/vSeparatorConnection" />
+
+
Connection is metered
Connection is unmetered
+ Roaming
Expander
Avatar