mirror of
https://github.com/SimpleMobileTools/Simple-Calendar.git
synced 2025-06-05 21:59:17 +02:00
fix #573, listen to CalDAV events in the background, update asap
This commit is contained in:
@@ -177,6 +177,11 @@
|
|||||||
|
|
||||||
<service android:name=".services.SnoozeService"/>
|
<service android:name=".services.SnoozeService"/>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".jobs.CalDAVUpdateListener"
|
||||||
|
android:exported="true"
|
||||||
|
android:permission="android.permission.BIND_JOB_SERVICE"/>
|
||||||
|
|
||||||
<receiver android:name=".receivers.NotificationReceiver"/>
|
<receiver android:name=".receivers.NotificationReceiver"/>
|
||||||
|
|
||||||
<receiver android:name=".receivers.CalDAVSyncReceiver"/>
|
<receiver android:name=".receivers.CalDAVSyncReceiver"/>
|
||||||
|
@@ -31,6 +31,7 @@ import com.simplemobiletools.calendar.pro.extensions.*
|
|||||||
import com.simplemobiletools.calendar.pro.fragments.*
|
import com.simplemobiletools.calendar.pro.fragments.*
|
||||||
import com.simplemobiletools.calendar.pro.helpers.*
|
import com.simplemobiletools.calendar.pro.helpers.*
|
||||||
import com.simplemobiletools.calendar.pro.helpers.Formatter
|
import com.simplemobiletools.calendar.pro.helpers.Formatter
|
||||||
|
import com.simplemobiletools.calendar.pro.jobs.CalDAVUpdateListener
|
||||||
import com.simplemobiletools.calendar.pro.models.Event
|
import com.simplemobiletools.calendar.pro.models.Event
|
||||||
import com.simplemobiletools.calendar.pro.models.EventType
|
import com.simplemobiletools.calendar.pro.models.EventType
|
||||||
import com.simplemobiletools.calendar.pro.models.ListEvent
|
import com.simplemobiletools.calendar.pro.models.ListEvent
|
||||||
@@ -102,6 +103,10 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkAppOnSDCard()
|
checkAppOnSDCard()
|
||||||
|
|
||||||
|
if (savedInstanceState == null) {
|
||||||
|
checkCalDAVUpdateListener()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
@@ -265,6 +270,19 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
|||||||
mSearchMenuItem?.collapseActionView()
|
mSearchMenuItem?.collapseActionView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkCalDAVUpdateListener() {
|
||||||
|
if (isNougatPlus()) {
|
||||||
|
val updateListener = CalDAVUpdateListener()
|
||||||
|
if (config.caldavSync) {
|
||||||
|
if (!updateListener.isScheduled(applicationContext)) {
|
||||||
|
updateListener.scheduleJob(applicationContext)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
updateListener.cancelJob(applicationContext)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
private fun checkShortcuts() {
|
private fun checkShortcuts() {
|
||||||
val appIconColor = config.appIconColor
|
val appIconColor = config.appIconColor
|
||||||
|
@@ -0,0 +1,65 @@
|
|||||||
|
package com.simplemobiletools.calendar.pro.jobs
|
||||||
|
|
||||||
|
import android.annotation.TargetApi
|
||||||
|
import android.app.job.JobInfo
|
||||||
|
import android.app.job.JobParameters
|
||||||
|
import android.app.job.JobScheduler
|
||||||
|
import android.app.job.JobService
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Handler
|
||||||
|
import android.provider.CalendarContract
|
||||||
|
import com.simplemobiletools.calendar.pro.extensions.recheckCalDAVCalendars
|
||||||
|
|
||||||
|
// based on https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri)
|
||||||
|
@TargetApi(Build.VERSION_CODES.N)
|
||||||
|
class CalDAVUpdateListener : JobService() {
|
||||||
|
companion object {
|
||||||
|
const val CALDAV_EVENT_CONTENT_JOB = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
private val mHandler = Handler()
|
||||||
|
private val mWorker = Runnable {
|
||||||
|
scheduleJob(this@CalDAVUpdateListener)
|
||||||
|
jobFinished(mRunningParams, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var mRunningParams: JobParameters? = null
|
||||||
|
|
||||||
|
fun scheduleJob(context: Context) {
|
||||||
|
val componentName = ComponentName(context, CalDAVUpdateListener::class.java)
|
||||||
|
val uri = CalendarContract.Calendars.CONTENT_URI
|
||||||
|
JobInfo.Builder(CALDAV_EVENT_CONTENT_JOB, componentName).apply {
|
||||||
|
addTriggerContentUri(JobInfo.TriggerContentUri(uri, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
|
||||||
|
context.getSystemService(JobScheduler::class.java).schedule(build())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isScheduled(context: Context): Boolean {
|
||||||
|
val jobScheduler = context.getSystemService(JobScheduler::class.java)
|
||||||
|
val jobs = jobScheduler.allPendingJobs ?: return false
|
||||||
|
return jobs.any { it.id == CALDAV_EVENT_CONTENT_JOB }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun cancelJob(context: Context) {
|
||||||
|
val js = context.getSystemService(JobScheduler::class.java)
|
||||||
|
js.cancel(CALDAV_EVENT_CONTENT_JOB)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStartJob(params: JobParameters): Boolean {
|
||||||
|
mRunningParams = params
|
||||||
|
|
||||||
|
if (params.triggeredContentAuthorities != null && params.triggeredContentUris != null) {
|
||||||
|
recheckCalDAVCalendars {}
|
||||||
|
}
|
||||||
|
|
||||||
|
mHandler.post(mWorker)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStopJob(params: JobParameters): Boolean {
|
||||||
|
mHandler.removeCallbacks(mWorker)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user