diff --git a/android/Omnivore/app/src/main/AndroidManifest.xml b/android/Omnivore/app/src/main/AndroidManifest.xml
index 8e8ed979a..1667cf88b 100644
--- a/android/Omnivore/app/src/main/AndroidManifest.xml
+++ b/android/Omnivore/app/src/main/AndroidManifest.xml
@@ -54,8 +54,9 @@
+ android:exported="true"
+ android:label="@string/app_name"
+ android:theme="@style/Theme.Omnivore"/>
diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemQuery.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemQuery.kt
index 9cc667461..bc5ec8840 100644
--- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemQuery.kt
+++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/SavedItemQuery.kt
@@ -8,11 +8,12 @@ import app.omnivore.omnivore.persistence.entities.Highlight
data class SavedItemQueryResponse(
val item: SavedItem?,
val highlights: List,
- val labels: List
+ val labels: List,
+ val state: String
) {
companion object {
fun emptyResponse(): SavedItemQueryResponse {
- return SavedItemQueryResponse(null, listOf(), listOf())
+ return SavedItemQueryResponse(null, listOf(), listOf(), state = "")
}
}
}
@@ -79,8 +80,8 @@ suspend fun Networker.savedItem(slug: String): SavedItemQueryResponse {
content = article.articleFields.content
)
- return SavedItemQueryResponse(item = savedItem, highlights, labels = savedItemLabels)
+ return SavedItemQueryResponse(item = savedItem, highlights, labels = savedItemLabels, state = article.articleFields.state?.rawValue ?: "")
} catch (e: java.lang.Exception) {
- return SavedItemQueryResponse(item = null, listOf(), labels = listOf())
+ return SavedItemQueryResponse(item = null, listOf(), labels = listOf(), state = "")
}
}
diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt
index 8313adb39..a23ef6b53 100644
--- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt
+++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt
@@ -1,14 +1,13 @@
package app.omnivore.omnivore.ui.reader
-import android.graphics.PointF
import android.os.Bundle
-import android.util.Log
import android.view.View
+import androidx.activity.ComponentActivity
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.activity.compose.setContent
import androidx.activity.viewModels
-import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.verticalScroll
@@ -22,6 +21,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
@@ -33,27 +33,15 @@ import androidx.compose.ui.unit.dp
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
-import app.omnivore.omnivore.R
-import app.omnivore.omnivore.ui.root.RootView
import app.omnivore.omnivore.ui.savedItemViews.SavedItemContextMenu
import app.omnivore.omnivore.ui.theme.OmnivoreTheme
-import com.pspdfkit.annotations.Annotation
-import com.pspdfkit.annotations.HighlightAnnotation
-import com.pspdfkit.configuration.PdfConfiguration
-import com.pspdfkit.configuration.page.PageScrollDirection
-import com.pspdfkit.listeners.DocumentListener
-import com.pspdfkit.listeners.OnPreparePopupToolbarListener
-import com.pspdfkit.ui.PdfFragment
-import com.pspdfkit.ui.PdfThumbnailBar
-import com.pspdfkit.ui.search.PdfSearchViewModular
-import com.pspdfkit.ui.special_mode.controller.TextSelectionController
-import com.pspdfkit.ui.special_mode.manager.TextSelectionManager
+import com.google.accompanist.systemuicontroller.rememberSystemUiController
import dagger.hilt.android.AndroidEntryPoint
import kotlin.math.roundToInt
@AndroidEntryPoint
-class WebReaderLoadingContainerActivity: AppCompatActivity() {
+class WebReaderLoadingContainerActivity: ComponentActivity() {
val viewModel: WebReaderViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
@@ -61,15 +49,32 @@ class WebReaderLoadingContainerActivity: AppCompatActivity() {
val requestID = intent.getStringExtra("SAVED_ITEM_REQUEST_ID") ?: ""
setContent {
+ val systemUiController = rememberSystemUiController()
+ val useDarkIcons = !isSystemInDarkTheme()
+
OmnivoreTheme {
Box(
modifier = Modifier
.fillMaxSize()
.background(color = Color.Black)
+ .systemBarsPadding()
) {
- WebReaderLoadingContainer(requestID = requestID, webReaderViewModel = viewModel)
+ if (viewModel.hasFetchError.value == true) {
+ Text("We were unable to fetch your content.")
+ } else {
+ WebReaderLoadingContainer(requestID = requestID, webReaderViewModel = viewModel)
+ }
}
}
+
+ DisposableEffect(systemUiController, useDarkIcons) {
+ systemUiController.setSystemBarsColor(
+ color = Color.Black,
+ darkIcons = false
+ )
+
+ onDispose {}
+ }
}
// animate the view up when keyboard appears
@@ -194,7 +199,14 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, w
}
}
} else {
- // TODO: add a proper loading view
- Text("Loading...")
+ Column(
+ verticalArrangement = Arrangement.SpaceAround,
+ horizontalAlignment = Alignment.CenterHorizontally,
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(horizontal = 16.dp)
+ ) {
+ Text("Loading...", color = Color.White)
+ }
}
}
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 eca884c8b..4bb3b4fa3 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
@@ -41,30 +41,42 @@ class WebReaderViewModel @Inject constructor(
val annotationLiveData = MutableLiveData(null)
val javascriptActionLoopUUIDLiveData = MutableLiveData(lastJavascriptActionLoopUUID)
val shouldPopViewLiveData = MutableLiveData(false)
+ val hasFetchError = MutableLiveData(false)
var hasTappedExistingHighlight = false
var lastTapCoordinates: TapCoordinates? = null
fun loadItem(slug: String?, requestID: String?) {
- slug?.let { loadItemUsingSlug(it) }
- requestID?.let { loadItemUsingRequestID(it) }
- }
-
- private fun loadItemUsingSlug(slug: String) {
viewModelScope.launch {
- val webReaderParams = loadItemFromServer(slug)
-
- if (webReaderParams != null) {
- Log.d("sync", "data loaded from server")
- webReaderParamsLiveData.postValue(webReaderParams)
- } else {
- loadItemFromDB(slug)
- }
+ slug?.let { loadItemUsingSlug(it) }
+ requestID?.let { loadItemUsingRequestID(it) }
}
}
- private fun loadItemUsingRequestID(requestID: String) {
- // TODO: implement
+ private suspend fun loadItemUsingSlug(slug: String) {
+ val webReaderParams = loadItemFromServer(slug)
+
+ if (webReaderParams != null) {
+ Log.d("sync", "data loaded from server")
+ webReaderParamsLiveData.postValue(webReaderParams)
+ } else {
+ loadItemFromDB(slug)
+ }
+ }
+
+ private suspend fun loadItemUsingRequestID(requestID: String, requestCount: Int = 0) {
+ val webReaderParams = loadItemFromServer(requestID)
+ val isSuccessful = webReaderParams?.articleContent?.contentStatus == "SUCCEEDED"
+
+ if (webReaderParams != null && isSuccessful) {
+ webReaderParamsLiveData.postValue(webReaderParams)
+ } else if (requestCount < 7) {
+ // delay then try again
+ delay(2000L)
+ loadItemUsingRequestID(requestID = requestID, requestCount = requestCount + 1)
+ } else {
+ hasFetchError.postValue(true)
+ }
}
private suspend fun loadItemFromDB(slug: String) {
@@ -96,7 +108,7 @@ class WebReaderViewModel @Inject constructor(
title = article.title,
htmlContent = article.content ?: "",
highlights = articleQueryResult.highlights,
- contentStatus = "SUCCEEDED",
+ contentStatus = articleQueryResult.state,
objectID = "",
labelsJSONString = Gson().toJson(articleQueryResult.labels)
)