diff --git a/app/src/main/java/at/bitfire/icsdroid/BaseSyncWorker.kt b/app/src/main/java/at/bitfire/icsdroid/BaseSyncWorker.kt index 929eceb7..3c93a9c0 100644 --- a/app/src/main/java/at/bitfire/icsdroid/BaseSyncWorker.kt +++ b/app/src/main/java/at/bitfire/icsdroid/BaseSyncWorker.kt @@ -3,6 +3,7 @@ package at.bitfire.icsdroid import android.content.ContentProviderClient import android.content.ContentUris import android.content.Context +import android.os.DeadObjectException import android.util.Log import androidx.work.CoroutineWorker import androidx.work.WorkerParameters @@ -47,13 +48,12 @@ open class BaseSyncWorker( val onlyMigrate = inputData.getBoolean(ONLY_MIGRATE, false) Log.i(Constants.TAG, "Synchronizing (forceReSync=$forceReSync,onlyMigrate=$onlyMigrate)") - provider = - try { - LocalCalendar.getCalendarProvider(applicationContext) - } catch (e: SecurityException) { - NotificationUtils.showCalendarPermissionNotification(applicationContext) - return Result.failure() - } + provider = try { + LocalCalendar.getCalendarProvider(applicationContext) + } catch (_: SecurityException) { + NotificationUtils.showCalendarPermissionNotification(applicationContext) + return Result.failure() + } var syncFailed = false @@ -88,6 +88,12 @@ open class BaseSyncWorker( syncFailed = true } } + } catch (e: DeadObjectException) { + /* May happen when the remote process dies or (since Android 14) when IPC (for instance + with the calendar provider) is suddenly forbidden because our sync process was demoted + from a "service process" to a "cached process". */ + Log.e(Constants.TAG, "Received DeadObjectException, treating as soft error", e) + return Result.retry() } catch (e: InterruptedException) { Log.e(Constants.TAG, "Thread interrupted", e) return Result.retry() @@ -183,8 +189,7 @@ open class BaseSyncWorker( "Creating local calendar from subscription #${subscription.id}" ) // create local calendar - val uri = - AndroidCalendar.create(account, provider, subscription.toCalendarProperties()) + val uri = AndroidCalendar.create(account, provider, subscription.toCalendarProperties()) // update calendar ID in DB val newCalendarId = ContentUris.parseId(uri) subscriptionsDao.updateCalendarId(subscription.id, newCalendarId) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index af02bbbd..394e6e4c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ androidx-test-rules = "1.6.1" androidx-test-runner = "1.6.2" androidx-work = "2.10.0" bitfire-cert4android = "f0964cb" -bitfire-ical4android = "12df9bf" +bitfire-ical4android = "883954c" compose-dialogs = "1.3.0" compose-material = "1.7.7" compose-material3 = "1.3.1"