diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index a9557c77ea..0823b35465 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1125,18 +1125,27 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences " init=" + folder.initialize + " poll=" + folder.poll); // Partition operations by priority - Map> partitions = new TreeMap<>(); + Map> partitions = new TreeMap<>(new Comparator() { + @Override + public int compare(TupleOperationEx.PartitionKey k1, TupleOperationEx.PartitionKey k2) { + Integer p1 = k1.getPriority(); + Integer p2 = k2.getPriority(); + return p1.compareTo(p2); + } + }); + for (TupleOperationEx op : submit) { - if (!partitions.containsKey(op.priority)) - partitions.put(op.priority, new ArrayList<>()); - partitions.get(op.priority).add(op); + TupleOperationEx.PartitionKey key = op.getPartitionKey(); + if (!partitions.containsKey(key)) + partitions.put(key, new ArrayList<>()); + partitions.get(key).add(op); } - for (int priority : partitions.keySet()) { - List partition = partitions.get(priority); - Log.i(folder.name + " queuing operations=" + partition.size() + " priority=" + priority); + for (TupleOperationEx.PartitionKey key : partitions.keySet()) { + List partition = partitions.get(key); + Log.i(folder.name + " queuing operations=" + partition.size() + " key=" + key); - executor.submit(new Helper.PriorityRunnable(priority) { + executor.submit(new Helper.PriorityRunnable(key.getPriority()) { @Override public void run() { super.run(); diff --git a/app/src/main/java/eu/faircode/email/TupleOperationEx.java b/app/src/main/java/eu/faircode/email/TupleOperationEx.java index 984dd53946..a887b45f82 100644 --- a/app/src/main/java/eu/faircode/email/TupleOperationEx.java +++ b/app/src/main/java/eu/faircode/email/TupleOperationEx.java @@ -19,6 +19,9 @@ package eu.faircode.email; Copyright 2018-2020 by Marcel Bokhorst (M66B) */ +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.util.Objects; public class TupleOperationEx extends EntityOperation { @@ -39,4 +42,45 @@ public class TupleOperationEx extends EntityOperation { } else return false; } + + PartitionKey getPartitionKey() { + PartitionKey key = new PartitionKey(); + key.id = (MOVE.equals(name) || FETCH.equals(name) ? 0 : this.id); + key.priority = this.priority; + key.operation = this.name; + return key; + } + + class PartitionKey { + private long id; + private int priority; + @NonNull + private String operation; + + int getPriority() { + return this.priority; + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (obj instanceof PartitionKey) { + PartitionKey other = (PartitionKey) obj; + return (this.id == other.id && + this.priority == other.priority && + this.operation.equals(other.operation)); + } else + return false; + } + + @NonNull + @Override + public String toString() { + return operation + ":" + priority + ":" + id; + } + } }