From 9496a7d6a6b46ffa4fa87f597c76ef36495994ba Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 24 Oct 2024 10:04:34 +0200 Subject: [PATCH] Limit range size to 1,000 --- app/src/main/java/eu/faircode/email/Core.java | 13 ++++++-- .../faircode/email/FragmentOptionsMisc.java | 31 ++++++++++++++++++- .../main/res/layout/fragment_options_misc.xml | 25 ++++++++++++++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 090617e3d0..472c9ea975 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -124,6 +124,7 @@ import javax.mail.search.SearchTerm; import javax.mail.search.SentDateTerm; class Core { + static final int DEFAULT_RANGE_SIZE = 1000; static final int DEFAULT_CHUNK_SIZE = 50; private static final int SYNC_BATCH_SIZE = 20; @@ -4145,6 +4146,10 @@ class Core { public Object doCommand(IMAPProtocol protocol) throws ProtocolException { protocol.select(folder.name); + // Yahoo range size: 2000 + // https://help.yahoo.com/kb/download-email-yahoo-mail-third-party-sln28681.html + int range_size = prefs.getInt("range_size", DEFAULT_RANGE_SIZE); + // Build ranges List> ranges = new ArrayList<>(); long first = -1; @@ -4152,7 +4157,7 @@ class Core { for (long uid : uids) if (first < 0) first = uid; - else if ((last < 0 ? first : last) + 1 == uid) + else if ((last < 0 ? first : last) + 1 == uid && (uid - first + 1 <= range_size)) last = uid; else { ranges.add(new Pair<>(first, last < 0 ? first : last)); @@ -4170,10 +4175,10 @@ class Core { List>> chunks = Helper.chunkList(ranges, chunk_size); Log.i(folder.name + " executing uid fetch count=" + uids.size() + - " ranges=" + ranges.size() + " chunks=" + chunks.size()); + " ranges=" + ranges.size() + " chunks=" + chunks.size() + + " range_size=" + range_size + " chunk_size=" + chunk_size); for (int c = 0; c < chunks.size(); c++) { List> chunk = chunks.get(c); - Log.i(folder.name + " chunk #" + c + " size=" + chunk.size()); StringBuilder sb = new StringBuilder(); for (Pair range : chunk) { @@ -4184,6 +4189,8 @@ class Core { else sb.append(range.first).append(':').append(range.second); } + Log.i(folder.name + " chunk #" + c + " " + sb); + String command = "UID FETCH " + sb + " (UID FLAGS)"; Response[] responses = protocol.command(command, null); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index da5768adb6..522c6584eb 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -188,6 +188,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swOauthTabs; private TextView tvStartDelay; private SeekBar sbStartDelay; + private TextView tvRangeSize; + private SeekBar sbRangeSize; private TextView tvChunkSize; private SeekBar sbChunkSize; private TextView tvThreadRange; @@ -296,7 +298,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc "sqlite_integrity_check", "wal", "sqlite_checkpoints", "sqlite_analyze", "sqlite_auto_vacuum", "sqlite_sync_extra", "sqlite_cache", "legacy_queries", "cache_lists", "oauth_tabs", - "start_delay", "chunk_size", "thread_range", + "start_delay", "range_size", "chunk_size", "thread_range", "autoscroll_editor", "undo_manager", "browser_zoom", "fake_dark", "ignore_formatted_size", @@ -452,6 +454,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swOauthTabs = view.findViewById(R.id.swOauthTabs); tvStartDelay = view.findViewById(R.id.tvStartDelay); sbStartDelay = view.findViewById(R.id.sbStartDelay); + tvRangeSize = view.findViewById(R.id.tvRangeSize); + sbRangeSize = view.findViewById(R.id.sbRangeSize); tvChunkSize = view.findViewById(R.id.tvChunkSize); sbChunkSize = view.findViewById(R.id.sbChunkSize); tvThreadRange = view.findViewById(R.id.tvThreadRange); @@ -1330,6 +1334,27 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + sbRangeSize.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + progress = progress / 10; + if (progress < 1) + progress = 1; + progress = progress * 10; + prefs.edit().putInt("range_size", progress).apply(); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + // Do nothing + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + // Do nothing + } + }); + sbChunkSize.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { @@ -2501,6 +2526,10 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc tvStartDelay.setText(getString(R.string.title_advanced_start_delay, start_delay)); sbStartDelay.setProgress(start_delay); + int range_size = prefs.getInt("range_size", Core.DEFAULT_RANGE_SIZE); + tvRangeSize.setText(getString(R.string.title_advanced_range_size, range_size)); + sbRangeSize.setProgress(range_size); + int chunk_size = prefs.getInt("chunk_size", Core.DEFAULT_CHUNK_SIZE); tvChunkSize.setText(getString(R.string.title_advanced_chunk_size, chunk_size)); sbChunkSize.setProgress(chunk_size); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index 46a3fa8e03..d7222a6860 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -1234,6 +1234,29 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvStartDelay" /> + + + + + app:layout_constraintTop_toBottomOf="@id/sbRangeSize" /> Cache lists OAuth tabs Start delay: %1$d s + Range size: %1$d Chunk size: %1$d Thread range: %1$d days Auto scroll editor