summaryrefslogtreecommitdiffstats
path: root/src/com/android/messaging/datamodel/media/VCardResourceEntry.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/messaging/datamodel/media/VCardResourceEntry.java')
-rw-r--r--src/com/android/messaging/datamodel/media/VCardResourceEntry.java389
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;
+ }
+ };
+ }
+ }
+}