diff options
Diffstat (limited to 'src/com/android/messaging/datamodel/media/VCardResourceEntry.java')
-rw-r--r-- | src/com/android/messaging/datamodel/media/VCardResourceEntry.java | 389 |
1 files changed, 389 insertions, 0 deletions
diff --git a/src/com/android/messaging/datamodel/media/VCardResourceEntry.java b/src/com/android/messaging/datamodel/media/VCardResourceEntry.java new file mode 100644 index 0000000..f76b796 --- /dev/null +++ b/src/com/android/messaging/datamodel/media/VCardResourceEntry.java @@ -0,0 +1,389 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.messaging.datamodel.media; + +import android.content.Intent; +import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; +import android.net.Uri; +import android.provider.ContactsContract.CommonDataKinds.Im; +import android.provider.ContactsContract.CommonDataKinds.Organization; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.support.v4.util.ArrayMap; +import android.text.TextUtils; + +import com.android.messaging.Factory; +import com.android.messaging.R; +import com.android.messaging.datamodel.MediaScratchFileProvider; +import com.android.messaging.datamodel.data.PersonItemData; +import com.android.messaging.util.ContactUtil; +import com.android.messaging.util.LogUtil; +import com.android.messaging.util.SafeAsyncTask; +import com.android.vcard.VCardEntry; +import com.android.vcard.VCardEntry.EmailData; +import com.android.vcard.VCardEntry.ImData; +import com.android.vcard.VCardEntry.NoteData; +import com.android.vcard.VCardEntry.OrganizationData; +import com.android.vcard.VCardEntry.PhoneData; +import com.android.vcard.VCardEntry.PostalData; +import com.android.vcard.VCardEntry.WebsiteData; +import com.android.vcard.VCardProperty; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; + +/** + * Holds one entry item (i.e. a single contact) within a VCard resource. It is able to take + * a VCardEntry and extract relevant information from it. + */ +public class VCardResourceEntry { + public static final String PROPERTY_KIND = "KIND"; + + public static final String KIND_LOCATION = "location"; + + private final List<VCardResourceEntry.VCardResourceEntryDestinationItem> mContactInfo; + private final Uri mAvatarUri; + private final String mDisplayName; + private final CustomVCardEntry mVCard; + + public VCardResourceEntry(final CustomVCardEntry vcard, final Uri avatarUri) { + mContactInfo = getContactInfoFromVCardEntry(vcard); + mDisplayName = getDisplayNameFromVCardEntry(vcard); + mAvatarUri = avatarUri; + mVCard = vcard; + } + + void close() { + // If the avatar image was temporarily saved in the scratch folder, remove that. + if (MediaScratchFileProvider.isMediaScratchSpaceUri(mAvatarUri)) { + SafeAsyncTask.executeOnThreadPool(new Runnable() { + @Override + public void run() { + Factory.get().getApplicationContext().getContentResolver().delete( + mAvatarUri, null, null); + } + }); + } + } + + public String getKind() { + VCardProperty kindProperty = mVCard.getProperty(PROPERTY_KIND); + return kindProperty == null ? null : kindProperty.getRawValue(); + } + + public Uri getAvatarUri() { + return mAvatarUri; + } + + public String getDisplayName() { + return mDisplayName; + } + + public String getDisplayAddress() { + List<PostalData> postalList = mVCard.getPostalList(); + if (postalList == null || postalList.size() < 1) { + return null; + } + + return formatAddress(postalList.get(0)); + } + + public String getNotes() { + List<NoteData> notes = mVCard.getNotes(); + if (notes == null || notes.size() == 0) { + return null; + } + StringBuilder noteBuilder = new StringBuilder(); + for (NoteData note : notes) { + noteBuilder.append(note.getNote()); + } + return noteBuilder.toString(); + } + + /** + * Returns a UI-facing representation that can be bound and consumed by the UI layer to display + * this VCard resource entry. + */ + public PersonItemData getDisplayItem() { + return new PersonItemData() { + @Override + public Uri getAvatarUri() { + return VCardResourceEntry.this.getAvatarUri(); + } + + @Override + public String getDisplayName() { + return VCardResourceEntry.this.getDisplayName(); + } + + @Override + public String getDetails() { + return null; + } + + @Override + public Intent getClickIntent() { + return null; + } + + @Override + public long getContactId() { + return ContactUtil.INVALID_CONTACT_ID; + } + + @Override + public String getLookupKey() { + return null; + } + + @Override + public String getNormalizedDestination() { + return null; + } + }; + } + + public List<VCardResourceEntry.VCardResourceEntryDestinationItem> getContactInfo() { + return mContactInfo; + } + + private static List<VCardResourceEntryDestinationItem> getContactInfoFromVCardEntry( + final VCardEntry vcard) { + final Resources resources = Factory.get().getApplicationContext().getResources(); + final List<VCardResourceEntry.VCardResourceEntryDestinationItem> retList = + new ArrayList<VCardResourceEntry.VCardResourceEntryDestinationItem>(); + if (vcard.getPhoneList() != null) { + for (final PhoneData phone : vcard.getPhoneList()) { + final Intent intent = new Intent(Intent.ACTION_DIAL); + intent.setData(Uri.parse("tel:" + phone.getNumber())); + retList.add(new VCardResourceEntryDestinationItem(phone.getNumber(), + Phone.getTypeLabel(resources, phone.getType(), phone.getLabel()).toString(), + intent)); + } + } + + if (vcard.getEmailList() != null) { + for (final EmailData email : vcard.getEmailList()) { + final Intent intent = new Intent(Intent.ACTION_SENDTO); + intent.setData(Uri.parse("mailto:")); + intent.putExtra(Intent.EXTRA_EMAIL, new String[] { email.getAddress() }); + retList.add(new VCardResourceEntryDestinationItem(email.getAddress(), + Phone.getTypeLabel(resources, email.getType(), + email.getLabel()).toString(), intent)); + } + } + + if (vcard.getPostalList() != null) { + for (final PostalData postalData : vcard.getPostalList()) { + String type; + try { + type = resources. + getStringArray(android.R.array.postalAddressTypes) + [postalData.getType() - 1]; + } catch (final NotFoundException ex) { + type = resources.getStringArray(android.R.array.postalAddressTypes)[2]; + } catch (final Exception e) { + LogUtil.e(LogUtil.BUGLE_TAG, "createContactItem postal Exception:" + e); + type = resources.getStringArray(android.R.array.postalAddressTypes)[2]; + } + Intent intent = new Intent(Intent.ACTION_VIEW); + final String address = formatAddress(postalData); + try { + intent.setData(Uri.parse("geo:0,0?q=" + URLEncoder.encode(address, "UTF-8"))); + } catch (UnsupportedEncodingException e) { + intent = null; + } + + retList.add(new VCardResourceEntryDestinationItem(address, type, intent)); + } + } + + if (vcard.getImList() != null) { + for (final ImData imData : vcard.getImList()) { + String type = null; + try { + type = resources. + getString(Im.getProtocolLabelResource(imData.getProtocol())); + } catch (final NotFoundException ex) { + // Do nothing since this implies an empty label. + } + retList.add(new VCardResourceEntryDestinationItem(imData.getAddress(), type, null)); + } + } + + if (vcard.getOrganizationList() != null) { + for (final OrganizationData organtization : vcard.getOrganizationList()) { + String type = null; + try { + type = resources.getString(Organization.getTypeLabelResource( + organtization.getType())); + } catch (final NotFoundException ex) { + //set other kind as "other" + type = resources.getStringArray(android.R.array.organizationTypes)[1]; + } catch (final Exception e) { + LogUtil.e(LogUtil.BUGLE_TAG, "createContactItem org Exception:" + e); + type = resources.getStringArray(android.R.array.organizationTypes)[1]; + } + retList.add(new VCardResourceEntryDestinationItem( + organtization.getOrganizationName(), type, null)); + } + } + + if (vcard.getWebsiteList() != null) { + for (final WebsiteData web : vcard.getWebsiteList()) { + if (web != null && TextUtils.isGraphic(web.getWebsite())){ + String website = web.getWebsite(); + if (!website.startsWith("http://") && !website.startsWith("https://")) { + // Prefix required for parsing to end up with a scheme and result in + // navigation + website = "http://" + website; + } + final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(website)); + retList.add(new VCardResourceEntryDestinationItem(web.getWebsite(), null, + intent)); + } + } + } + + if (vcard.getBirthday() != null) { + final String birthday = vcard.getBirthday(); + if (TextUtils.isGraphic(birthday)){ + retList.add(new VCardResourceEntryDestinationItem(birthday, + resources.getString(R.string.vcard_detail_birthday_label), null)); + } + } + + if (vcard.getNotes() != null) { + for (final NoteData note : vcard.getNotes()) { + final ArrayMap<String, String> curChildMap = new ArrayMap<String, String>(); + if (TextUtils.isGraphic(note.getNote())){ + retList.add(new VCardResourceEntryDestinationItem(note.getNote(), + resources.getString(R.string.vcard_detail_notes_label), null)); + } + } + } + return retList; + } + + private static String formatAddress(final PostalData postalData) { + final StringBuilder sb = new StringBuilder(); + final String poBox = postalData.getPobox(); + if (!TextUtils.isEmpty(poBox)) { + sb.append(poBox); + sb.append(" "); + } + final String extendedAddress = postalData.getExtendedAddress(); + if (!TextUtils.isEmpty(extendedAddress)) { + sb.append(extendedAddress); + sb.append(" "); + } + final String street = postalData.getStreet(); + if (!TextUtils.isEmpty(street)) { + sb.append(street); + sb.append(" "); + } + final String localty = postalData.getLocalty(); + if (!TextUtils.isEmpty(localty)) { + sb.append(localty); + sb.append(" "); + } + final String region = postalData.getRegion(); + if (!TextUtils.isEmpty(region)) { + sb.append(region); + sb.append(" "); + } + final String postalCode = postalData.getPostalCode(); + if (!TextUtils.isEmpty(postalCode)) { + sb.append(postalCode); + sb.append(" "); + } + final String country = postalData.getCountry(); + if (!TextUtils.isEmpty(country)) { + sb.append(country); + } + return sb.toString(); + } + + private static String getDisplayNameFromVCardEntry(final VCardEntry vcard) { + String name = vcard.getDisplayName(); + if (name == null) { + vcard.consolidateFields(); + name = vcard.getDisplayName(); + } + return name; + } + + /** + * Represents one entry line (e.g. phone number and phone label) for a single contact. Each + * VCardResourceEntry may hold one or more VCardResourceEntryDestinationItem's. + */ + public static class VCardResourceEntryDestinationItem { + private final String mDisplayDestination; + private final String mDestinationType; + private final Intent mClickIntent; + public VCardResourceEntryDestinationItem(final String displayDestination, + final String destinationType, final Intent clickIntent) { + mDisplayDestination = displayDestination; + mDestinationType = destinationType; + mClickIntent = clickIntent; + } + + /** + * Returns a UI-facing representation that can be bound and consumed by the UI layer to + * display this VCard resource destination entry. + */ + public PersonItemData getDisplayItem() { + return new PersonItemData() { + @Override + public Uri getAvatarUri() { + return null; + } + + @Override + public String getDisplayName() { + return mDisplayDestination; + } + + @Override + public String getDetails() { + return mDestinationType; + } + + @Override + public Intent getClickIntent() { + return mClickIntent; + } + + @Override + public long getContactId() { + return ContactUtil.INVALID_CONTACT_ID; + } + + @Override + public String getLookupKey() { + return null; + } + + @Override + public String getNormalizedDestination() { + return null; + } + }; + } + } +} |