Merge "New replication config default in 2.9 Release Notes"
diff --git a/Documentation/intro-change-screen.txt b/Documentation/intro-change-screen.txt
index b4cd20a..7720f15 100644
--- a/Documentation/intro-change-screen.txt
+++ b/Documentation/intro-change-screen.txt
@@ -205,6 +205,8 @@
 
 To remove reviewers click on the 'x' icon in the reviewer's "chip".
 
+Votable categories are shown as a tooltip for each reviewer.
+
 Key bindings:  "c" to add a reviewer. "ESC" to close the drop down.
 
 [[auto-refresh]]
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
index 0be0b5d..a88edfa 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
@@ -176,7 +176,7 @@
       }
       html.append(val).append(" ");
       html.append(formatUserList(style, m.get(v),
-          Collections.<Integer> emptySet()));
+          Collections.<Integer> emptySet(), null));
       html.closeSpan();
     }
     return html.toBlockWidget();
@@ -222,7 +222,8 @@
 
   static SafeHtml formatUserList(ChangeScreen2.Style style,
       Collection<? extends AccountInfo> in,
-      Set<Integer> removable) {
+      Set<Integer> removable,
+      Map<Integer, VotableInfo> votable) {
     List<AccountInfo> users = new ArrayList<>(in);
     Collections.sort(users, new Comparator<AccountInfo>() {
       @Override
@@ -261,13 +262,26 @@
         name = Integer.toString(ai._account_id());
       }
 
+      String votableCategories = "";
+      if (votable != null) {
+        Set<String> s = votable.get(ai._account_id()).votableLabels();
+        if (!s.isEmpty()) {
+          StringBuilder sb = new StringBuilder(Util.C.votable());
+          sb.append(" ");
+          for (Iterator<String> it = s.iterator(); it.hasNext();) {
+            sb.append(it.next());
+            if (it.hasNext()) {
+              sb.append(", ");
+            }
+          }
+          votableCategories = sb.toString();
+        }
+      }
       html.openSpan()
           .setAttribute("role", "listitem")
           .setAttribute(DATA_ID, ai._account_id())
+          .setAttribute("title", getTitle(ai, votableCategories))
           .setStyleName(style.label_user());
-      if (ai.email() != null) {
-        html.setAttribute("title", ai.email());
-      }
       if (img != null) {
         html.openElement("img")
             .setStyleName(style.avatar())
@@ -295,4 +309,15 @@
     }
     return html;
   }
+
+  private static String getTitle(AccountInfo ai, String votableCategories) {
+    String title = ai.email() != null ? ai.email() : "";
+    if (!votableCategories.isEmpty()) {
+      if (!title.isEmpty()) {
+        title += " ";
+      }
+      title += votableCategories;
+    }
+    return title;
+  }
 }
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 fb75627..2ca424c 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
@@ -231,10 +231,35 @@
       }
     }
 
-    SafeHtml rHtml = Labels.formatUserList(style, r.values(), removable);
-    SafeHtml ccHtml = Labels.formatUserList(style, cc.values(), removable);
+    Map<Integer, VotableInfo> votable = votable(info);
+
+    SafeHtml rHtml = Labels.formatUserList(style,
+        r.values(), removable, votable);
+    SafeHtml ccHtml = Labels.formatUserList(style,
+        cc.values(), removable, votable);
 
     reviewersText.setInnerSafeHtml(rHtml);
     ccText.setInnerSafeHtml(ccHtml);
   }
+
+  private static Map<Integer, VotableInfo> votable(ChangeInfo change) {
+    Map<Integer, VotableInfo> d = new HashMap<>();
+    for (String name : change.labels()) {
+      LabelInfo label = change.label(name);
+      if (label.all() != null) {
+        for (ApprovalInfo ai : Natives.asList(label.all())) {
+          int id = ai._account_id();
+          VotableInfo ad = d.get(id);
+          if (ad == null) {
+            ad = new VotableInfo();
+            d.put(id, ad);
+          }
+          if (ai.has_value()) {
+            ad.votable(name);
+          }
+        }
+      }
+    }
+    return d;
+  }
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/VotableInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/VotableInfo.java
new file mode 100644
index 0000000..056c9a2
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/VotableInfo.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.client.change;
+
+import java.util.HashSet;
+import java.util.Set;
+
+class VotableInfo {
+  private Set<String> votable;
+
+  void votable(String label) {
+    if (votable == null) {
+      votable = new HashSet<>();
+    }
+    votable.add(label);
+  }
+
+  Set<String> votableLabels() {
+    Set<String> s = new HashSet<>();
+    if (votable != null) {
+      s.addAll(votable);
+    }
+    return s;
+  }
+}
+
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java
index 5092fe0..b4f3e17 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java
@@ -211,4 +211,6 @@
   String oneWeekAgo();
   String oneMonthAgo();
   String oneYearAgo();
+
+  String votable();
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties
index ab2145b..fb713b6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties
@@ -193,3 +193,5 @@
 oneWeekAgo = 1 week ago
 oneMonthAgo = 1 month ago
 oneYearAgo = 1 year ago
+
+votable = Votable: