Add group membership support to compact editor (E9)

Bug 23589603

Change-Id: I71082af35a35dc7d0658ffb671a4436f794f5b0c
diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
index 540bf1a..8ca6389 100644
--- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java
+++ b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
@@ -31,6 +31,7 @@
 import com.android.contacts.util.UiClosables;
 
 import android.content.Context;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.net.Uri;
 import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -129,6 +130,7 @@
      *     <li>All names are together at the top.</li>
      *     <li>IM is moved up after addresses</li>
      *     <li>SIP addresses are moved to below phone numbers</li>
+     *     <li>Group membership is palced at the end</li>
      * </ol>
      */
     private static final class MimeTypeComparator implements Comparator<String> {
@@ -145,7 +147,8 @@
                 Organization.CONTENT_ITEM_TYPE,
                 Event.CONTENT_ITEM_TYPE,
                 Relation.CONTENT_ITEM_TYPE,
-                Note.CONTENT_ITEM_TYPE
+                Note.CONTENT_ITEM_TYPE,
+                GroupMembership.CONTENT_ITEM_TYPE
         });
 
         @Override
@@ -271,6 +274,7 @@
 
     private CompactPhotoEditorView mPhotoView;
     private ViewGroup mKindSectionViews;
+    private Map<String,List<CompactKindSectionView>> mKindSectionViewsMap = new HashMap<>();
     private View mMoreFields;
 
     private long mPhotoRawContactId;
@@ -380,15 +384,22 @@
     }
 
     public View getAggregationAnchorView() {
-        // The kind section for the primary account is sorted to the front
-        final List<KindSectionData> kindSectionDataList = getKindSectionDataList(
+        final List<CompactKindSectionView> kindSectionViews = getKindSectionViews(
                 StructuredName.CONTENT_ITEM_TYPE);
-        if (kindSectionDataList != null && !kindSectionDataList.isEmpty()) {
+        if (!kindSectionViews.isEmpty()) {
             return mKindSectionViews.getChildAt(0).findViewById(R.id.anchor_view);
         }
         return null;
     }
 
+    public void setGroupMetaData(Cursor groupMetaData) {
+        final List<CompactKindSectionView> kindSectionViews = getKindSectionViews(
+                GroupMembership.CONTENT_ITEM_TYPE);
+        for (CompactKindSectionView kindSectionView : kindSectionViews) {
+            kindSectionView.setGroupMetaData(groupMetaData);
+        }
+    }
+
     public void setState(RawContactDeltaList rawContactDeltas,
             MaterialColorMapUtils.MaterialPalette materialPalette, ViewIdGenerator viewIdGenerator,
             long photoId, boolean hasNewContact, boolean isUserProfile,
@@ -720,12 +731,6 @@
                 continue;
             }
 
-            // Ignore mime types that we don't handle
-            if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                vlog("kind: " + i + " " + mimeType + " dropped");
-                continue;
-            }
-
             if (kindSectionDataList != null && !kindSectionDataList.isEmpty()) {
                 vlog("kind: " + i + " " + mimeType + ": " + kindSectionDataList.size() +
                         " kindSectionData(s)");
@@ -733,10 +738,22 @@
                 final CompactKindSectionView kindSectionView = inflateKindSectionView(
                         mKindSectionViews, kindSectionDataList, mimeType);
                 mKindSectionViews.addView(kindSectionView);
+
+                // Keep a pointer to all the KindSectionsViews for each mimeType
+                getKindSectionViews(mimeType).add(kindSectionView);
             }
         }
     }
 
+    private List<CompactKindSectionView> getKindSectionViews(String mimeType) {
+        List<CompactKindSectionView> kindSectionViews = mKindSectionViewsMap.get(mimeType);
+        if (kindSectionViews == null) {
+            kindSectionViews = new ArrayList<>();
+            mKindSectionViewsMap.put(mimeType, kindSectionViews);
+        }
+        return kindSectionViews;
+    }
+
     private CompactKindSectionView inflateKindSectionView(ViewGroup viewGroup,
             List<KindSectionData> kindSectionDataList, String mimeType) {
         final CompactKindSectionView kindSectionView = (CompactKindSectionView)