diff options
author | Daniel Lehmann <lehmannd@google.com> | 2010-03-12 14:17:08 -0800 |
---|---|---|
committer | Daniel Lehmann <lehmannd@google.com> | 2010-03-12 14:17:08 -0800 |
commit | 42aff67de3f0f4b8664a74fe6ff63ae191aa51bf (patch) | |
tree | ddbcaa2f6d55c9a8871a486de8c5753c4a2cdcf6 /src/com/android/providers | |
parent | 609cc5b4c96a6981f675a70ff743ecfec2b448e6 (diff) | |
download | packages_providers_ContactsProvider-42aff67de3f0f4b8664a74fe6ff63ae191aa51bf.zip packages_providers_ContactsProvider-42aff67de3f0f4b8664a74fe6ff63ae191aa51bf.tar.gz packages_providers_ContactsProvider-42aff67de3f0f4b8664a74fe6ff63ae191aa51bf.tar.bz2 |
Ability to create VCards containing several contacts
Bug:2501468
Change-Id: Ie28f1617d8ca02539eaf7bff90cc9decfa4e4ac6
Diffstat (limited to 'src/com/android/providers')
-rw-r--r-- | src/com/android/providers/contacts/ContactsProvider2.java | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java index e498bb3..b2823e1 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -108,14 +108,17 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.telephony.PhoneNumberUtils; import android.text.TextUtils; +import android.text.format.DateFormat; import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -183,6 +186,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private static final int CONTACTS_GROUP = 1008; private static final int CONTACTS_PHOTO = 1009; private static final int CONTACTS_AS_VCARD = 1010; + private static final int CONTACTS_AS_MULTI_VCARD = 1011; private static final int RAW_CONTACTS = 2002; private static final int RAW_CONTACTS_ID = 2003; @@ -425,6 +429,8 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*", CONTACTS_LOOKUP); matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/#", CONTACTS_LOOKUP_ID); matcher.addURI(ContactsContract.AUTHORITY, "contacts/as_vcard/*", CONTACTS_AS_VCARD); + matcher.addURI(ContactsContract.AUTHORITY, "contacts/as_multi_vcard/*", + CONTACTS_AS_MULTI_VCARD); matcher.addURI(ContactsContract.AUTHORITY, "contacts/strequent/", CONTACTS_STREQUENT); matcher.addURI(ContactsContract.AUTHORITY, "contacts/strequent/filter/*", CONTACTS_STREQUENT_FILTER); @@ -4030,7 +4036,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun case CONTACTS_AS_VCARD: { // When reading as vCard always use restricted view - final String lookupKey = uri.getPathSegments().get(2); + final String lookupKey = Uri.encode(uri.getPathSegments().get(2)); qb.setTables(mDbHelper.getContactView(true /* require restricted */)); qb.setProjectionMap(sContactsVCardProjectionMap); selectionArgs = insertSelectionArg(selectionArgs, @@ -4039,6 +4045,16 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun break; } + case CONTACTS_AS_MULTI_VCARD: { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); + String currentDateString = dateFormat.format(new Date()).toString(); + return db.rawQuery( + "SELECT" + + " 'vcards_' || ? || '.vcf' AS " + OpenableColumns.DISPLAY_NAME + "," + + " NULL AS " + OpenableColumns.SIZE, + new String[] { currentDateString }); + } + case CONTACTS_FILTER: { String filterParam = ""; if (uri.getPathSegments().size() > 2) { @@ -5231,15 +5247,42 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } case CONTACTS_AS_VCARD: { - final String lookupKey = uri.getPathSegments().get(2); - final long contactId = lookupContactIdByLookupKey(mDb, lookupKey); - final String selection = Contacts._ID + "=" + contactId; + final String lookupKey = Uri.encode(uri.getPathSegments().get(2)); + mSelectionArgs1[0] = String.valueOf(lookupContactIdByLookupKey(mDb, lookupKey)); + final String selection = Contacts._ID + "=?"; + + // When opening a contact as file, we pass back contents as a + // vCard-encoded stream. We build into a local buffer first, + // then pipe into MemoryFile once the exact size is known. + final ByteArrayOutputStream localStream = new ByteArrayOutputStream(); + outputRawContactsAsVCard(localStream, selection, mSelectionArgs1); + return buildAssetFileDescriptor(localStream); + } + + case CONTACTS_AS_MULTI_VCARD: { + final String lookupKeys = uri.getPathSegments().get(2); + final String[] loopupKeyList = lookupKeys.split(":"); + final StringBuilder inBuilder = new StringBuilder(); + int index = 0; + String[] selectionArgs = new String[loopupKeyList.length]; + for (String lookupKey : loopupKeyList) { + selectionArgs[index] = + String.valueOf(lookupContactIdByLookupKey(mDb, lookupKey)); + if (index == 0) { + inBuilder.append("(?"); + } else { + inBuilder.append(",?"); + } + index++; + } + inBuilder.append(')'); + final String selection = Contacts._ID + " IN " + inBuilder.toString(); // When opening a contact as file, we pass back contents as a // vCard-encoded stream. We build into a local buffer first, // then pipe into MemoryFile once the exact size is known. final ByteArrayOutputStream localStream = new ByteArrayOutputStream(); - outputRawContactsAsVCard(localStream, selection, null); + outputRawContactsAsVCard(localStream, selection, selectionArgs); return buildAssetFileDescriptor(localStream); } @@ -5311,6 +5354,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun case CONTACTS_LOOKUP_ID: return Contacts.CONTENT_ITEM_TYPE; case CONTACTS_AS_VCARD: + case CONTACTS_AS_MULTI_VCARD: return Contacts.CONTENT_VCARD_TYPE; case RAW_CONTACTS: return RawContacts.CONTENT_TYPE; |