Loading app/build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ android { defaultConfig { applicationId "at.bitfire.davdroid" versionCode 275 versionCode 276 buildConfigField "long", "buildTime", System.currentTimeMillis() + "L" buildConfigField "boolean", "customCerts", "true" Loading app/src/main/java/at/bitfire/davdroid/CompatUtils.kt 0 → 100644 +11 −0 Original line number Diff line number Diff line package at.bitfire.davdroid import android.content.ContentProviderClient import android.os.Build fun ContentProviderClient.closeCompat() { if (Build.VERSION.SDK_INT >= 24) close() else release() } app/src/main/java/at/bitfire/davdroid/DavService.kt +8 −4 Original line number Diff line number Diff line Loading @@ -65,10 +65,10 @@ class DavService: Service() { when (intent.action) { ACTION_REFRESH_COLLECTIONS -> if (runningRefresh.add(id)) { thread { refreshCollections(id) } refreshingStatusListeners.forEach { listener -> listener.get()?.onDavRefreshStatusChanged(id, true) } thread { refreshCollections(id) } } ACTION_FORCE_SYNC -> { Loading @@ -93,6 +93,7 @@ class DavService: Service() { interface RefreshingStatusListener { fun onDavRefreshStatusChanged(id: Long, refreshing: Boolean) fun onDavRefreshFinished(id: Long) } private val binder = InfoBinder() Loading @@ -100,9 +101,9 @@ class DavService: Service() { inner class InfoBinder: Binder() { fun isRefreshing(id: Long) = runningRefresh.contains(id) fun addRefreshingStatusListener(listener: RefreshingStatusListener, callImmediate: Boolean) { fun addRefreshingStatusListener(listener: RefreshingStatusListener, callImmediateIfRunning: Boolean) { refreshingStatusListeners += WeakReference<RefreshingStatusListener>(listener) if (callImmediate) if (callImmediateIfRunning) runningRefresh.forEach { id -> listener.onDavRefreshStatusChanged(id, true) } } Loading Loading @@ -400,7 +401,10 @@ class DavService: Service() { .notify(service.toString(), NotificationUtils.NOTIFY_REFRESH_COLLECTIONS, notify) } finally { runningRefresh.remove(service) refreshingStatusListeners.forEach { it.get()?.onDavRefreshStatusChanged(service, false) } refreshingStatusListeners.mapNotNull { it.get() }.forEach { it.onDavRefreshStatusChanged(service, false) it.onDavRefreshFinished(service) } } } Loading app/src/main/java/at/bitfire/davdroid/DavUtils.kt +22 −0 Original line number Diff line number Diff line Loading @@ -8,11 +8,17 @@ package at.bitfire.davdroid import android.accounts.Account import android.annotation.TargetApi import android.content.ContentProviderClient import android.content.ContentResolver import android.content.Context import android.net.ConnectivityManager import android.os.Build import android.os.Bundle import android.provider.CalendarContract import at.bitfire.davdroid.log.Logger import at.bitfire.ical4android.TaskProvider import okhttp3.HttpUrl import org.xbill.DNS.* import java.util.* Loading @@ -28,6 +34,7 @@ object DavUtils { return String.format("#%06X%02X", color, alpha) } fun lastSegmentOfUrl(url: HttpUrl): String { // the list returned by HttpUrl.pathSegments() is unmodifiable, so we have to create a copy val segments = LinkedList<String>(url.pathSegments()) Loading Loading @@ -79,4 +86,19 @@ object DavUtils { return paths } fun requestSync(context: Context, account: Account) { val authorities = arrayOf( context.getString(R.string.address_books_authority), CalendarContract.AUTHORITY, TaskProvider.ProviderName.OpenTasks.authority ) for (authority in authorities) { val extras = Bundle(2) extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true) // manual sync extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true) // run immediately (don't queue) ContentResolver.requestSync(account, authority, extras) } } } app/src/main/java/at/bitfire/davdroid/model/CollectionInfo.kt +2 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,8 @@ data class CollectionInfo( var source: String? = null, // non-persistent properties var confirmed: Boolean = false var confirmed: Boolean = false, var uiEnabled: Boolean = true ): Parcelable { enum class Type { Loading Loading
app/build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ android { defaultConfig { applicationId "at.bitfire.davdroid" versionCode 275 versionCode 276 buildConfigField "long", "buildTime", System.currentTimeMillis() + "L" buildConfigField "boolean", "customCerts", "true" Loading
app/src/main/java/at/bitfire/davdroid/CompatUtils.kt 0 → 100644 +11 −0 Original line number Diff line number Diff line package at.bitfire.davdroid import android.content.ContentProviderClient import android.os.Build fun ContentProviderClient.closeCompat() { if (Build.VERSION.SDK_INT >= 24) close() else release() }
app/src/main/java/at/bitfire/davdroid/DavService.kt +8 −4 Original line number Diff line number Diff line Loading @@ -65,10 +65,10 @@ class DavService: Service() { when (intent.action) { ACTION_REFRESH_COLLECTIONS -> if (runningRefresh.add(id)) { thread { refreshCollections(id) } refreshingStatusListeners.forEach { listener -> listener.get()?.onDavRefreshStatusChanged(id, true) } thread { refreshCollections(id) } } ACTION_FORCE_SYNC -> { Loading @@ -93,6 +93,7 @@ class DavService: Service() { interface RefreshingStatusListener { fun onDavRefreshStatusChanged(id: Long, refreshing: Boolean) fun onDavRefreshFinished(id: Long) } private val binder = InfoBinder() Loading @@ -100,9 +101,9 @@ class DavService: Service() { inner class InfoBinder: Binder() { fun isRefreshing(id: Long) = runningRefresh.contains(id) fun addRefreshingStatusListener(listener: RefreshingStatusListener, callImmediate: Boolean) { fun addRefreshingStatusListener(listener: RefreshingStatusListener, callImmediateIfRunning: Boolean) { refreshingStatusListeners += WeakReference<RefreshingStatusListener>(listener) if (callImmediate) if (callImmediateIfRunning) runningRefresh.forEach { id -> listener.onDavRefreshStatusChanged(id, true) } } Loading Loading @@ -400,7 +401,10 @@ class DavService: Service() { .notify(service.toString(), NotificationUtils.NOTIFY_REFRESH_COLLECTIONS, notify) } finally { runningRefresh.remove(service) refreshingStatusListeners.forEach { it.get()?.onDavRefreshStatusChanged(service, false) } refreshingStatusListeners.mapNotNull { it.get() }.forEach { it.onDavRefreshStatusChanged(service, false) it.onDavRefreshFinished(service) } } } Loading
app/src/main/java/at/bitfire/davdroid/DavUtils.kt +22 −0 Original line number Diff line number Diff line Loading @@ -8,11 +8,17 @@ package at.bitfire.davdroid import android.accounts.Account import android.annotation.TargetApi import android.content.ContentProviderClient import android.content.ContentResolver import android.content.Context import android.net.ConnectivityManager import android.os.Build import android.os.Bundle import android.provider.CalendarContract import at.bitfire.davdroid.log.Logger import at.bitfire.ical4android.TaskProvider import okhttp3.HttpUrl import org.xbill.DNS.* import java.util.* Loading @@ -28,6 +34,7 @@ object DavUtils { return String.format("#%06X%02X", color, alpha) } fun lastSegmentOfUrl(url: HttpUrl): String { // the list returned by HttpUrl.pathSegments() is unmodifiable, so we have to create a copy val segments = LinkedList<String>(url.pathSegments()) Loading Loading @@ -79,4 +86,19 @@ object DavUtils { return paths } fun requestSync(context: Context, account: Account) { val authorities = arrayOf( context.getString(R.string.address_books_authority), CalendarContract.AUTHORITY, TaskProvider.ProviderName.OpenTasks.authority ) for (authority in authorities) { val extras = Bundle(2) extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true) // manual sync extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true) // run immediately (don't queue) ContentResolver.requestSync(account, authority, extras) } } }
app/src/main/java/at/bitfire/davdroid/model/CollectionInfo.kt +2 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,8 @@ data class CollectionInfo( var source: String? = null, // non-persistent properties var confirmed: Boolean = false var confirmed: Boolean = false, var uiEnabled: Boolean = true ): Parcelable { enum class Type { Loading