QuickContacts can prioritize phone mimetype. Part3
Support prioritizing a single mimetype inside QuickContacts.
Also, fix a bug in ExpandingEntryCardView that causes divider
lines to dissapear after expanding, collapsing and then
expanding a second time.
Bug: 18391003
Change-Id: Ie5a93ad9e1919f470a638d4235d91fe337cb5ca3
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);