blob: f76b796bc2097694ca17f98245baf3872cecb000 [file] [log] [blame]
/*
* 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;
}
};
}
}
}