|
|
/*
|
|
|
* Copyright © 2013 – 2015 Ricki Hirner (bitfire web engineering).
|
|
|
* All rights reserved. This program and the accompanying materials
|
|
|
* are made available under the terms of the GNU Public License v3.0
|
|
|
* which accompanies this distribution, and is available at
|
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
|
*/
|
|
|
|
|
|
package at.bitfire.davdroid.resource;
|
|
|
|
|
|
import android.content.ContentProviderOperation;
|
|
|
import android.content.ContentValues;
|
|
|
import android.os.RemoteException;
|
|
|
import android.provider.ContactsContract;
|
|
|
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
|
|
|
|
|
|
import java.io.FileNotFoundException;
|
|
|
|
|
|
import at.bitfire.davdroid.BuildConfig;
|
|
|
import at.bitfire.davdroid.Constants;
|
|
|
import at.bitfire.vcard4android.AndroidAddressBook;
|
|
|
import at.bitfire.vcard4android.AndroidContact;
|
|
|
import at.bitfire.vcard4android.AndroidContactFactory;
|
|
|
import at.bitfire.vcard4android.BatchOperation;
|
|
|
import at.bitfire.vcard4android.Contact;
|
|
|
import at.bitfire.vcard4android.ContactsStorageException;
|
|
|
import ezvcard.Ezvcard;
|
|
|
|
|
|
public class LocalContact extends AndroidContact implements LocalResource {
|
|
|
static {
|
|
|
Contact.productID = "+//IDN bitfire.at//DAVdroid/" + BuildConfig.VERSION_NAME + " vcard4android ez-vcard/" + Ezvcard.VERSION;
|
|
|
}
|
|
|
|
|
|
protected LocalContact(AndroidAddressBook addressBook, long id, String fileName, String eTag) {
|
|
|
super(addressBook, id, fileName, eTag);
|
|
|
}
|
|
|
|
|
|
public LocalContact(AndroidAddressBook addressBook, Contact contact, String fileName, String eTag) {
|
|
|
super(addressBook, contact, fileName, eTag);
|
|
|
}
|
|
|
|
|
|
public void clearDirty(String eTag) throws ContactsStorageException {
|
|
|
try {
|
|
|
ContentValues values = new ContentValues(1);
|
|
|
values.put(ContactsContract.RawContacts.DIRTY, 0);
|
|
|
values.put(COLUMN_ETAG, eTag);
|
|
|
addressBook.provider.update(rawContactSyncURI(), values, null, null);
|
|
|
|
|
|
this.eTag = eTag;
|
|
|
} catch (RemoteException e) {
|
|
|
throw new ContactsStorageException("Couldn't clear dirty flag", e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void updateFileNameAndUID(String uid) throws ContactsStorageException {
|
|
|
try {
|
|
|
String newFileName = uid + ".vcf";
|
|
|
|
|
|
ContentValues values = new ContentValues(2);
|
|
|
values.put(COLUMN_FILENAME, newFileName);
|
|
|
values.put(COLUMN_UID, uid);
|
|
|
addressBook.provider.update(rawContactSyncURI(), values, null, null);
|
|
|
|
|
|
fileName = newFileName;
|
|
|
} catch (RemoteException e) {
|
|
|
throw new ContactsStorageException("Couldn't update UID", e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
// group support
|
|
|
|
|
|
@Override
|
|
|
protected void populateGroupMembership(ContentValues row) {
|
|
|
if (row.containsKey(GroupMembership.GROUP_ROW_ID)) {
|
|
|
long groupId = row.getAsLong(GroupMembership.GROUP_ROW_ID);
|
|
|
|
|
|
// fetch group
|
|
|
LocalGroup group = new LocalGroup(addressBook, groupId);
|
|
|
try {
|
|
|
Contact groupInfo = group.getContact();
|
|
|
|
|
|
// add to CATEGORIES
|
|
|
contact.getCategories().add(groupInfo.displayName);
|
|
|
} catch (FileNotFoundException|ContactsStorageException e) {
|
|
|
Constants.log.warn("Couldn't find assigned group #" + groupId + ", ignoring membership", e);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected void insertGroupMemberships(BatchOperation batch) throws ContactsStorageException {
|
|
|
for (String category : contact.getCategories()) {
|
|
|
// Is there already a category with this display name?
|
|
|
LocalGroup group = ((LocalAddressBook)addressBook).findGroupByTitle(category);
|
|
|
|
|
|
if (group == null) {
|
|
|
// no, we have to create the group before inserting the membership
|
|
|
|
|
|
Contact groupInfo = new Contact();
|
|
|
groupInfo.displayName = category;
|
|
|
group = new LocalGroup(addressBook, groupInfo);
|
|
|
group.create();
|
|
|
}
|
|
|
|
|
|
Long groupId = group.getId();
|
|
|
if (groupId != null) {
|
|
|
ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(dataSyncURI());
|
|
|
if (id == null)
|
|
|
builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0);
|
|
|
else
|
|
|
builder.withValue(GroupMembership.RAW_CONTACT_ID, id);
|
|
|
builder .withValue(GroupMembership.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE)
|
|
|
.withValue(GroupMembership.GROUP_ROW_ID, groupId);
|
|
|
batch.enqueue(builder.build());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
// factory
|
|
|
|
|
|
static class Factory extends AndroidContactFactory {
|
|
|
static final Factory INSTANCE = new Factory();
|
|
|
|
|
|
@Override
|
|
|
public LocalContact newInstance(AndroidAddressBook addressBook, long id, String fileName, String eTag) {
|
|
|
return new LocalContact(addressBook, id, fileName, eTag);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public LocalContact newInstance(AndroidAddressBook addressBook, Contact contact, String fileName, String eTag) {
|
|
|
return new LocalContact(addressBook, contact, fileName, eTag);
|
|
|
}
|
|
|
|
|
|
public LocalContact[] newArray(int size) {
|
|
|
return new LocalContact[size];
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|