From 20c059280c11964dc6633479e1c880a33b47212d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 12 Oct 2018 09:30:01 -0700 Subject: [PATCH] Refactor OrderEnforcer. --- .../securesms/camera/OrderEnforcer.java | 74 ++++++++++--------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/src/org/thoughtcrime/securesms/camera/OrderEnforcer.java b/src/org/thoughtcrime/securesms/camera/OrderEnforcer.java index bc46ba1f98..fd7cc2b9b1 100644 --- a/src/org/thoughtcrime/securesms/camera/OrderEnforcer.java +++ b/src/org/thoughtcrime/securesms/camera/OrderEnforcer.java @@ -2,26 +2,19 @@ package org.thoughtcrime.securesms.camera; import android.support.annotation.NonNull; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; +@SuppressWarnings("ConstantConditions") public class OrderEnforcer { - private final E[] stages; - private final Map stageIndices; - private final Map> actions; - private final boolean[] completion; + private final Map stages = new LinkedHashMap<>(); public OrderEnforcer(@NonNull E... stages) { - this.stages = stages; - this.stageIndices = new HashMap<>(); - this.actions = new HashMap<>(); - this.completion = new boolean[stages.length]; - - for (int i = 0; i < stages.length; i++) { - stageIndices.put(stages[i], i); + for (E stage : stages) { + this.stages.put(stage, new StageDetails()); } } @@ -29,46 +22,59 @@ public class OrderEnforcer { if (isCompletedThrough(stage)) { r.run(); } else { - List stageActions = actions.containsKey(stage) ? actions.get(stage) : new CopyOnWriteArrayList<>(); - stageActions.add(r); - - actions.put(stage, stageActions); + stages.get(stage).getActions().add(r); } } public synchronized void markCompleted(@NonNull E stage) { - completion[stageIndices.get(stage)] = true; + stages.get(stage).setCompleted(true); - int i = 0; - while (i < completion.length && completion[i]) { - List stageActions = actions.get(stages[i]); - if (stageActions != null) { - for (Runnable r : stageActions) { + for (E s : stages.keySet()) { + StageDetails details = stages.get(s); + + if (details.isCompleted()) { + for (Runnable r : details.getActions()) { r.run(); } - stageActions.clear(); + details.getActions().clear(); + } else { + break; } - i++; } } public synchronized void reset() { - for (int i = 0; i < completion.length; i++) { - completion[i] = false; + for (StageDetails details : stages.values()) { + details.setCompleted(false); + details.getActions().clear(); } - actions.clear(); } private boolean isCompletedThrough(@NonNull E stage) { - int index = stageIndices.get(stage); - int i = 0; - - while (i <= index && i < completion.length) { - if (!completion[i]) { + for (E s : stages.keySet()) { + if (s.equals(stage)) { + return stages.get(s).isCompleted(); + } else if (!stages.get(s).isCompleted()) { return false; } - i++; } - return true; + return false; + } + + private static class StageDetails { + private boolean completed = false; + private List actions = new CopyOnWriteArrayList<>(); + + @NonNull List getActions() { + return actions; + } + + boolean isCompleted() { + return completed; + } + + void setCompleted(boolean completed) { + this.completed = completed; + } } }