Paged change details: Show CC's on approvals tab separately

Change-Id: Ic6deeb03d9c6a94e2c6d5ca84cd0b711d909a4a1
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/app/src/main/java/com/google/reviewit/ApprovalsFragment.java b/app/src/main/java/com/google/reviewit/ApprovalsFragment.java
index 2e2a196..2ca6cb9 100644
--- a/app/src/main/java/com/google/reviewit/ApprovalsFragment.java
+++ b/app/src/main/java/com/google/reviewit/ApprovalsFragment.java
@@ -20,6 +20,7 @@
 import android.view.ViewGroup;
 
 import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.reviewit.app.ApprovalData;
 import com.google.reviewit.app.Change;
 import com.google.reviewit.widget.ApprovalEntry;
 import com.google.reviewit.widget.ApprovalsHeader;
@@ -44,16 +45,31 @@
     super.onActivityCreated(savedInstanceState);
 
     ViewGroup approvalList = vg(R.id.approvalList);
-    ApprovalsHeader approvalsHeader = new ApprovalsHeader(getContext());
-    approvalsHeader.init(change);
-    approvalList.addView(approvalsHeader);
+    ApprovalData approvalData = change.getApprovalData();
+
+    ApprovalsHeader reviewersHeader = new ApprovalsHeader(getContext());
+    reviewersHeader.init(change, getString(R.string.reviewers), true);
+    approvalList.addView(reviewersHeader);
     addSeparator(approvalList);
