From a283cbbae52bdca9c44bcb2a625cd28ce3c611a9 Mon Sep 17 00:00:00 2001 From: Ricki Hirner Date: Wed, 30 Mar 2016 15:07:56 +0200 Subject: [PATCH] Add account info when creating calendars * add ACCOUNT_NAME and ACCOUNT_TYPE when creating calendars * close TaskProvider when checking for its presence * when TaskProvider is not available/accessible, explicitly disallow task sync at account creation to prevent further crashes * try to handle OutOfMemoryError * version 1.0_2 --- app/build.gradle | 4 ++-- .../at/bitfire/davdroid/resource/LocalCalendar.java | 5 +++++ .../at/bitfire/davdroid/resource/LocalTaskList.java | 2 +- .../at/bitfire/davdroid/syncadapter/SyncManager.java | 2 +- .../davdroid/ui/setup/AccountDetailsFragment.java | 12 +++++++++--- app/src/main/res/values-de/strings.xml | 2 +- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d0a9a5b4..aaf3a059 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { minSdkVersion 14 targetSdkVersion 22 - versionCode 91 - versionName "1.0_1" + versionCode 92 + versionName "1.0.2" buildConfigField "long", "buildTime", System.currentTimeMillis() + "L" } 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 3bec3bf9..59ec0588 100644 --- a/app/src/main/java/at/bitfire/davdroid/resource/LocalCalendar.java +++ b/app/src/main/java/at/bitfire/davdroid/resource/LocalCalendar.java @@ -72,7 +72,12 @@ public class LocalCalendar extends AndroidCalendar implements LocalCollection { public static Uri create(@NonNull Account account, @NonNull ContentProviderClient provider, @NonNull CollectionInfo info) throws CalendarStorageException { ContentValues values = valuesFromCollectionInfo(info); + + // ACCOUNT_NAME and ACCOUNT_TYPE are required (see docs)! If it's missing, other apps will crash. + values.put(Calendars.ACCOUNT_NAME, account.name); + values.put(Calendars.ACCOUNT_TYPE, account.type); values.put(Calendars.OWNER_ACCOUNT, account.name); + return create(account, provider, values); } diff --git a/app/src/main/java/at/bitfire/davdroid/resource/LocalTaskList.java b/app/src/main/java/at/bitfire/davdroid/resource/LocalTaskList.java index 1d3f1bcf..fef42dc1 100644 --- a/app/src/main/java/at/bitfire/davdroid/resource/LocalTaskList.java +++ b/app/src/main/java/at/bitfire/davdroid/resource/LocalTaskList.java @@ -135,7 +135,7 @@ public class LocalTaskList extends AndroidTaskList implements LocalCollection { if (tasksProviderAvailable != null) return tasksProviderAvailable; else { - TaskProvider provider = TaskProvider.acquire(resolver, TaskProvider.ProviderName.OpenTasks); + @Cleanup TaskProvider provider = TaskProvider.acquire(resolver, TaskProvider.ProviderName.OpenTasks); return tasksProviderAvailable = (provider != null); } } 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 a337af36..9a3cc241 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java @@ -188,7 +188,7 @@ abstract public class SyncManager { } } - } catch(Exception e) { + } catch(Exception|OutOfMemoryError e) { final int messageString; if (e instanceof UnauthorizedException) { 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 c1d834e1..311dff70 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 @@ -38,6 +38,7 @@ import at.bitfire.davdroid.model.ServiceDB.Collections; import at.bitfire.davdroid.model.ServiceDB.HomeSets; import at.bitfire.davdroid.model.ServiceDB.OpenHelper; import at.bitfire.davdroid.model.ServiceDB.Services; +import at.bitfire.davdroid.resource.LocalTaskList; import at.bitfire.ical4android.TaskProvider; import lombok.Cleanup; @@ -127,9 +128,14 @@ public class AccountDetailsFragment extends Fragment { ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 1); ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, true); - // will only do something if OpenTasks is installed - ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 1); - ContentResolver.setSyncAutomatically(account, TaskProvider.ProviderName.OpenTasks.authority, true); + if (LocalTaskList.tasksProviderAvailable(getContext().getContentResolver())) { + // will only do something if OpenTasks is installed and accessible + ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 1); + ContentResolver.setSyncAutomatically(account, TaskProvider.ProviderName.OpenTasks.authority, true); + } else + // If OpenTasks is installed after DAVdroid, DAVdroid won't get task permissions and crash at every task sync + // unless we disable task sync here (before OpenTasks is available). + ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 0); } else { ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 0); ContentResolver.setIsSyncable(account, TaskProvider.ProviderName.OpenTasks.authority, 0); diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5a2ad545..1f307fac 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -19,7 +19,7 @@ Unter bestimmten Umständen verursacht die zwangsweise Play Store-Verschlüsselung, dass Accounts nach einem Neustart oder einem DAVdroid-Update verschwinden. Installieren Sie \"DAVdroid JB Workaround\", falls Sie von dem Problem betroffen sind. Weitere Infos OpenTasks nicht installiert - Die OpenTasks-App ist nicht installiert oder DAVdroid hat keine Rechte, um darauf zuzugreifen. Aufgabenlisten werden also nicht synchronisiert. Falls Sie OpenTasks installieren, müssen Sie DAVdroid danach deinstallieren und noch einmal installieren (Android-Bug). + Die OpenTasks-App ist nicht installiert oder DAVdroid hat keine Rechte, um darauf zuzugreifen. Aufgabenlisten werden also nicht synchronisiert. Falls Sie OpenTasks installieren, müssen Sie DAVdroid DANACH NEU INSTALLIEREN und Ihre Konten neu hinzufügen (Android-Bug). OpenTasks installieren Lizenzbedingungen