use channels to space out saved item and highlight syncs to server

This commit is contained in:
Satindar Dhillon
2023-04-10 17:07:11 -07:00
parent 4297fd7290
commit a3018829b3
3 changed files with 32 additions and 4 deletions

View File

@ -17,8 +17,8 @@ android {
applicationId "app.omnivore.omnivore"
minSdk 26
targetSdk 33
versionCode 32
versionName "0.0.32"
versionCode 33
versionName "0.0.33"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {

View File

@ -4,13 +4,19 @@ import android.content.Context
import androidx.room.Room
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.persistence.AppDatabase
import app.omnivore.omnivore.persistence.entities.Highlight
import app.omnivore.omnivore.persistence.entities.SavedItem
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import javax.inject.Inject
class DataService @Inject constructor(
context: Context,
val networker: Networker
) {
val savedItemSyncChannel = Channel<SavedItem>(capacity = Channel.UNLIMITED)
val highlightSyncChannel = Channel<Highlight>(capacity = Channel.UNLIMITED)
val db = Room.databaseBuilder(
context,
AppDatabase::class.java, "omnivore-database"
@ -18,6 +24,12 @@ class DataService @Inject constructor(
.fallbackToDestructiveMigration()
.build()
init {
CoroutineScope(Dispatchers.IO).launch {
startSyncChannels()
}
}
fun clearDatabase() {
CoroutineScope(Dispatchers.IO).launch {
db.clearAllTables()

View File

@ -7,17 +7,33 @@ import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.persistence.entities.Highlight
import app.omnivore.omnivore.persistence.entities.SavedItem
import com.apollographql.apollo3.api.Optional
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
suspend fun DataService.startSyncChannels() {
for (savedItem in savedItemSyncChannel) {
syncSavedItem(savedItem)
}
for (highlight in highlightSyncChannel) {
syncHighlight(highlight)
}
}
suspend fun DataService.syncOfflineItemsWithServerIfNeeded() {
val unSyncedSavedItems = db.savedItemDao().getUnSynced()
val unSyncedHighlights = db.highlightDao().getUnSynced()
for (savedItem in unSyncedSavedItems) {
syncSavedItem(savedItem)
delay(250)
savedItemSyncChannel.send(savedItem)
}
for (highlight in unSyncedHighlights) {
syncHighlight(highlight)
delay(250)
highlightSyncChannel.send(highlight)
}
}