diff --git a/app/src/main/java/eu/faircode/email/EntityAccount.java b/app/src/main/java/eu/faircode/email/EntityAccount.java index 3f7b6e2be8..1cab438777 100644 --- a/app/src/main/java/eu/faircode/email/EntityAccount.java +++ b/app/src/main/java/eu/faircode/email/EntityAccount.java @@ -229,6 +229,18 @@ public class EntityAccount extends EntityOrder implements Serializable { } boolean isExempted(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean poll_metered = prefs.getBoolean("poll_metered", false); + boolean poll_unmetered = prefs.getBoolean("poll_unmetered", false); + + if (poll_metered || poll_unmetered) { + ConnectionHelper.NetworkState state = ConnectionHelper.getNetworkState(context); + if (poll_metered && state.isConnected() && !state.isUnmetered()) + return false; + if (poll_unmetered && state.isConnected() && state.isUnmetered()) + return false; + } + return this.poll_exempted; } diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java index c836364358..4f669e31dc 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java @@ -82,6 +82,8 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr private Spinner spPollInterval; private TextView tvPollBattery; private RecyclerView rvExempted; + private SwitchCompat swPollMetered; + private SwitchCompat swPollUnmetered; private SwitchCompat swSchedule; private TextView tvSchedulePro; private TextView tvScheduleStart; @@ -132,6 +134,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr private final static List RESET_OPTIONS = Collections.unmodifiableList(Arrays.asList( "enabled", "poll_interval", "auto_optimize", + "poll_metered", "poll_unmetered", "schedule", "schedule_start", "schedule_end", "schedule_start_weekend", "schedule_end_weekend", "weekend", "sync_quick_imap", "sync_quick_pop", "sync_nodate", "sync_unseen", "sync_flagged", "delete_unseen", "sync_kept", @@ -172,6 +175,8 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr tvPollBattery = view.findViewById(R.id.tvPollBattery); rvExempted = view.findViewById(R.id.rvExempted); + swPollMetered = view.findViewById(R.id.swPollMetered); + swPollUnmetered = view.findViewById(R.id.swPollUnmetered); swSchedule = view.findViewById(R.id.swSchedule); tvSchedulePro = view.findViewById(R.id.tvSchedulePro); @@ -369,6 +374,20 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr adapter = new AdapterAccountExempted(getViewLifecycleOwner(), getContext()); rvExempted.setAdapter(adapter); + swPollMetered.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("poll_metered", checked).apply(); + } + }); + + swPollUnmetered.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("poll_unmetered", checked).apply(); + } + }); + swSchedule.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -706,6 +725,8 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr } tvPollBattery.setVisibility(pollInterval > 0 && pollInterval < 15 ? View.VISIBLE : View.GONE); + swPollMetered.setChecked(prefs.getBoolean("poll_metered", false)); + swPollUnmetered.setChecked(prefs.getBoolean("poll_unmetered", false)); grpExempted.setVisibility(pollInterval == 0 ? View.GONE : View.VISIBLE); swSchedule.setChecked(prefs.getBoolean("schedule", false) && pro); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index cd5c7fd29a..15a29adf35 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -160,7 +160,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences private static final String ACTION_NEW_MESSAGE_COUNT = BuildConfig.APPLICATION_ID + ".NEW_MESSAGE_COUNT"; private static final List PREF_EVAL = Collections.unmodifiableList(Arrays.asList( - "enabled", "poll_interval", "last_daily" // restart account(s) + "enabled", "poll_interval", "poll_metered", "poll_unmetered", "last_daily" // restart account(s) )); private static final List PREF_RELOAD = Collections.unmodifiableList(Arrays.asList( diff --git a/app/src/main/res/layout/fragment_options_synchronize.xml b/app/src/main/res/layout/fragment_options_synchronize.xml index 349e972b8a..d54e5d9ac8 100644 --- a/app/src/main/res/layout/fragment_options_synchronize.xml +++ b/app/src/main/res/layout/fragment_options_synchronize.xml @@ -250,6 +250,30 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvExempted" /> + + + + + app:constraint_referenced_ids="tvExempted,rvExempted,swPollMetered,swPollUnmetered" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ee2e22b53..5785905b1a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -420,6 +420,8 @@ When Automatically optimize Always receive messages for these accounts + Periodically check for new messages while on a metered network + Periodically check for new messages while on a unmetered network Schedule Workdays Weekend