load web reader container when tapping read now

This commit is contained in:
Satindar Dhillon 2023-01-31 12:20:24 -08:00
parent 00dfb9386c
commit 9894b8fb50
4 changed files with 68 additions and 42 deletions

View file

@ -54,8 +54,9 @@
<activity
android:name=".ui.reader.WebReaderLoadingContainerActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:windowSoftInputMode="adjustNothing" />
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Omnivore"/>
</application>
</manifest>

View file

@ -8,11 +8,12 @@ import app.omnivore.omnivore.persistence.entities.Highlight
data class SavedItemQueryResponse(
val item: SavedItem?,
val highlights: List<Highlight>,
val labels: List<SavedItemLabel>
val labels: List<SavedItemLabel>,
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 = "")
}
}

View file

@ -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)
}
}
}

View file

@ -41,30 +41,42 @@ class WebReaderViewModel @Inject constructor(
val annotationLiveData = MutableLiveData<String?>(null)
val javascriptActionLoopUUIDLiveData = MutableLiveData(lastJavascriptActionLoopUUID)
val shouldPopViewLiveData = MutableLiveData<Boolean>(false)
val hasFetchError = MutableLiveData<Boolean>(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)
)