mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
load web reader container when tapping read now
This commit is contained in:
parent
00dfb9386c
commit
9894b8fb50
4 changed files with 68 additions and 42 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 = "")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in a new issue