Merge "QuickContacts can prioritize phone mimetype. Part3"
diff --git a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
index 706350f..10b2898 100644
--- a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
+++ b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
@@ -241,12 +241,18 @@
     private final ImageView mExpandCollapseArrow;
     private int mThemeColor;
     private ColorFilter mThemeColorFilter;
+    /**
+     * Whether to prioritize the first entry type. If prioritized, we should show at least two
+     * of this entry type.
+     */
+    private boolean mShowFirstEntryTypeTwice;
     private boolean mIsAlwaysExpanded;
     /** The ViewGroup to run the expand/collapse animation on */
     private ViewGroup mAnimationViewGroup;
     private LinearLayout mBadgeContainer;
     private final List<ImageView> mBadges;
     private final List<Integer> mBadgeIds;
+    private final int mDividerLineHeightPixels;
     /**
      * List to hold the separators. This saves us from reconstructing every expand/collapse and
      * provides a smoother animation.
@@ -284,11 +290,20 @@
         mExpandCollapseArrow = (ImageView) mExpandCollapseButton.findViewById(R.id.arrow);
         mExpandCollapseButton.setOnClickListener(mExpandCollapseButtonListener);
         mBadgeContainer = (LinearLayout) mExpandCollapseButton.findViewById(R.id.badge_container);
+        mDividerLineHeightPixels = getResources()
+                .getDimensionPixelSize(R.dimen.divider_line_height);
 
         mBadges = new ArrayList<ImageView>();
         mBadgeIds = new ArrayList<Integer>();
     }
 
+    public void initialize(List<List<Entry>> entries, int numInitialVisibleEntries,
+            boolean isExpanded, boolean isAlwaysExpanded, ExpandingEntryCardViewListener listener,
+            ViewGroup animationViewGroup) {
+        initialize(entries, numInitialVisibleEntries, isExpanded, isAlwaysExpanded,
+                listener, animationViewGroup, /* showFirstEntryTypeTwice = */ false);
+    }
+
     /**
      * Sets the Entry list to display.
      *
@@ -296,7 +311,8 @@
      */
     public void initialize(List<List<Entry>> entries, int numInitialVisibleEntries,
             boolean isExpanded, boolean isAlwaysExpanded,
-            ExpandingEntryCardViewListener listener, ViewGroup animationViewGroup) {
+            ExpandingEntryCardViewListener listener, ViewGroup animationViewGroup,
+            boolean showFirstEntryTypeTwice) {
         LayoutInflater layoutInflater = LayoutInflater.from(getContext());
         mIsExpanded = isExpanded;
         mIsAlwaysExpanded = isAlwaysExpanded;
@@ -306,6 +322,7 @@
         mEntries = entries;
         mNumEntries = 0;
         mAllEntriesInflated = false;
+        mShowFirstEntryTypeTwice = showFirstEntryTypeTwice;
         for (List<Entry> entryList : mEntries) {
             mNumEntries += entryList.size();
             mEntryViews.add(new ArrayList<View>());
@@ -428,8 +445,17 @@
                 }
                 viewsToDisplay.add(entryViewList.get(0));
                 numInViewGroup++;
+
+                int indexInEntryViewList = 1;
+                if (mShowFirstEntryTypeTwice && i == 0 && entryViewList.size() > 1) {
+                    viewsToDisplay.add(entryViewList.get(1));
+                    numInViewGroup++;
+                    extraEntries--;
+                    indexInEntryViewList++;
+                }
+
                 // Insert entries in this list to hit mCollapsedEntriesCount.
-                for (int j = 1;
+                for (int j = indexInEntryViewList;
                         j < entryViewList.size() && numInViewGroup < mCollapsedEntriesCount &&
                         extraEntries > 0;
                         j++) {
@@ -466,8 +492,7 @@
         separator.setBackgroundColor(res.getColor(
                 R.color.divider_line_color_light));
         LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                res.getDimensionPixelSize(R.dimen.divider_line_height));
+                ViewGroup.LayoutParams.MATCH_PARENT, mDividerLineHeightPixels);
         // The separator is aligned with the text in the entry. This is offset by a default
         // margin. If there is an icon present, the icon's width and margin are added
         int marginStart = res.getDimensionPixelSize(
@@ -521,9 +546,20 @@
                 entryViewList.add(createEntryView(layoutInflater, entryList.get(0),
                         /* showIcon = */ View.VISIBLE));
                 numInflated++;
+
+                int indexInEntryViewList = 1;
+                if (mShowFirstEntryTypeTwice && i == 0 && entryList.size() > 1) {
+                    entryViewList.add(createEntryView(layoutInflater, entryList.get(1),
+                        /* showIcon = */ View.INVISIBLE));
+                    numInflated++;
+                    extraEntries--;
+                    indexInEntryViewList++;
+                }
+
                 // Inflate entries in this list to hit mCollapsedEntriesCount.
-                for (int j = 1; j < entryList.size() && numInflated < mCollapsedEntriesCount &&
-                        extraEntries > 0; j++) {
+                for (int j = indexInEntryViewList; j < entryList.size()
+                        && numInflated < mCollapsedEntriesCount
+                        && extraEntries > 0; j++) {
                     entryViewList.add(createEntryView(layoutInflater, entryList.get(j),
                             /* showIcon = */ View.INVISIBLE));
                     numInflated++;
@@ -761,9 +797,14 @@
         if (mIsExpanded) {
             mBadgeContainer.removeAllViews();
         } else {
+            int numberOfMimeTypesShown = mCollapsedEntriesCount;
+            if (mShowFirstEntryTypeTwice && mEntries.size() > 0
+                    && mEntries.get(0).size() > 1) {
+                numberOfMimeTypesShown--;
+            }
             // Inflate badges if not yet created
-            if (mBadges.size() < mEntries.size() - mCollapsedEntriesCount) {
-                for (int i = mCollapsedEntriesCount; i < mEntries.size(); i++) {
+            if (mBadges.size() < mEntries.size() - numberOfMimeTypesShown) {
+                for (int i = numberOfMimeTypesShown; i < mEntries.size(); i++) {
                     Drawable badgeDrawable = mEntries.get(i).get(0).getIcon();
                     int badgeResourceId = mEntries.get(i).get(0).getIconResourceId();
                     // Do not add the same badge twice
@@ -875,11 +916,14 @@
             public void onAnimationEnd(Animator animation) {
                 // Now that the views have been animated away, actually remove them from the view
                 // hierarchy. Reset their appearance so that they look appropriate when they
-                // get added back later. We know that all views originally used WRAP_CONTENT
-                // since no separators are ever removed during collapse().
+                // get added back later.
                 insertEntriesIntoViewGroup();
                 for (View view : views) {
-                    VIEW_LAYOUT_HEIGHT_PROPERTY.set(view, LayoutParams.WRAP_CONTENT);
+                    if (view instanceof EntryView) {
+                        VIEW_LAYOUT_HEIGHT_PROPERTY.set(view, LayoutParams.WRAP_CONTENT);
+                    } else {
+                        VIEW_LAYOUT_HEIGHT_PROPERTY.set(view, mDividerLineHeightPixels);
+                    }
                     view.animate().cancel();
                     view.setAlpha(1);
                 }
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index cf6cc47..db309c2 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -211,6 +211,7 @@
     private Uri mLookupUri;
     private String[] mExcludeMimes;
     private int mExtraMode;
+    private String mExtraPrioritizedMimeType;
     private int mStatusBarColor;
     private boolean mHasAlreadyBeenOpened;
     private boolean mOnlyOnePhoneNumber;
@@ -589,16 +590,31 @@
 
     /**
      * Sorts among different mimetypes based off:
-     * 1. Times used
-     * 2. Last time used
-     * 3. Statically defined
+     * 1. Whether one of the mimetypes is the prioritized mimetype
+     * 2. Number of times used
+     * 3. Last time used
+     * 4. Statically defined
      */
     private final Comparator<List<DataItem>> mAmongstMimeTypeDataItemComparator =
             new Comparator<List<DataItem>> () {
         @Override
         public int compare(List<DataItem> lhsList, List<DataItem> rhsList) {
-            DataItem lhs = lhsList.get(0);
-            DataItem rhs = rhsList.get(0);
+            final DataItem lhs = lhsList.get(0);
+            final DataItem rhs = rhsList.get(0);
+            final String lhsMimeType = lhs.getMimeType();
+            final String rhsMimeType = rhs.getMimeType();
+
+            // 1. Whether one of the mimetypes is the prioritized mimetype
+            if (!TextUtils.isEmpty(mExtraPrioritizedMimeType) && !lhsMimeType.equals(rhsMimeType)) {
+                if (rhsMimeType.equals(mExtraPrioritizedMimeType)) {
+                    return 1;
+                }
+                if (lhsMimeType.equals(mExtraPrioritizedMimeType)) {
+                    return -1;
+                }
+            }
+
+            // 2. Number of times used
             final int lhsTimesUsed = lhs.getTimesUsed() == null ? 0 : lhs.getTimesUsed();
             final int rhsTimesUsed = rhs.getTimesUsed() == null ? 0 : rhs.getTimesUsed();
             final int timesUsedDifference = rhsTimesUsed - lhsTimesUsed;
@@ -606,6 +622,7 @@
                 return timesUsedDifference;
             }
 
+            // 3. Last time used
             final long lhsLastTimeUsed =
                     lhs.getLastTimeUsed() == null ? 0 : lhs.getLastTimeUsed();
             final long rhsLastTimeUsed =
@@ -617,14 +634,14 @@
                 return -1;
             }
 
-            // Times used and last time used are the same. Resort to statically defined.
-            final String lhsMimeType = lhs.getMimeType();
-            final String rhsMimeType = rhs.getMimeType();
-            for (String mimeType : LEADING_MIMETYPES) {
-                if (lhsMimeType.equals(mimeType)) {
-                    return -1;
-                } else if (rhsMimeType.equals(mimeType)) {
-                    return 1;
+            // 4. Resort to a statically defined mimetype order.
+            if (!lhsMimeType.equals(rhsMimeType)) {
+                for (String mimeType : LEADING_MIMETYPES) {
+                    if (lhsMimeType.equals(mimeType)) {
+                        return -1;
+                    } else if (rhsMimeType.equals(mimeType)) {
+                        return 1;
+                    }
                 }
             }
             return 0;
@@ -807,8 +824,8 @@
             lookupUri = RawContacts.getContactLookupUri(getContentResolver(),
                     ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId));
         }
-        mExtraMode = getIntent().getIntExtra(QuickContact.EXTRA_MODE,
-                QuickContact.MODE_LARGE);
+        mExtraMode = getIntent().getIntExtra(QuickContact.EXTRA_MODE, QuickContact.MODE_LARGE);
+        mExtraPrioritizedMimeType = getIntent().getStringExtra(QuickContact.EXTRA_PRIORITIZED_MIMETYPE);
         final Uri oldLookupUri = mLookupUri;
 
         if (lookupUri == null) {
@@ -1035,12 +1052,17 @@
         final String customAboutCardName = cp2DataCardModel.customAboutCardName;
 
         if (contactCardEntries.size() > 0) {
+            final boolean firstEntriesArePrioritizedMimeType =
+                    !TextUtils.isEmpty(mExtraPrioritizedMimeType) &&
+                    mCachedCp2DataCardModel.dataItemsMap.containsKey(mExtraPrioritizedMimeType) &&
+                    mCachedCp2DataCardModel.dataItemsMap.get(mExtraPrioritizedMimeType).size() != 0;
             mContactCard.initialize(contactCardEntries,
                     /* numInitialVisibleEntries = */ MIN_NUM_CONTACT_ENTRIES_SHOWN,
                     /* isExpanded = */ mContactCard.isExpanded(),
                     /* isAlwaysExpanded = */ false,
                     mExpandingEntryCardViewListener,
-                    mScroller);
+                    mScroller,
+                    firstEntriesArePrioritizedMimeType);
             mContactCard.setVisibility(View.VISIBLE);
         } else {
             mContactCard.setVisibility(View.GONE);