From 9894b8fb506acd575e644a43878dcdfa9236b533 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 31 Jan 2023 12:20:24 -0800 Subject: [PATCH] load web reader container when tapping read now --- .../Omnivore/app/src/main/AndroidManifest.xml | 5 +- .../omnivore/networking/SavedItemQuery.kt | 9 ++-- .../ui/reader/WebReaderLoadingContainer.kt | 52 ++++++++++++------- .../omnivore/ui/reader/WebReaderViewModel.kt | 44 ++++++++++------ 4 files changed, 68 insertions(+), 42 deletions(-) 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) )