Releases: k1717/Readwide
Releases · k1717/Readwide
Readwide v1.0.10
Release scope
- Android metadata is
versionCode 10010andversionName "1.0.10". It keeps thecom.readwide.managerapplicationId and thereadwiderelease signing key, so 1.0.10 updates in place over 1.0.9, 1.0.8, 1.0.7, and 1.0.6. - This release speeds up image page-flipping inside solid/sequential comic archives — 7z/CB7 and the TAR family (TAR/CBT and its gzip/bzip2/xz/lzma/compress variants) — fixes a problem where the previously shown image could stay on screen while paging through them, and smooths PDF page-flipping during rapid taps. The changes are internal to the archive image viewer and the PDF reader and add no new dependency.
Images - faster page-flipping in solid/sequential archives
- Paging through images inside a solid 7z (
.7z/.cb7) or a TAR-family archive (.tar/.cbtand its compressed variants) is faster, and the previous image no longer lingers while the next one loads. These formats have no cheap random access to a single entry: the viewer used to re-open the archive and re-decompress its shared stream from the start up to the requested image for every page, which is work proportional to the image's position and made each forward step progressively slower on a large archive. The viewer now keeps one forward reader open for the whole viewing session, decodes each image once, and caches every image it passes, so flipping forward decodes just the next image and pages already seen are served from cache. - The first page of a large solid archive now appears without waiting for the whole archive to be decompressed first; only the images up to the opened one are extracted. Paging back to a page that the cache size cap had to evict re-reads just that one page rather than re-reading the rest of the archive, so backward paging in a large 7z/CB7 or TAR/CBT stays smooth too.
- Neighbour prefetch for these archives now flows through the same forward reader, so reading ahead extends only as far as you read rather than decompressing the whole archive in the background. Extraction still falls back to the previous whole-archive method whenever the forward reader cannot serve an image, so the change can only improve speed, never reduce what opens.
- ZIP/CBZ, ALZ, and EGG already support direct per-entry access and are unchanged. RAR/CBR now flows through the same forward reader, backed by its libarchive engine, which is itself a strictly forward reader: opening a large RAR/CBR no longer decompresses the whole archive before the first image appears, paging forward decodes each image once, and reading ahead extends only as far as you read. This covers ordinary RAR v4/v5 comics; anything the libarchive engine cannot read on its own (for example some encrypted RAR) automatically falls back to the previous whole-archive extraction, so the change can only improve speed, never reduce what opens. Paging back to a page that the cache size cap had to evict re-extracts just that one page rather than the whole archive.
Reading - smoother PDF page-flipping
- Flipping through pages in the PDF reader with rapid taps is smoother. In single-page mode the reader pre-renders neighbouring pages into a cache so a turn shows instantly; it now buffers further ahead in the direction you are reading instead of splitting the same budget evenly between forward and backward, so quick forward (or backward) tapping stays ahead of the on-demand render more often. Page rendering, zoom, pan, and continuous-scroll mode are otherwise unchanged.
Readwide v1.0.9
Release scope
- Android metadata is
versionCode 10009andversionName "1.0.9". It keeps thecom.readwide.managerapplicationId and thereadwiderelease signing key, so 1.0.9 updates in place over 1.0.8, 1.0.7, and 1.0.6. - This release adds in-document text find to the PDF reader for digital (text-based) PDFs, speeds up image page-flipping inside large archives, and reworks the recent-files list: it now searches your reading history (with a result banner), keeps your full history and shows up to 5000 entries, combines with the file-type filters, and supports swipe-to-remove. It also matches the archive preview's row styling to the main file list. It adds one new runtime dependency, PdfBox-Android (Apache-2.0), used only for PDF text extraction; the recent-list, archive-styling, and archive-image changes are internal and add no dependency.
Reading - PDF in-document find
- Added a Find action to the PDF reader that searches for text inside the open PDF. Matches are highlighted on the page (the highlights track zoom and pan), previous/next step through them, and a current/total match count is shown. The find dialog matches the search dialog used by the other viewers.
- Find covers the whole document, not just the current page. Previous/next move through matches across pages and jump to the page where each match is.
- When you move to a match, the page shifts as needed so the current match stays visible above the find dialog instead of being hidden behind it.
- This works on digital (text-based) PDFs only. Scanned or image-only PDFs have no text layer to extract, so they are not searched; OCR is intentionally not included.
- PDF pages continue to be rendered by the platform
PdfRenderer. The new dependency is used only to read the text and its on-page positions, not to render pages, so rendering, zoom, pan, and the single-page/continuous modes are unchanged.
Images - faster page-flipping in large archives
- Paging to the next or previous image inside an archive (a ZIP/CBZ comic) is faster, especially on the first pass through a large archive such as a comic with around two thousand images. The reader now caches each archive's parsed entry index, so showing each image is a direct lookup instead of re-reading the whole archive directory every time. This applies to both unencrypted and password-protected archives; for an encrypted archive the password is used only during extraction and is not retained.
Files - recent list search and management
- The search box on the home screen now searches your recently-read files (your reading history) as you type, instead of walking device storage. Matches come from your full history, and a banner under the Recently Read header shows the query and how many recent files match. Searching while browsing a folder still searches storage as before.
- The recent list keeps your entire reading history and shows up to 5000 entries (previously a few hundred), so older reads stay listed and remain reachable through search.
- The file-type filter chips (All, General, TXT, Archive, PDF, EPUB, Word, Image) now combine with the recent search: the chip narrows the list first, then the search runs within the filtered set. Changing the chip while searching re-applies the search on top of the new filter.
- Swipe a recent row to the left to remove it from the list. The card follows your finger and is removed once dragged past about 45% of its width; a shorter swipe slides back without removing. Removing a row also clears that file's saved reading position.
- Back now clears an active recent search first (restoring the list and hiding the banner) before dropping any active file-type filter or leaving the home screen.
Archive viewer
- File rows inside the archive (ZIP/CBZ) preview now use the same font sizes and spacing as the main file list, so the two lists look consistent.
Dependencies
- Added
com.tom-roush:pdfbox-android:2.0.27.0(Apache-2.0, pure Java) for PDF text extraction. A proguard/R8 rule ignores its optional, unbundled JPEG2000 (JP2) decoder; JPX images are unaffected because find only uses extracted text.
Readwide v1.0.8
Release scope
- Android metadata is
versionCode 10008andversionName "1.0.8". This is a hotfix over 1.0.7 and keeps thecom.readwide.managerapplicationId and thereadwiderelease signing key, so 1.0.8 updates in place over 1.0.7 and 1.0.6.
Fixes
- Fixed a regression where a large text or PDF document could suddenly turn blank while it was being read. Under system memory pressure the reader released its on-screen text even while the app was still in the foreground; because that content is only restored when you return to the app (which does not happen while you are already reading), the page went blank at random and the reading position was lost. The reader now releases that memory only when the app is actually in the background.
Readwide v1.0.7
Release scope
- Android metadata is
versionCode 10007andversionName "1.0.7". - Keeps the
com.readwide.managerapplicationId and thereadwiderelease signing key introduced in 1.0.6, so 1.0.7 installs in place over 1.0.6 as a normal update. Updating from 1.0.4/1.0.5 (previous key) still requires uninstalling the old version first, then migrating via the in-app JSON backup export/import. - This release centers on an optional blank-line collapsing display setting, more reliable text reading-position restore, improved large-file bookmark page accuracy, recent-list scroll preservation, refined find-in-page behavior when its options change, and a find-in-page crash fix.
Reading — collapse repeated blank lines
- Added an optional Collapse repeated blank lines display setting for the text reader (Display settings, under the large-TXT options). When enabled, any run of two or more consecutive blank lines is shown as a single blank line; a lone blank line is left as-is and the original file is never modified. It applies to all text files the reader opens (TXT, log, CSV, and similar), both small and large, treats whitespace-only lines as blank, and is applied consistently to the page model, large-file partition/exact-page index, and in-text search so page numbers, bookmarks, and search positions stay aligned. Toggling it reloads the open file, and the collapse state is folded into the page-layout signature so the page model is recomputed instead of reusing a stale one. Bookmarks from before this version stay compatible while the option is off. Default off.
Reading — position restore
- Reopening a text file restores the reading position more reliably. The saved position now carries short before/after text anchors and a page-layout signature, so the reader re-finds the original spot even when the page layout would otherwise differ (for example after a display-setting change), instead of falling back to an approximate page. The restored position also stays correct after the system recreates the reader and when scrolling back through a large file.
- If a text file changed on disk since it was last opened, reopening it reloads the current contents instead of restoring the earlier cached view and position.
- Large-file bookmark jumps now prefer surrounding-text anchors when resolving the destination, improving landing accuracy after a layout or display change (for example a different font size or margin).
Settings and display rules
- Settings are reorganized into two screens. Display and reading-layout options (theme, reading theme, text layout, EPUB layout) now live in a dedicated Display settings screen reached from Settings, while general app settings (behavior, button order, security, backup) stay on the main Settings screen. This keeps display options together and out of the general list; the large-TXT options, including Collapse repeated blank lines, are in the Display settings screen.
- Edit actual TXT file: enabled TXT display rules can now be permanently applied to the current text file from the text reader's More menu. You choose between fixing the original file in place or writing a separate
_editedcopy, and the flow keeps the rule-order, overwrite, and large-file warnings followed by a final confirmation. Display-only rules still never modify the file; this is the explicit opt-in that writes changes. It moved here from the TXT layout settings so it always runs with the currently open file in context.
Files — recent list
- Returning to the app after opening a file from the recent list no longer forces the list back to the top. The list keeps its scroll position near the row the file was opened from.
Fixes
- Fixed a crash that could occur when an invalid regular expression was the active find-in-page query; an invalid pattern is now treated as no match instead of failing during drawing.
- Changing the find-in-page options (case-sensitive, whole-word, or regular expression) now restarts the search under the new options, so the next match is found with the new settings instead of continuing from the previous result.
- When the system recreates the reader from memory (for example under memory pressure), large-file exact page numbering is rebuilt for the current layout instead of remaining on the initial estimate.
Readwide v1.0.6
Release scope
- Android metadata is
versionCode 10006andversionName "1.0.6". - Keeps the
com.readwide.managerapplicationId from 1.0.4 but changes the release signing key, so 1.0.6 does not install over an existing 1.0.4/1.0.5 (which used the previous key); uninstall the old version first, then migrate via the in-app JSON backup export/import. - This release centers on file-list performance, reading-progress for image archives, per-type file icons, folder auto-refresh, image-viewer paging smoothness, text-to-speech refinements, and several browsing fixes.
Final changes included in this release
Performance — file listing and sorting
- Folder listing and sorting no longer issue a MediaStore (ContentResolver) query per file or per scrolled row. Date sorting previously queried MediaStore for each image/video, and each visible row queried again while scrolling, which was slow in large media folders.
- Folders now sort and display immediately using filesystem timestamps (the newer of last-modified and creation time). When a date sort is active, a background pass batches MediaStore date lookups and re-sorts only if the order actually changes; folder loads and non-date sorts do no MediaStore work at all.
- Large folders such as Downloads open noticeably faster as a result, with the same set of files shown.
Performance — file search
- Removed the 5,000-item cap on file search. The search walk now streams results into the list incrementally (only the new items per step), then applies the final sorted order when the walk finishes, so very large result sets are no longer truncated.
Performance — image and PDF caches
- The image viewer now prefetches three pages in each direction instead of two, and its decoded-bitmap cache budget was raised (up to 128 MB, scaled to a fraction of app heap). Rapid continuous paging is less likely to outrun the prefetch window and stall on a decode.
- The PDF viewer's single-page and continuous-mode bitmap caches were enlarged (cap raised to 96 MB each, still scaled to app heap), for smoother paging and scrolling on large documents.
Reading progress — image archives
- Image archives opened in the comic/image viewer (and folder image sequences) now record a reading position and show a progress percent in the recent list, the same as PDF and EPUB. Progress is keyed on the archive so the archive's recent entry gets the badge.
- Progress is saved with a short debounce as you turn pages (so fast paging does not write to disk every page) and saved immediately when you leave the viewer.
Files — per-type icons
- File rows now show a Material icon chosen by type: PDF, EPUB, document (Word/HWP), archive, image, video, audio, app package (APK), or a generic file icon as the fallback. Icons are tinted with the current theme color. Folder icons are unchanged.
Files — long-name display
- Long file names now keep their extension and the end of the name visible. When a name does not fit, it is shortened in the middle as "start…" so the file type and trailing context (for example a resolution or part number) remain readable across two lines. Names that fit are shown in full.
- The truncation is computed during layout so the final text appears in one pass, without the brief flash that a deferred rewrite produced when re-entering the recent list.
Files — list layout
- Reworked the recent/file list row: two-line file names, slightly smaller and tighter secondary text (type, size, date), and more consistent row spacing.
Files — search result location
- Search results now display each file's location relative to the searched folder instead of the full absolute path that repeated the search root on every row. A file directly in the searched folder shows no location line at all; a file in a subfolder shows ".../subfolder" so it reads as a path below the searched folder rather than a bare folder name.
- An all-storage search (which spans multiple roots such as internal storage, Downloads, and SD cards) keeps the matched storage's folder name as a prefix, so results from different storages remain distinguishable. The deepest matching root is used when roots are nested.
Files — image formats
- The image filter chip and the image viewer now also recognize
.jfif(a JPEG container),.wbmp, and.dng. These were chosen because Android's bitmap decoder can render them, so they both appear under the Image filter and open in the viewer (including when found inside an archive). Formats Android cannot decode by default (such as TIFF and ICO) were intentionally not added.
Files — recent list
- The recent list now shows up to 300 recently opened files, so more of your reading history stays visible on the home screen. Entries whose underlying file no longer exists are skipped.
Files — search and filter loading
- While a search or file-type filter runs, the file list shows a single loading spinner. The spinner is new in this release; earlier versions showed a "loading" text label, and the spinner now takes its place. The empty-state message appears only once a finished search returns no results.
Folders — refresh
- The visible folder is re-read when the app regains window focus, picking up downloads and other external changes that the filesystem watcher can miss on FUSE/MediaStore-routed storage. The re-read keeps scroll position and only happens when the folder's on-disk signature actually changed.
- Pull down on the file list to refresh the current folder (or re-run the active search) manually.
Text-to-speech — resume on reopen
- When a read-aloud session is interrupted — leaving the app, the process being killed in the background, or pausing and navigating away — reopening Readwide shows a prompt on the main screen offering to resume that book. Continuing reopens the file at its saved position, restores the sleep-timer value that was active when playback stopped, and starts reading automatically. "Later" (or dismissing the prompt) clears the saved session, and finishing a book to the end also clears it so it does not prompt again.
- Resume is page-level: reopening restores the saved reading page and TTS begins from there. Because Android's speech engine has no true mid-sentence pause and the exact paused sentence is not persisted across process death, playback resumes from the start of that page rather than mid-sentence.
Text-to-speech — speech cleanup
- Runs of punctuation are no longer read aloud. Ellipses, sequences of two or more periods, and underscores are collapsed to a pause instead of being spoken, and a semicolon is spoken as a short, comma-like pause. Single sentence-ending periods are unaffected.
Security & stability
- External open path: files handed to Readwide through
ACTION_VIEW/BROWSABLE(from a browser, messenger, file manager, or document provider) are copied into an app-privateopened_filescache before rendering. The copy sanitizes the provider-supplied display name, verifies the cached path stays inside the cache directory, keeps each source URI in its own subdirectory, enforces a 2 GB per-file copy limit, and prunes the cache before and after the copy (preserving the just-opened file). A failed, aborted, or over-limit copy deletes its partial file, and providerquery/getTypeexceptions are caught so a misbehaving provider cannot crash the open. - Backup/settings import caps the JSON read at 256 MB and rejects (rather than truncates) anything larger.
- App lock: launching the lock screen now returns before the home/recent UI is built, so it is not prepared or briefly shown behind the lock; the main UI is set up after a successful unlock.
- Search and current-folder filtering build their result rows in a generation-aware, cancellable pass and stop promptly when a newer search or folder change supersedes them.
- Document text entries (EPUB/Word/HWPX), in-document resources, and EPUB chapters each have a read-size cap (32 MB / 64 MB / 32 MB) so a crafted file cannot exhaust memory during rendering.
Fixes
- Starting a folder navigation while a file search was still running no longer leaves a stale search screen, stutter, or brief freeze. Navigation now cancels the in-progress search walk cleanly so it stops consuming the search thread.
- Tapping the navigation drawer's Recent shortcut while a large folder was open no longer delays the drawer from closing. Entering the recent/home view from the drawer now uses the fast state-save path instead of a synchronous folder rescan that could stall the close animation.
- In fixed-layout EPUBs (including image-based books and comics), a double-tap on the left or right side now turns the page the same way a single side tap does, instead of zooming. Double-tapping the center still zooms, and reflowable EPUBs and other documents are unchanged.
Internal
- Background work executors for file search, folder operations, and document loading are guarded so late tasks submitted around viewer teardown do not throw.
Readwide v1.0.5
Release scope
- Android metadata is
versionCode 10005andversionName "1.0.5". - Keeps the
com.readwide.managerapplicationId from 1.0.4, so 1.0.5 installs as an in-place update over 1.0.4 when signed with the same key. - This release centers on a text-to-speech overhaul, a folder-aware multi-select delete confirmation, two PDF mode-switch crash fixes, a text-rule performance fix, and internal code cleanup.
Final changes included in this release
Text-to-speech — sleep timer
- Added a sleep timer with Off / 15 / 30 / 45 / 60-minute presets and a custom-minutes entry (0–600). An optional "finish the current sentence" setting lets playback complete the sentence in progress before stopping.
- The timer measures playback time only: time spent paused does not count toward it. When it expires, playback stops.
- The timer can be changed mid-playback and takes effect immediately. The setting is shown as "Timer" in the UI.
Text-to-speech — pause, resume, and session
- Added real pause and resume. Pausing stops speech but keeps the session active and remembers the current sentence; resuming continues from that sentence rather than restarting from a saved character position. Because the Android speech engine cannot pause mid-sentence, resume replays from the start of the interrupted sentence.
- A paused session now persists its position when you leave the app, so playback can resume where it left off on return.
Text-to-speech — floating control card
- Added a floating control card over the text reader (TXT) with play/pause and stop buttons. It appears while TTS is active, reflects the paused state on its play/pause button, and can be dragged anywhere on screen; a tap on either button is distinguished from a drag by the touch slop.
- The card complements, and stays in sync with, the existing foreground-service notification, lock-screen controls, and Bluetooth/media-button controls.
Text-to-speech — audio policy
- TTS keeps reading when you scroll or move within the page; manual navigation no longer stops playback. As a result the reading position and the visible position can diverge.
- Audio focus is now requested for speech playback. A transient focus loss (for example a phone call) pauses playback and auto-resumes when focus returns; a permanent loss (another app taking over media) stops playback.
- Unplugging headphones (audio becoming noisy) now pauses playback instead of stopping it, so it can be resumed after reconnecting.
Text-to-speech — translations
- All new text-to-speech strings (sleep-timer presets and labels, pause/resume, and the folder-warning message) were translated across the bundled locales: Arabic, German, Greek, Spanish, French, Hindi, Indonesian, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Russian, Swedish, Thai, Turkish, Ukrainian, Vietnamese, Simplified Chinese, and Traditional Chinese, with English as the fallback.
Files
- The multi-select delete confirmation now appends a warning when the selection includes one or more folders, stating that all of their contents will be deleted too. The warning is shown only when at least one folder is selected. All real file and folder deletions in the app continue to pass through a confirmation dialog; the single-file action-sheet delete and the image-viewer delete are unchanged.
Fixes
- Fixed a PDF crash when switching from a zoomed-in vertical (continuous) view into horizontal (single-page) mode. The single-page render reused the carried-over zoom factor and could allocate an oversized bitmap; single-page mode now resets to fit and evicts the stale single-page cache on entry.
- Fixed a second PDF crash when switching display modes, where the matrix page view could draw a bitmap that the activity had already recycled. The view now detaches its bitmap references before any recycle and skips drawing a null or recycled bitmap.
- Fixed text-to-speech sentence segmentation for short pages. A page shorter than the internal segment size was returned as a single segment, so pause/resume rewound to the start of the page; segmentation now always splits by sentence terminator, so resume continues from the correct sentence.
- Made the navigation drawer's Recent shortcut respond immediately. Building the recent list scanned saved reading states on the main thread (checking file existence and cleaning up stale or image-only entries) before the list appeared; the scan and cleanup now run on a background thread.
Performance
- Text display rules compile their regular expressions once per file load instead of once per line. When a large text file is read line by line with active regex rules, each rule's pattern was recompiled for every line; rules are now pre-compiled and reused, so compilation scales with the rule count rather than the line count. Invalid user regexes are skipped at compile time, matching the previous fail-safe behavior, and files with no rules or only literal rules are unaffected.
Internal
- Removed dead code (an unused stop-on-navigation path left over after TTS stopped halting on scroll) and an unused, fully duplicated color utility class.
- Consolidated duplicated helpers into shared utilities: CSS quoting/coloring, same-or-child path checks, and an empty-to-null string helper used by the document render builders.
- Collapsed a redundant tap-zone action overload into a single method.
- Split the text-to-speech controller's sleep-timer dialog and its stateless dialog view builders into their own classes, reducing the controller's size without changing behavior.
Readwide v1.0.4
Release scope
- Android metadata is
versionCode 10004andversionName "1.0.4". - Readwide moves to a new Android applicationId,
com.readwide.manager, completing the rename away from the earlier TextView Reader package identity. - Because the application ID changed, 1.0.4 is installed as a separate app rather than an in-place update over older TextView Reader/Readwide builds.
- This release keeps the 1.0.3 document-fidelity cycle and focuses on package identity cleanup, reader-search consistency, document-viewer search behavior, and translated UI clipping fixes.
Final changes included in this upload
Package identity
- Renamed the Android applicationId and source package from
com.textview.readertocom.readwide.manager, including all package declarations, the FileProvider authority (derived from${applicationId}), layout custom-view references, ProGuard keep rules, fixture report scripts, F-Droid metadata, and release materials. - Existing users are not auto-updated to 1.0.4 because the package identity differs; bookmarks, reading positions, themes, and settings transfer through the in-app JSON backup export/import, which is independent of package name and signing key.
PDF viewer
- Reworked single-page (horizontal) PDF zoom onto a single transform. Double-tap zoom, pinch-to-zoom, panning, and fling are now driven by one image matrix instead of a scroll-view stack with a separately rendered bitmap per zoom level. This removes the position jump on double-tap, the flicker when a zoom settled, and the wrong-focus pinch behavior that the previous approach was prone to; the point you tap or pinch stays under your finger. When a zoom or pan settles, the currently visible region is re-rendered at full resolution so text sharpens in place, while memory stays bounded because only the visible region is rendered at high resolution rather than the whole page at the zoom factor. Page navigation works alongside the matrix zoom: horizontal swipes turn the page, and the left/right tap zones turn the page while the center zone toggles the toolbar, following the same tap-zone settings as the other viewers. Double-tap zoom is suppressed inside the page-turn zones so a quick double tap there turns pages instead of zooming, and page-turn taps fire immediately (without waiting out the double-tap timeout) so tapping is as responsive as swiping. (Vertical continuous mode keeps the existing zoom behavior for now.)
- Fixed single-page PDF fit when toggling the PDF toolbar on tablets. The visible toolbar now reserves its full overlay height before the page is fitted, stale pre-reserve renders are cancelled, and the cache key includes viewport height so returning from toolbar-off mode cannot leave an oversized page under the toolbar. Toolbar-off mode releases the reserve and immediately refits the current bitmap into the larger viewport before the sharper rerender completes.
- Made double-tap zoom in vertical (continuous) mode more responsive. Zooming re-renders every visible page at the new scale on the single render thread; the per-page pixel cap is now lowered while zoomed so each of those renders is roughly half the work, which reduces the stutter.
- Balanced horizontal (single-page) prefetch equally in both directions (two pages ahead and two behind) so paging backward is just as fast as paging forward. The page cache budget holds several full pages (fit-size pages are ~13MB each), and prefetch is backed by a second, independent PDF renderer so it fills without blocking the page you're viewing.
- Restructured horizontal (single-page) neighbor prefetch to render in true parallel with the page you're viewing. A second, independent PDF renderer over the same file now backs prefetch, with its own lock, so prerendering the next pages no longer queues behind (or blocks) the on-demand render of the page you just turned to. This makes normal and moderate-speed paging noticeably smoother; the page you turn to is far more often already rendered.
- Improved horizontal (single-page) rapid-tap paging by prefetching deeper in the direction of travel (two pages ahead plus one behind) and starting the prefetch almost immediately instead of only after paging pauses.
- Fixed the PDF viewer closing back to the main screen when double-tapping to zoom. Zoomed pages produce large bitmaps, and prefetching/caching several of them at the fit-zoom assumptions could exhaust memory and have the system silently kill the activity. Neighbor prefetch is now skipped while zoomed, cached neighbor bitmaps are released on zoom-in, and zoomed renders use a smaller pixel cap, so a zoom no longer risks running out of memory.
- Roughly doubled PDF page render speed by lowering the supersample factor from 2.0 to 1.4. Pages are still rendered above screen density (1.4×) and downscaled for display, so text stays sharp, but the render now processes about half the pixels. This speeds up both on-demand turns and neighbor prerender.
- Fixed the initial lag when rapidly tapping through pages in horizontal (single-page) mode. Each tap queued a full page render on the single render thread, and renders for pages already skipped past were still completed before the page you stopped on, so the first several taps felt unresponsive until the backlog cleared. Renders for superseded pages are now abandoned before doing the work, so the page you land on renders immediately. Neighbor prerender was also made to begin during brief pauses between taps rather than only after paging fully stops.
- Fixed the page counter bouncing around the target page during rapid taps in vertical (continuous) mode before settling. Each page turn scheduled a delayed "settle" timer that was never cancelled, so on rapid taps several stale timers fired in order and briefly reverted the current page to earlier targets. Pending scroll/settle work is now cancelled before scheduling the next, so only the latest target is applied.
- Fixed the page counter showing the previous page after a long jump with the page slider in continuous mode. The target page is now re-asserted once the scroll settles, so a late scroll callback can no longer overwrite it with an intermediate page.
- Fixed tapping a toolbar icon hiding the toolbar while leaving its popup on screen. A tap on a visible toolbar/app-bar no longer also toggles the viewer chrome underneath it.
- Improved PDF page sharpness by rendering pages above 1:1 screen density (supersampling) and downscaling them for display, which noticeably crispens text. The page is displayed at its fit width with the aspect ratio preserved, so it is never stretched (including when the toolbar is hidden and the viewport grows taller). Per-page pixel budgets still bound memory, so large pages are capped automatically.
- Fixed the PDF viewer hiding the lower part of the page behind the bottom toolbar when chrome is visible. The floating toolbar's height is now reserved at the bottom of the page viewport while it is shown (and released when hidden), so a full PDF page sits between the top title area and the toolbar. Applies to both single-page and continuous-scroll modes and on first load.
- Fixed the PDF page being partly hidden under the 3-button navigation bar in landscape. The page area is now inset away from the side nav bar, and the fit-to-width calculation excludes that inset, so the page fits within the visible area (between the toolbars) when the toolbar is shown.
EPUB viewer
- Fixed fixed-layout EPUBs (pages that declare a fixed pixel size, e.g. 1366×768) not fitting the screen. The viewer now relies on the WebView's wide-viewport/overview scaling to fit the declared viewport to the screen width, and only neutralizes page margins and matches the page box to the viewport width to prevent horizontal scroll; it no longer imposes its own fixed body height or flex-centering, which had re-anchored full-page image spreads to the top. The book's own layout (full-height images, centered covers) is preserved.
Image viewer
- Removed the per-tap delay on image page turns. Page-turn taps in the side zones are now delivered the moment the finger lifts, instead of waiting on the gesture detector's double-tap confirmation (~300 ms). Previously a fast second or third tap got folded into a double-tap sequence and was held back, which made rapid tapping feel laggy; now each tap registers immediately. Swipes and double-tap-to-zoom on the image are unaffected.
- Made image page turns much faster, especially on rapid repeated taps. Decoded preview bitmaps are now kept in a memory-budgeted cache, and adjacent pages (two in each direction) are pre-decoded on a small parallel decode pool that runs concurrently with archive extraction instead of queuing behind it, so turning to an already-prepared page is instant. The cache owns its bitmaps and only recycles them on eviction, so a displayed or cached page is never recycled out from under the view.
- Raised the preview decode budget from 12 to 16 megapixels, so higher-resolution images are shown at full detail before any downsampling. Larger images are still downsampled to fit the screen and memory, with the existing out-of-memory fallback intact.
File list and sorting
- Sped up file-list sorting (and refresh) by computing each entry's sort key once instead of repeatedly inside the comparator. Name, directory flag, and the active date/size/type key are extracted a single time per file, which removes the repeated
File.getName()/isDirectory()/length()filesystem and parsing calls that previously ran on the order of n·log n times during a sort. Sort order is unchanged. - Reduced redundant filesystem calls while listing a folder (the path taken when opening a folder or a folder shortcut, e.g. Downloads): each entry's name and directory flag are now read once per item in the scan loop instead of two to three times. This speeds up the initial folder load for dire...
Readwide v1.0.3
Release scope
- Android metadata is
versionCode 10003andversionName "1.0.3". - Keeps the existing Android
applicationId/ package name so Readwide remains update-compatible with earlier compatible builds when signed with the same key. - Starts the document viewer fidelity cycle for DOCX, HWPX, and HWP.
- The target for this cycle is L3 content-fidelity HTML preview: document structure, inline styling, tables, and images where verified.
- Exact MS Word/Hancom pagination, exact font metrics, editing/saving, and complete floating-object placement are explicit non-goals.
Final changes included in this upload
- Existing text-first and semantic WebView document readers remain the fallback path, and a shared RenderedDocument / FixedHtmlRenderer scaffold was added before changing real document conversion behavior. The scaffold supports page containers, paragraph/run styles, tables, images, unsupported placeholders, and text anchors.
- DOCX now has a conservative bridge into the shared RenderedDocument model for paragraphs, run styling, basic tables, inline images, and page margins, with fallback to the previous Word semantic HTML path if conversion fails.
- DOCX
numbering.xmllists now enter the rendered bridge as visible ordered/bullet markers with level-aware counters and indentation; malformed or missing numbering definitions still fall back to ordinary paragraphs. - DOCX tables in the rendered bridge now preserve basic table width, grid column proportions, cell width hints, vertical merge row spans, table/cell border colors, and cell shading where those properties are directly present in the OOXML.
- DOCX
styles.xmlinheritance now feeds the rendered bridge for document defaults, paragraph styles, character styles, based-on style chains, and direct override precedence, improving heading/body/emphasis fidelity without changing the fallback path. - DOCX images in the rendered bridge now read WordprocessingML/DrawingML extent metadata, emit width/height hints, and mark floating
wp:anchordrawings as block-downgraded images instead of pretending to preserve exact floating layout. - DOCX footnotes and endnotes in the rendered bridge are now preserved at the end of the rendered document, with superscript reference links in the body and backlink targets in the note section.
- DOCX headers and footers in the rendered bridge are now preserved as reading-order sections before and after the body, including paragraph/table content and local header/footer image relationships where directly referenced.
- DOCX Symbol/Wingdings bullet markers are normalized to standard Unicode bullets in the rendered document bridge, and list paragraphs no longer double-apply Word hanging indents on top of the flex marker layout.
- DOCX rendered tables now clamp cell overflow and use stronger word wrapping so narrow columns cannot draw text over neighboring cells on phone-width pages, while long first-column labels stay readable without introducing horizontal scrolling and cells prefer word-level wrapping over arbitrary letter breaks.
- DOCX split text runs are coalesced before rendering, and DOCX/Word lecture-note formulas now render inline and conservative
$$...$$display-math fragments, including fractions, square roots, superscripts/subscripts, Greek letters, and symbols such as\partial. Covered examples include$2Dt$,$L/W$,$\nu_0$,$\rho_{S}$, and$e^{-\text{barrier}/kT}$, including expressions split across runs by spell/grammar markers. Lone currency amounts such as$200are left as plain text. - HWP and HWPX rendered output now preserves partially-ruled table borders per edge (for example header bands with only top and bottom rules), paragraph-head bullet markers, authored cell heights so empty layout cells do not collapse, character size/bold/italic/color, paragraph alignment, and horizontal rules.
- RAR5 AES visible-header multi-volume handling was tightened against real encrypted multi-volume source fixtures. Covered RAR5 v5.0 compressed/solid split entries now assemble their packed stream across volumes, tolerate continuation encryption-flag differences when the actual AES material matches, and avoid plaintext CRC checks only when a RAR5 password-check value is present.
- Password-protected archive image preview caches now require current-session verification before a ready marker is trusted. Sensitive preview files that were produced by an older failed password/decode attempt are deleted and regenerated, preventing stale black/invalid images from being reused after the RAR5 visible-header multi-volume decoder succeeds.
- RAR5 encrypted/solid/split preview single-entry extraction now prefers the first-party ordered decoder instead of a backend call that may start from a later volume or an unprimed solid member. This targets archive preview document opens where whole extraction succeeds but preview opens the wrong or invalid cached file. RAR5 visible-header listing also prefers first-party header parsing before libarchive to reduce password-preview startup delay.
- Archive preview/list loading now uses the same centered loading window as archive entry preview extraction, removing the leftover tiny inline spinner from the archive browser.
- EPUB page transition animation settings were removed because WebView document pages now snap without slide/fade animation, and the compact top page counter shown while EPUB/Markdown/document/PDF toolbars are hidden now forces a 48dp strip plus the status-bar inset and nudges the page-number glyphs downward for better balance.
- The selectable UI languages were brought to full coverage: newly added archive support-boundary messages, bookmark "file missing" notices, and tap/image paging labels are now translated across all bundled locales (Arabic, German, Greek, Spanish, French, Hindi, Indonesian, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Russian, Swedish, Thai, Turkish, Ukrainian, Vietnamese, Simplified Chinese, and Traditional Chinese), with English remaining the fallback for any future untranslated string.
Readwide v1.0.2
Release scope
- Android metadata is
versionCode 10002andversionName "1.0.2". - Keeps the existing Android
applicationId/ package name so Readwide remains update-compatible with earlier compatible builds when signed with the same key. - Focuses on new document reader formats, rendered-document viewer polish, scoped archive decoding boundaries, and release documentation for the 1.0.2 line.
Final changes included in this upload
.mdand.markdownfiles now open in a dedicated themed Markdown WebView reader. Markdown headings, emphasis, lists, links, code blocks, blockquotes, and tables are rendered as HTML while ordinary.txtfiles stay on the exact TXT reader model.- HWP/HWPX files now have text-first read-only support through Apache-2.0 dogfoot libraries:
hwplibfor HWP 5.x andhwpxlibfor HWPX. Hancom-compatible layout rendering, editing/writing, password/encrypted HWP, original page-count parity, and embedded object rendering are not claimed. - The visible
Wordfilter remains compact while grouping OOXML Word files, HWP/HWPX, and recognized legacy.docfiles. Legacy binary.docis recognized for classification/filtering but is still reported as unsupported for rendering. - Markdown, EPUB, Word, HWP/HWPX, and PDF bookmark rows now use the same rendered-document display model: content/text anchors are shown as the primary label where available, while page/position/date metadata is shown separately.
- WebView-backed document viewer chrome was adjusted so toolbar toggles do not move the rendered WebView body. Compact top page labels, bottom toolbar shape, slider presentation, Markdown CSS isolation, and Android navigation-inset handling were refined without changing the TXT reader model.
- PDF viewer system-bar and navigation-inset handling was refined separately from WebView documents so the PDF viewport keeps fixed-layout behavior while avoiding stale toolbar-colored system bars.
- The Readwide launcher source reference was updated to the project-supplied image at
docs/readwide_launcher_icon_source.png; checked-in Android launcher/adaptive/play-store PNG resources were left unchanged. - Unknown-size decoded stream extraction, failed single-entry extraction cleanup, and 7z solid-member drain handling now use the decoded-byte safety boundary so unsupported or hostile streams cannot bypass the total extraction ceiling or leave stale output.
- 7z/CB7 password and split handling was tightened. Standard raw split chains such as
.7z.001/.7z.002and.cb7.001/.cb7.002are resolved conservatively, missing/gapped chains are treated as corrupt/incomplete, and wrong-password AES failures are classified with password context where possible. - RAR/CBR support remains conservatively documented. The default build uses libarchive-android as the compressed-RAR backend, plus scoped first-party decode-only paths for covered stored entries, eligible unencrypted single-volume RAR3/RAR4 PPMd solid cases, and eligible unencrypted single-volume RAR5 v5.0 compressed/solid cases. Full RAR, encrypted RAR, broad split RAR, SFX, VM-filtered RAR, and complete RAR compatibility are not claimed.
- ALZ/EGG first-party extraction paths remain limited and CRC-verified for covered methods, with unsupported encrypted/split/solid cases failing cleanly.
- Public GitHub/F-Droid materials were updated for the 1.0.2 package:
README.md,PRIVACY.md,THIRD_PARTY_NOTICES.md, FOSS notes, F-Droid submission notes, license report, SBOM draft, Fastlane metadata, release checklist, and release notes.
Archive support boundary
- ZIP/CBZ stays on Zip4j as the primary path, with Apache Commons Compress fallback for selected methods where bundled codecs can read them.
- 7z/CB7, TAR-family archives, and single-compressor streams continue through Apache Commons Compress, with the 1.0.2 split/password/drain safety boundaries documented separately.
- ALZ/EGG behavior is unchanged from the existing scoped coverage; 1.0.2 keeps those limits documented while focusing archive changes on 7z safety and RAR boundary wording.
- RAR/CBR remains limited and backend/scoped-path dependent. It includes covered stored paths, selected stored split paths, RAR4 Unicode metadata handling, eligible unencrypted single-volume RAR3/RAR4 PPMd solid extraction, and eligible unencrypted single-volume RAR5 v5.0 compressed/solid extraction.
- RAR creation/compression, password recovery, encrypted RAR support, broad split RAR support, broad SFX support, and complete RAR compatibility are not implemented or claimed.
Readwide v1.0.1
Release scope
- Kept Android metadata at
versionCode 10001andversionName "1.0.1". - Kept the existing Android
applicationId/ package name so Readwide 1.0.1 remains update-compatible with earlier compatible builds when signed with the same key. - Focused on viewer polish, portable backup/bookmark handling, archive safety, lifecycle hardening, and public GitHub/F-Droid packaging cleanup.
Final changes included in this upload
- Missing bookmark target files remain visible in the bookmark list with a theme-matched File missing / 파일 없음 label. Tapping one opens a themed explanation dialog while preserving the bookmark for later portable rebind.
- Backup import keeps
last_directory,recent_folders, andfolder_shortcutsonly when those folders exist on the current device. Invalid imported paths are skipped, and valid current-device entries are preserved when the backup has no accessible replacement. - TXT bookmark imports treat
pageNumber,totalPages, andpageLayoutSignatureas layout-dependent cache. Character position, logical line, surrounding anchor text, and file fingerprint remain the stable bookmark location, and Page X/Y refreshes under the current device layout when the file is opened or the bookmark is used. - Zoomed PDF pages can fling/pan with inertia in single-page mode, and zoomed pages in vertical continuous mode support horizontal fling across the visible page while original-scale swipes keep their page-turn behavior.
- Image viewer landscape safe-area handling now respects Android 3-button navigation on the right side of the screen.
- Image viewer default fitting is adaptive: wide images open fit-to-width and tall images open fit-to-height. Double tap toggles against true 1:1 scale when applicable.
- Image viewer keeps successfully decoded detail/original bitmaps after returning from zoom to adaptive-fit view, avoiding repeated detail re-decodes for the same image.
- Archive-backed image viewer recent/saved-position reopen paths were hardened so deferred image sequence metadata is applied before decoding, with fallback handling for missing or invalid handoff metadata.
- Legacy archive entry filename decoding was expanded for raw ZIP central-directory names and first-party ALZ/EGG name fields, covering Korean, Chinese, Japanese, Cyrillic, Greek, Turkish, Hebrew, Arabic, Thai, Vietnamese, Western/Central/Baltic Latin, and DOS ZIP code pages where raw name bytes are available.
- Password-protected archive image viewing uses selected-image-first lazy extraction after password entry. Password-sensitive preview cache reuse validates the current password before trusting cached output.
- ALZ Store/Deflate/BZip2 and EGG Store/Deflate/BZip2/LZMA extraction paths stream to output with CRC verification where the format path allows it.
- Archive failure messages now distinguish password-required, bad-password, unsupported-feature, corrupt-archive, and generic failures, with conservative family-specific support-boundary details.
- Added external RAR and non-RAR archive fixture report tooling for local compatibility QA without broadening public archive compatibility claims.
- Removed forced process-wide
System.gc()calls from image decode OOM retry; retries increase sample size and yield instead. - Added lifecycle guards and cleanup for document WebView callbacks, PDF delayed callbacks, TXT TTS callbacks, reader-toolbar delayed work, drawer delayed work, image sequence handoffs, archive password snapshots, and font-scan callbacks.
- Bounded EPUB fixed-layout/font detection reads so large HTML/CSS entries are not fully loaded during detection-only scans.
- Public GitHub/F-Droid documentation, release notes, archive/RAR/license report filenames, and Fastlane changelogs were normalized for the Readwide 1.0.1 release line.
Archive support boundary
- ZIP/CBZ stays on Zip4j as the primary path, with Apache Commons Compress fallback for non-encrypted unsupported ZIP methods where bundled codecs can read them.
- 7z/CB7, TAR-family archives, and single-compressor streams continue through Apache Commons Compress.
- ALZ and EGG remain limited first-party implementations with documented method coverage and unsupported encrypted/split/solid variants.
- RAR/CBR remains libarchive-primary with scoped first-party Java support for metadata, safe paths, stored entries, selected stored split paths, RAR4 Unicode names, diagnostics, and covered RAR5 stored-entry handling.
- RAR creation is not implemented.
- Split/multi-volume RAR and encrypted RAR are not guaranteed.
- Solid RAR, PPMd, custom VM filters, broad SFX, RAR5 compressed/solid/encrypted-header cases, and unusual RAR variants remain backend-dependent or unsupported unless a specific file is covered by the bundled backend.