Merge "Move dataItemToEntry() off UI thread" into lmp-dev
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 6240c37..9bcdde8 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -25,13 +25,13 @@
import android.content.ActivityNotFoundException;
import android.content.ContentUris;
import android.content.ContentValues;
+import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.Color;
-import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.BitmapDrawable;
@@ -68,7 +68,6 @@
import android.telecomm.TelecommManager;
import android.text.TextUtils;
import android.util.Log;
-import android.util.Pair;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
@@ -202,21 +201,13 @@
private ExpandingEntryCardView mNoContactDetailsCard;
private ExpandingEntryCardView mRecentCard;
private ExpandingEntryCardView mAboutCard;
- /**
- * This list contains all the {@link DataItem}s. Each nested list contains all data items of a
- * specific mimetype in sorted order, using mWithinMimeTypeDataItemComparator. The mimetype
- * lists are sorted using mAmongstMimeTypeDataItemComparator.
- */
- private List<List<DataItem>> mDataItemsList;
- /**
- * A map between a mimetype string and the corresponding list of data items. The data items
- * are in sorted order using mWithinMimeTypeDataItemComparator.
- */
- private Map<String, List<DataItem>> mDataItemsMap;
private MultiShrinkScroller mScroller;
private SelectAccountDialogFragmentListener mSelectAccountFragmentListener;
- private AsyncTask<Void, Void, Pair<List<List<DataItem>>, Map<String, List<DataItem>>>>
- mEntriesAndActionsTask;
+ private AsyncTask<Void, Void, Cp2DataCardModel> mEntriesAndActionsTask;
+ /**
+ * The last copy of Cp2DataCardModel that was passed to {@link #populateContactAndAboutCard}.
+ */
+ private Cp2DataCardModel mCachedCp2DataCardModel;
/**
* This scrim's opacity is controlled in two different ways. 1) Before the initial entrance
* animation finishes, the opacity is animated by a value animator. This is designed to
@@ -791,26 +782,22 @@
Trace.endSection();
- mEntriesAndActionsTask = new AsyncTask<Void, Void,
- Pair<List<List<DataItem>>, Map<String, List<DataItem>>>>() {
+ mEntriesAndActionsTask = new AsyncTask<Void, Void, Cp2DataCardModel>() {
@Override
- protected Pair<List<List<DataItem>>, Map<String, List<DataItem>>> doInBackground(
+ protected Cp2DataCardModel doInBackground(
Void... params) {
return generateDataModelFromContact(data);
}
@Override
- protected void onPostExecute(Pair<List<List<DataItem>>,
- Map<String, List<DataItem>>> dataItemsPair) {
- super.onPostExecute(dataItemsPair);
- mDataItemsList = dataItemsPair.first;
- mDataItemsMap = dataItemsPair.second;
+ protected void onPostExecute(Cp2DataCardModel cardDataModel) {
+ super.onPostExecute(cardDataModel);
// Check that original AsyncTask parameters are still valid and the activity
// is still running before binding to UI. A new intent could invalidate
// the results, for example.
if (data == mContactData && !isCancelled()) {
- bindDataToCards();
+ bindDataToCards(cardDataModel);
showActivity();
}
}
@@ -818,13 +805,14 @@
mEntriesAndActionsTask.execute();
}
- private void bindDataToCards() {
- startInteractionLoaders();
- populateContactAndAboutCard();
+ private void bindDataToCards(Cp2DataCardModel cp2DataCardModel) {
+ startInteractionLoaders(cp2DataCardModel);
+ populateContactAndAboutCard(cp2DataCardModel);
}
- private void startInteractionLoaders() {
- final List<DataItem> phoneDataItems = mDataItemsMap.get(Phone.CONTENT_ITEM_TYPE);
+ private void startInteractionLoaders(Cp2DataCardModel cp2DataCardModel) {
+ final Map<String, List<DataItem>> dataItemsMap = cp2DataCardModel.dataItemsMap;
+ final List<DataItem> phoneDataItems = dataItemsMap.get(Phone.CONTENT_ITEM_TYPE);
String[] phoneNumbers = null;
if (phoneDataItems != null) {
phoneNumbers = new String[phoneDataItems.size()];
@@ -851,7 +839,7 @@
Trace.beginSection("start calendar loader");
- final List<DataItem> emailDataItems = mDataItemsMap.get(Email.CONTENT_ITEM_TYPE);
+ final List<DataItem> emailDataItems = dataItemsMap.get(Email.CONTENT_ITEM_TYPE);
String[] emailAddresses = null;
if (emailDataItems != null) {
emailAddresses = new String[emailDataItems.size()];
@@ -881,14 +869,17 @@
}
}
- private List<List<Entry>> 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 = mDataItemsMap.get(mimetype);
+ final List<DataItem> mimeTypeItems = dataItemsMap.get(mimetype);
if (mimeTypeItems == null) {
continue;
}
- final List<Entry> aboutEntries = dataItemsToEntries(mimeTypeItems);
+ // 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);
}
@@ -902,32 +893,20 @@
// If returning from a launched activity, repopulate the contact and about card
if (mHasIntentLaunched) {
mHasIntentLaunched = false;
- populateContactAndAboutCard();
+ populateContactAndAboutCard(mCachedCp2DataCardModel);
}
}
- private void populateContactAndAboutCard() {
- if (mHasIntentLaunched) {
+ private void populateContactAndAboutCard(Cp2DataCardModel cp2DataCardModel) {
+ mCachedCp2DataCardModel = cp2DataCardModel;
+ if (mHasIntentLaunched || cp2DataCardModel == null) {
return;
}
Trace.beginSection("bind contact card");
- final List<List<Entry>> contactCardEntries = new ArrayList<>();
- final List<List<Entry>> aboutCardEntries = buildAboutCardEntries();
-
- for (int i = 0; i < mDataItemsList.size(); ++i) {
- final List<DataItem> dataItemsByMimeType = mDataItemsList.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(mDataItemsList.get(i));
- if (contactEntries.size() > 0) {
- contactCardEntries.add(contactEntries);
- }
- }
- }
+ final List<List<Entry>> contactCardEntries = cp2DataCardModel.contactCardEntries;
+ final List<List<Entry>> aboutCardEntries = cp2DataCardModel.aboutCardEntries;
+ final String customAboutCardName = cp2DataCardModel.customAboutCardName;
if (contactCardEntries.size() > 0) {
mContactCard.initialize(contactCardEntries,
@@ -970,6 +949,10 @@
}
}
+ if (!TextUtils.isEmpty(customAboutCardName)) {
+ mAboutCard.setTitle(customAboutCardName);
+ }
+
mAboutCard.initialize(aboutCardEntries,
/* numInitialVisibleEntries = */ 1,
/* isExpanded = */ true,
@@ -1037,7 +1020,7 @@
* amongst mimetype. The map goes from mimetype string to the sorted list of data items within
* mimetype
*/
- private Pair<List<List<DataItem>>, Map<String, List<DataItem>>> generateDataModelFromContact(
+ private Cp2DataCardModel generateDataModelFromContact(
Contact data) {
Trace.beginSection("Build data items map");
@@ -1096,16 +1079,69 @@
Collections.sort(dataItemsList, mAmongstMimeTypeDataItemComparator);
Trace.endSection();
- return new Pair<>(dataItemsList, dataItemsMap);
+ 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;
+ }
+
+ /**
+ * Class used to hold the About card and Contact cards' data model that gets generated
+ * on a background thread. All data is from CP2.
+ */
+ private static class Cp2DataCardModel {
+ /**
+ * A map between a mimetype string and the corresponding list of data items. The data items
+ * are in sorted order using mWithinMimeTypeDataItemComparator.
+ */
+ public Map<String, List<DataItem>> dataItemsMap;
+ public List<List<Entry>> aboutCardEntries;
+ public List<List<Entry>> contactCardEntries;
+ public String customAboutCardName;
+ }
+
+ private static class MutableString {
+ public String value;
}
/**
* Converts a {@link DataItem} into an {@link ExpandingEntryCardView.Entry} for display.
* If the {@link ExpandingEntryCardView.Entry} has no visual elements, null is returned.
+ *
+ * This runs on a background thread. This is set as static to avoid accidentally adding
+ * additional dependencies on unsafe things (like the Activity).
+ *
* @param dataItem The {@link DataItem} to convert.
* @return The {@link ExpandingEntryCardView.Entry}, or null if no visual elements are present.
*/
- private Entry dataItemToEntry(DataItem dataItem) {
+ private static Entry dataItemToEntry(DataItem dataItem,
+ Context context, Contact contactData,
+ final MutableString aboutCardName) {
Drawable icon = null;
String header = null;
String subHeader = null;
@@ -1120,11 +1156,12 @@
final boolean isEditable = false;
EntryContextMenuInfo entryContextMenuInfo = null;
+ context = context.getApplicationContext();
DataKind kind = dataItem.getDataKind();
if (dataItem instanceof ImDataItem) {
final ImDataItem im = (ImDataItem) dataItem;
- intent = ContactsUtils.buildImIntent(this, im).first;
+ intent = ContactsUtils.buildImIntent(context, im).first;
final boolean isEmail = im.isCreatedFromEmail();
final int protocol;
if (!im.isProtocolValid()) {
@@ -1135,19 +1172,19 @@
if (protocol == Im.PROTOCOL_CUSTOM) {
// If the protocol is custom, display the "IM" entry header as well to distinguish
// this entry from other ones
- header = getResources().getString(R.string.header_im_entry);
- subHeader = Im.getProtocolLabel(getResources(), protocol,
+ header = context.getResources().getString(R.string.header_im_entry);
+ subHeader = Im.getProtocolLabel(context.getResources(), protocol,
im.getCustomProtocol()).toString();
text = im.getData();
} else {
- header = Im.getProtocolLabel(getResources(), protocol,
+ header = Im.getProtocolLabel(context.getResources(), protocol,
im.getCustomProtocol()).toString();
subHeader = im.getData();
}
entryContextMenuInfo = new EntryContextMenuInfo(im.getData(), header);
} else if (dataItem instanceof OrganizationDataItem) {
final OrganizationDataItem organization = (OrganizationDataItem) dataItem;
- header = getResources().getString(R.string.header_organization_entry);
+ header = context.getResources().getString(R.string.header_organization_entry);
subHeader = organization.getCompany();
entryContextMenuInfo = new EntryContextMenuInfo(subHeader, header);
text = organization.getTitle();
@@ -1155,36 +1192,37 @@
final NicknameDataItem nickname = (NicknameDataItem) dataItem;
// Build nickname entries
final boolean isNameRawContact =
- (mContactData.getNameRawContactId() == dataItem.getRawContactId());
+ (contactData.getNameRawContactId() == dataItem.getRawContactId());
final boolean duplicatesTitle =
isNameRawContact
- && mContactData.getDisplayNameSource() == DisplayNameSources.NICKNAME;
+ && contactData.getDisplayNameSource() == DisplayNameSources.NICKNAME;
if (!duplicatesTitle) {
- header = getResources().getString(R.string.header_nickname_entry);
+ header = context.getResources().getString(R.string.header_nickname_entry);
subHeader = nickname.getName();
entryContextMenuInfo = new EntryContextMenuInfo(subHeader, header);
}
} else if (dataItem instanceof NoteDataItem) {
final NoteDataItem note = (NoteDataItem) dataItem;
- header = getResources().getString(R.string.header_note_entry);
+ header = context.getResources().getString(R.string.header_note_entry);
subHeader = note.getNote();
entryContextMenuInfo = new EntryContextMenuInfo(subHeader, header);
} else if (dataItem instanceof WebsiteDataItem) {
final WebsiteDataItem website = (WebsiteDataItem) dataItem;
- header = getResources().getString(R.string.header_website_entry);
+ header = context.getResources().getString(R.string.header_website_entry);
subHeader = website.getUrl();
entryContextMenuInfo = new EntryContextMenuInfo(subHeader, header);
try {
- final WebAddress webAddress = new WebAddress(website.buildDataString(this, kind));
+ final WebAddress webAddress = new WebAddress(website.buildDataString(context,
+ kind));
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webAddress.toString()));
} catch (final ParseException e) {
- Log.e(TAG, "Couldn't parse website: " + website.buildDataString(this, kind));
+ Log.e(TAG, "Couldn't parse website: " + website.buildDataString(context, kind));
}
} else if (dataItem instanceof EventDataItem) {
final EventDataItem event = (EventDataItem) dataItem;
- final String dataString = event.buildDataString(this, kind);
+ final String dataString = event.buildDataString(context, kind);
final Calendar cal = DateUtils.parseDate(dataString, false);
if (cal != null) {
final Date nextAnniversary =
@@ -1194,46 +1232,47 @@
ContentUris.appendId(builder, nextAnniversary.getTime());
intent = new Intent(Intent.ACTION_VIEW).setData(builder.build());
}
- header = getResources().getString(R.string.header_event_entry);
+ header = context.getResources().getString(R.string.header_event_entry);
if (event.hasKindTypeColumn(kind)) {
- subHeader = Event.getTypeLabel(getResources(), event.getKindTypeColumn(kind),
+ subHeader = Event.getTypeLabel(context.getResources(), event.getKindTypeColumn(kind),
event.getLabel()).toString();
}
- text = DateUtils.formatDate(this, dataString);
+ text = DateUtils.formatDate(context, dataString);
entryContextMenuInfo = new EntryContextMenuInfo(text, header);
} else if (dataItem instanceof RelationDataItem) {
final RelationDataItem relation = (RelationDataItem) dataItem;
- final String dataString = relation.buildDataString(this, kind);
+ final String dataString = relation.buildDataString(context, kind);
if (!TextUtils.isEmpty(dataString)) {
intent = new Intent(Intent.ACTION_SEARCH);
intent.putExtra(SearchManager.QUERY, dataString);
intent.setType(Contacts.CONTENT_TYPE);
}
- header = getResources().getString(R.string.header_relation_entry);
+ header = context.getResources().getString(R.string.header_relation_entry);
subHeader = relation.getName();
entryContextMenuInfo = new EntryContextMenuInfo(subHeader, header);
if (relation.hasKindTypeColumn(kind)) {
- text = Relation.getTypeLabel(getResources(), relation.getKindTypeColumn(kind),
+ text = Relation.getTypeLabel(context.getResources(),
+ relation.getKindTypeColumn(kind),
relation.getLabel()).toString();
}
} else if (dataItem instanceof PhoneDataItem) {
final PhoneDataItem phone = (PhoneDataItem) dataItem;
if (!TextUtils.isEmpty(phone.getNumber())) {
- header = phone.buildDataString(this, kind);
+ header = phone.buildDataString(context, kind);
entryContextMenuInfo = new EntryContextMenuInfo(header,
- getResources().getString(R.string.phoneLabelsGroup));
+ context.getResources().getString(R.string.phoneLabelsGroup));
if (phone.hasKindTypeColumn(kind)) {
- text = Phone.getTypeLabel(getResources(), phone.getKindTypeColumn(kind),
+ text = Phone.getTypeLabel(context.getResources(), phone.getKindTypeColumn(kind),
phone.getLabel()).toString();
}
- icon = getResources().getDrawable(R.drawable.ic_phone_24dp);
- if (PhoneCapabilityTester.isPhone(this)) {
+ icon = context.getResources().getDrawable(R.drawable.ic_phone_24dp);
+ if (PhoneCapabilityTester.isPhone(context)) {
intent = CallUtil.getCallIntent(phone.getNumber());
}
alternateIntent = new Intent(Intent.ACTION_SENDTO,
Uri.fromParts(CallUtil.SCHEME_SMSTO, phone.getNumber(), null));
- alternateIcon = getResources().getDrawable(R.drawable.ic_message_24dp);
- alternateContentDescription = getResources().getString(R.string.sms_other);
+ alternateIcon = context.getResources().getDrawable(R.drawable.ic_message_24dp);
+ alternateContentDescription = context.getResources().getString(R.string.sms_other);
}
} else if (dataItem instanceof EmailDataItem) {
final EmailDataItem email = (EmailDataItem) dataItem;
@@ -1243,12 +1282,12 @@
intent = new Intent(Intent.ACTION_SENDTO, mailUri);
header = email.getAddress();
entryContextMenuInfo = new EntryContextMenuInfo(header,
- getResources().getString(R.string.emailLabelsGroup));
+ context.getResources().getString(R.string.emailLabelsGroup));
if (email.hasKindTypeColumn(kind)) {
- text = Email.getTypeLabel(getResources(), email.getKindTypeColumn(kind),
+ text = Email.getTypeLabel(context.getResources(), email.getKindTypeColumn(kind),
email.getLabel()).toString();
}
- icon = getResources().getDrawable(R.drawable.ic_email_24dp);
+ icon = context.getResources().getDrawable(R.drawable.ic_email_24dp);
}
} else if (dataItem instanceof StructuredPostalDataItem) {
StructuredPostalDataItem postal = (StructuredPostalDataItem) dataItem;
@@ -1257,18 +1296,18 @@
intent = StructuredPostalUtils.getViewPostalAddressIntent(postalAddress);
header = postal.getFormattedAddress();
entryContextMenuInfo = new EntryContextMenuInfo(header,
- getResources().getString(R.string.postalLabelsGroup));
+ context.getResources().getString(R.string.postalLabelsGroup));
if (postal.hasKindTypeColumn(kind)) {
- text = StructuredPostal.getTypeLabel(getResources(),
+ text = StructuredPostal.getTypeLabel(context.getResources(),
postal.getKindTypeColumn(kind), postal.getLabel()).toString();
}
alternateIntent =
StructuredPostalUtils.getViewPostalAddressDirectionsIntent(postalAddress);
- alternateIcon = getResources().getDrawable(R.drawable.ic_directions_24dp);
- icon = getResources().getDrawable(R.drawable.ic_place_24dp);
+ alternateIcon = context.getResources().getDrawable(R.drawable.ic_directions_24dp);
+ icon = context.getResources().getDrawable(R.drawable.ic_place_24dp);
}
} else if (dataItem instanceof SipAddressDataItem) {
- if (PhoneCapabilityTester.isSipPhone(this)) {
+ if (PhoneCapabilityTester.isSipPhone(context)) {
final SipAddressDataItem sip = (SipAddressDataItem) dataItem;
final String address = sip.getSipAddress();
if (!TextUtils.isEmpty(address)) {
@@ -1276,25 +1315,25 @@
intent = CallUtil.getCallIntent(callUri);
header = address;
entryContextMenuInfo = new EntryContextMenuInfo(header,
- getResources().getString(R.string.phoneLabelsGroup));
+ context.getResources().getString(R.string.phoneLabelsGroup));
if (sip.hasKindTypeColumn(kind)) {
- text = SipAddress.getTypeLabel(getResources(), sip.getKindTypeColumn(kind),
- sip.getLabel()).toString();
+ text = SipAddress.getTypeLabel(context.getResources(),
+ sip.getKindTypeColumn(kind), sip.getLabel()).toString();
}
- icon = getResources().getDrawable(R.drawable.ic_dialer_sip_black_24dp);
+ icon = context.getResources().getDrawable(R.drawable.ic_dialer_sip_black_24dp);
}
}
} else if (dataItem instanceof StructuredNameDataItem) {
final String givenName = ((StructuredNameDataItem) dataItem).getGivenName();
if (!TextUtils.isEmpty(givenName)) {
- mAboutCard.setTitle(getResources().getString(R.string.about_card_title) +
- " " + givenName);
+ aboutCardName.value = context.getResources().getString(R.string.about_card_title) +
+ " " + givenName;
} else {
- mAboutCard.setTitle(getResources().getString(R.string.about_card_title));
+ aboutCardName.value = context.getResources().getString(R.string.about_card_title);
}
} else {
// Custom DataItem
- header = dataItem.buildDataStringForDisplay(this, kind);
+ header = dataItem.buildDataStringForDisplay(context, kind);
text = kind.typeColumn;
intent = new Intent(Intent.ACTION_VIEW);
final Uri uri = ContentUris.withAppendedId(Data.CONTENT_URI, dataItem.getId());
@@ -1308,22 +1347,22 @@
case MIMETYPE_GPLUS_PROFILE:
if (INTENT_DATA_GPLUS_PROFILE_ADD_TO_CIRCLE.equals(
intent.getDataString())) {
- icon = getResources().getDrawable(
+ icon = context.getResources().getDrawable(
R.drawable.ic_add_to_circles_black_24);
} else {
- icon = getResources().getDrawable(R.drawable.ic_google_plus_24dp);
+ icon = context.getResources().getDrawable(R.drawable.ic_google_plus_24dp);
}
break;
case MIMETYPE_HANGOUTS:
if (INTENT_DATA_HANGOUTS_VIDEO.equals(intent.getDataString())) {
- icon = getResources().getDrawable(R.drawable.ic_hangout_video_24dp);
+ icon = context.getResources().getDrawable(R.drawable.ic_hangout_video_24dp);
} else {
- icon = getResources().getDrawable(R.drawable.ic_hangout_24dp);
+ icon = context.getResources().getDrawable(R.drawable.ic_hangout_24dp);
}
break;
default:
entryContextMenuInfo = new EntryContextMenuInfo(header, mimetype);
- icon = ResolveCache.getInstance(this).getIcon(
+ icon = ResolveCache.getInstance(context).getIcon(
dataItem.getMimeType(), intent);
// Call mutate to create a new Drawable.ConstantState for color filtering
if (icon != null) {
@@ -1336,20 +1375,20 @@
if (intent != null) {
// Do not set the intent is there are no resolves
- if (!PhoneCapabilityTester.isIntentRegistered(this, intent)) {
+ if (!PhoneCapabilityTester.isIntentRegistered(context, intent)) {
intent = null;
}
}
if (alternateIntent != null) {
// Do not set the alternate intent is there are no resolves
- if (!PhoneCapabilityTester.isIntentRegistered(this, alternateIntent)) {
+ if (!PhoneCapabilityTester.isIntentRegistered(context, alternateIntent)) {
alternateIntent = null;
}
// Attempt to use package manager to find a suitable content description if needed
if (TextUtils.isEmpty(alternateContentDescription)) {
- alternateContentDescription = getIntentResolveLabel(alternateIntent);
+ alternateContentDescription = getIntentResolveLabel(alternateIntent, context);
}
}
@@ -1368,10 +1407,11 @@
isEditable, entryContextMenuInfo);
}
- private List<Entry> dataItemsToEntries(List<DataItem> dataItems) {
+ private List<Entry> dataItemsToEntries(List<DataItem> dataItems,
+ MutableString aboutCardTitleOut) {
final List<Entry> entries = new ArrayList<>();
for (DataItem dataItem : dataItems) {
- final Entry entry = dataItemToEntry(dataItem);
+ final Entry entry = dataItemToEntry(dataItem, this, mContactData, aboutCardTitleOut);
if (entry != null) {
entries.add(entry);
}
@@ -1379,8 +1419,8 @@
return entries;
}
- private String getIntentResolveLabel(Intent intent) {
- final List<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent,
+ private static String getIntentResolveLabel(Intent intent, Context context) {
+ final List<ResolveInfo> matches = context.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
// Pick first match, otherwise best found
@@ -1389,14 +1429,14 @@
if (size == 1) {
bestResolve = matches.get(0);
} else if (size > 1) {
- bestResolve = ResolveCache.getInstance(this).getBestResolve(intent, matches);
+ bestResolve = ResolveCache.getInstance(context).getBestResolve(intent, matches);
}
if (bestResolve == null) {
return null;
}
- return String.valueOf(bestResolve.loadLabel(getPackageManager()));
+ return String.valueOf(bestResolve.loadLabel(context.getPackageManager()));
}
/**