use of com.android.contacts.quickcontact.ExpandingEntryCardView.Entry in project packages_apps_Contacts by AOKP.
the class QuickContactActivity method buildAboutCardEntries.
private List<List<Entry>> buildAboutCardEntries(Map<String, List<DataItem>> dataItemsMap) {
final List<List<Entry>> aboutCardEntries = new ArrayList<>();
for (String mimetype : SORTED_ABOUT_CARD_MIMETYPES) {
final List<DataItem> mimeTypeItems = dataItemsMap.get(mimetype);
if (mimeTypeItems == null) {
continue;
}
// Set aboutCardTitleOut = null, since SORTED_ABOUT_CARD_MIMETYPES doesn't contain
// the name mimetype.
final List<Entry> aboutEntries = dataItemsToEntries(mimeTypeItems, /* aboutCardTitleOut = */
null);
if (aboutEntries.size() > 0) {
aboutCardEntries.add(aboutEntries);
}
}
return aboutCardEntries;
}
use of com.android.contacts.quickcontact.ExpandingEntryCardView.Entry in project packages_apps_Contacts by AOKP.
the class QuickContactActivity method gPlusOrHangoutsDataItemsToEntries.
/**
* G+ and Hangout entries are unique in that a single ExpandingEntryCardView.Entry consists
* of two data items. This method attempts to build each entry using the two data items if
* they are available. If there are more or less than two data items, a fall back is used
* and each data item gets its own entry.
*/
private List<Entry> gPlusOrHangoutsDataItemsToEntries(List<DataItem> dataItems) {
final List<Entry> entries = new ArrayList<>();
final Map<Long, List<DataItem>> buckets = new HashMap<>();
// Put the data items into buckets based on the raw contact id
for (DataItem dataItem : dataItems) {
List<DataItem> bucket = buckets.get(dataItem.getRawContactId());
if (bucket == null) {
bucket = new ArrayList<>();
buckets.put(dataItem.getRawContactId(), bucket);
}
bucket.add(dataItem);
}
// entry, otherwise fall back to the normal entry.
for (List<DataItem> bucket : buckets.values()) {
if (bucket.size() == 2) {
// Use the pair to build an entry
final Entry entry = dataItemToEntry(bucket.get(0), /* secondDataItem = */
bucket.get(1), this, mContactData, /* aboutCardName = */
null);
if (entry != null) {
entries.add(entry);
}
} else {
for (DataItem dataItem : bucket) {
final Entry entry = dataItemToEntry(dataItem, /* secondDataItem = */
null, this, mContactData, /* aboutCardName = */
null);
if (entry != null) {
entries.add(entry);
}
}
}
}
return entries;
}
use of com.android.contacts.quickcontact.ExpandingEntryCardView.Entry in project packages_apps_Contacts by AOKP.
the class QuickContactActivity method initializeNoContactDetailCard.
/**
* Create a card that shows "Add email" and "Add phone number" entries in grey.
*/
private void initializeNoContactDetailCard() {
final Drawable phoneIcon = getResources().getDrawable(R.drawable.ic_phone_24dp).mutate();
final Entry phonePromptEntry = new Entry(CARD_ENTRY_ID_EDIT_CONTACT, phoneIcon, getString(R.string.quickcontact_add_phone_number), /* subHeader = */
null, /* subHeaderIcon = */
null, /* text = */
null, /* textIcon = */
null, /* primaryContentDescription = */
null, getEditContactIntent(), /* alternateIcon = */
null, /* alternateIntent = */
null, /* alternateContentDescription = */
null, /* shouldApplyColor = */
true, /* isEditable = */
false, /* EntryContextMenuInfo = */
null, /* thirdIcon = */
null, /* thirdIntent = */
null, /* thirdContentDescription = */
null, /* thirdAction = */
Entry.ACTION_NONE, /* thirdExtras = */
null, R.drawable.ic_phone_24dp);
final Drawable emailIcon = getResources().getDrawable(R.drawable.ic_email_24dp).mutate();
final Entry emailPromptEntry = new Entry(CARD_ENTRY_ID_EDIT_CONTACT, emailIcon, getString(R.string.quickcontact_add_email), /* subHeader = */
null, /* subHeaderIcon = */
null, /* text = */
null, /* textIcon = */
null, /* primaryContentDescription = */
null, getEditContactIntent(), /* alternateIcon = */
null, /* alternateIntent = */
null, /* alternateContentDescription = */
null, /* shouldApplyColor = */
true, /* isEditable = */
false, /* EntryContextMenuInfo = */
null, /* thirdIcon = */
null, /* thirdIntent = */
null, /* thirdContentDescription = */
null, /* thirdAction = */
Entry.ACTION_NONE, /* thirdExtras = */
null, R.drawable.ic_email_24dp);
final List<List<Entry>> promptEntries = new ArrayList<>();
promptEntries.add(new ArrayList<Entry>(1));
promptEntries.add(new ArrayList<Entry>(1));
promptEntries.get(0).add(phonePromptEntry);
promptEntries.get(1).add(emailPromptEntry);
final int subHeaderTextColor = getResources().getColor(R.color.quickcontact_entry_sub_header_text_color);
final PorterDuffColorFilter greyColorFilter = new PorterDuffColorFilter(subHeaderTextColor, PorterDuff.Mode.SRC_ATOP);
mNoContactDetailsCard.initialize(promptEntries, 2, /* isExpanded = */
true, /* isAlwaysExpanded = */
true, mExpandingEntryCardViewListener, mScroller);
mNoContactDetailsCard.setVisibility(View.VISIBLE);
mNoContactDetailsCard.setEntryHeaderColor(subHeaderTextColor);
mNoContactDetailsCard.setColorAndFilter(subHeaderTextColor, greyColorFilter);
}
use of com.android.contacts.quickcontact.ExpandingEntryCardView.Entry in project packages_apps_Contacts by AOKP.
the class QuickContactActivity method populateContactAndAboutCard.
private void populateContactAndAboutCard(Cp2DataCardModel cp2DataCardModel, boolean shouldAddPhoneticName) {
mCachedCp2DataCardModel = cp2DataCardModel;
if (mHasIntentLaunched || cp2DataCardModel == null) {
return;
}
Trace.beginSection("bind contact card");
final List<List<Entry>> contactCardEntries = cp2DataCardModel.contactCardEntries;
final List<List<Entry>> aboutCardEntries = cp2DataCardModel.aboutCardEntries;
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, firstEntriesArePrioritizedMimeType);
mContactCard.setVisibility(View.VISIBLE);
} else {
mContactCard.setVisibility(View.GONE);
}
Trace.endSection();
Trace.beginSection("bind about card");
// Phonetic name is not a data item, so the entry needs to be created separately
// But if mCachedCp2DataCardModel is passed to this method (e.g. returning from editor
// without saving any changes), then it should include phoneticName and the phoneticName
// shouldn't be changed. If this is the case, we shouldn't add it again. b/27459294
final String phoneticName = mContactData.getPhoneticName();
if (shouldAddPhoneticName && !TextUtils.isEmpty(phoneticName)) {
Entry phoneticEntry = new Entry(/* viewId = */
-1, /* icon = */
null, getResources().getString(R.string.name_phonetic), phoneticName, /* subHeaderIcon = */
null, /* text = */
null, /* textIcon = */
null, /* primaryContentDescription = */
null, /* intent = */
null, /* alternateIcon = */
null, /* alternateIntent = */
null, /* alternateContentDescription = */
null, /* shouldApplyColor = */
false, /* isEditable = */
false, /* EntryContextMenuInfo = */
new EntryContextMenuInfo(phoneticName, getResources().getString(R.string.name_phonetic), /* mimeType = */
null, /* id = */
-1, /* isPrimary = */
false), /* thirdIcon = */
null, /* thirdIntent = */
null, /* thirdContentDescription = */
null, /* thirdAction = */
Entry.ACTION_NONE, /* thirdExtras = */
null, /* iconResourceId = */
0);
List<Entry> phoneticList = new ArrayList<>();
phoneticList.add(phoneticEntry);
// Phonetic name comes after nickname. Check to see if the first entry type is nickname
if (aboutCardEntries.size() > 0 && aboutCardEntries.get(0).get(0).getHeader().equals(getResources().getString(R.string.header_nickname_entry))) {
aboutCardEntries.add(1, phoneticList);
} else {
aboutCardEntries.add(0, phoneticList);
}
}
if (!TextUtils.isEmpty(customAboutCardName)) {
mAboutCard.setTitle(customAboutCardName);
}
mAboutCard.initialize(aboutCardEntries, /* numInitialVisibleEntries = */
1, /* isExpanded = */
true, /* isAlwaysExpanded = */
true, mExpandingEntryCardViewListener, mScroller);
if (contactCardEntries.size() == 0 && aboutCardEntries.size() == 0) {
initializeNoContactDetailCard();
} else {
mNoContactDetailsCard.setVisibility(View.GONE);
}
// card if it has entries. Otherwise About card visibility will be set in bindRecentData()
if (isAllRecentDataLoaded() && aboutCardEntries.size() > 0) {
mAboutCard.setVisibility(View.VISIBLE);
}
Trace.endSection();
}
use of com.android.contacts.quickcontact.ExpandingEntryCardView.Entry in project packages_apps_Contacts by AOKP.
the class QuickContactActivity method generateDataModelFromContact.
/**
* Builds the {@link DataItem}s Map out of the Contact.
* @param data The contact to build the data from.
* @return A pair containing a list of data items sorted within mimetype and sorted
* amongst mimetype. The map goes from mimetype string to the sorted list of data items within
* mimetype
*/
private Cp2DataCardModel generateDataModelFromContact(Contact data) {
Trace.beginSection("Build data items map");
final Map<String, List<DataItem>> dataItemsMap = new HashMap<>();
final ResolveCache cache = ResolveCache.getInstance(this);
for (RawContact rawContact : data.getRawContacts()) {
for (DataItem dataItem : rawContact.getDataItems()) {
dataItem.setRawContactId(rawContact.getId());
final String mimeType = dataItem.getMimeType();
if (mimeType == null)
continue;
final AccountType accountType = rawContact.getAccountType(this);
final DataKind dataKind = AccountTypeManager.getInstance(this).getKindOrFallback(accountType, mimeType);
if (dataKind == null)
continue;
dataItem.setDataKind(dataKind);
final boolean hasData = !TextUtils.isEmpty(dataItem.buildDataString(this, dataKind));
if (isMimeExcluded(mimeType) || !hasData)
continue;
List<DataItem> dataItemListByType = dataItemsMap.get(mimeType);
if (dataItemListByType == null) {
dataItemListByType = new ArrayList<>();
dataItemsMap.put(mimeType, dataItemListByType);
}
dataItemListByType.add(dataItem);
}
}
Trace.endSection();
Trace.beginSection("sort within mimetypes");
/*
* Sorting is a multi part step. The end result is to a have a sorted list of the most
* used data items, one per mimetype. Then, within each mimetype, the list of data items
* for that type is also sorted, based off of {super primary, primary, times used} in that
* order.
*/
final List<List<DataItem>> dataItemsList = new ArrayList<>();
for (List<DataItem> mimeTypeDataItems : dataItemsMap.values()) {
// Remove duplicate data items
Collapser.collapseList(mimeTypeDataItems, this);
// Sort within mimetype
Collections.sort(mimeTypeDataItems, mWithinMimeTypeDataItemComparator);
// Add to the list of data item lists
dataItemsList.add(mimeTypeDataItems);
}
Trace.endSection();
Trace.beginSection("sort amongst mimetypes");
// Sort amongst mimetypes to bubble up the top data items for the contact card
Collections.sort(dataItemsList, mAmongstMimeTypeDataItemComparator);
Trace.endSection();
Trace.beginSection("cp2 data items to entries");
final List<List<Entry>> contactCardEntries = new ArrayList<>();
final List<List<Entry>> aboutCardEntries = buildAboutCardEntries(dataItemsMap);
final MutableString aboutCardName = new MutableString();
for (int i = 0; i < dataItemsList.size(); ++i) {
final List<DataItem> dataItemsByMimeType = dataItemsList.get(i);
final DataItem topDataItem = dataItemsByMimeType.get(0);
if (SORTED_ABOUT_CARD_MIMETYPES.contains(topDataItem.getMimeType())) {
// About card mimetypes are built in buildAboutCardEntries, skip here
continue;
} else {
List<Entry> contactEntries = dataItemsToEntries(dataItemsList.get(i), aboutCardName);
if (contactEntries.size() > 0) {
contactCardEntries.add(contactEntries);
}
}
}
Trace.endSection();
final Cp2DataCardModel dataModel = new Cp2DataCardModel();
dataModel.customAboutCardName = aboutCardName.value;
dataModel.aboutCardEntries = aboutCardEntries;
dataModel.contactCardEntries = contactCardEntries;
dataModel.dataItemsMap = dataItemsMap;
return dataModel;
}
Aggregations