Skip to content

Readwide v1.0.4

Choose a tag to compare

@k1717 k1717 released this 16 Jun 17:00

Release scope

  • Android metadata is versionCode 10004 and versionName "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.reader to com.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 directories with many entries.

TXT find-in-page

  • Fixed TXT find-in-page being extremely slow for common words in some files. The matcher now prepares the comparison view once per search and reuses it, and the large-file engine scans each line in a single pass, keeping returned offsets aligned to the original text for bookmarks and page anchors.
  • Improved TXT find-in-page with case-sensitive, whole-word, and regular-expression options. Unicode normalization is always applied, overlapping literal occurrences are counted correctly, and the in-memory and large-file search paths share the same matcher and option semantics.
  • Improved TXT search reveal near the end of a file. Search jumps now use a search-only virtual bottom scroll allowance so a match in the final lines can be pulled above the search dialog without changing normal paging, manual scrolling, bookmarks, or saved-position restore.

Document-viewer search (Markdown, EPUB, HWP/HWPX, Word)

  • Reworked Markdown, EPUB, HWP/HWPX, and Word-family document-viewer search to use the same TXT-style search options and match counter instead of relying on WebView native find. The document search dialog supports previous/next movement, nth-match jumps, current/total status, case-sensitive mode, whole-word mode, and regex mode.
  • Fixed document-viewer search result visibility. Current matches now use explicit highlighted spans and popup-safe reveal logic; the selected result is placed near the upper safe area, with top/bottom document spacer handling so matches near the beginning or end of a rendered document can still be moved into view above the bottom search dialog.
  • Reduced same-page Markdown search bounce by updating the current highlighted match inside the existing DOM when possible instead of reloading the whole page for every previous/next movement.
  • Strengthened EPUB/HWP/Word search highlight styling so reader/theme CSS does not erase the yellow/current-result highlight.

Toolbar and dialogs

  • Fixed content and toolbars overlapping the Android 3-button navigation bar in landscape. The nav bar sits on a screen side in landscape, but only top/bottom insets were being applied; left/right system-bar insets are now applied across the main screen, settings, and the TXT, document, and PDF viewers, so content no longer slides under the side nav bar.

  • Added a screen-rotation (portrait/landscape) button to the TXT, document (Markdown/EPUB/Word/HWP/HWPX), and PDF viewer toolbars; the image viewer already had one. It uses the same monitor-shaped icon as the image viewer and now reflects the current screen state: it shows the landscape icon while the viewer is in landscape and the portrait icon while in portrait, updating both when tapped and when the device is physically rotated. It toggles the screen orientation and is separate from any page-slide direction setting. In the TXT viewer it sits at the end of the row, right of Text encoding. In the document and PDF viewers it sits in the scrollable row followed by a Settings button, just left of the pinned More button. All are part of the customizable button-order system and can be rearranged.

  • Added a Settings button to the document and PDF viewer toolbars (right of the rotation button). Settings also remains in those viewers' More dialog.

  • Converted the PDF and document viewer bottom toolbars to the TXT viewer's layout: the action buttons now sit in a horizontally scrollable row with the More button pinned at the far right. The buttons also now use the TXT viewer's shared toolbar controller, so they get the same balanced (equal) button widths and the same snap-to-nearest-button behavior when the row is scrolled, and they re-balance on rotation. New rotation and settings buttons are also included in the per-viewer theme tinting, so their icon and label follow the active theme color like the other buttons.

  • Fixed tap-to-turn paging firing when tapping the visible bottom toolbar (and top bar). The toolbar floats over the full-screen reader/document/PDF view, so a tap on it also fell inside the page-turn zone underneath. Taps that land on a shown chrome bar now toggle/keep the toolbar instead of turning the page; with the toolbar hidden, the whole view still pages normally. Fixed in the TXT, document (Markdown/EPUB/Word/HWP/HWPX), and PDF viewers.

  • Fixed reader toolbar buttons running their action multiple times when tapped repeatedly, which could open duplicate dialogs or trigger repeated loading. Toolbar taps are now debounced, and only one positioned reader dialog is shown at a time.

  • Fixed the settings "Button / icon order" rows (main filter, TXT, EPUB/Word, PDF) being vertically clipped under longer translations such as German. The rows changed from a fixed 48dp height to wrap_content with a 48dp minimum height and vertical padding, so longer labels wrap instead of being cut off.

  • Applied the same wrapping fix to the sort dialog's options and to the TXT search dialog's option/action rows, whose fixed-height controls could clip longer translations.

Manifest and distribution

  • Removed the dead android:requestLegacyExternalStorage="true" manifest flag, which had no effect under targetSdk 35 and added an unnecessary legacy-storage signal for static scanners. File access behavior is unchanged.