diff --git a/app/src/main/java/org/tasks/Tasks.kt b/app/src/main/java/org/tasks/Tasks.kt index 7d4c16798..784bd015d 100644 --- a/app/src/main/java/org/tasks/Tasks.kt +++ b/app/src/main/java/org/tasks/Tasks.kt @@ -7,7 +7,12 @@ import android.content.Intent import android.util.Log import androidx.core.app.JobIntentService import androidx.hilt.work.HiltWorkerFactory +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.lifecycle.coroutineScope import androidx.work.Configuration +import com.todoroo.andlib.utility.DateUtilities.now import com.todoroo.astrid.service.Upgrader import dagger.Lazy import dagger.hilt.android.HiltAndroidApp @@ -30,6 +35,7 @@ import org.tasks.scheduling.RefreshScheduler import org.tasks.themes.ThemeBase import org.tasks.widget.AppWidgetManager import timber.log.Timber +import java.util.concurrent.TimeUnit import javax.inject.Inject @HiltAndroidApp @@ -56,6 +62,17 @@ class Tasks : Application(), Configuration.Provider { ThemeBase.getThemeBase(preferences, inventory, null).setDefaultNightMode() localBroadcastManager.registerRefreshReceiver(RefreshBroadcastReceiver()) backgroundWork() + ProcessLifecycleOwner.get().lifecycle.addObserver( + object : DefaultLifecycleObserver { + override fun onResume(owner: LifecycleOwner) { + if (now() - preferences.lastSync > TimeUnit.MINUTES.toMillis(5)) { + owner.lifecycle.coroutineScope.launch { + workManager.get().sync(true) + } + } + } + } + ) } private fun upgrade() { @@ -105,7 +122,9 @@ class Tasks : Application(), Configuration.Provider { } companion object { + @Suppress("KotlinConstantConditions") const val IS_GOOGLE_PLAY = BuildConfig.FLAVOR == "googleplay" + @Suppress("KotlinConstantConditions") const val IS_GENERIC = BuildConfig.FLAVOR == "generic" } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/jobs/SyncWork.kt b/app/src/main/java/org/tasks/jobs/SyncWork.kt index 3c9c30169..f06f57b92 100644 --- a/app/src/main/java/org/tasks/jobs/SyncWork.kt +++ b/app/src/main/java/org/tasks/jobs/SyncWork.kt @@ -12,7 +12,11 @@ import androidx.work.WorkerParameters import dagger.Lazy import dagger.assisted.Assisted import dagger.assisted.AssistedInject -import kotlinx.coroutines.* +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope import org.tasks.LocalBroadcastManager import org.tasks.R import org.tasks.analytics.Firebase @@ -65,6 +69,7 @@ class SyncWork @AssistedInject constructor( localBroadcastManager.broadcastRefresh() try { doSync() + preferences.lastSync = System.currentTimeMillis() } catch (e: Exception) { firebase.reportException(e) } finally { diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt index abc7ea68b..0c1fbf3b4 100644 --- a/app/src/main/java/org/tasks/preferences/Preferences.kt +++ b/app/src/main/java/org/tasks/preferences/Preferences.kt @@ -471,6 +471,12 @@ class Preferences @JvmOverloads constructor( syncFlags.forEach { setBoolean(it, value) } } + var lastSync: Long + get() = getLong(R.string.p_last_sync, 0L) + set(value) { + setLong(R.string.p_last_sync, value) + } + fun getPrefs(c: Class): Map = prefs.all.filter { (_, value) -> c.isInstance(value) } as Map diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 2daaf4472..f669d3089 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -447,4 +447,5 @@ completed_tasks_at_bottom completed_tasks_sort shown_beast_mode_hint + last_sync_time