summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/terst/feedreader/ui
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/org/terst/feedreader/ui')
-rw-r--r--app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt56
1 files changed, 45 insertions, 11 deletions
diff --git a/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt b/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
index 165d421..c701a26 100644
--- a/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
+++ b/app/src/main/java/org/terst/feedreader/ui/ReaderScreen.kt
@@ -5,6 +5,7 @@ import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.net.Uri
+import android.util.Log
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -56,6 +57,9 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
+import org.terst.feedreader.readability.ExtractionResult
+import org.terst.feedreader.readability.diagnostic
+import org.terst.feedreader.readability.userMessage
import org.terst.feedreader.data.AppDatabase
import org.terst.feedreader.data.ArticleEntity
import org.terst.feedreader.data.DEFAULT_READER_FONT_SIZE_PX
@@ -194,6 +198,10 @@ private fun ReaderContent(
var readerContent by remember(articleId) { mutableStateOf<String?>(null) }
var isReaderMode by remember(articleId) { mutableStateOf(false) }
var isExtracting by remember(articleId) { mutableStateOf(false) }
+ // Non-null when the last extraction attempt failed. Keyed on articleId like
+ // the rest of the per-article state so a stale error cannot carry over to
+ // the next article.
+ var extractionError by remember(articleId) { mutableStateOf<String?>(null) }
var isSaving by remember(articleId) { mutableStateOf(false) }
var moreMenuExpanded by remember(articleId) { mutableStateOf(false) }
var showBugReportDialog by remember(articleId) { mutableStateOf(false) }
@@ -222,11 +230,24 @@ private fun ReaderContent(
isReaderMode = true
if (readerContent == null) {
isExtracting = true
- val extracted = ReaderExtractor.extract(context, loaded.link)
+ val result = ReaderExtractor.extractResult(context, loaded.link)
isExtracting = false
- extracted?.content?.let {
- readerContent = it
- db.articleDao().setExtractedContent(articleId, it)
+ when (result) {
+ is ExtractionResult.Success -> {
+ val content = result.article.content
+ if (content != null) {
+ readerContent = content
+ db.articleDao().setExtractedContent(articleId, content)
+ }
+ }
+ is ExtractionResult.Failure -> {
+ // Previously this branch did not exist: a failure was
+ // dropped, leaving the raw feed content on screen with
+ // no indication anything had gone wrong.
+ Log.w("ReaderExtractor", "extract failed for ${loaded.link}: ${result.reason.diagnostic()}")
+ extractionError = result.reason.userMessage()
+ snackbarHostState.showSnackbar(result.reason.userMessage())
+ }
}
}
}
@@ -245,12 +266,20 @@ private fun ReaderContent(
if (newEnabled) {
if (readerContent == null) {
isExtracting = true
- val extracted = ReaderExtractor.extract(context, a.link)
+ val result = ReaderExtractor.extractResult(context, a.link)
isExtracting = false
- val content = extracted?.content
- if (content != null) {
- readerContent = content
- db.articleDao().setExtractedContent(articleId, content)
+ when (result) {
+ is ExtractionResult.Success -> {
+ val content = result.article.content
+ if (content != null) {
+ readerContent = content
+ db.articleDao().setExtractedContent(articleId, content)
+ }
+ }
+ is ExtractionResult.Failure -> {
+ Log.w("ReaderExtractor", "extract failed for ${a.link}: ${result.reason.diagnostic()}")
+ extractionError = result.reason.userMessage()
+ }
}
}
isReaderMode = true
@@ -397,7 +426,12 @@ private fun ReaderContent(
val a = currentArticle ?: return@DropdownMenuItem
scope.launch {
isExtracting = true
- val extracted = ReaderExtractor.extract(context, a.link)
+ val reResult = ReaderExtractor.extractResult(context, a.link)
+ val extracted = (reResult as? ExtractionResult.Success)?.article
+ if (reResult is ExtractionResult.Failure) {
+ Log.w("ReaderExtractor", "re-extract failed for ${a.link}: ${reResult.reason.diagnostic()}")
+ extractionError = reResult.reason.userMessage()
+ }
isExtracting = false
val content = extracted?.content
if (content != null) {
@@ -406,7 +440,7 @@ private fun ReaderContent(
db.articleDao().setExtractedContent(a.id, content)
snackbarHostState.showSnackbar("Re-extracted")
} else {
- snackbarHostState.showSnackbar("Re-extraction failed")
+ snackbarHostState.showSnackbar(extractionError ?: "Re-extraction failed")
}
}
}