diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java
index 7fc198d0e0..863afab15c 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptions.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java
@@ -24,12 +24,17 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.media.RingtoneManager;
import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@@ -73,6 +78,7 @@ public class FragmentOptions extends FragmentEx implements SharedPreferences.OnS
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
setSubtitle(R.string.title_advanced);
+ setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.fragment_options, container, false);
@@ -324,6 +330,59 @@ public class FragmentOptions extends FragmentEx implements SharedPreferences.OnS
return view;
}
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkRequest.Builder builder = new NetworkRequest.Builder();
+ builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ // Removed because of Android VPN service
+ // builder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+ cm.registerNetworkCallback(builder.build(), networkCallback);
+ }
+
+ @Override
+ public void onPause() {
+ ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+ cm.unregisterNetworkCallback(networkCallback);
+
+ super.onPause();
+ }
+
+ private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
+ @Override
+ public void onAvailable(Network network) {
+ getActivity().invalidateOptionsMenu();
+ }
+
+ @Override
+ public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
+ getActivity().invalidateOptionsMenu();
+ }
+
+ @Override
+ public void onLost(Network network) {
+ getActivity().invalidateOptionsMenu();
+ }
+ };
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ inflater.inflate(R.menu.menu_options, menu);
+ super.onCreateOptionsMenu(menu, inflater);
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ Boolean metered = Helper.isMetered(getContext());
+ menu.findItem(R.id.menu_metered).setVisible(metered != null);
+ if (metered != null)
+ menu.findItem(R.id.menu_metered).setIcon(
+ metered ? R.drawable.baseline_attach_money_24 : R.drawable.baseline_money_off_24);
+ super.onPrepareOptionsMenu(menu);
+ }
+
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(Helper.TAG, "Result class=" + this.getClass().getSimpleName() +
diff --git a/app/src/main/res/drawable/baseline_attach_money_24.xml b/app/src/main/res/drawable/baseline_attach_money_24.xml
new file mode 100755
index 0000000000..8f3040cb10
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_attach_money_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/baseline_money_off_24.xml b/app/src/main/res/drawable/baseline_money_off_24.xml
new file mode 100755
index 0000000000..bc5fb2b2a5
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_money_off_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/fragment_legend.xml b/app/src/main/res/layout/fragment_legend.xml
index e0dff122d2..324118decf 100644
--- a/app/src/main/res/layout/fragment_legend.xml
+++ b/app/src/main/res/layout/fragment_legend.xml
@@ -468,6 +468,47 @@
app:layout_constraintStart_toEndOf="@id/ivClosing"
app:layout_constraintTop_toTopOf="@id/ivClosing" />
+
+
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@id/tvUnmetered" />
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 08b1fa8187..691862a9fb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -338,6 +338,8 @@
Synchronizing
Downloading
Closing
+ Connection is metered
+ Connection is unmetered
Number of days to synchronize / to keep messages
Number of message bodies downloaded / headers fetched