-    for (AccountInfo account : change.getApprovalData().reviewers) {
+    for (AccountInfo account : approvalData.reviewers) {
       ApprovalEntry approvalEntry = new ApprovalEntry(getContext());
       approvalEntry.init(getApp(), change, account);
       approvalList.addView(approvalEntry);
       addSeparator(approvalList);
     }
+
+    if (!approvalData.ccs.isEmpty()) {
+      ApprovalsHeader ccsHeader = new ApprovalsHeader(getContext());
+      ccsHeader.init(change, getString(R.string.ccs), false);
+      approvalList.addView(ccsHeader);
+      addSeparator(approvalList);
+      for (AccountInfo account : approvalData.ccs) {
+        ApprovalEntry approvalEntry = new ApprovalEntry(getContext());
+        approvalEntry.init(getApp(), change, account);
+        approvalList.addView(approvalEntry);
+        addSeparator(approvalList);
+      }
+    }
   }
 
   public void setChange(Change change) {
diff --git a/app/src/main/java/com/google/reviewit/app/AccountComparator.java b/app/src/main/java/com/google/reviewit/app/AccountComparator.java
new file mode 100644
index 0000000..2c10810
--- /dev/null
+++ b/app/src/main/java/com/google/reviewit/app/AccountComparator.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2016 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.reviewit.app;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.reviewit.util.FormatUtil;
+
+import java.util.Comparator;
+
+public class AccountComparator implements Comparator<AccountInfo> {
+  @Override
+  public int compare(AccountInfo account1, AccountInfo account2) {
+    return FormatUtil.format(account1).compareTo(
+        FormatUtil.format(account2));
+  }
+}
diff --git a/app/src/main/java/com/google/reviewit/app/ApprovalData.java b/app/src/main/java/com/google/reviewit/app/ApprovalData.java
index 63316b8..e09b51f 100644
--- a/app/src/main/java/com/google/reviewit/app/ApprovalData.java
+++ b/app/src/main/java/com/google/reviewit/app/ApprovalData.java
@@ -19,33 +19,33 @@
 import com.google.gerrit.extensions.common.ApprovalInfo;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.reviewit.util.FormatUtil;
 
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
 
 public class ApprovalData {
   public final Set<AccountInfo> reviewers;
+  public final Set<AccountInfo> ccs;
   public final Map<String, LabelInfo> labels;
   public final TreeMap<String, Map<Integer, ApprovalInfo>> approvalsByLabel;
 
   public ApprovalData(ChangeInfo change) {
-    reviewers = new TreeSet<>(new Comparator<AccountInfo>() {
-      @Override
-      public int compare(AccountInfo account1, AccountInfo account2) {
-        return FormatUtil.format(account1).compareTo(
-            FormatUtil.format(account2));
+    reviewers = new TreeSet<>(new AccountComparator());
+    ccs = new TreeSet<>(new AccountComparator());
+    if (change.reviewers != null) {
+      if (change.reviewers.containsKey(ReviewerState.REVIEWER)) {
+        reviewers.addAll(change.reviewers.get(ReviewerState.REVIEWER));
       }
-    });
-    if (change.reviewers != null
-        && change.reviewers.containsKey(ReviewerState.REVIEWER)) {
-      reviewers.addAll(change.reviewers.get(ReviewerState.REVIEWER));
+      if (change.reviewers.containsKey(ReviewerState.CC)) {
+        ccs.addAll(change.reviewers.get(ReviewerState.CC));
+      }
     }
+
     labels = new TreeMap<>();
     approvalsByLabel = new TreeMap<>();
     for (Map.Entry<String, LabelInfo> label : change.labels.entrySet()) {
@@ -55,7 +55,6 @@
       List<ApprovalInfo> all = change.labels.get(label.getKey()).all;
       if (all != null) {
         for (ApprovalInfo approval : all) {
-          reviewers.add(approval);
           approvalsByAccount.put(approval._accountId, approval);
         }
       }
@@ -83,4 +82,11 @@
     }
     return min != null && min.equals(Integer.valueOf(value));
   }
+
+  public SortedSet<AccountInfo> reviewersAndCcs() {
+    SortedSet<AccountInfo> result = new TreeSet<>(new AccountComparator());
+    result.addAll(reviewers);
+    result.addAll(ccs);
+    return result;
+  }
 }
diff --git a/app/src/main/java/com/google/reviewit/widget/ApprovalsHeader.java b/app/src/main/java/com/google/reviewit/widget/ApprovalsHeader.java
index 4c5d473..0b493fa 100644
--- a/app/src/main/java/com/google/reviewit/widget/ApprovalsHeader.java
+++ b/app/src/main/java/com/google/reviewit/widget/ApprovalsHeader.java
@@ -16,6 +16,7 @@
 
 import android.content.Context;
 import android.graphics.Typeface;
+import android.support.annotation.StringRes;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.ViewGroup;
@@ -47,17 +48,21 @@
     inflate(context, R.layout.approvals_header, this);
   }
 
-  public void init(Change change) {
-    for (String labelName : change.getApprovalData().labels.keySet()) {
-      TextView text = widgetUtil.createTextView(
-          FormatUtil.formatLabelName(labelName), 18);
-      text.setTypeface(null, Typeface.BOLD);
-      text.setGravity(Gravity.CENTER_HORIZONTAL);
-      text.setLayoutParams(
-          fixedLinearLayout(widgetUtil.dpToPx(40), widgetUtil.dpToPx(25)));
-      text.setPadding(
-          widgetUtil.dpToPx(2), 0, widgetUtil.dpToPx(2), 0);
-      ((ViewGroup) findViewById(R.id.labels)).addView(text);
+  public void init(Change change, String headerText, boolean showLabels) {
+    ((TextView) findViewById(R.id.headerText)).setText(headerText);
+
+    if (showLabels) {
+      for (String labelName : change.getApprovalData().labels.keySet()) {
+        TextView text = widgetUtil.createTextView(
+            FormatUtil.formatLabelName(labelName), 18);
+        text.setTypeface(null, Typeface.BOLD);
+        text.setGravity(Gravity.CENTER_HORIZONTAL);
+        text.setLayoutParams(
+            fixedLinearLayout(widgetUtil.dpToPx(40), widgetUtil.dpToPx(25)));
+        text.setPadding(
+            widgetUtil.dpToPx(2), 0, widgetUtil.dpToPx(2), 0);
+        ((ViewGroup) findViewById(R.id.labels)).addView(text);
+      }
     }
   }
 }
diff --git a/app/src/main/java/com/google/reviewit/widget/ApprovalsView.java b/app/src/main/java/com/google/reviewit/widget/ApprovalsView.java
index 8dd15ad..adfbff1 100644
--- a/app/src/main/java/com/google/reviewit/widget/ApprovalsView.java
+++ b/app/src/main/java/com/google/reviewit/widget/ApprovalsView.java
@@ -105,7 +105,7 @@
       headerRow.addView(center(labelNameText));
     }
 
-    for (AccountInfo account : approvalData.reviewers) {
+    for (AccountInfo account : approvalData.reviewersAndCcs()) {
       addApprovalRow(app, account, approvalData);
     }
   }
diff --git a/app/src/main/res/layout/approvals_header.xml b/app/src/main/res/layout/approvals_header.xml
index c0865f5..49c781a 100644
--- a/app/src/main/res/layout/approvals_header.xml
+++ b/app/src/main/res/layout/approvals_header.xml
@@ -31,9 +31,9 @@
     android:shrinkColumns="0">
     <TableRow>
       <TextView
+        android:id="@+id/headerText"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/reviewers"
         android:textSize="18sp"
         android:textStyle="bold"/>