From 89099d443148debed8d92fd86a5c80c2012c06a5 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 17 Jan 2023 12:45:48 -0800 Subject: [PATCH] use db to save archive status changes and handle deletion from web reader --- .../SavedItemMenuActionHandlers.kt | 56 +++++++++++++++++++ .../persistence/entities/SavedItem.kt | 5 +- .../omnivore/omnivore/ui/reader/WebReader.kt | 13 +++-- .../omnivore/ui/reader/WebReaderViewModel.kt | 9 ++- 4 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/SavedItemMenuActionHandlers.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/SavedItemMenuActionHandlers.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/SavedItemMenuActionHandlers.kt new file mode 100644 index 000000000..10988a3cc --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/dataService/SavedItemMenuActionHandlers.kt @@ -0,0 +1,56 @@ +package app.omnivore.omnivore.dataService + +import app.omnivore.omnivore.models.ServerSyncStatus +import app.omnivore.omnivore.networking.archiveSavedItem +import app.omnivore.omnivore.networking.deleteSavedItem +import app.omnivore.omnivore.networking.unarchiveSavedItem +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +suspend fun DataService.deleteSavedItem(itemID: String) { + withContext(Dispatchers.IO) { + val savedItem = db.savedItemDao().findById(itemID = itemID) ?: return@withContext + savedItem.serverSyncStatus = ServerSyncStatus.NEEDS_DELETION.rawValue + db.savedItemDao().update(savedItem) + + val isUpdatedOnServer = networker.deleteSavedItem(itemID) + + if (isUpdatedOnServer) { + db.savedItemDao().deleteById(itemID) + } + } +} + +suspend fun DataService.archiveSavedItem(itemID: String) { + withContext(Dispatchers.IO) { + val savedItem = db.savedItemDao().findById(itemID = itemID) ?: return@withContext + + savedItem.serverSyncStatus = ServerSyncStatus.NEEDS_UPDATE.rawValue + savedItem.isArchived = true + db.savedItemDao().update(savedItem) + + val isUpdatedOnServer = networker.archiveSavedItem(itemID) + + if (isUpdatedOnServer) { + savedItem.serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue + db.savedItemDao().update(savedItem) + } + } +} + +suspend fun DataService.unarchiveSavedItem(itemID: String) { + withContext(Dispatchers.IO) { + val savedItem = db.savedItemDao().findById(itemID = itemID) ?: return@withContext + + savedItem.serverSyncStatus = ServerSyncStatus.NEEDS_UPDATE.rawValue + savedItem.isArchived = false + db.savedItemDao().update(savedItem) + + val isUpdatedOnServer = networker.unarchiveSavedItem(itemID) + + if (isUpdatedOnServer) { + savedItem.serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue + db.savedItemDao().update(savedItem) + } + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt index 00965a85d..91b3096ad 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt @@ -23,7 +23,7 @@ data class SavedItem( val author: String?, val publishDate: String?, val slug: String, - val isArchived: Boolean, + var isArchived: Boolean, val contentReader: String? = null, val content: String? = null, val createdId: String? = null, @@ -92,6 +92,9 @@ interface SavedItemDao { @Query("SELECT * FROM savedItem") fun getAll(): List + @Query("SELECT * FROM savedItem WHERE savedItemId = :itemID") + fun findById(itemID: String): SavedItem? + @Query("SELECT * FROM savedItem WHERE serverSyncStatus != 0") fun getUnSynced(): List diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt index 596d6b7fa..fbb10bfdf 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.verticalScroll import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.* import androidx.compose.runtime.* @@ -97,12 +98,12 @@ fun WebReaderLoadingContainer(slug: String, webReaderViewModel: WebReaderViewMod title = {}, actions = { // Disabling menu until we implement local persistence -// IconButton(onClick = { isMenuExpanded = true }) { -// Icon( -// imageVector = Icons.Filled.Menu, -// contentDescription = null -// ) -// } + IconButton(onClick = { isMenuExpanded = true }) { + Icon( + imageVector = Icons.Filled.Menu, + contentDescription = null + ) + } IconButton(onClick = { showWebPreferencesDialog = true }) { Icon( imageVector = Icons.Filled.Settings, // TODO: set a better icon diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt index 4b347c733..ac9fc7f21 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt @@ -8,6 +8,9 @@ import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.DatastoreKeys import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.dataService.DataService +import app.omnivore.omnivore.dataService.archiveSavedItem +import app.omnivore.omnivore.dataService.deleteSavedItem +import app.omnivore.omnivore.dataService.unarchiveSavedItem import app.omnivore.omnivore.persistence.entities.SavedItem import app.omnivore.omnivore.networking.* import app.omnivore.omnivore.ui.library.SavedItemAction @@ -91,19 +94,19 @@ class WebReaderViewModel @Inject constructor( when (action) { SavedItemAction.Delete -> { viewModelScope.launch { - networker.deleteSavedItem(itemID) + dataService.deleteSavedItem(itemID) popToLibraryView(itemID) } } SavedItemAction.Archive -> { viewModelScope.launch { - networker.archiveSavedItem(itemID) + dataService.archiveSavedItem(itemID) popToLibraryView(itemID) } } SavedItemAction.Unarchive -> { viewModelScope.launch { - networker.unarchiveSavedItem(itemID) + dataService.unarchiveSavedItem(itemID) popToLibraryView(itemID) } }