From 3497cc2f72f9fac7cedfbebbc099dd024d54689a Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 14 Dec 2022 13:22:38 -0800 Subject: [PATCH 01/16] add room deps to gradle file --- android/Omnivore/app/build.gradle | 5 +++++ android/Omnivore/build.gradle | 1 + 2 files changed, 6 insertions(+) diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index 836389097..e81583770 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -143,6 +143,11 @@ dependencies { implementation 'com.segment.analytics.kotlin:android:1.10.0' implementation 'io.intercom.android:intercom-sdk-base:14.0.0' + + // Room Deps + implementation "androidx.room:room-runtime:$room_version" + annotationProcessor "androidx.room:room-compiler:$room_version" + kapt "androidx.room:room-compiler:$room_version" } apollo { diff --git a/android/Omnivore/build.gradle b/android/Omnivore/build.gradle index 00a604ec9..6c9b942d4 100644 --- a/android/Omnivore/build.gradle +++ b/android/Omnivore/build.gradle @@ -4,6 +4,7 @@ buildscript { lifecycle_version = '2.5.1' hilt_version = '2.44.2' gradle_plugin_version = '7.3.1' + room_version = '2.4.3' } dependencies { From 8b2b8d1816bf252821e0394b7d162a6f5481bc71 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Fri, 16 Dec 2022 19:41:24 -0800 Subject: [PATCH 02/16] WIP it --- .../omnivore/omnivore/persistence/empty.kt | 2 ++ .../persistence/entities/Highlight.kt | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt new file mode 100644 index 000000000..6ba1608e9 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt @@ -0,0 +1,2 @@ +package app.omnivore.omnivore.persistence + diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt new file mode 100644 index 000000000..961c3cbab --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt @@ -0,0 +1,23 @@ +package app.omnivore.omnivore.persistence.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey +import java.util.Date + +@Entity +data class Highlight( + @PrimaryKey val id: String, + val annotation: String?, + val createdAt: Date?, + val createdByMe: Boolean, + val markedForDeletion: Boolean, // default false + val patch: String, + val prefix: String?, + val quote: String, + val serverSyncStatus: Int, // default 0 + val shortId: String, + val suffix: String?, + val updatedAt: Date? + + // has many LinkedItems and LinkedItemLabels +) From b7bfaa575e68f142c852490923a6dc7b60320dc7 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 2 Jan 2023 20:25:29 -0800 Subject: [PATCH 03/16] update build number to 17 --- android/Omnivore/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index e81583770..c2b596149 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "app.omnivore.omnivore" minSdk 23 targetSdk 33 - versionCode 16 - versionName "0.0.16" + versionCode 17 + versionName "0.0.17" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 39ce9a67b3e48815bc257d6f21a221960bdb827f Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 09:12:21 -0800 Subject: [PATCH 04/16] bump build number to 19 --- android/Omnivore/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index c2b596149..e2bbfb484 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "app.omnivore.omnivore" minSdk 23 targetSdk 33 - versionCode 17 - versionName "0.0.17" + versionCode 19 + versionName "0.0.19" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From a6c115d5bfefc9c8d988fd74baa27e3cb24f0110 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 09:43:18 -0800 Subject: [PATCH 05/16] replace Highlight model with Highlight entity --- android/Omnivore/app/build.gradle | 2 +- .../app/omnivore/omnivore/models/Highlight.kt | 15 --------------- .../omnivore/networking/HighlightMutations.kt | 10 +++++++--- .../omnivore/networking/LinkedItemQuery.kt | 9 +++++++-- .../omnivore/persistence/entities/Highlight.kt | 4 +++- .../app/omnivore/omnivore/ui/reader/PDFReader.kt | 2 +- .../omnivore/ui/reader/PDFReaderViewModel.kt | 1 + .../omnivore/ui/reader/WebReaderContent.kt | 2 +- 8 files changed, 21 insertions(+), 24 deletions(-) delete mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/Highlight.kt diff --git a/android/Omnivore/app/build.gradle b/android/Omnivore/app/build.gradle index e2bbfb484..ec268a033 100644 --- a/android/Omnivore/app/build.gradle +++ b/android/Omnivore/app/build.gradle @@ -15,7 +15,7 @@ android { defaultConfig { applicationId "app.omnivore.omnivore" - minSdk 23 + minSdk 26 targetSdk 33 versionCode 19 versionName "0.0.19" diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/Highlight.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/Highlight.kt deleted file mode 100644 index 0a7c90423..000000000 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/Highlight.kt +++ /dev/null @@ -1,15 +0,0 @@ -package app.omnivore.omnivore.models - -data class Highlight( - val id: String, - val shortId: String, - val quote: String, - val prefix: String?, - val suffix: String?, - val patch: String, - val annotation: String?, - val createdAt: Any?, - val updatedAt: Any?, - val createdByMe : Boolean, -) - diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt index 4bc72d7fa..866b694e3 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt @@ -8,10 +8,10 @@ import app.omnivore.omnivore.graphql.generated.UpdateHighlightMutation import app.omnivore.omnivore.graphql.generated.type.CreateHighlightInput import app.omnivore.omnivore.graphql.generated.type.MergeHighlightInput import app.omnivore.omnivore.graphql.generated.type.UpdateHighlightInput -import app.omnivore.omnivore.models.Highlight +import app.omnivore.omnivore.persistence.entities.Highlight import com.apollographql.apollo3.api.Optional import com.google.gson.Gson -import com.pspdfkit.annotations.HighlightAnnotation +import java.time.LocalDate data class CreateHighlightParams( val shortId: String?, @@ -137,6 +137,8 @@ suspend fun Networker.createHighlight(input: CreateHighlightInput): Highlight? { val createdHighlight = result.data?.createHighlight?.onCreateHighlightSuccess?.highlight if (createdHighlight != null) { +// val updatedAtString = createdHighlight.highlightFields.updatedAt as? String + return Highlight( id = createdHighlight.highlightFields.id, shortId = createdHighlight.highlightFields.shortId, @@ -146,8 +148,10 @@ suspend fun Networker.createHighlight(input: CreateHighlightInput): Highlight? { patch = createdHighlight.highlightFields.patch, annotation = createdHighlight.highlightFields.annotation, createdAt = null, // TODO: update gql query to get this - updatedAt = createdHighlight.highlightFields.updatedAt, + updatedAt = null, // TODO: fix updatedAtString?.let { LocalDate.parse(it) }, createdByMe = createdHighlight.highlightFields.createdByMe, + markedForDeletion = false, + serverSyncStatus = 1 // TODO: create enum for this ) } else { return null diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt index 79e6c13ad..dbc3d6323 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt @@ -1,9 +1,10 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.GetArticleQuery -import app.omnivore.omnivore.models.Highlight import app.omnivore.omnivore.models.LinkedItem import app.omnivore.omnivore.models.LinkedItemLabel +import app.omnivore.omnivore.persistence.entities.Highlight +import java.time.LocalDate data class LinkedItemQueryResponse( val item: LinkedItem?, @@ -39,6 +40,8 @@ suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { } val highlights = article.highlights.map { +// val updatedAtString = it.highlightFields.updatedAt as? String + Highlight( id = it.highlightFields.id, shortId = it.highlightFields.shortId, @@ -48,8 +51,10 @@ suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { patch = it.highlightFields.patch, annotation = it.highlightFields.annotation, createdAt = null, // TODO: update gql query to get this - updatedAt = it.highlightFields.updatedAt, + updatedAt = null, //updatedAtString?.let { str -> LocalDate.parse(str) }, TODO: fix date parsing createdByMe = it.highlightFields.createdByMe, + markedForDeletion = false, + serverSyncStatus = 1 // TODO: create enum for this ) } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt index 961c3cbab..3d4dc41c3 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt @@ -2,6 +2,7 @@ package app.omnivore.omnivore.persistence.entities import androidx.room.Entity import androidx.room.PrimaryKey +import java.time.LocalDate import java.util.Date @Entity @@ -17,7 +18,8 @@ data class Highlight( val serverSyncStatus: Int, // default 0 val shortId: String, val suffix: String?, - val updatedAt: Date? + val updatedAt: LocalDate? // has many LinkedItems and LinkedItemLabels + // has a UserProfile ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt index 65c71ad36..f5e1ef506 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt @@ -19,7 +19,7 @@ import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat import androidx.lifecycle.Observer import app.omnivore.omnivore.R -import app.omnivore.omnivore.models.Highlight +import app.omnivore.omnivore.persistence.entities.Highlight import com.pspdfkit.annotations.Annotation import com.pspdfkit.annotations.HighlightAnnotation import com.pspdfkit.configuration.PdfConfiguration diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt index 620e333b0..d8bdeca7d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt @@ -12,6 +12,7 @@ import app.omnivore.omnivore.graphql.generated.type.MergeHighlightInput import app.omnivore.omnivore.graphql.generated.type.UpdateHighlightInput import app.omnivore.omnivore.models.LinkedItem import app.omnivore.omnivore.networking.* +import app.omnivore.omnivore.persistence.entities.Highlight import com.apollographql.apollo3.api.Optional import com.google.gson.Gson import com.pspdfkit.annotations.Annotation diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt index 55b1b85de..329dae762 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt @@ -1,8 +1,8 @@ package app.omnivore.omnivore.ui.reader import android.util.Log -import app.omnivore.omnivore.models.Highlight import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.Highlight import com.google.gson.Gson enum class WebFont(val displayText: String, val rawValue: String) { From 7a49b52921bc5821e8b633714ef723f07c41af92 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 09:55:40 -0800 Subject: [PATCH 06/16] move models into persistence package --- .../java/app/omnivore/omnivore/networking/LinkedItemQuery.kt | 5 ++--- .../java/app/omnivore/omnivore/networking/SearchQuery.kt | 2 +- .../java/app/omnivore/omnivore/networking/ViewerQuery.kt | 2 +- .../omnivore/{models => persistence/entities}/LinkedItem.kt | 2 +- .../{models => persistence/entities}/LinkedItemLabel.kt | 2 +- .../omnivore/{models => persistence/entities}/Viewer.kt | 2 +- .../src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt | 2 +- .../main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt | 4 +--- .../omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt | 2 +- .../app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt | 3 +-- .../java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt | 2 +- .../app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt | 3 +-- 12 files changed, 13 insertions(+), 18 deletions(-) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{models => persistence/entities}/LinkedItem.kt (93%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{models => persistence/entities}/LinkedItemLabel.kt (74%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/{models => persistence/entities}/Viewer.kt (68%) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt index dbc3d6323..917b5785f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt @@ -1,10 +1,9 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.GetArticleQuery -import app.omnivore.omnivore.models.LinkedItem -import app.omnivore.omnivore.models.LinkedItemLabel +import app.omnivore.omnivore.persistence.entities.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItemLabel import app.omnivore.omnivore.persistence.entities.Highlight -import java.time.LocalDate data class LinkedItemQueryResponse( val item: LinkedItem?, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt index 1716ad54e..417b2eab2 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt @@ -2,7 +2,7 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.SearchQuery import app.omnivore.omnivore.graphql.generated.TypeaheadSearchQuery -import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItem import com.apollographql.apollo3.api.Optional data class SearchQueryResponse( diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt index d0c7ec45a..272649300 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt @@ -1,7 +1,7 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.ViewerQuery -import app.omnivore.omnivore.models.Viewer +import app.omnivore.omnivore.persistence.entities.Viewer suspend fun Networker.viewer(): Viewer? { try { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/LinkedItem.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt similarity index 93% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/LinkedItem.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt index 960348b8b..af81f95d3 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/LinkedItem.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.models +package app.omnivore.omnivore.persistence.entities import androidx.core.net.toUri diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/LinkedItemLabel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt similarity index 74% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/LinkedItemLabel.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt index 69da9aee8..56cef7f0a 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/LinkedItemLabel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.models +package app.omnivore.omnivore.persistence.entities data class LinkedItemLabel( val id: String, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/Viewer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt similarity index 68% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/Viewer.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt index 505068dd4..ff114fcb3 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/models/Viewer.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.models +package app.omnivore.omnivore.persistence.entities data class Viewer( val id: String, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt index c004fae7b..00afbf210 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import app.omnivore.omnivore.Routes -import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.ui.linkedItemViews.LinkedItemCard import app.omnivore.omnivore.ui.reader.PDFReaderActivity import kotlinx.coroutines.flow.distinctUntilChanged diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt index 3e442743a..5cf16508a 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt @@ -1,15 +1,13 @@ package app.omnivore.omnivore.ui.home -import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.networking.* -import com.pspdfkit.analytics.Analytics import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt index 775ed6be7..ea106161b 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.ui.home.LinkedItemAction import coil.compose.rememberAsyncImagePainter diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt index d8bdeca7d..05f16c003 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt @@ -10,9 +10,8 @@ import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.graphql.generated.type.CreateHighlightInput import app.omnivore.omnivore.graphql.generated.type.MergeHighlightInput import app.omnivore.omnivore.graphql.generated.type.UpdateHighlightInput -import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.networking.* -import app.omnivore.omnivore.persistence.entities.Highlight import com.apollographql.apollo3.api.Optional import com.google.gson.Gson import com.pspdfkit.annotations.Annotation diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt index 329dae762..386cc68d4 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt @@ -1,7 +1,7 @@ package app.omnivore.omnivore.ui.reader import android.util.Log -import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.persistence.entities.Highlight import com.google.gson.Gson 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 baaadd34a..ffed95f66 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 @@ -2,13 +2,12 @@ package app.omnivore.omnivore.ui.reader import android.util.Log import androidx.compose.foundation.ScrollState -import androidx.compose.ui.unit.Density import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.DatastoreKeys import app.omnivore.omnivore.DatastoreRepository -import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.networking.* import app.omnivore.omnivore.ui.home.LinkedItemAction import com.google.gson.Gson From abb5eade24a1b2ca52b8f6f42bd936a839fa39a5 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 10:37:35 -0800 Subject: [PATCH 07/16] add properties to LinkedItem model to match ios model --- .../omnivore/networking/LinkedItemQuery.kt | 10 ++-- .../omnivore/networking/SearchQuery.kt | 10 ++-- .../persistence/entities/LinkedItem.kt | 51 ++++++++++++++++--- 3 files changed, 53 insertions(+), 18 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt index 917b5785f..970e49c2a 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt @@ -62,10 +62,10 @@ suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { val linkedItem = LinkedItem( id = article.articleFields.id, title = article.articleFields.title, - createdAt = article.articleFields.createdAt, - savedAt = article.articleFields.savedAt, - readAt = article.articleFields.readAt, - updatedAt = article.articleFields.updatedAt, + createdAt = article.articleFields.createdAt as String, + savedAt = article.articleFields.savedAt as String, + readAt = article.articleFields.readAt as String?, + updatedAt = article.articleFields.updatedAt as String?, readingProgress = article.articleFields.readingProgressPercent, readingProgressAnchor = article.articleFields.readingProgressAnchorIndex, imageURLString = article.articleFields.image, @@ -74,7 +74,7 @@ suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { publisherURLString = article.articleFields.originalArticleUrl, siteName = article.articleFields.siteName, author = article.articleFields.author, - publishDate = article.articleFields.publishedAt, + publishDate = article.articleFields.publishedAt as String?, slug = article.articleFields.slug, isArchived = article.articleFields.isArchived, contentReader = article.articleFields.contentReader.rawValue, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt index 417b2eab2..c45ade9ed 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt @@ -72,10 +72,10 @@ suspend fun Networker.search( LinkedItem( id = it.node.id, title = it.node.title, - createdAt = it.node.createdAt, - savedAt = it.node.savedAt, - readAt = it.node.readAt, - updatedAt = it.node.updatedAt, + createdAt = it.node.createdAt as String, + savedAt = it.node.savedAt as String, + readAt = it.node.readAt as String?, + updatedAt = it.node.updatedAt as String?, readingProgress = it.node.readingProgressPercent, readingProgressAnchor = it.node.readingProgressAnchorIndex, imageURLString = it.node.image, @@ -84,7 +84,7 @@ suspend fun Networker.search( publisherURLString = it.node.originalArticleUrl, siteName = it.node.siteName, author = it.node.author, - publishDate = it.node.publishedAt, + publishDate = it.node.publishedAt as String?, slug = it.node.slug, isArchived = it.node.isArchived, contentReader = it.node.contentReader.rawValue, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt index af81f95d3..a5e0f3613 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt @@ -1,14 +1,18 @@ package app.omnivore.omnivore.persistence.entities import androidx.core.net.toUri +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +@Entity data class LinkedItem( - val id: String, + @PrimaryKey val id: String, val title: String, - val createdAt: Any, - val savedAt: Any, - val readAt: Any?, - val updatedAt: Any?, + val createdAt: String, + val savedAt: String, + val readAt: String?, + val updatedAt: String?, val readingProgress: Double, val readingProgressAnchor: Int, val imageURLString: String?, @@ -17,11 +21,27 @@ data class LinkedItem( val publisherURLString: String?, val siteName: String?, val author: String?, - val publishDate: Any?, + val publishDate: String?, val slug: String, val isArchived: Boolean, - val contentReader: String?, - val content: String? + val contentReader: String? = null, + val content: String? = null, + val createdId: String? = null, + val htmlContent: String? = null, + val language: String? = null, + val listenPositionIndex: Int? = null, + val listenPositionOffset: Double? = null, + val listenPositionTime: Double? = null, + val localPDF: String? = null, + val onDeviceImageURLString: String? = null, + val originalHtml: String? = null, + @ColumnInfo(typeAffinity = ColumnInfo.BLOB) val pdfData: ByteArray? = null, + val serverSyncStatus: Int = 0, // TODO: implement, + val tempPDFURL: String? = null + +// hasMany highlights +// hasMany labels +// has Many recommendations ) { fun publisherDisplayName(): String? { return publisherURLString?.toUri()?.host @@ -31,4 +51,19 @@ data class LinkedItem( val hasPDFSuffix = pageURLString.endsWith("pdf") return contentReader == "PDF" || hasPDFSuffix } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as LinkedItem + + if (id != other.id) return false + + return true + } + + override fun hashCode(): Int { + return id.hashCode() + } } From 4bf48e5e5eec9b6c51275b9f098aac01b8dff2c4 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 10:49:37 -0800 Subject: [PATCH 08/16] convert viewer and linkedItemLabel to room entities --- .../app/omnivore/omnivore/networking/ViewerQuery.kt | 4 ++-- .../omnivore/persistence/entities/LinkedItemLabel.kt | 12 ++++++++++-- .../omnivore/omnivore/persistence/entities/Viewer.kt | 8 ++++++-- .../app/omnivore/omnivore/ui/auth/LoginViewModel.kt | 2 +- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt index 272649300..d27c5fc15 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ViewerQuery.kt @@ -10,10 +10,10 @@ suspend fun Networker.viewer(): Viewer? { return if (me != null) { Viewer( - id = me.id, + userID = me.id, name = me.name, username = me.profile.username, - pictureUrl = me.profile.pictureUrl + profileImageURL = me.profile.pictureUrl ) } else { null diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt index 56cef7f0a..9f8fe8083 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt @@ -1,9 +1,17 @@ package app.omnivore.omnivore.persistence.entities +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity data class LinkedItemLabel( - val id: String, + @PrimaryKey val id: String, val name: String, val color: String, - val createdAt: Any?, + val createdAt: String?, val labelDescription: String?, + val serverSyncStatus: Int = 0 ) + +// has many highlights +// has many linkedItems diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt index ff114fcb3..5c52f9655 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt @@ -1,9 +1,13 @@ package app.omnivore.omnivore.persistence.entities +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity data class Viewer( - val id: String, + @PrimaryKey val userID: String, val name: String, val username: String, - val pictureUrl: String?, + val profileImageURL: String?, ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt index 68a7178be..727d953e7 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt @@ -100,7 +100,7 @@ class LoginViewModel @Inject constructor( viewModelScope.launch { val viewer = networker.viewer() viewer?.let { - eventTracker.registerUser(viewer.id) + eventTracker.registerUser(viewer.userID) } } } From 7bb05d0a80185b600cf20a64db5f8054e81c2ad4 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 11:00:59 -0800 Subject: [PATCH 09/16] port remaining persistence models over from ios --- .../persistence/entities/NewsletterEmail.kt | 12 ++++++++++++ .../persistence/entities/RecentSearchItem.kt | 11 +++++++++++ .../persistence/entities/Recommendation.kt | 15 +++++++++++++++ .../entities/RecommendationGroup.kt | 18 ++++++++++++++++++ .../persistence/entities/UserProfile.kt | 13 +++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/NewsletterEmail.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecentSearchItem.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecommendationGroup.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/UserProfile.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/NewsletterEmail.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/NewsletterEmail.kt new file mode 100644 index 000000000..2920367a1 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/NewsletterEmail.kt @@ -0,0 +1,12 @@ +package app.omnivore.omnivore.persistence.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class NewsletterEmail( + @PrimaryKey val userID: String, + val confirmationCode: String?, + val email: String?, + val emailID: String? +) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecentSearchItem.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecentSearchItem.kt new file mode 100644 index 000000000..2da231121 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecentSearchItem.kt @@ -0,0 +1,11 @@ +package app.omnivore.omnivore.persistence.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class RecentSearchItem( + @PrimaryKey val id: String, + val savedAt: String?, + val term: String? +) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt new file mode 100644 index 000000000..7dab45d70 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt @@ -0,0 +1,15 @@ +package app.omnivore.omnivore.persistence.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class Recommendation( + @PrimaryKey val groupID: String, + val name: String?, + val note: String?, + val recommendedAt: String? +) + +// hasOne LinkedItem +// hasOne UserProfile diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecommendationGroup.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecommendationGroup.kt new file mode 100644 index 000000000..4ea5f5051 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/RecommendationGroup.kt @@ -0,0 +1,18 @@ +package app.omnivore.omnivore.persistence.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class RecommendationGroup( + @PrimaryKey val id: String, + val name: String?, + val canPost: Boolean, + val canSeeMembers: Boolean, + val inviteURL: String?, + val createdAt: String?, + val updatedAt: String? +) + +// hasMany admins (Viewer) +// hasMany members (Viewer) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/UserProfile.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/UserProfile.kt new file mode 100644 index 000000000..12408f40c --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/UserProfile.kt @@ -0,0 +1,13 @@ +package app.omnivore.omnivore.persistence.entities + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class UserProfile( + @PrimaryKey val userID: String, + val name: String?, + val username: String?, + val profileImageURL: String?, +) + From 6a6ad34f4daf74c176c02a4c131ccfaa78960fb8 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 11:04:40 -0800 Subject: [PATCH 10/16] add comments for creating entity relationships --- .../app/omnivore/omnivore/persistence/entities/Highlight.kt | 5 +++-- .../app/omnivore/omnivore/persistence/entities/LinkedItem.kt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt index 3d4dc41c3..9b0495c6f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt @@ -20,6 +20,7 @@ data class Highlight( val suffix: String?, val updatedAt: LocalDate? - // has many LinkedItems and LinkedItemLabels - // has a UserProfile + // has many LinkedItemLabels (inverse: labels have many highlights) + // has one linkedItem (inverse: linkedItem has many highlights + // has a UserProfile (no inverse) ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt index a5e0f3613..33ee181ca 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt @@ -41,7 +41,7 @@ data class LinkedItem( // hasMany highlights // hasMany labels -// has Many recommendations +// has Many recommendations (rec has one linkedItem) ) { fun publisherDisplayName(): String? { return publisherURLString?.toUri()?.host From 3aff827665e2f6da649aa60b7d489105846f8d75 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 12:15:27 -0800 Subject: [PATCH 11/16] create dataService sibgleton and load it on app launch --- .../java/app/omnivore/omnivore/AppModule.kt | 6 ++++++ .../java/app/omnivore/omnivore/DataService.kt | 15 +++++++++++++++ .../omnivore/networking/LinkedItemQuery.kt | 2 +- .../omnivore/persistence/AppDatabase.kt | 16 ++++++++++++++++ .../app/omnivore/omnivore/persistence/empty.kt | 2 -- .../omnivore/persistence/entities/Viewer.kt | 17 +++++++++++++++-- .../omnivore/omnivore/ui/home/HomeViewModel.kt | 10 ++++++++++ 7 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/DataService.kt create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt delete mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt index ef526af60..a395d831f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/AppModule.kt @@ -1,7 +1,9 @@ package app.omnivore.omnivore import android.content.Context +import androidx.room.Room import app.omnivore.omnivore.networking.Networker +import app.omnivore.omnivore.persistence.AppDatabase import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -26,4 +28,8 @@ object AppModule { @Singleton @Provides fun provideAnalytics(@ApplicationContext app: Context) = EventTracker(app) + + @Singleton + @Provides + fun provideDataService(@ApplicationContext app: Context) = DataService(app) } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/DataService.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/DataService.kt new file mode 100644 index 000000000..651b7311a --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/DataService.kt @@ -0,0 +1,15 @@ +package app.omnivore.omnivore + +import android.content.Context +import androidx.room.Room +import app.omnivore.omnivore.persistence.AppDatabase +import javax.inject.Inject + +class DataService @Inject constructor( + context: Context +) { + val db = Room.databaseBuilder( + context, + AppDatabase::class.java, "omnivore-database" + ).build() +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt index 970e49c2a..ddf0c9d2f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt @@ -33,7 +33,7 @@ suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { id = it.labelFields.id, name = it.labelFields.name, color = it.labelFields.color, - createdAt = it.labelFields.createdAt, + createdAt = it.labelFields.createdAt as String?, labelDescription = it.labelFields.description ) } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt new file mode 100644 index 000000000..ea86ffedd --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt @@ -0,0 +1,16 @@ +package app.omnivore.omnivore.persistence + +import androidx.room.Database +import androidx.room.RoomDatabase +import app.omnivore.omnivore.persistence.entities.Viewer +import app.omnivore.omnivore.persistence.entities.ViewerDao + +@Database( + entities = [ + Viewer::class + ], + version = 1 +) +abstract class AppDatabase : RoomDatabase() { + abstract fun viewerDao(): ViewerDao +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt deleted file mode 100644 index 6ba1608e9..000000000 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/empty.kt +++ /dev/null @@ -1,2 +0,0 @@ -package app.omnivore.omnivore.persistence - diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt index 5c52f9655..4dafd1639 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt @@ -1,7 +1,6 @@ package app.omnivore.omnivore.persistence.entities -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room.* @Entity data class Viewer( @@ -11,3 +10,17 @@ data class Viewer( val profileImageURL: String?, ) +@Dao +interface ViewerDao { + @Query("SELECT * FROM viewer") + fun getAll(): List + + @Query("SELECT * FROM viewer WHERE userID IN (:viewerIds)") + fun loadAllByIds(viewerIds: IntArray): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertAll(vararg viewers: Viewer) + + @Delete + fun delete(viewer: Viewer) +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt index 5cf16508a..c795bd73f 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt @@ -1,22 +1,27 @@ package app.omnivore.omnivore.ui.home +import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import app.omnivore.omnivore.DataService import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.networking.* +import app.omnivore.omnivore.persistence.AppDatabase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( private val networker: Networker, + private val dataService: DataService ): ViewModel() { private var cursor: String? = null private var items: List = listOf() @@ -53,6 +58,11 @@ class HomeViewModel @Inject constructor( } viewModelScope.launch { + withContext(Dispatchers.IO) { + val viewers = dataService.db.viewerDao().getAll() + Log.d("appDatabase", "found ${viewers.count()} viewers in db") + } + val thisSearchIdx = searchIdx searchIdx += 1 From 8f695ee06d9768fa3564f6843f1a69f642bd3cd0 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 3 Jan 2023 17:09:36 -0800 Subject: [PATCH 12/16] rename home to library --- .../app/omnivore/omnivore/MainActivity.kt | 6 ++-- .../main/java/app/omnivore/omnivore/Routes.kt | 2 +- .../omnivore/ui/{home => library}/HomeView.kt | 30 +++++++++---------- .../LibraryViewModel.kt} | 5 ++-- .../ui/{home => library}/SearchBar.kt | 4 +-- .../ui/linkedItemViews/LinkedItemCard.kt | 2 +- .../linkedItemViews/LinkedItemContextMenu.kt | 2 +- .../omnivore/ui/reader/WebReaderViewModel.kt | 14 ++++----- .../app/omnivore/omnivore/ui/root/RootView.kt | 18 +++++------ .../omnivore/ui/settings/SettingsContent.kt | 5 +--- 10 files changed, 42 insertions(+), 46 deletions(-) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/{home => library}/HomeView.kt (83%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/{home/HomeViewModel.kt => library/LibraryViewModel.kt} (96%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/{home => library}/SearchBar.kt (98%) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt index abe2cec31..7cb09dfca 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/MainActivity.kt @@ -14,7 +14,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import app.omnivore.omnivore.ui.auth.LoginViewModel -import app.omnivore.omnivore.ui.home.HomeViewModel +import app.omnivore.omnivore.ui.library.LibraryViewModel import app.omnivore.omnivore.ui.reader.WebReaderViewModel import app.omnivore.omnivore.ui.root.RootView import app.omnivore.omnivore.ui.theme.OmnivoreTheme @@ -31,7 +31,7 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) val loginViewModel: LoginViewModel by viewModels() - val homeViewModel: HomeViewModel by viewModels() + val libraryViewModel: LibraryViewModel by viewModels() val webReaderViewModel: WebReaderViewModel by viewModels() val context = this @@ -53,7 +53,7 @@ class MainActivity : ComponentActivity() { .fillMaxSize() .background(color = Color.Black) ) { - RootView(loginViewModel, homeViewModel, webReaderViewModel) + RootView(loginViewModel, libraryViewModel, webReaderViewModel) } } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt index 65a4fce36..d30d337a6 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt @@ -1,7 +1,7 @@ package app.omnivore.omnivore sealed class Routes(val route: String) { - object Home : Routes("Home") + object Library : Routes("Library") object WebAppReader : Routes("WebAppReader") object Settings: Routes("Settings") } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/HomeView.kt similarity index 83% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/HomeView.kt index 00afbf210..4457f3bbf 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/HomeView.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.ui.home +package app.omnivore.omnivore.ui.library import android.content.Intent import androidx.compose.foundation.background @@ -28,23 +28,23 @@ import kotlinx.coroutines.flow.distinctUntilChanged @OptIn(ExperimentalMaterial3Api::class) @Composable -fun HomeView( - homeViewModel: HomeViewModel, +fun LibraryView( + libraryViewModel: LibraryViewModel, navController: NavHostController ) { - val searchText: String by homeViewModel.searchTextLiveData.observeAsState("") + val searchText: String by libraryViewModel.searchTextLiveData.observeAsState("") Scaffold( topBar = { SearchBar( searchText = searchText, - onSearchTextChanged = { homeViewModel.updateSearchText(it) }, + onSearchTextChanged = { libraryViewModel.updateSearchText(it) }, onSettingsIconClick = { navController.navigate(Routes.Settings.route) } ) } ) { paddingValues -> - HomeViewContent( - homeViewModel, + LibraryViewContent( + libraryViewModel, navController, modifier = Modifier .padding( @@ -57,8 +57,8 @@ fun HomeView( @OptIn(ExperimentalMaterialApi::class) @Composable -fun HomeViewContent( - homeViewModel: HomeViewModel, +fun LibraryViewContent( + libraryViewModel: LibraryViewModel, navController: NavHostController, modifier: Modifier ) { @@ -66,11 +66,11 @@ fun HomeViewContent( val listState = rememberLazyListState() val pullRefreshState = rememberPullRefreshState( - refreshing = homeViewModel.isRefreshing, - onRefresh = { homeViewModel.refresh() } + refreshing = libraryViewModel.isRefreshing, + onRefresh = { libraryViewModel.refresh() } ) - val linkedItems: List by homeViewModel.itemsLiveData.observeAsState(listOf()) + val linkedItems: List by libraryViewModel.itemsLiveData.observeAsState(listOf()) Box( modifier = Modifier @@ -98,17 +98,17 @@ fun HomeViewContent( navController.navigate("WebReader/${item.slug}") } }, - actionHandler = { homeViewModel.handleLinkedItemAction(item.id, it) } + actionHandler = { libraryViewModel.handleLinkedItemAction(item.id, it) } ) } } InfiniteListHandler(listState = listState) { - homeViewModel.load() + libraryViewModel.load() } PullRefreshIndicator( - refreshing = homeViewModel.isRefreshing, + refreshing = libraryViewModel.isRefreshing, state = pullRefreshState, modifier = Modifier.align(Alignment.TopCenter) ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt similarity index 96% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index c795bd73f..8c588b64d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.ui.home +package app.omnivore.omnivore.ui.library import android.util.Log import androidx.compose.runtime.getValue @@ -10,7 +10,6 @@ import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.DataService import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.networking.* -import app.omnivore.omnivore.persistence.AppDatabase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -19,7 +18,7 @@ import kotlinx.coroutines.withContext import javax.inject.Inject @HiltViewModel -class HomeViewModel @Inject constructor( +class LibraryViewModel @Inject constructor( private val networker: Networker, private val dataService: DataService ): ViewModel() { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/SearchBar.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/SearchBar.kt similarity index 98% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/SearchBar.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/SearchBar.kt index c4d93badc..63b0b91e9 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/SearchBar.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/SearchBar.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.ui.home +package app.omnivore.omnivore.ui.library import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -38,7 +38,7 @@ fun SearchBar( if (showSearchField) { SearchField(searchText, onSearchTextChanged) } else { - Text("Home") + Text("Library") } }, colors = TopAppBarDefaults.smallTopAppBarColors( diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt index ea106161b..bbb1e01da 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import app.omnivore.omnivore.persistence.entities.LinkedItem -import app.omnivore.omnivore.ui.home.LinkedItemAction +import app.omnivore.omnivore.ui.library.LinkedItemAction import coil.compose.rememberAsyncImagePainter @OptIn(ExperimentalFoundationApi::class) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt index ea11a4038..62b4c4692 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt @@ -8,7 +8,7 @@ import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import app.omnivore.omnivore.ui.home.LinkedItemAction +import app.omnivore.omnivore.ui.library.LinkedItemAction @Composable fun LinkedItemContextMenu( 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 ffed95f66..37a725343 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 @@ -9,7 +9,7 @@ import app.omnivore.omnivore.DatastoreKeys import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.persistence.entities.LinkedItem import app.omnivore.omnivore.networking.* -import app.omnivore.omnivore.ui.home.LinkedItemAction +import app.omnivore.omnivore.ui.library.LinkedItemAction import com.google.gson.Gson import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope @@ -69,28 +69,28 @@ class WebReaderViewModel @Inject constructor( LinkedItemAction.Delete -> { viewModelScope.launch { networker.deleteLinkedItem(itemID) - popToHomeView(itemID) + popToLibraryView(itemID) } } LinkedItemAction.Archive -> { viewModelScope.launch { networker.archiveLinkedItem(itemID) - popToHomeView(itemID) + popToLibraryView(itemID) } } LinkedItemAction.Unarchive -> { viewModelScope.launch { networker.unarchiveLinkedItem(itemID) - popToHomeView(itemID) + popToLibraryView(itemID) } } } } - private fun popToHomeView(itemID: String) { + private fun popToLibraryView(itemID: String) { CoroutineScope(Dispatchers.Main).launch { - // TODO: pop to home - Log.d("maxx", "should pop to home and remove item with ID: $itemID") + // TODO: pop to library + Log.d("maxx", "should pop to library and remove item with ID: $itemID") } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt index b0abce8d2..e22d3ac18 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt @@ -16,15 +16,15 @@ import androidx.navigation.compose.rememberNavController import app.omnivore.omnivore.Routes import app.omnivore.omnivore.ui.auth.LoginViewModel import app.omnivore.omnivore.ui.auth.WelcomeScreen -import app.omnivore.omnivore.ui.home.HomeView -import app.omnivore.omnivore.ui.home.HomeViewModel +import app.omnivore.omnivore.ui.library.LibraryView +import app.omnivore.omnivore.ui.library.LibraryViewModel import app.omnivore.omnivore.ui.reader.* import com.google.accompanist.systemuicontroller.rememberSystemUiController @Composable fun RootView( loginViewModel: LoginViewModel, - homeViewModel: HomeViewModel, + libraryViewModel: LibraryViewModel, webReaderViewModel: WebReaderViewModel ) { val hasAuthToken: Boolean by loginViewModel.hasAuthTokenLiveData.observeAsState(false) @@ -47,7 +47,7 @@ fun RootView( if (hasAuthToken) { PrimaryNavigator( loginViewModel = loginViewModel, - homeViewModel = homeViewModel, + libraryViewModel = libraryViewModel, webReaderViewModel = webReaderViewModel ) } else { @@ -66,15 +66,15 @@ fun RootView( @Composable fun PrimaryNavigator( loginViewModel: LoginViewModel, - homeViewModel: HomeViewModel, + libraryViewModel: LibraryViewModel, webReaderViewModel: WebReaderViewModel ) { val navController = rememberNavController() - NavHost(navController = navController, startDestination = Routes.Home.route) { - composable(Routes.Home.route) { - HomeView( - homeViewModel = homeViewModel, + NavHost(navController = navController, startDestination = Routes.Library.route) { + composable(Routes.Library.route) { + LibraryView( + libraryViewModel = libraryViewModel, navController = navController ) } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt index 2c47411f4..fbedadde0 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/settings/SettingsContent.kt @@ -1,14 +1,11 @@ import android.annotation.SuppressLint -import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Home import androidx.compose.material3.* -import androidx.compose.material3.TopAppBarDefaults.smallTopAppBarColors import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController @@ -34,7 +31,7 @@ fun SettingsView( containerColor = MaterialTheme.colorScheme.surfaceVariant ), actions = { - IconButton(onClick = { navController.navigate(Routes.Home.route) }) { + IconButton(onClick = { navController.navigate(Routes.Library.route) }) { Icon( imageVector = Icons.Default.Home, contentDescription = null From 3f2fb0b2e0baf2818376b10cec2e76f802460e5d Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 4 Jan 2023 09:25:52 -0800 Subject: [PATCH 13/16] rename linkedItem to savedItem --- ...dItem.graphql => ArchiveSavedItem.graphql} | 0 ...edItem.graphql => DeleteSavedItem.graphql} | 0 ...ItemMutations.kt => SavedItemMutations.kt} | 12 ++++---- .../{LinkedItemQuery.kt => SavedItemQuery.kt} | 28 +++++++++---------- .../omnivore/networking/SearchQuery.kt | 8 +++--- .../persistence/entities/Highlight.kt | 4 +-- .../persistence/entities/Recommendation.kt | 2 +- .../entities/{LinkedItem.kt => SavedItem.kt} | 6 ++-- .../{LinkedItemLabel.kt => SavedItemLabel.kt} | 4 +-- .../omnivore/ui/auth/LoginViewModel.kt | 4 --- .../library/{HomeView.kt => LibraryView.kt} | 14 +++++----- .../omnivore/ui/library/LibraryViewModel.kt | 24 ++++++++-------- .../omnivore/omnivore/ui/reader/PDFReader.kt | 2 +- .../omnivore/ui/reader/PDFReaderViewModel.kt | 6 ++-- .../omnivore/omnivore/ui/reader/WebReader.kt | 9 ++---- .../omnivore/ui/reader/WebReaderContent.kt | 4 +-- .../omnivore/ui/reader/WebReaderViewModel.kt | 22 +++++++-------- .../SavedItemCard.kt} | 12 ++++---- .../SavedItemContextMenu.kt} | 12 ++++---- 19 files changed, 83 insertions(+), 90 deletions(-) rename android/Omnivore/app/src/main/graphql/{ArchiveLinkedItem.graphql => ArchiveSavedItem.graphql} (100%) rename android/Omnivore/app/src/main/graphql/{DeleteLinkedItem.graphql => DeleteSavedItem.graphql} (100%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/{LinkedItemMutations.kt => SavedItemMutations.kt} (69%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/{LinkedItemQuery.kt => SavedItemQuery.kt} (78%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/{LinkedItem.kt => SavedItem.kt} (94%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/{LinkedItemLabel.kt => SavedItemLabel.kt} (85%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/{HomeView.kt => LibraryView.kt} (90%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/{linkedItemViews/LinkedItemCard.kt => savedItemViews/SavedItemCard.kt} (86%) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/{linkedItemViews/LinkedItemContextMenu.kt => savedItemViews/SavedItemContextMenu.kt} (77%) diff --git a/android/Omnivore/app/src/main/graphql/ArchiveLinkedItem.graphql b/android/Omnivore/app/src/main/graphql/ArchiveSavedItem.graphql similarity index 100% rename from android/Omnivore/app/src/main/graphql/ArchiveLinkedItem.graphql rename to android/Omnivore/app/src/main/graphql/ArchiveSavedItem.graphql diff --git a/android/Omnivore/app/src/main/graphql/DeleteLinkedItem.graphql b/android/Omnivore/app/src/main/graphql/DeleteSavedItem.graphql similarity index 100% rename from android/Omnivore/app/src/main/graphql/DeleteLinkedItem.graphql rename to android/Omnivore/app/src/main/graphql/DeleteSavedItem.graphql diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt similarity index 69% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemMutations.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt index f1a8ac87a..67ead474e 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemMutations.kt @@ -5,7 +5,7 @@ import app.omnivore.omnivore.graphql.generated.SetLinkArchivedMutation import app.omnivore.omnivore.graphql.generated.type.ArchiveLinkInput import app.omnivore.omnivore.graphql.generated.type.SetBookmarkArticleInput -suspend fun Networker.deleteLinkedItem(itemID: String): Boolean { +suspend fun Networker.deleteSavedItem(itemID: String): Boolean { return try { val input = SetBookmarkArticleInput(itemID, false) val result = authenticatedApolloClient().mutation(SetBookmarkArticleMutation(input)).execute() @@ -15,15 +15,15 @@ suspend fun Networker.deleteLinkedItem(itemID: String): Boolean { } } -suspend fun Networker.archiveLinkedItem(itemID: String): Boolean { - return updateArchiveStatusLinkedItem(itemID, true) +suspend fun Networker.archiveSavedItem(itemID: String): Boolean { + return updateArchiveStatusSavedItem(itemID, true) } -suspend fun Networker.unarchiveLinkedItem(itemID: String): Boolean { - return updateArchiveStatusLinkedItem(itemID, false) +suspend fun Networker.unarchiveSavedItem(itemID: String): Boolean { + return updateArchiveStatusSavedItem(itemID, false) } -private suspend fun Networker.updateArchiveStatusLinkedItem(itemID: String, setAsArchived: Boolean): Boolean { +private suspend fun Networker.updateArchiveStatusSavedItem(itemID: String, setAsArchived: Boolean): Boolean { return try { val input = ArchiveLinkInput(setAsArchived, itemID) val result = authenticatedApolloClient().mutation(SetLinkArchivedMutation(input)).execute() diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemQuery.kt similarity index 78% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemQuery.kt index ddf0c9d2f..107d17e12 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/LinkedItemQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemQuery.kt @@ -1,35 +1,35 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.GetArticleQuery -import app.omnivore.omnivore.persistence.entities.LinkedItem -import app.omnivore.omnivore.persistence.entities.LinkedItemLabel +import app.omnivore.omnivore.persistence.entities.SavedItem +import app.omnivore.omnivore.persistence.entities.SavedItemLabel import app.omnivore.omnivore.persistence.entities.Highlight -data class LinkedItemQueryResponse( - val item: LinkedItem?, +data class SavedItemQueryResponse( + val item: SavedItem?, val highlights: List, - val labels: List + val labels: List ) { companion object { - fun emptyResponse(): LinkedItemQueryResponse { - return LinkedItemQueryResponse(null, listOf(), listOf()) + fun emptyResponse(): SavedItemQueryResponse { + return SavedItemQueryResponse(null, listOf(), listOf()) } } } -suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { +suspend fun Networker.savedItem(slug: String): SavedItemQueryResponse { try { val result = authenticatedApolloClient().query( GetArticleQuery(slug = slug) ).execute() val article = result.data?.article?.onArticleSuccess?.article - ?: return LinkedItemQueryResponse.emptyResponse() + ?: return SavedItemQueryResponse.emptyResponse() val labels = article.labels ?: listOf() - val linkedItemLabels = labels.map { - LinkedItemLabel( + val savedItemLabels = labels.map { + SavedItemLabel( id = it.labelFields.id, name = it.labelFields.name, color = it.labelFields.color, @@ -59,7 +59,7 @@ suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { // TODO: handle errors - val linkedItem = LinkedItem( + val savedItem = SavedItem( id = article.articleFields.id, title = article.articleFields.title, createdAt = article.articleFields.createdAt as String, @@ -81,8 +81,8 @@ suspend fun Networker.linkedItem(slug: String): LinkedItemQueryResponse { content = article.articleFields.content ) - return LinkedItemQueryResponse(item = linkedItem, highlights, labels = linkedItemLabels) + return SavedItemQueryResponse(item = savedItem, highlights, labels = savedItemLabels) } catch (e: java.lang.Exception) { - return LinkedItemQueryResponse(item = null, listOf(), labels = listOf()) + return SavedItemQueryResponse(item = null, listOf(), labels = listOf()) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt index c45ade9ed..1d2ac12e0 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt @@ -2,12 +2,12 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.SearchQuery import app.omnivore.omnivore.graphql.generated.TypeaheadSearchQuery -import app.omnivore.omnivore.persistence.entities.LinkedItem +import app.omnivore.omnivore.persistence.entities.SavedItem import com.apollographql.apollo3.api.Optional data class SearchQueryResponse( val cursor: String?, - val items: List + val items: List ) suspend fun Networker.typeaheadSearch( @@ -21,7 +21,7 @@ suspend fun Networker.typeaheadSearch( val itemList = result.data?.typeaheadSearch?.onTypeaheadSearchSuccess?.items ?: listOf() val items = itemList.map { - LinkedItem( + SavedItem( id = it.id, title = it.title, createdAt = "", @@ -69,7 +69,7 @@ suspend fun Networker.search( val itemList = result.data?.search?.onSearchSuccess?.edges ?: listOf() val items = itemList.map { - LinkedItem( + SavedItem( id = it.node.id, title = it.node.title, createdAt = it.node.createdAt as String, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt index 9b0495c6f..7b2331330 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Highlight.kt @@ -20,7 +20,7 @@ data class Highlight( val suffix: String?, val updatedAt: LocalDate? - // has many LinkedItemLabels (inverse: labels have many highlights) - // has one linkedItem (inverse: linkedItem has many highlights + // has many SavedItemLabels (inverse: labels have many highlights) + // has one savedItem (inverse: savedItem has many highlights // has a UserProfile (no inverse) ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt index 7dab45d70..2c41c9473 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Recommendation.kt @@ -11,5 +11,5 @@ data class Recommendation( val recommendedAt: String? ) -// hasOne LinkedItem +// hasOne SavedItem // hasOne UserProfile diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt similarity index 94% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt index 33ee181ca..4b5f93a36 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItem.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItem.kt @@ -6,7 +6,7 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity -data class LinkedItem( +data class SavedItem( @PrimaryKey val id: String, val title: String, val createdAt: String, @@ -41,7 +41,7 @@ data class LinkedItem( // hasMany highlights // hasMany labels -// has Many recommendations (rec has one linkedItem) +// has Many recommendations (rec has one savedItem) ) { fun publisherDisplayName(): String? { return publisherURLString?.toUri()?.host @@ -56,7 +56,7 @@ data class LinkedItem( if (this === other) return true if (javaClass != other?.javaClass) return false - other as LinkedItem + other as SavedItem if (id != other.id) return false diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItemLabel.kt similarity index 85% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItemLabel.kt index 9f8fe8083..14a0bbdf0 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/LinkedItemLabel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/SavedItemLabel.kt @@ -4,7 +4,7 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity -data class LinkedItemLabel( +data class SavedItemLabel( @PrimaryKey val id: String, val name: String, val color: String, @@ -14,4 +14,4 @@ data class LinkedItemLabel( ) // has many highlights -// has many linkedItems +// has many savedItems diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt index 727d953e7..4415c5a28 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/auth/LoginViewModel.kt @@ -4,15 +4,11 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.* -import androidx.lifecycle.viewmodel.compose.viewModel import app.omnivore.omnivore.* -import app.omnivore.omnivore.graphql.generated.SearchQuery import app.omnivore.omnivore.graphql.generated.ValidateUsernameQuery -import app.omnivore.omnivore.networking.LinkedItemQueryResponse import app.omnivore.omnivore.networking.Networker import app.omnivore.omnivore.networking.viewer import com.apollographql.apollo3.ApolloClient -import com.apollographql.apollo3.api.Optional import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.common.api.ApiException import com.google.android.gms.tasks.Task diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/HomeView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt similarity index 90% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/HomeView.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt index 4457f3bbf..6458da473 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/HomeView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt @@ -20,8 +20,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import app.omnivore.omnivore.Routes -import app.omnivore.omnivore.persistence.entities.LinkedItem -import app.omnivore.omnivore.ui.linkedItemViews.LinkedItemCard +import app.omnivore.omnivore.persistence.entities.SavedItem +import app.omnivore.omnivore.ui.savedItemViews.SavedItemCard import app.omnivore.omnivore.ui.reader.PDFReaderActivity import kotlinx.coroutines.flow.distinctUntilChanged @@ -70,7 +70,7 @@ fun LibraryViewContent( onRefresh = { libraryViewModel.refresh() } ) - val linkedItems: List by libraryViewModel.itemsLiveData.observeAsState(listOf()) + val savedItems: List by libraryViewModel.itemsLiveData.observeAsState(listOf()) Box( modifier = Modifier @@ -86,19 +86,19 @@ fun LibraryViewContent( .fillMaxSize() .padding(horizontal = 6.dp) ) { - items(linkedItems) { item -> - LinkedItemCard( + items(savedItems) { item -> + SavedItemCard( item = item, onClickHandler = { if (item.isPDF()) { val intent = Intent(context, PDFReaderActivity::class.java) - intent.putExtra("LINKED_ITEM_SLUG", item.slug) + intent.putExtra("SAVED_ITEM_SLUG", item.slug) context.startActivity(intent) } else { navController.navigate("WebReader/${item.slug}") } }, - actionHandler = { libraryViewModel.handleLinkedItemAction(item.id, it) } + actionHandler = { libraryViewModel.handleSavedItemAction(item.id, it) } ) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index 8c588b64d..86fc301a4 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -8,7 +8,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.DataService -import app.omnivore.omnivore.persistence.entities.LinkedItem +import app.omnivore.omnivore.persistence.entities.SavedItem import app.omnivore.omnivore.networking.* import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope @@ -23,8 +23,8 @@ class LibraryViewModel @Inject constructor( private val dataService: DataService ): ViewModel() { private var cursor: String? = null - private var items: List = listOf() - private var searchedItems: List = listOf() + private var items: List = listOf() + private var searchedItems: List = listOf() // These are used to make sure we handle search result // responses in the right order @@ -33,7 +33,7 @@ class LibraryViewModel @Inject constructor( // Live Data val searchTextLiveData = MutableLiveData("") - val itemsLiveData = MutableLiveData>(listOf()) + val itemsLiveData = MutableLiveData>(listOf()) var isRefreshing by mutableStateOf(false) fun updateSearchText(text: String) { @@ -100,25 +100,25 @@ class LibraryViewModel @Inject constructor( } } - fun handleLinkedItemAction(itemID: String, action: LinkedItemAction) { + fun handleSavedItemAction(itemID: String, action: SavedItemAction) { when (action) { - LinkedItemAction.Delete -> { + SavedItemAction.Delete -> { removeItemFromList(itemID) viewModelScope.launch { - networker.deleteLinkedItem(itemID) + networker.deleteSavedItem(itemID) } } - LinkedItemAction.Archive -> { + SavedItemAction.Archive -> { removeItemFromList(itemID) viewModelScope.launch { - networker.archiveLinkedItem(itemID) + networker.archiveSavedItem(itemID) } } - LinkedItemAction.Unarchive -> { + SavedItemAction.Unarchive -> { removeItemFromList(itemID) viewModelScope.launch { - networker.unarchiveLinkedItem(itemID) + networker.unarchiveSavedItem(itemID) } } } @@ -142,7 +142,7 @@ class LibraryViewModel @Inject constructor( } } -enum class LinkedItemAction { +enum class SavedItemAction { Delete, Archive, Unarchive diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt index f5e1ef506..d6249cd21 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt @@ -78,7 +78,7 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer. viewModel.pdfReaderParamsLiveData.observe(this, pdfParamsObserver) - val slug = intent.getStringExtra("LINKED_ITEM_SLUG") ?: "" + val slug = intent.getStringExtra("SAVED_ITEM_SLUG") ?: "" viewModel.loadItem(slug, this) } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt index 05f16c003..d313994f6 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt @@ -10,7 +10,7 @@ import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.graphql.generated.type.CreateHighlightInput import app.omnivore.omnivore.graphql.generated.type.MergeHighlightInput import app.omnivore.omnivore.graphql.generated.type.UpdateHighlightInput -import app.omnivore.omnivore.persistence.entities.LinkedItem +import app.omnivore.omnivore.persistence.entities.SavedItem import app.omnivore.omnivore.networking.* import com.apollographql.apollo3.api.Optional import com.google.gson.Gson @@ -29,7 +29,7 @@ import java.util.* import javax.inject.Inject data class PDFReaderParams( - val item: LinkedItem, + val item: SavedItem, val articleContent: ArticleContent, val localFileUri: Uri ) @@ -45,7 +45,7 @@ class PDFReaderViewModel @Inject constructor( fun loadItem(slug: String, context: Context) { viewModelScope.launch { - val articleQueryResult = networker.linkedItem(slug) + val articleQueryResult = networker.savedItem(slug) val article = articleQueryResult.item ?: return@launch 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 73b707d73..25c173aab 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,7 +15,6 @@ 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.* @@ -29,14 +28,12 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView -import androidx.core.content.ContextCompat.getSystemService import app.omnivore.omnivore.R -import app.omnivore.omnivore.ui.linkedItemViews.LinkedItemContextMenu +import app.omnivore.omnivore.ui.savedItemViews.SavedItemContextMenu import com.google.gson.Gson import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.json.JSONObject import java.util.* import kotlin.math.roundToInt @@ -112,11 +109,11 @@ fun WebReaderLoadingContainer(slug: String, webReaderViewModel: WebReaderViewMod contentDescription = null ) } - LinkedItemContextMenu( + SavedItemContextMenu( isExpanded = isMenuExpanded, isArchived = webReaderParams!!.item.isArchived, onDismiss = { isMenuExpanded = false }, - actionHandler = { webReaderViewModel.handleLinkedItemAction(webReaderParams!!.item.id, it) } + actionHandler = { webReaderViewModel.handleSavedItemAction(webReaderParams!!.item.id, it) } ) } ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt index 386cc68d4..fccd4038c 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt @@ -1,7 +1,7 @@ package app.omnivore.omnivore.ui.reader import android.util.Log -import app.omnivore.omnivore.persistence.entities.LinkedItem +import app.omnivore.omnivore.persistence.entities.SavedItem import app.omnivore.omnivore.persistence.entities.Highlight import com.google.gson.Gson @@ -39,7 +39,7 @@ data class ArticleContent( data class WebReaderContent( val preferences: WebPreferences, - val item: LinkedItem, + val item: SavedItem, val articleContent: ArticleContent, ) { fun styledContent(): String { 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 37a725343..fe6c1b103 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 @@ -7,9 +7,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.DatastoreKeys import app.omnivore.omnivore.DatastoreRepository -import app.omnivore.omnivore.persistence.entities.LinkedItem +import app.omnivore.omnivore.persistence.entities.SavedItem import app.omnivore.omnivore.networking.* -import app.omnivore.omnivore.ui.library.LinkedItemAction +import app.omnivore.omnivore.ui.library.SavedItemAction import com.google.gson.Gson import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope @@ -20,7 +20,7 @@ import java.util.* import javax.inject.Inject data class WebReaderParams( - val item: LinkedItem, + val item: SavedItem, val articleContent: ArticleContent ) @@ -47,7 +47,7 @@ class WebReaderViewModel @Inject constructor( fun loadItem(slug: String) { viewModelScope.launch { - val articleQueryResult = networker.linkedItem(slug) + val articleQueryResult = networker.savedItem(slug) val article = articleQueryResult.item ?: return@launch @@ -64,23 +64,23 @@ class WebReaderViewModel @Inject constructor( } } - fun handleLinkedItemAction(itemID: String, action: LinkedItemAction) { + fun handleSavedItemAction(itemID: String, action: SavedItemAction) { when (action) { - LinkedItemAction.Delete -> { + SavedItemAction.Delete -> { viewModelScope.launch { - networker.deleteLinkedItem(itemID) + networker.deleteSavedItem(itemID) popToLibraryView(itemID) } } - LinkedItemAction.Archive -> { + SavedItemAction.Archive -> { viewModelScope.launch { - networker.archiveLinkedItem(itemID) + networker.archiveSavedItem(itemID) popToLibraryView(itemID) } } - LinkedItemAction.Unarchive -> { + SavedItemAction.Unarchive -> { viewModelScope.launch { - networker.unarchiveLinkedItem(itemID) + networker.unarchiveSavedItem(itemID) popToLibraryView(itemID) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt similarity index 86% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt index bbb1e01da..d0d39e52b 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.ui.linkedItemViews +package app.omnivore.omnivore.ui.savedItemViews import androidx.compose.foundation.* import androidx.compose.foundation.layout.* @@ -12,13 +12,13 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import app.omnivore.omnivore.persistence.entities.LinkedItem -import app.omnivore.omnivore.ui.library.LinkedItemAction +import app.omnivore.omnivore.persistence.entities.SavedItem +import app.omnivore.omnivore.ui.library.SavedItemAction import coil.compose.rememberAsyncImagePainter @OptIn(ExperimentalFoundationApi::class) @Composable -fun LinkedItemCard(item: LinkedItem, onClickHandler: () -> Unit, actionHandler: (LinkedItemAction) -> Unit) { +fun SavedItemCard(item: SavedItem, onClickHandler: () -> Unit, actionHandler: (SavedItemAction) -> Unit) { var isMenuExpanded by remember { mutableStateOf(false) } val publisherDisplayName = item.publisherDisplayName() @@ -69,7 +69,7 @@ fun LinkedItemCard(item: LinkedItem, onClickHandler: () -> Unit, actionHandler: if (item.imageURLString != null) { Image( painter = rememberAsyncImagePainter(item.imageURLString), - contentDescription = "Image associated with linked item", + contentDescription = "Image associated with saved item", modifier = Modifier .padding(top = 6.dp) .clip(RoundedCornerShape(6.dp)) @@ -80,7 +80,7 @@ fun LinkedItemCard(item: LinkedItem, onClickHandler: () -> Unit, actionHandler: Divider(color = MaterialTheme.colorScheme.outlineVariant, thickness = 1.dp) - LinkedItemContextMenu( + SavedItemContextMenu( isExpanded = isMenuExpanded, isArchived = item.isArchived, onDismiss = { isMenuExpanded = false }, diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemContextMenu.kt similarity index 77% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemContextMenu.kt index 62b4c4692..7725d62d7 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemContextMenu.kt @@ -1,4 +1,4 @@ -package app.omnivore.omnivore.ui.linkedItemViews +package app.omnivore.omnivore.ui.savedItemViews import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete @@ -8,14 +8,14 @@ import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import app.omnivore.omnivore.ui.library.LinkedItemAction +import app.omnivore.omnivore.ui.library.SavedItemAction @Composable -fun LinkedItemContextMenu( +fun SavedItemContextMenu( isExpanded: Boolean, isArchived: Boolean, onDismiss: () -> Unit, - actionHandler: (LinkedItemAction) -> Unit + actionHandler: (SavedItemAction) -> Unit ) { DropdownMenu( expanded = isExpanded, @@ -24,7 +24,7 @@ fun LinkedItemContextMenu( DropdownMenuItem( text = { Text(if (isArchived) "Unarchive" else "Archive") }, onClick = { - val action = if (isArchived) LinkedItemAction.Unarchive else LinkedItemAction.Archive + val action = if (isArchived) SavedItemAction.Unarchive else SavedItemAction.Archive actionHandler(action) onDismiss() }, @@ -38,7 +38,7 @@ fun LinkedItemContextMenu( DropdownMenuItem( text = { Text("Remove Item") }, onClick = { - actionHandler(LinkedItemAction.Delete) + actionHandler(SavedItemAction.Delete) onDismiss() }, leadingIcon = { From bbe85087533d6aba49548a0d4761f6c1143e0270 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 4 Jan 2023 10:55:52 -0800 Subject: [PATCH 14/16] create savedItemCardData class --- .../omnivore/persistence/AppDatabase.kt | 6 +++- .../persistence/entities/SavedItem.kt | 30 +++++++++++++++++-- .../omnivore/persistence/entities/Viewer.kt | 1 + .../omnivore/ui/library/LibraryViewModel.kt | 6 ++++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt index ea86ffedd..7d9d66b94 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/AppDatabase.kt @@ -2,15 +2,19 @@ package app.omnivore.omnivore.persistence import androidx.room.Database import androidx.room.RoomDatabase +import app.omnivore.omnivore.persistence.entities.SavedItem +import app.omnivore.omnivore.persistence.entities.SavedItemDao import app.omnivore.omnivore.persistence.entities.Viewer import app.omnivore.omnivore.persistence.entities.ViewerDao @Database( entities = [ - Viewer::class + Viewer::class, + SavedItem::class ], version = 1 ) abstract class AppDatabase : RoomDatabase() { abstract fun viewerDao(): ViewerDao + abstract fun savedItemDao(): SavedItemDao } 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 4b5f93a36..0d22f731c 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 @@ -1,9 +1,8 @@ package app.omnivore.omnivore.persistence.entities import androidx.core.net.toUri -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey +import androidx.room.* +import app.omnivore.omnivore.persistence.BaseDao @Entity data class SavedItem( @@ -67,3 +66,28 @@ data class SavedItem( return id.hashCode() } } + +data class SavedItemCardData( + val id: String, + val publisherURLString: String?, + val title: String, + val author: String?, + val imageURLString: String?, + val isArchived: Boolean +) { + fun publisherDisplayName(): String? { + return publisherURLString?.toUri()?.host + } +} + +@Dao +interface SavedItemDao { + @Query("SELECT id, publisherURLString, title, author, imageURLString, isArchived FROM SavedItem") + fun getLibraryData(): List + + @Query("SELECT * FROM savedItem") + fun getAll(): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertAll(items: List) +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt index 4dafd1639..5fb2d329d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/entities/Viewer.kt @@ -1,6 +1,7 @@ package app.omnivore.omnivore.persistence.entities import androidx.room.* +import app.omnivore.omnivore.persistence.BaseDao @Entity data class Viewer( diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index 86fc301a4..c77961bf2 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -94,6 +94,12 @@ class LibraryViewModel @Inject constructor( itemsLiveData.postValue(items) } + withContext(Dispatchers.IO) { + dataService.db.savedItemDao().insertAll(items) + val items = dataService.db.savedItemDao().getLibraryData() + Log.d("appDatabase", "libraryData: $items") + } + CoroutineScope(Dispatchers.Main).launch { isRefreshing = false } From 49855087027ee7ba967e238220ca23f251080765 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 4 Jan 2023 11:21:12 -0800 Subject: [PATCH 15/16] update SavedItemCardData class --- .../omnivore/omnivore/persistence/BaseDao.kt | 42 +++++++++++++++++++ .../persistence/entities/SavedItem.kt | 26 +++++++++++- .../omnivore/ui/library/LibraryViewModel.kt | 5 --- 3 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/BaseDao.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/BaseDao.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/BaseDao.kt new file mode 100644 index 000000000..e422079ae --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/persistence/BaseDao.kt @@ -0,0 +1,42 @@ +package app.omnivore.omnivore.persistence + +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Update + + +interface BaseDao { + + /** + * Insert an object in the database. + * + * @param obj the object to be inserted. + */ + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(obj: T) + + /** + * Insert an array of objects in the database. + * + * @param obj the objects to be inserted. + */ + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg obj: T) + + /** + * Update an object from the database. + * + * @param obj the object to be updated + */ + @Update + fun update(obj: T) + + /** + * Delete an object from the database + * + * @param obj the object to be deleted + */ + @Delete + fun delete(obj: T) +} 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 0d22f731c..33cc02ca0 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 @@ -51,6 +51,20 @@ data class SavedItem( return contentReader == "PDF" || hasPDFSuffix } + fun asSavedItemCardData(): SavedItemCardData { + return SavedItemCardData( + id = id, + slug = slug, + publisherURLString = publisherURLString, + title = title, + author = author, + imageURLString = imageURLString, + isArchived = isArchived, + pageURLString = pageURLString, + contentReader = contentReader, + ) + } + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false @@ -69,20 +83,28 @@ data class SavedItem( data class SavedItemCardData( val id: String, + val slug: String, val publisherURLString: String?, val title: String, val author: String?, val imageURLString: String?, - val isArchived: Boolean + val isArchived: Boolean, + val pageURLString: String, + val contentReader: String? ) { fun publisherDisplayName(): String? { return publisherURLString?.toUri()?.host } + + fun isPDF(): Boolean { + val hasPDFSuffix = pageURLString.endsWith("pdf") + return contentReader == "PDF" || hasPDFSuffix + } } @Dao interface SavedItemDao { - @Query("SELECT id, publisherURLString, title, author, imageURLString, isArchived FROM SavedItem") + @Query("SELECT id, slug, publisherURLString, title, author, imageURLString, isArchived, pageURLString, contentReader FROM SavedItem") fun getLibraryData(): List @Query("SELECT * FROM savedItem") diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index c77961bf2..9562b4586 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -57,11 +57,6 @@ class LibraryViewModel @Inject constructor( } viewModelScope.launch { - withContext(Dispatchers.IO) { - val viewers = dataService.db.viewerDao().getAll() - Log.d("appDatabase", "found ${viewers.count()} viewers in db") - } - val thisSearchIdx = searchIdx searchIdx += 1 From 9d19f6fdba46674c4d509843ff55164936ca0f13 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 4 Jan 2023 11:36:39 -0800 Subject: [PATCH 16/16] use SavedItemCardData to populate library list --- .../omnivore/networking/SearchQuery.kt | 55 ++++++------------- .../omnivore/ui/library/LibraryView.kt | 15 ++--- .../omnivore/ui/library/LibraryViewModel.kt | 22 ++++---- .../ui/savedItemViews/SavedItemCard.kt | 17 +++--- 4 files changed, 46 insertions(+), 63 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt index 1d2ac12e0..429030f6c 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SearchQuery.kt @@ -3,11 +3,12 @@ package app.omnivore.omnivore.networking import app.omnivore.omnivore.graphql.generated.SearchQuery import app.omnivore.omnivore.graphql.generated.TypeaheadSearchQuery import app.omnivore.omnivore.persistence.entities.SavedItem +import app.omnivore.omnivore.persistence.entities.SavedItemCardData import com.apollographql.apollo3.api.Optional data class SearchQueryResponse( val cursor: String?, - val items: List + val cardsData: List ) suspend fun Networker.typeaheadSearch( @@ -20,31 +21,21 @@ suspend fun Networker.typeaheadSearch( val itemList = result.data?.typeaheadSearch?.onTypeaheadSearchSuccess?.items ?: listOf() - val items = itemList.map { - SavedItem( + val cardsData = itemList.map { + SavedItemCardData( id = it.id, - title = it.title, - createdAt = "", - savedAt = "", - readAt = "", - updatedAt = "", - readingProgress = 0.0, - readingProgressAnchor = 0, - imageURLString = null, - pageURLString = "", - descriptionText = "", - publisherURLString = "", - siteName = it.siteName, - author = "", - publishDate = null, slug = it.slug, + publisherURLString = "", + title = it.title, + author = "", + imageURLString = null, isArchived = false, + pageURLString = "", contentReader = null, - content = null ) } - return SearchQueryResponse(null, items) + return SearchQueryResponse(null, cardsData) } catch (e: java.lang.Exception) { return SearchQueryResponse(null, listOf()) } @@ -68,31 +59,21 @@ suspend fun Networker.search( val newCursor = result.data?.search?.onSearchSuccess?.pageInfo?.endCursor val itemList = result.data?.search?.onSearchSuccess?.edges ?: listOf() - val items = itemList.map { - SavedItem( + val cardsData = itemList.map { + SavedItemCardData( id = it.node.id, - title = it.node.title, - createdAt = it.node.createdAt as String, - savedAt = it.node.savedAt as String, - readAt = it.node.readAt as String?, - updatedAt = it.node.updatedAt as String?, - readingProgress = it.node.readingProgressPercent, - readingProgressAnchor = it.node.readingProgressAnchorIndex, - imageURLString = it.node.image, - pageURLString = it.node.url, - descriptionText = it.node.description, - publisherURLString = it.node.originalArticleUrl, - siteName = it.node.siteName, - author = it.node.author, - publishDate = it.node.publishedAt as String?, slug = it.node.slug, + publisherURLString = it.node.originalArticleUrl, + title = it.node.title, + author = it.node.author, + imageURLString = it.node.image, isArchived = it.node.isArchived, + pageURLString = it.node.url, contentReader = it.node.contentReader.rawValue, - content = null ) } - return SearchQueryResponse(newCursor, items) + return SearchQueryResponse(newCursor, cardsData) } catch (e: java.lang.Exception) { return SearchQueryResponse(null, listOf()) } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt index 6458da473..35a16552d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryView.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import app.omnivore.omnivore.Routes import app.omnivore.omnivore.persistence.entities.SavedItem +import app.omnivore.omnivore.persistence.entities.SavedItemCardData import app.omnivore.omnivore.ui.savedItemViews.SavedItemCard import app.omnivore.omnivore.ui.reader.PDFReaderActivity import kotlinx.coroutines.flow.distinctUntilChanged @@ -70,7 +71,7 @@ fun LibraryViewContent( onRefresh = { libraryViewModel.refresh() } ) - val savedItems: List by libraryViewModel.itemsLiveData.observeAsState(listOf()) + val cardsData: List by libraryViewModel.itemsLiveData.observeAsState(listOf()) Box( modifier = Modifier @@ -86,19 +87,19 @@ fun LibraryViewContent( .fillMaxSize() .padding(horizontal = 6.dp) ) { - items(savedItems) { item -> + items(cardsData) { cardData -> SavedItemCard( - item = item, + cardData = cardData, onClickHandler = { - if (item.isPDF()) { + if (cardData.isPDF()) { val intent = Intent(context, PDFReaderActivity::class.java) - intent.putExtra("SAVED_ITEM_SLUG", item.slug) + intent.putExtra("SAVED_ITEM_SLUG", cardData.slug) context.startActivity(intent) } else { - navController.navigate("WebReader/${item.slug}") + navController.navigate("WebReader/${cardData.slug}") } }, - actionHandler = { libraryViewModel.handleSavedItemAction(item.id, it) } + actionHandler = { libraryViewModel.handleSavedItemAction(cardData.id, it) } ) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt index 9562b4586..e6fecd759 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/library/LibraryViewModel.kt @@ -8,8 +8,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.DataService -import app.omnivore.omnivore.persistence.entities.SavedItem import app.omnivore.omnivore.networking.* +import app.omnivore.omnivore.persistence.entities.SavedItemCardData import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -23,8 +23,8 @@ class LibraryViewModel @Inject constructor( private val dataService: DataService ): ViewModel() { private var cursor: String? = null - private var items: List = listOf() - private var searchedItems: List = listOf() + private var items: List = listOf() + private var searchedItems: List = listOf() // These are used to make sure we handle search result // responses in the right order @@ -33,7 +33,7 @@ class LibraryViewModel @Inject constructor( // Live Data val searchTextLiveData = MutableLiveData("") - val itemsLiveData = MutableLiveData>(listOf()) + val itemsLiveData = MutableLiveData>(listOf()) var isRefreshing by mutableStateOf(false) fun updateSearchText(text: String) { @@ -82,18 +82,18 @@ class LibraryViewModel @Inject constructor( if (searchTextLiveData.value != "" || clearPreviousSearch) { val previousItems = if (clearPreviousSearch) listOf() else searchedItems - searchedItems = previousItems.plus(searchResult.items) + searchedItems = previousItems.plus(searchResult.cardsData) itemsLiveData.postValue(searchedItems) } else { - items = items.plus(searchResult.items) + items = items.plus(searchResult.cardsData) itemsLiveData.postValue(items) } - withContext(Dispatchers.IO) { - dataService.db.savedItemDao().insertAll(items) - val items = dataService.db.savedItemDao().getLibraryData() - Log.d("appDatabase", "libraryData: $items") - } +// withContext(Dispatchers.IO) { +// dataService.db.savedItemDao().insertAll(items) +// val items = dataService.db.savedItemDao().getLibraryData() +// Log.d("appDatabase", "libraryData: $items") +// } CoroutineScope(Dispatchers.Main).launch { isRefreshing = false diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt index d0d39e52b..d179667e6 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/savedItemViews/SavedItemCard.kt @@ -13,14 +13,15 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import app.omnivore.omnivore.persistence.entities.SavedItem +import app.omnivore.omnivore.persistence.entities.SavedItemCardData import app.omnivore.omnivore.ui.library.SavedItemAction import coil.compose.rememberAsyncImagePainter @OptIn(ExperimentalFoundationApi::class) @Composable -fun SavedItemCard(item: SavedItem, onClickHandler: () -> Unit, actionHandler: (SavedItemAction) -> Unit) { +fun SavedItemCard(cardData: SavedItemCardData, onClickHandler: () -> Unit, actionHandler: (SavedItemAction) -> Unit) { var isMenuExpanded by remember { mutableStateOf(false) } - val publisherDisplayName = item.publisherDisplayName() + val publisherDisplayName = cardData.publisherDisplayName() Column { Row( @@ -42,14 +43,14 @@ fun SavedItemCard(item: SavedItem, onClickHandler: () -> Unit, actionHandler: (S .padding(end = 8.dp) ) { Text( - text = item.title, + text = cardData.title, style = MaterialTheme.typography.titleMedium, lineHeight = 20.sp ) - if (item.author != null && item.author != "") { + if (cardData.author != null && cardData.author != "") { Text( - text = "By ${item.author}", + text = "By ${cardData.author}", style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis @@ -66,9 +67,9 @@ fun SavedItemCard(item: SavedItem, onClickHandler: () -> Unit, actionHandler: (S } } - if (item.imageURLString != null) { + if (cardData.imageURLString != null) { Image( - painter = rememberAsyncImagePainter(item.imageURLString), + painter = rememberAsyncImagePainter(cardData.imageURLString), contentDescription = "Image associated with saved item", modifier = Modifier .padding(top = 6.dp) @@ -82,7 +83,7 @@ fun SavedItemCard(item: SavedItem, onClickHandler: () -> Unit, actionHandler: (S SavedItemContextMenu( isExpanded = isMenuExpanded, - isArchived = item.isArchived, + isArchived = cardData.isArchived, onDismiss = { isMenuExpanded = false }, actionHandler = actionHandler )