Use reviewers from ChangeInfo when rendering reviewers

We have been populating this map using logic on the server side for a
while, but the UI was never updated to avoid duplicating this logic on
the client.

Change-Id: I3a40f9d9a7d726f9ab3522e62d484924337dc4b5
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java
index 9d0676e..e87cadd 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java
@@ -19,6 +19,7 @@
 import com.google.gerrit.client.rpc.Natives;
 import com.google.gerrit.common.data.LabelValue;
 import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.extensions.client.ReviewerState;
 import com.google.gerrit.extensions.client.SubmitType;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSet;
@@ -29,10 +30,13 @@
 import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer;
 
 import java.sql.Timestamp;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
@@ -133,6 +137,23 @@
   public final native JsArray<AccountInfo> removableReviewers()
   /*-{ return this.removable_reviewers; }-*/;
 
+  private final native NativeMap<JsArray<AccountInfo>> _reviewers()
+  /*-{ return this.reviewers; }-*/;
+  public final Map<ReviewerState, List<AccountInfo>> reviewers() {
+    NativeMap<JsArray<AccountInfo>> reviewers = _reviewers();
+    Map<ReviewerState, List<AccountInfo>> result = new HashMap<>();
+    for (String k : reviewers.keySet()) {
+      ReviewerState state = ReviewerState.valueOf(k.toUpperCase());
+      List<AccountInfo> accounts = result.get(state);
+      if (accounts == null) {
+        accounts = new ArrayList<>();
+        result.put(state, accounts);
+      }
+      accounts.addAll(Natives.asList(reviewers.get(k)));
+    }
+    return result;
+  }
+
   public final native boolean hasActions() /*-{ return this.hasOwnProperty('actions') }-*/;
   public final native NativeMap<ActionInfo> actions() /*-{ return this.actions; }-*/;
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
index 48071cc..e04509b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
@@ -29,6 +29,7 @@
 import com.google.gerrit.client.rpc.NativeString;
 import com.google.gerrit.client.rpc.Natives;
 import com.google.gerrit.client.ui.RemoteSuggestBox;
+import com.google.gerrit.extensions.client.ReviewerState;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
@@ -52,7 +53,9 @@
 import com.google.gwtexpui.safehtml.client.SafeHtml;
 import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
 
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -205,15 +208,9 @@
   }
 
   private void display(ChangeInfo info) {
-    Map<Integer, AccountInfo> r = new HashMap<>();
-    Map<Integer, AccountInfo> cc = new HashMap<>();
-    for (LabelInfo label : Natives.asList(info.allLabels().values())) {
-      if (label.all() != null) {
-        for (ApprovalInfo ai : Natives.asList(label.all())) {
-          (ai.value() != 0 ? r : cc).put(ai._accountId(), ai);
-        }
-      }
-    }
+    Map<ReviewerState, List<AccountInfo>> reviewers = info.reviewers();
+    Map<Integer, AccountInfo> r = byAccount(reviewers, ReviewerState.REVIEWER);
+    Map<Integer, AccountInfo> cc = byAccount(reviewers, ReviewerState.CC);
     for (Integer i : r.keySet()) {
       cc.remove(i);
     }
@@ -237,6 +234,19 @@
     }
   }
 
+  private static Map<Integer, AccountInfo> byAccount(
+      Map<ReviewerState, List<AccountInfo>> reviewers, ReviewerState state) {
+    List<AccountInfo> accounts = reviewers.get(state);
+    if (accounts == null) {
+      return Collections.emptyMap();
+    }
+    Map<Integer, AccountInfo> result = new HashMap<>();
+    for (AccountInfo a : accounts) {
+      result.put(a._accountId(), a);
+    }
+    return result;
+  }
+
   private static Map<Integer, VotableInfo> votable(ChangeInfo change) {
     Map<Integer, VotableInfo> d = new HashMap<>();
     for (String name : change.labels()) {