diff --git a/app/build.gradle b/app/build.gradle index d878ad40..0646c92f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { minSdkVersion 14 targetSdkVersion 23 - versionCode 75 - versionName "0.9-alpha3" + versionCode 76 + versionName "0.9-alpha4" buildConfigField "java.util.Date", "buildTime", "new java.util.Date()" } @@ -49,8 +49,8 @@ configurations.all { } dependencies { - compile 'com.google.guava:guava:18.0' compile 'dnsjava:dnsjava:2.1.7' + compile 'org.apache.commons:commons-lang3:3.4' provided 'org.projectlombok:lombok:1.16.6' compile('org.slf4j:slf4j-android:1.7.12') diff --git a/app/src/main/java/at/bitfire/davdroid/Constants.java b/app/src/main/java/at/bitfire/davdroid/Constants.java index fdc02ef6..a9a33eaf 100644 --- a/app/src/main/java/at/bitfire/davdroid/Constants.java +++ b/app/src/main/java/at/bitfire/davdroid/Constants.java @@ -14,8 +14,16 @@ public class Constants { public static final String ACCOUNT_TYPE = "bitfire.at.davdroid", WEB_URL_MAIN = "https://davdroid.bitfire.at/?pk_campaign=davdroid-app", - WEB_URL_HELP = "https://davdroid.bitfire.at/configuration?pk_campaign=davdroid-app", - WEB_URL_VIEW_LOGS = "https://github.com/bitfireAT/davdroid/wiki/How-to-view-the-logs"; + WEB_URL_HELP = "https://davdroid.bitfire.at/configuration?pk_campaign=davdroid-app"; public static final Logger log = LoggerFactory.getLogger("davdroid"); + + // notification IDs + public final static int + NOTIFICATION_ANDROID_VERSION_UPDATED = 0, + NOTIFICATION_ACCOUNT_SETTINGS_UPDATED = 1, + NOTIFICATION_CONTACTS_SYNC = 10, + NOTIFICATION_CALENDAR_SYNC = 11, + NOTIFICATION_TASK_SYNC = 12; + } diff --git a/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java b/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java index e0956c2b..8d9ecf9e 100644 --- a/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java +++ b/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java @@ -26,7 +26,9 @@ import lombok.Synchronized; public class LocalAddressBook extends AndroidAddressBook implements LocalCollection { - protected static final String SYNC_STATE_CTAG = "ctag"; + protected static final String + SYNC_STATE_CTAG = "ctag", + SYNC_STATE_URL = "url"; private Bundle syncState = new Bundle(); @@ -80,6 +82,27 @@ public class LocalAddressBook extends AndroidAddressBook implements LocalCollect syncState.clear(); } + protected void writeSyncState() throws ContactsStorageException { + @Cleanup("recycle") Parcel parcel = Parcel.obtain(); + parcel.writeBundle(syncState); + setSyncState(parcel.marshall()); + } + + public String getURL() throws ContactsStorageException { + synchronized (syncState) { + readSyncState(); + return syncState.getString(SYNC_STATE_URL); + } + } + + public void setURL(String url) throws ContactsStorageException { + synchronized (syncState) { + readSyncState(); + syncState.putString(SYNC_STATE_URL, url); + writeSyncState(); + } + } + @Override public String getCTag() throws ContactsStorageException { synchronized (syncState) { @@ -93,11 +116,7 @@ public class LocalAddressBook extends AndroidAddressBook implements LocalCollect synchronized (syncState) { readSyncState(); syncState.putString(SYNC_STATE_CTAG, cTag); - - // write sync state bundle - @Cleanup("recycle") Parcel parcel = Parcel.obtain(); - parcel.writeBundle(syncState); - setSyncState(parcel.marshall()); + writeSyncState(); } } diff --git a/app/src/main/java/at/bitfire/davdroid/resource/LocalCalendar.java b/app/src/main/java/at/bitfire/davdroid/resource/LocalCalendar.java index c2bb046c..84972b03 100644 --- a/app/src/main/java/at/bitfire/davdroid/resource/LocalCalendar.java +++ b/app/src/main/java/at/bitfire/davdroid/resource/LocalCalendar.java @@ -24,11 +24,10 @@ import android.provider.CalendarContract.Events; import android.provider.CalendarContract.Reminders; import android.text.TextUtils; -import com.google.common.base.Joiner; - -import net.fortuna.ical4j.data.CalendarBuilder; import net.fortuna.ical4j.model.component.VTimeZone; +import org.apache.commons.lang3.StringUtils; + import java.io.FileNotFoundException; import java.util.LinkedList; import java.util.List; @@ -96,8 +95,8 @@ public class LocalCalendar extends AndroidCalendar implements LocalCollection { } values.put(Calendars.ALLOWED_REMINDERS, Reminders.METHOD_ALERT); if (Build.VERSION.SDK_INT >= 15) { - values.put(Calendars.ALLOWED_AVAILABILITY, Joiner.on(",").join(Reminders.AVAILABILITY_TENTATIVE, Reminders.AVAILABILITY_FREE, Reminders.AVAILABILITY_BUSY)); - values.put(Calendars.ALLOWED_ATTENDEE_TYPES, Joiner.on(",").join(CalendarContract.Attendees.TYPE_OPTIONAL, CalendarContract.Attendees.TYPE_REQUIRED, CalendarContract.Attendees.TYPE_RESOURCE)); + values.put(Calendars.ALLOWED_AVAILABILITY, StringUtils.join(new int[] { Reminders.AVAILABILITY_TENTATIVE, Reminders.AVAILABILITY_FREE, Reminders.AVAILABILITY_BUSY }, ",")); + values.put(Calendars.ALLOWED_ATTENDEE_TYPES, StringUtils.join(new int[] { CalendarContract.Attendees.TYPE_OPTIONAL, CalendarContract.Attendees.TYPE_REQUIRED, CalendarContract.Attendees.TYPE_RESOURCE }, ", ")); } return create(account, provider, values); } diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountSettings.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountSettings.java index dd9f70d7..52edc33a 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountSettings.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountSettings.java @@ -9,6 +9,9 @@ package at.bitfire.davdroid.syncadapter; import android.accounts.Account; import android.accounts.AccountManager; +import android.app.Notification; +import android.app.NotificationManager; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; @@ -16,32 +19,34 @@ import android.content.Context; import android.content.PeriodicSync; import android.database.Cursor; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.provider.CalendarContract; import android.provider.CalendarContract.Calendars; -import android.util.Log; +import android.provider.ContactsContract; +import android.text.TextUtils; + +import org.apache.commons.lang3.math.NumberUtils; import java.net.URI; import java.net.URISyntaxException; import java.util.List; +import at.bitfire.davdroid.Constants; +import at.bitfire.davdroid.R; +import at.bitfire.davdroid.resource.LocalAddressBook; import at.bitfire.davdroid.resource.ServerInfo; -import ezvcard.VCardVersion; +import at.bitfire.vcard4android.ContactsStorageException; import lombok.Cleanup; public class AccountSettings { - private final static String TAG = "davdroid.AccountSettings"; - - private final static int CURRENT_VERSION = 1; + private final static int CURRENT_VERSION = 2; private final static String KEY_SETTINGS_VERSION = "version", - + KEY_USERNAME = "user_name", KEY_AUTH_PREEMPTIVE = "auth_preemptive", - - KEY_ADDRESSBOOK_URL = "addressbook_url", - KEY_ADDRESSBOOK_CTAG = "addressbook_ctag", - KEY_ADDRESSBOOK_VCARD_VERSION = "addressbook_vcard_version"; + KEY_LAST_ANDROID_VERSION = "last_android_version"; public final static long SYNC_INTERVAL_MANUALLY = -1; @@ -50,7 +55,7 @@ public class AccountSettings { final Account account; - public AccountSettings(Context context, Account account) { + public AccountSettings(Context context, Account account) { this.context = context; this.account = account; @@ -62,10 +67,43 @@ public class AccountSettings { version = Integer.parseInt(accountManager.getUserData(account, KEY_SETTINGS_VERSION)); } catch(NumberFormatException e) { } - if (version < CURRENT_VERSION) - update(version); + Constants.log.info("AccountSettings version: v" + version + ", should be: " + version); + + if (version < CURRENT_VERSION) { + showNotification(Constants.NOTIFICATION_ACCOUNT_SETTINGS_UPDATED, + context.getString(R.string.settings_version_update_title), + context.getString(R.string.settings_version_update_description)); + update(version); + } + + // check whether Android version has changed + int lastAndroidVersion = NumberUtils.toInt(accountManager.getUserData(account, KEY_LAST_ANDROID_VERSION)); + if (lastAndroidVersion < Build.VERSION.SDK_INT) { + // notify user + showNotification(Constants.NOTIFICATION_ANDROID_VERSION_UPDATED, + context.getString(R.string.settings_android_update_title), + context.getString(R.string.settings_android_update_description)); + + accountManager.setUserData(account, KEY_LAST_ANDROID_VERSION, String.valueOf(Build.VERSION.SDK_INT)); + } } } + + protected void showNotification(int id, String title, String message) { + NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); + Notification.Builder n = new Notification.Builder(context); + if (Build.VERSION.SDK_INT >= 16) { + n.setPriority(Notification.PRIORITY_HIGH); + n.setStyle(new Notification.BigTextStyle().bigText(message)); + } if (Build.VERSION.SDK_INT >= 20) + n.setLocalOnly(true); + if (Build.VERSION.SDK_INT >= 21) + n.setCategory(Notification.CATEGORY_SYSTEM); + n.setSmallIcon(R.drawable.ic_launcher); + n.setContentTitle(title); + n.setContentText(message); + nm.notify(id, Build.VERSION.SDK_INT >= 16 ? n.build() : n.getNotification()); + } public static Bundle createBundle(ServerInfo serverInfo) { @@ -73,11 +111,6 @@ public class AccountSettings { bundle.putString(KEY_SETTINGS_VERSION, String.valueOf(CURRENT_VERSION)); bundle.putString(KEY_USERNAME, serverInfo.getUserName()); bundle.putString(KEY_AUTH_PREEMPTIVE, Boolean.toString(serverInfo.isAuthPreemptive())); - for (ServerInfo.ResourceInfo addressBook : serverInfo.getAddressBooks()) - if (addressBook.isEnabled()) { - bundle.putString(KEY_ADDRESSBOOK_URL, addressBook.getURL()); - break; - } return bundle; } @@ -123,66 +156,45 @@ public class AccountSettings { } } - - // address book (CardDAV) settings - - public String getAddressBookURL() { - return accountManager.getUserData(account, KEY_ADDRESSBOOK_URL); - } - - public String getAddressBookCTag() { - return accountManager.getUserData(account, KEY_ADDRESSBOOK_CTAG); - } - - public void setAddressBookCTag(String cTag) { - accountManager.setUserData(account, KEY_ADDRESSBOOK_CTAG, cTag); - } - - public VCardVersion getAddressBookVCardVersion() { - VCardVersion version = VCardVersion.V3_0; - String versionStr = accountManager.getUserData(account, KEY_ADDRESSBOOK_VCARD_VERSION); - if (versionStr != null) - 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 private void update(int fromVersion) { - Log.i(TAG, "Account settings must be updated from v" + fromVersion + " to v" + CURRENT_VERSION); - for (int toVersion = CURRENT_VERSION; toVersion > fromVersion; toVersion--) - update(fromVersion, toVersion); + for (int toVersion = fromVersion + 1; toVersion <= CURRENT_VERSION; toVersion++) + updateTo(toVersion); } - private void update(int fromVersion, int toVersion) { - Log.i(TAG, "Updating account settings from v" + fromVersion + " to " + toVersion); + private void updateTo(int toVersion) { + final int fromVersion = toVersion - 1; + Constants.log.info("Updating account settings from v" + fromVersion + " to " + toVersion); try { - if (fromVersion == 0 && toVersion == 1) - update_0_1(); - else - Log.wtf(TAG, "Don't know how to update settings from v" + fromVersion + " to v" + toVersion); + switch (toVersion) { + case 1: + update_0_1(); + break; + case 2: + update_1_2(); + break; + default: + Constants.log.error("Don't know how to update settings from v" + fromVersion + " to v" + toVersion); + } } catch(Exception e) { - Log.e(TAG, "Couldn't update account settings (DAVdroid will probably crash)!", e); + Constants.log.error("Couldn't update account settings (DAVdroid will probably crash)!", e); } } private void update_0_1() throws URISyntaxException { String v0_principalURL = accountManager.getUserData(account, "principal_url"), v0_addressBookPath = accountManager.getUserData(account, "addressbook_path"); - Log.d(TAG, "Old principal URL = " + v0_principalURL); - Log.d(TAG, "Old address book path = " + v0_addressBookPath); + Constants.log.debug("Old principal URL = " + v0_principalURL); + Constants.log.debug("Old address book path = " + v0_addressBookPath); URI principalURI = new URI(v0_principalURL); // update address book if (v0_addressBookPath != null) { String addressBookURL = principalURI.resolve(v0_addressBookPath).toASCIIString(); - Log.d(TAG, "New address book URL = " + addressBookURL); + Constants.log.debug("New address book URL = " + addressBookURL); accountManager.setUserData(account, "addressbook_url", addressBookURL); } @@ -197,7 +209,7 @@ public class AccountSettings { int id = cursor.getInt(0); String v0_path = cursor.getString(1), v1_url = principalURI.resolve(v0_path).toASCIIString(); - Log.d(TAG, "Updating calendar #" + id + " name: " + v0_path + " -> " + v1_url); + Constants.log.debug("Updating calendar #" + id + " name: " + v0_path + " -> " + v1_url); Uri calendar = ContentUris.appendId(Calendars.CONTENT_URI.buildUpon() .appendQueryParameter(Calendars.ACCOUNT_NAME, account.name) .appendQueryParameter(Calendars.ACCOUNT_TYPE, account.type) @@ -205,14 +217,42 @@ public class AccountSettings { ContentValues newValues = new ContentValues(1); newValues.put(Calendars.NAME, v1_url); if (resolver.update(calendar, newValues, null, null) != 1) - Log.e(TAG, "Number of modified calendars != 1"); + Constants.log.debug("Number of modified calendars != 1"); } - - Log.d(TAG, "Cleaning old principal URL and address book path"); + accountManager.setUserData(account, "principal_url", null); accountManager.setUserData(account, "addressbook_path", null); - - Log.d(TAG, "Updated settings successfully!"); + accountManager.setUserData(account, KEY_SETTINGS_VERSION, "1"); } + + private void update_1_2() throws ContactsStorageException { + /* - KEY_ADDRESSBOOK_URL ("addressbook_url"),, + - KEY_ADDRESSBOOK_CTAG ("addressbook_ctag"), + - KEY_ADDRESSBOOK_VCARD_VERSION ("addressbook_vcard_version") are not used anymore (now stored in ContactsContract.SyncState) + - KEY_LAST_ANDROID_VERSION ("last_android_version") has been added + */ + + // move previous address book info to ContactsContract.SyncState + @Cleanup("release") ContentProviderClient provider = context.getContentResolver().acquireContentProviderClient(ContactsContract.AUTHORITY); + if (provider != null) { + LocalAddressBook addr = new LocalAddressBook(account, provider); + + String url = accountManager.getUserData(account, "addressbook_url"); + if (!TextUtils.isEmpty(url)) + addr.setURL(url); + accountManager.setUserData(account, "addressbook_url", null); + + String cTag = accountManager.getUserData(account, "addressbook_ctag"); + if (!TextUtils.isEmpty(cTag)) + addr.setCTag(cTag); + accountManager.setUserData(account, "addressbook_ctag", null); + } + + // store current Android version + accountManager.setUserData(account, KEY_LAST_ANDROID_VERSION, String.valueOf(Build.VERSION.SDK_INT)); + + accountManager.setUserData(account, KEY_SETTINGS_VERSION, "2"); + } + } diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java index f3793b33..a8c60ce5 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java @@ -16,13 +16,14 @@ import android.os.Bundle; import android.provider.CalendarContract.Calendars; import android.text.TextUtils; -import com.google.common.base.Charsets; -import com.google.common.base.Joiner; import com.squareup.okhttp.HttpUrl; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.ResponseBody; +import org.apache.commons.codec.Charsets; +import org.apache.commons.lang3.StringUtils; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -54,13 +55,11 @@ import lombok.Cleanup; public class CalendarSyncManager extends SyncManager { - protected static final int - MAX_MULTIGET = 30, - NOTIFICATION_ID = 2; + protected static final int MAX_MULTIGET = 20; public CalendarSyncManager(Context context, Account account, Bundle extras, SyncResult result, LocalCalendar calendar) { - super(NOTIFICATION_ID, context, account, extras, result); + super(Constants.NOTIFICATION_CALENDAR_SYNC, context, account, extras, result); localCollection = calendar; } @@ -126,7 +125,7 @@ public class CalendarSyncManager extends SyncManager { // download new/updated iCalendars from server for (DavResource[] bunch : ArrayUtils.partition(toDownload.toArray(new DavResource[toDownload.size()]), MAX_MULTIGET)) { - Constants.log.info("Downloading " + Joiner.on(" + ").join(bunch)); + Constants.log.info("Downloading " + StringUtils.join(bunch, ", ")); if (bunch.length == 1) { // only one contact, use GET diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java index 99480451..bc81238e 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java @@ -13,9 +13,7 @@ import android.content.ContentProviderClient; import android.content.Context; import android.content.SyncResult; import android.os.Bundle; -import android.text.TextUtils; -import com.google.common.base.Charsets; import com.squareup.okhttp.HttpUrl; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.Request; @@ -23,6 +21,9 @@ import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import com.squareup.okhttp.ResponseBody; +import org.apache.commons.codec.Charsets; +import org.apache.commons.lang3.StringUtils; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -30,8 +31,6 @@ import java.nio.charset.Charset; import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.Set; import at.bitfire.dav4android.DavAddressBook; import at.bitfire.dav4android.DavResource; @@ -56,27 +55,25 @@ import lombok.Cleanup; import lombok.RequiredArgsConstructor; public class ContactsSyncManager extends SyncManager { - protected static final int - MAX_MULTIGET = 10, - NOTIFICATION_ID = 1; + protected static final int MAX_MULTIGET = 10; final protected ContentProviderClient provider; protected boolean hasVCard4; public ContactsSyncManager(Context context, Account account, Bundle extras, ContentProviderClient provider, SyncResult result) { - super(NOTIFICATION_ID, context, account, extras, result); + super(Constants.NOTIFICATION_CONTACTS_SYNC, context, account, extras, result); this.provider = provider; } @Override - protected void prepare() { - collectionURL = HttpUrl.parse(settings.getAddressBookURL()); - davCollection = new DavAddressBook(httpClient, collectionURL); - + protected void prepare() throws ContactsStorageException { // prepare local address book localCollection = new LocalAddressBook(account, provider); + + collectionURL = HttpUrl.parse(localAddressBook().getURL()); + davCollection = new DavAddressBook(httpClient, collectionURL); } @Override @@ -122,7 +119,7 @@ public class ContactsSyncManager extends SyncManager { // download new/updated VCards from server for (DavResource[] bunch : ArrayUtils.partition(toDownload.toArray(new DavResource[toDownload.size()]), MAX_MULTIGET)) { - Constants.log.info("Downloading " + TextUtils.join(" + ", bunch)); + Constants.log.info("Downloading " + StringUtils.join(bunch, ", ")); if (bunch.length == 1) { // only one contact, use GET diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java index d39ff89a..a5a9c3eb 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java @@ -204,6 +204,9 @@ abstract public class SyncManager { .setContentTitle(context.getString(R.string.sync_error_title, account.name)) .setContentIntent(PendingIntent.getActivity(context, 0, detailsIntent, PendingIntent.FLAG_UPDATE_CURRENT)); + if (Build.VERSION.SDK_INT >= 20) + builder.setLocalOnly(true); + try { String[] phases = context.getResources().getStringArray(R.array.sync_error_phases); String message = context.getString(messageString, phases[syncPhase]); @@ -225,7 +228,7 @@ abstract public class SyncManager { } - abstract protected void prepare(); + abstract protected void prepare() throws ContactsStorageException; abstract protected void queryCapabilities() throws IOException, HttpException, DavException, CalendarStorageException, ContactsStorageException; diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java index b0ab3c67..c10fe465 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java @@ -15,13 +15,13 @@ import android.content.SyncResult; import android.os.Bundle; import android.text.TextUtils; -import com.google.common.base.Charsets; -import com.google.common.base.Joiner; import com.squareup.okhttp.HttpUrl; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.ResponseBody; +import org.apache.commons.codec.Charsets; +import org.apache.commons.lang3.StringUtils; import org.dmfs.provider.tasks.TaskContract.TaskLists; import java.io.ByteArrayInputStream; @@ -56,15 +56,13 @@ import lombok.Cleanup; public class TasksSyncManager extends SyncManager { - protected static final int - MAX_MULTIGET = 30, - NOTIFICATION_ID = 3; + protected static final int MAX_MULTIGET = 30; final protected TaskProvider provider; public TasksSyncManager(Context context, Account account, Bundle extras, TaskProvider provider, SyncResult result, LocalTaskList taskList) { - super(NOTIFICATION_ID, context, account, extras, result); + super(Constants.NOTIFICATION_TASK_SYNC, context, account, extras, result); this.provider = provider; localCollection = taskList; } @@ -124,7 +122,7 @@ public class TasksSyncManager extends SyncManager { // download new/updated iCalendars from server for (DavResource[] bunch : ArrayUtils.partition(toDownload.toArray(new DavResource[toDownload.size()]), MAX_MULTIGET)) { - Constants.log.info("Downloading " + Joiner.on(" + ").join(bunch)); + Constants.log.info("Downloading " + StringUtils.join(bunch, ", ")); if (bunch.length == 1) { // only one contact, use GET diff --git a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java index c5244828..ef07d2b0 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java @@ -23,18 +23,12 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; -import com.google.common.base.Throwables; - import org.apache.commons.lang3.exception.ExceptionUtils; -import java.io.PrintWriter; -import java.io.StringWriter; - import at.bitfire.dav4android.exception.HttpException; import at.bitfire.davdroid.BuildConfig; import at.bitfire.davdroid.Constants; import at.bitfire.davdroid.R; -import lombok.Cleanup; public class DebugInfoActivity extends Activity { public static final String @@ -141,7 +135,8 @@ public class DebugInfoActivity extends Activity { if (exception != null) { report.append("STACK TRACE\n"); - report.append(Throwables.getStackTraceAsString(exception)); + for (String stackTrace : ExceptionUtils.getRootCauseStackTrace(exception)) + report.append(stackTrace + "\n"); } return report.toString(); diff --git a/app/src/main/java/at/bitfire/davdroid/ui/settings/AccountFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/settings/AccountFragment.java index 33a72d6a..d3aa45e5 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/settings/AccountFragment.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/settings/AccountFragment.java @@ -141,22 +141,5 @@ public class AccountFragment extends PreferenceFragment { prefSyncTasks.setSummary(R.string.settings_sync_summary_not_available); } - // category: address book - final CheckBoxPreference prefVCard4 = (CheckBoxPreference) findPreference("vcard4_support"); - if (settings.getAddressBookURL() != null) { // does this account even have an address book? - final VCardVersion vCardVersion = settings.getAddressBookVCardVersion(); - prefVCard4.setChecked(vCardVersion == VCardVersion.V4_0); - prefVCard4.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - // don't change the value (it's not really a setting, only a display) - return false; - } - }); - } else { - // account doesn't have an adress book, disable contact settings - prefVCard4.setEnabled(false); - } - } } diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java index 18d7c8c4..c34da60f 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java @@ -104,6 +104,11 @@ public class AccountDetailsFragment extends Fragment implements TextWatcher { public void createLocalCollection(Account account, ServerInfo.ResourceInfo resource) throws ContactsStorageException { @Cleanup("release") ContentProviderClient provider = getActivity().getContentResolver().acquireContentProviderClient(ContactsContract.AUTHORITY); LocalAddressBook addressBook = new LocalAddressBook(account, provider); + + // set URL + addressBook.setURL(resource.getURL()); + + // set Settings ContentValues settings = new ContentValues(2); settings.put(ContactsContract.Settings.SHOULD_SYNC, 1); settings.put(ContactsContract.Settings.UNGROUPED_VISIBLE, 1); diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3aa4c9ca..9a20476a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -143,7 +143,12 @@ VCard 4.0-Unterstützung Kontakte werden als VCard 4.0 gesendet Kontakte werden als VCard 3.0 gesendet - + + Neue Android-Version + Die Änderung der Android-Version kann einen Einfluss auf DAVdroid haben. Falls etwas nicht funktioniert, löschen Sie bitte Ihre DAVdroid-Accounts und fügen Sie sie neu hinzu. + Einstellungen aktualisiert + Interne Einstellungen wurden aktualisiert. Falls etwas nicht funktioniert, löschen Sie bitte Ihre DAVdroid-Accounts und fügen Sie sie neu hinzu. + DAVdroid: Ordner auswählen An dieser Adresse konnte kein CalDAV- oder CardDAV-Dienst gefunden werden. Konto hinzufügen @@ -178,9 +183,9 @@ schreibgeschützt Synchronisierung von %s fehlgeschlagen - Fehler beim %1$s - Serverfehler - Datenbank-Fehler + Fehler beim %s + Serverfehler beim %s + Datenbank-Fehler beim %s Vorbereiten der Synchronisierung Abfragen der Server-Fähigkeiten diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8afc501f..5e90267f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -159,6 +159,11 @@ Contacts are sent in VCard 4.0 format Contacts are sent in VCard 3.0 format + Android version update + Android version updates may have an impact on how DAVdroid works. If there are problems, please delete your DAVdroid accounts and add them again. + Settings have been updated + Internal settings have been updated. If there are problems, please delete your DAVdroid accounts and add them again. + DAVdroid: Select collections No CalDAV-/CardDAV service is available at this location. Add account @@ -193,9 +198,9 @@ Debug info Synchronization of %s failed - Error while %1$s - Server error - Database error + Error while %s + Server error while %s + Database error while %s preparing synchronization querying capabilities diff --git a/app/src/main/res/xml/settings_account_prefs.xml b/app/src/main/res/xml/settings_account_prefs.xml index 7198fb12..9fc0eeed 100644 --- a/app/src/main/res/xml/settings_account_prefs.xml +++ b/app/src/main/res/xml/settings_account_prefs.xml @@ -59,15 +59,10 @@ + diff --git a/dav4android b/dav4android index 6fc7f30b..429648cf 160000 --- a/dav4android +++ b/dav4android @@ -1 +1 @@ -Subproject commit 6fc7f30b614ecb23b6fa66b6fd848fd6ddc4bafe +Subproject commit 429648cfae534dd0476f813c94ab1cae1f140223 diff --git a/ical4android b/ical4android index 62428770..662c48c4 160000 --- a/ical4android +++ b/ical4android @@ -1 +1 @@ -Subproject commit 624287708eb7f093d2ddf2012e2c2c124cd6e206 +Subproject commit 662c48c40ad66e9a77f4f4792587dc04ecc4a74e diff --git a/vcard4android b/vcard4android index 83ba3128..18b26fe4 160000 --- a/vcard4android +++ b/vcard4android @@ -1 +1 @@ -Subproject commit 83ba3128913ba6e57d021ad003bf992100baae43 +Subproject commit 18b26fe48896b2683b1e04e8df4464f5ceacf8f3