summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/terst/feedreader/ui/ReaderWebView.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/org/terst/feedreader/ui/ReaderWebView.kt')
-rw-r--r--app/src/main/java/org/terst/feedreader/ui/ReaderWebView.kt24
1 files changed, 21 insertions, 3 deletions
diff --git a/app/src/main/java/org/terst/feedreader/ui/ReaderWebView.kt b/app/src/main/java/org/terst/feedreader/ui/ReaderWebView.kt
index 039255f..9a11dd3 100644
--- a/app/src/main/java/org/terst/feedreader/ui/ReaderWebView.kt
+++ b/app/src/main/java/org/terst/feedreader/ui/ReaderWebView.kt
@@ -79,6 +79,11 @@ private fun extractYouTubeVideoId(uri: Uri): String? {
* back to the external-open behavior when a confident video ID can't be extracted
* (a playlist/channel link, say).
*
+ * onImageTap fires for a tap on an article image (see ImageZoom.kt for how a tap on an <img>
+ * is detected at all with JS off) with the image's own URL -- callers show a full-screen
+ * ImageZoomDialog. Also fires for a link pointing straight at an image file, which used to
+ * send LinkReaderScreen off to run Readability over a JPEG.
+ *
* Pinch-to-zoom adjusts the persisted reader font size, not WebView's own page zoom
* (never enabled here -- setSupportZoom/builtInZoomControls are left at their defaults,
* which is effectively off). A real page zoom would scale layout and images along with
@@ -109,6 +114,7 @@ data class ReaderWebViewCallbacks(
val onOpenLink: (String) -> Unit,
val onLongPressLink: (String) -> Unit = {},
val onYouTubeVideo: (String) -> Unit = {},
+ val onImageTap: (String) -> Unit = {},
val onScrollChanged: (Int) -> Unit = {},
val onPageFinished: (WebView) -> Unit = {},
val currentFontSizePx: () -> Int = { DEFAULT_READER_FONT_SIZE_PX },
@@ -175,7 +181,13 @@ fun newReaderWebView(context: Context, callbacks: ReaderWebViewCallbacks): WebVi
// worked here anyway.
if (!request.isForMainFrame) return true
val url = request.url
- if (isYouTubeWatchUrl(url)) {
+ // Checked before anything else: an image tap is never a navigation we'd want to
+ // follow. Covers both the zoom links wrapReaderHtml adds to the article's own
+ // images and a link the article itself already pointed straight at an image file.
+ val imageUrl = zoomableImageTarget(url.toString())
+ if (imageUrl != null) {
+ callbacks.onImageTap(imageUrl)
+ } else if (isYouTubeWatchUrl(url)) {
val videoId = extractYouTubeVideoId(url)
if (videoId != null) {
callbacks.onYouTubeVideo(videoId)
@@ -195,7 +207,10 @@ fun newReaderWebView(context: Context, callbacks: ReaderWebViewCallbacks): WebVi
else -> null
}
if (url != null) {
- callbacks.onLongPressLink(url)
+ // Every article image now sits inside a zoom link, so a long-press on one
+ // reports that link's internal scheme -- strip it back to the image's own URL
+ // so the actions menu shows, and acts on, something real.
+ callbacks.onLongPressLink(withoutImageZoomScheme(url))
true
} else {
false
@@ -414,6 +429,9 @@ fun wrapReaderHtml(
fontSizePx: Int = DEFAULT_READER_FONT_SIZE_PX
): String {
val processedBody = replaceGenericIframes(replaceYouTubeIframes(bodyContent))
+ // NB: linkifyImagesForZoom runs at the very end (below, over hero + body together), after
+ // the iframe passes -- the YouTube thumbnail one of them synthesizes is an image inside a
+ // link, and the zoom pass has to see it as one to leave its tap-to-play link alone.
// Some feeds' body HTML never embeds an image at all -- the only image they give us
// is a separate RSS media:content/enclosure field (ArticleEntity.imageUrl), which
// otherwise only ever reaches the list-view thumbnail and never the reader itself
@@ -464,6 +482,6 @@ fun wrapReaderHtml(
</style></head>
<body>${if (!title.isNullOrBlank()) "<h1 class=\"article-title\">${escapeHtml(title)}</h1>" else ""}${
if (publishedAt != null) "<p class=\"article-date\">${escapeHtml(absoluteDateText(publishedAt))}</p>" else ""
- }$heroHtml$processedBody</body></html>
+ }${linkifyImagesForZoom(heroHtml + processedBody)}</body></html>
""".trimIndent()
}