Detect VCard/4 support per sync, too

pull/2/head
Ricki Hirner 9 years ago
parent ece6be0f9d
commit 3225a4bbc1

@ -44,17 +44,14 @@ public class DavResourceFinderTest extends InstrumentationTestCase {
List<ResourceInfo> collections = info.getAddressBooks();
// two address books
assertEquals(2, collections.size());
// first one
ResourceInfo collection = collections.get(0);
assertEquals(TestConstants.roboHydra.resolve("/dav/addressbooks/test/default-v4.vcf/").toString(), collection.getURL());
assertEquals(TestConstants.roboHydra.resolve("/dav/addressbooks/test/default.vcf/").toString(), collection.getURL());
assertEquals("Default Address Book", collection.getDescription());
assertEquals(VCardVersion.V4_0, collection.getVCardVersion());
// second one
collection = collections.get(1);
assertEquals("https://my.server/absolute:uri/my-address-book/", collection.getURL());
assertEquals("Absolute URI VCard3 Book", collection.getDescription());
assertEquals(VCardVersion.V3_0, collection.getVCardVersion());
assertEquals("Absolute URI VCard Book", collection.getDescription());
/*** CalDAV ***/
assertTrue(info.isCalDAV());
collections = info.getCalendars();

@ -105,19 +105,17 @@ public class WebDavResourceTest extends InstrumentationTestCase {
assertEquals("useless-member", ab.getName());
assertFalse(ab.isAddressBook());
// the second one is a VCard4-capable address book (referenced by relative URI)
// the second one is an address book (referenced by relative URI)
ab = dav.getMembers().get(1);
assertEquals(TestConstants.roboHydra.resolve("/dav/addressbooks/test/default-v4.vcf/"), ab.getLocation());
assertEquals("default-v4.vcf", ab.getName());
assertEquals(TestConstants.roboHydra.resolve("/dav/addressbooks/test/default.vcf/"), ab.getLocation());
assertEquals("default.vcf", ab.getName());
assertTrue(ab.isAddressBook());
assertEquals(VCardVersion.V4_0, ab.getVCardVersion());
// the third one is a (non-VCard4-capable) address book (referenced by an absolute URI)
// the third one is an address book (referenced by an absolute URI)
ab = dav.getMembers().get(2);
assertEquals(new URI("https://my.server/absolute:uri/my-address-book/"), ab.getLocation());
assertEquals("my-address-book", ab.getName());
assertTrue(ab.isAddressBook());
assertNull(ab.getVCardVersion());
}
public void testPropfindCalendars() throws Exception {

@ -132,7 +132,7 @@ exports.getBodyParts = function(conf) {
</propstat>\
</response>\
<response>\
<href>/dav/addressbooks/test/default-v4.vcf</href>\
<href>/dav/addressbooks/test/default.vcf</href>\
<propstat>\
<prop xmlns:CARD="urn:ietf:params:xml:ns:carddav">\
<resourcetype>\
@ -140,10 +140,6 @@ exports.getBodyParts = function(conf) {
<CARD:addressbook/>\
</resourcetype>\
<CARD:addressbook-description>Default Address Book</CARD:addressbook-description>\
<CARD:supported-address-data>\
<CARD:address-data-type content-type="text/vcard" version="3.0" />\
<CARD:address-data-type content-type="text/vcard" version="4.0" />\
</CARD:supported-address-data>\
</prop>\
<status>HTTP/1.1 200 OK</status>\
</propstat>\
@ -156,7 +152,7 @@ exports.getBodyParts = function(conf) {
<collection/>\
<CARD:addressbook/>\
</resourcetype>\
<CARD:addressbook-description>Absolute URI VCard3 Book</CARD:addressbook-description>\
<CARD:addressbook-description>Absolute URI VCard Book</CARD:addressbook-description>\
</prop>\
<status>HTTP/1.1 200 OK</status>\
</propstat>\

@ -91,11 +91,6 @@ public class DavResourceFinder implements Closeable {
resource.getDescription(), resource.getColor()
);
VCardVersion version = resource.getVCardVersion();
if (version == null)
version = VCardVersion.V3_0; // VCard 3.0 MUST be supported
info.setVCardVersion(version);
addressBooks.add(info);
}
serverInfo.setAddressBooks(addressBooks);

@ -48,6 +48,7 @@ import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@ -55,6 +56,8 @@ import java.util.Locale;
import java.util.Set;
import at.bitfire.davdroid.syncadapter.AccountSettings;
import at.bitfire.davdroid.webdav.WebDavResource;
import ezvcard.VCardVersion;
import ezvcard.parameter.AddressType;
import ezvcard.parameter.EmailType;
import ezvcard.parameter.ImppType;
@ -75,9 +78,8 @@ public class LocalAddressBook extends LocalCollection<Contact> {
protected final static String COLUMN_UNKNOWN_PROPERTIES = RawContacts.SYNC3;
final protected AccountSettings accountSettings;
/* database fields */
@ -125,9 +127,10 @@ public class LocalAddressBook extends LocalCollection<Contact> {
}
@Override
public void updateMetaData(String displayName, String color)
public void updateMetaData(WebDavResource resource)
{
// address books don't have a display name or color in Android
final VCardVersion vCardVersion = resource.getVCardVersion();
accountSettings.setAddressBookVCardVersion(vCardVersion != null ? vCardVersion : VCardVersion.V3_0);
}

@ -22,6 +22,7 @@ import android.database.Cursor;
import android.database.DatabaseUtils;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Attendees;
@ -60,12 +61,14 @@ import org.apache.commons.lang3.StringUtils;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import at.bitfire.davdroid.DAVUtils;
import at.bitfire.davdroid.DateUtils;
import at.bitfire.davdroid.webdav.WebDavResource;
import lombok.Cleanup;
import lombok.Getter;
@ -193,12 +196,17 @@ public class LocalCalendar extends LocalCollection<Event> {
}
@Override
public void updateMetaData(String displayName, String color) throws LocalStorageException {
public void updateMetaData(WebDavResource resource) throws LocalStorageException {
ContentValues values = new ContentValues();
final String displayName = resource.getDisplayName();
if (displayName != null)
values.put(Calendars.CALENDAR_DISPLAY_NAME, displayName);
final String color = resource.getColor();
if (color != null)
values.put(Calendars.CALENDAR_COLOR, DAVUtils.CalDAVtoARGBColor(color));
try {
if (values.size() > 0)
providerClient.update(ContentUris.withAppendedId(calendarsURI(), id), values, null, null);

@ -18,6 +18,7 @@ import android.content.OperationApplicationException;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.CalendarContract;
import android.util.Log;
@ -25,9 +26,11 @@ import android.util.Log;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import at.bitfire.davdroid.webdav.WebDavResource;
import lombok.Cleanup;
/**
@ -74,9 +77,6 @@ public abstract class LocalCollection<T extends Resource> {
abstract protected String entryColumnUID();
/** ID of the collection (for instance, CalendarContract.Calendars._ID) */
// protected long id;
/** SQL filter expression */
String sqlFilter;
@ -95,8 +95,8 @@ public abstract class LocalCollection<T extends Resource> {
abstract public void setCTag(String cTag) throws LocalStorageException;
/** gets the CTag of the collection */
abstract public String getCTag() throws LocalStorageException;
/** update locally stored collection properties */
abstract public void updateMetaData(String displayName, String color) throws LocalStorageException;
/** update locally stored collection properties (e.g. display name and color) from a WebDavResource */
abstract public void updateMetaData(WebDavResource resource) throws LocalStorageException;
// content provider (= database) querying

@ -18,6 +18,7 @@ import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.CalendarContract;
import android.util.Log;
import net.fortuna.ical4j.model.Date;
@ -35,10 +36,12 @@ import net.fortuna.ical4j.util.TimeZones;
import org.apache.commons.lang3.StringUtils;
import org.dmfs.provider.tasks.TaskContract;
import java.util.HashMap;
import java.util.LinkedList;
import at.bitfire.davdroid.DAVUtils;
import at.bitfire.davdroid.DateUtils;
import at.bitfire.davdroid.webdav.WebDavResource;
import lombok.Cleanup;
import lombok.Getter;
@ -132,12 +135,17 @@ public class LocalTaskList extends LocalCollection<Task> {
}
@Override
public void updateMetaData(String displayName, String color) throws LocalStorageException {
public void updateMetaData(WebDavResource resource) throws LocalStorageException {
ContentValues values = new ContentValues();
final String displayName = resource.getDisplayName();
if (displayName != null)
values.put(TaskContract.TaskLists.LIST_NAME, displayName);
final String color = resource.getColor();
if (color != null)
values.put(TaskContract.TaskLists.LIST_COLOR, DAVUtils.CalDAVtoARGBColor(color));
try {
if (values.size() > 0)
providerClient.update(ContentUris.withAppendedId(taskListsURI(account), id), values, null, null);

@ -59,8 +59,6 @@ public class ServerInfo implements Serializable {
description,
color;
VCardVersion vCardVersion;
String timezone;
@ -75,7 +73,6 @@ public class ServerInfo implements Serializable {
description = src.description;
color = src.color;
vCardVersion = src.vCardVersion;
timezone = src.timezone;
}

@ -76,7 +76,6 @@ public class AccountSettings {
for (ServerInfo.ResourceInfo addressBook : serverInfo.getAddressBooks())
if (addressBook.isEnabled()) {
bundle.putString(KEY_ADDRESSBOOK_URL, addressBook.getURL());
bundle.putString(KEY_ADDRESSBOOK_VCARD_VERSION, addressBook.getVCardVersion().getVersion());
break;
}
return bundle;
@ -146,6 +145,10 @@ public class AccountSettings {
version = VCardVersion.valueOfByStr(versionStr);
return version;
}
public void setAddressBookVCardVersion(VCardVersion version) {
accountManager.setUserData(account, KEY_ADDRESSBOOK_VCARD_VERSION, version.getVersion());
}
// update from previous account settings

@ -47,7 +47,7 @@ public class SyncManager {
// PHASE 1: fetch collection properties
remote.getProperties();
final WebDavResource collectionResource = remote.getCollection();
local.updateMetaData(collectionResource.getDisplayName(), collectionResource.getColor());
local.updateMetaData(collectionResource);
// PHASE 2: push local changes to server
int deletedRemotely = pushDeleted(),

@ -58,7 +58,6 @@ public class HttpPropfind extends HttpEntityEnclosingRequestBaseHC4 {
propfind.prop.resourcetype = new DavProp.ResourceType();
propfind.prop.currentUserPrivilegeSet = new LinkedList<>();
propfind.prop.addressbookDescription = new DavProp.AddressbookDescription();
propfind.prop.supportedAddressData = new LinkedList<>();
break;
case CALDAV_COLLECTIONS:
depth = 1;
@ -75,6 +74,7 @@ public class HttpPropfind extends HttpEntityEnclosingRequestBaseHC4 {
propfind.prop.resourcetype = new DavProp.ResourceType();
propfind.prop.displayname = new DavProp.DisplayName();
propfind.prop.calendarColor = new DavProp.CalendarColor();
propfind.prop.supportedAddressData = new LinkedList<>();
break;
case MEMBERS_ETAG:
depth = 1;

Loading…
Cancel
Save