From fd49bacfb92ef8d29cbad56419acd016ff40f357 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Sat, 22 Aug 2026 01:00:02 +0000 Subject: In-app YouTube playback, shared ConfirmDialog, hardened link handling - ReaderWebView/LinkReaderScreen/ReaderScreen: tapping a YouTube link inside an article now opens an in-app player (youtube-nocookie.com, JS scoped to just that dialog) instead of handing off to the YouTube app/browser. Falls back to external-open when a confident video ID can't be extracted (playlist/channel links). - A subframe (ad/embed iframe) auto-navigating is now blocked outright instead of being treated like a real link tap -- it fired the exact same callback as a user tap, with no interaction required. - wrapReaderHtml can now show a fallback hero image + date when the feed's own body HTML has no image of its own. - ConfirmDialog: the generic "confirm before doing something irreversible" dialog shape was independently rebuilt from scratch at FeedListScreen's unsubscribe and ArticleListScreen's mark-read-from- here confirmations. Both now share one composable; the latter also chunks its batch update (markReadBatchChunked) so a long-unread feed can't exceed SQLite's per-statement bound-variable limit. --- app/src/main/java/org/terst/feedreader/data/Daos.kt | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'app/src/main/java/org/terst/feedreader/data') diff --git a/app/src/main/java/org/terst/feedreader/data/Daos.kt b/app/src/main/java/org/terst/feedreader/data/Daos.kt index 1f442e9..8a5f50e 100644 --- a/app/src/main/java/org/terst/feedreader/data/Daos.kt +++ b/app/src/main/java/org/terst/feedreader/data/Daos.kt @@ -149,6 +149,15 @@ interface ArticleDao { suspend fun delete(article: ArticleEntity) } +// A single markReadBatch(ids) call builds one query with one bound parameter per id -- +// "mark read from here" can realistically span hundreds of rows in a long-unread feed, +// and SQLite has a hard per-statement limit on bound variables (historically 999 on many +// Android SQLite builds). Chunking well under any realistic limit means this can't throw +// "too many SQL variables" and crash on an otherwise routine bulk mark-read tap. +suspend fun ArticleDao.markReadBatchChunked(ids: List) { + ids.chunked(500).forEach { chunk -> markReadBatch(chunk) } +} + @Dao interface FilterRuleDao { @Query("SELECT * FROM filter_rules ORDER BY createdAt DESC") -- cgit v1.2.3