From 278e1952f4a719bf9d25f690d4ca0b9b45a4aabd Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 10 Dec 2018 13:36:05 +0100 Subject: [PATCH] Added metered/unmetered indicator --- .../eu/faircode/email/FragmentOptions.java | 59 +++++++++++++++++++ .../res/drawable/baseline_attach_money_24.xml | 10 ++++ .../res/drawable/baseline_money_off_24.xml | 10 ++++ app/src/main/res/layout/fragment_legend.xml | 43 +++++++++++++- app/src/main/res/menu/menu_options.xml | 9 +++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 132 insertions(+), 1 deletion(-) create mode 100755 app/src/main/res/drawable/baseline_attach_money_24.xml create mode 100755 app/src/main/res/drawable/baseline_money_off_24.xml create mode 100644 app/src/main/res/menu/menu_options.xml 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