Skip to content

Releases

Llunevie v0.5.1-beta.3

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 06 Nov 12:08

Beta release: Audit Batch 4 — full fix pass over Audit #2 findings (all 17 new findings plus the remaining open items from Audit #1), plus two bugs found in on-device testing of beta.2.

Batch 4A (critical/high fixes):

  • PDF spread mode can no longer cache a permanently blank page; external page jumps in Scroll/Webtoon modes work again; Back button priority in the reader is back in the right order (overlays first, exit last).
  • Backup restore is sanitized: book ids / paths in a backup can no longer escape the app folder (path traversal could previously delete the whole app data directory), and EPUB import is bounded by a total byte budget so a crafted book can no longer OOM the app.

On-device test fixes:

  • T1 — Bilingual spread mode: pagination now comes only from the original text; each bilingual page is exactly one original page plus its own translation fitted into the same box, page numbers follow the original, and switching modes no longer leaves a mixed original/translation stream. Left and right pages can no longer show unrelated passages or two translations side by side.
  • T2 — The translation quick bar (Replace | Bilingual | JA | x) no longer covers the first line of text: reader content is inset by the bar height plus margin in every mode whenever the bar is visible.

Batch 4B (performance/memory):

  • Stripped unused BouncyCastle post-quantum .properties resources from the APK (about 8 MB), translation requests no longer duplicate via a fallback Elvis chain, fit-scale results are reused instead of recomputed, a center tap no longer also fires the highlight action, reader bitmap caches are evicted on exit instead of lingering (~176 MB), and in-book search runs off the main thread.

Batch 4C (remaining items):

  • Security: scoped network security config and backup/data-extraction rules added; signing credentials moved out of the build script into a gitignored keystore.properties with identical values; stray prototype/release artifacts moved to a gitignored archive/ folder (nothing deleted).
  • Room: indices on createdAtMillis and shelf with a proper MIGRATION_8_9 (database version 9); reader highlights/bookmarks now use per-book DAO queries.
  • Auto-import folder scan has a 60-second cooldown and all HttpURLConnection calls are cancellable (connection disconnects when the coroutine is cancelled).
  • Animated root blur replaced with a static blur while modals/sheets are open (no per-frame RenderEffect rebuild); accessibility: content descriptions on reader icons and a >=48dp touch target for the quick-notes handle; several recomposition hot spots remembered/hoisted.
  • Dead code removed (~1,200 net lines, including 427 lines of dead snapshot renderers) and duplicated chapter CRUD / path helpers deduplicated.
  • Skipped by design (recorded in the run report): mechanically splitting LlunevieViewModel / PdfNativeRenderer — too tightly coupled to private mutex/state; deferred rather than risking reader stability.

Known issue: one pre-existing unit test (PDF chapter title deduplication, "the" vs "The") still fails on an assertion mismatch that predates the audit batches; the code it covers is untouched. Test run otherwise matches the pre-batch baseline exactly (4 of 5 passing, no new failures).

Build: versionCode 65, clean build (assembleDebug + assembleRelease, R8 + shrinkResources).
Release APK (17,198,828 bytes) — MD5: 1e8173ad3e1d79d9d3c9a7b8f883dd2d
SHA-256: 533516a4ce5f8faa26d1cb00e7259afe320d7d9f83a7de28854b639667cde7cc

Llunevie v0.5.1-beta.2

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 06 Nov 07:31

Beta release: Audit Batch 3 — reader hot-path performance and modularization.

  • EPUB rendering: page snapshots now actually go through the snapshot cache (byte-sized LRU) and render off the main thread, page-fit scaling uses binary search instead of a linear probe loop, and two-page spread snapshots no longer re-render pages quadratically. This removes the ~31 MB of bitmap work that previously ran on the main thread for every page turn.
  • Flipbook: page-curl state is now read in the draw phase instead of forcing recomposition every frame, and Path/Paint/RectF objects are reused across frames instead of being allocated 30-60 times per frame.
  • Page scrubber: dragging the slider no longer re-renders the target page on every tick; the jump commits once when the drag ends.
  • PDF: a single pooled PdfRenderer + file descriptor session is kept per book and closed through the Batch 2 lifecycle hook when leaving the reader; the aspect-ratio cache is now thread-safe (ConcurrentHashMap), and paginated/scroll modes share one bitmap cache key space instead of duplicating every page.
  • Scroll & Webtoon modes: saved progress now follows the first visible item instead of lagging behind, page jumps land on the exact page (chapter headers and dividers are accounted for in the index mapping), page content receives the real chapter/page indices, and pinch-to-zoom is available in both modes.
  • Reader chrome & structure: tapping the center of the page toggles the reader chrome, the Back button dismisses in-reader overlays (search, language dropdown, scrubber, quote popover, text selection) before exiting, and ReaderScreen.kt was mechanically split from 8,153 lines into a 1,353-line core plus 9 focused component files (top chrome, bottom dock, search overlay, typography sheet, TOC drawer, notes drawer, illustration viewer, page content, EPUB snapshot renderer) with no behavior change intended.

Known issue: one pre-existing unit test (PDF chapter title deduplication, "the" vs "The") still fails on an assertion mismatch that predates the audit batches; the code it covers is untouched. Test run otherwise matches the pre-batch baseline exactly (4 of 5 passing, no new failures).

Build: versionCode 64, clean build (assembleDebug + assembleRelease).
Release APK (21,320,286 bytes) — MD5: 8ad90a5f99dfe4e46bc7a8c9e7a7f932
SHA-256: 4abdb5f11a131d47405662a369224543306ea6900123ff61d0f2befbb367be9e

Llunevie v0.5.1-beta.1

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 06 Nov 04:34

Beta release: Audit Batch 2 — correctness, persistence, and memory bounds.

  • Translator: fixed the feedback loop that kept wiping the page translation cache and re-rendering flipbook bitmaps (up to 6x per page turn); in-flight page translations are now deduplicated, the current-page translation uses the correct global page index, and single-page mode next/previous bitmaps now use the translation cache — no more untranslated flash before a page settles.
  • Text parsing: chapter text sanitizing no longer strips <...> tags from LitRPG/Sci-Fi novels (the Html.fromHtml pass is gone, entities are decoded directly, regexes are pre-compiled); EPUB illustrations keep their document order; the PDF "bulan kabur" watermark filter is restricted to the header/footer margins so it cannot eat body text.
  • Memory: all bitmap caches are now byte-sized with hard caps (PDF pages 48 MB, translated PDF pages 32 MB, high-res illustrations 24 MB, EPUB images 24 MB), the cached PDF document is closed when leaving the reader, and onTrimMemory evicts bitmap caches under system memory pressure.
  • Backup & restore: backups now include all tables and reading progress; restoring updates books in place instead of clobbering existing EPUB/PDF chapters, highlights, and bookmarks; export uses the system file picker (SAF CreateDocument); v1 backup files still restore.
  • Stats: the reading session timer pauses/flushes on lifecycle changes without losing sub-minute progress or double-counting; weekly minutes and reading streaks on Home/Stats are computed over real calendar days; the library spine-width formula now matches the row renderer.

Known issue: one pre-existing unit test (PDF chapter title deduplication, "the" vs "The") still fails on an assertion mismatch that predates the audit batches; the code it covers is untouched. Test run otherwise matches the pre-batch baseline exactly (4 of 5 passing, no new failures).

Build: versionCode 63, clean build (assembleDebug + assembleRelease).
Release APK (21,303,893 bytes) — MD5: 88f84b49c81d9297c2ed28caa3a7243f
SHA-256: c5a2ab687f634609e1e398e1edbf240dca803fb540cfa8d9982284c22349f8ce

Llunevie v0.4.2-beta.1

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 06 Nov 04:02

Beta release: Audit Batch 1 — zero-risk size, startup, and leak fixes.

  • APK size down 42.8% (37.2 MB -> 21.3 MB): R8 minification and resource shrinking are now enabled for release builds, 7 duplicate/unused font files were removed from assets, and the unused palette-ktx and ui-text-google-fonts dependencies were dropped (material-icons-extended stays — it is genuinely used by the UI).
  • CameraX leak fixed in the ISBN scanner: the camera is now unbound when the scanner screen closes, so it no longer stays active in the background.
  • Lighter cold start: the dead cover-cache pre-warm is gone, and the orphan file sweep now runs before the auto-import folder scan.
  • Heavy I/O no longer runs on the main thread: opening books, deleting books, importing photos, the Settings avatar crop, and backup export were moved to background dispatchers.
  • Icons: vector paths are cached instead of re-parsed on every recomposition, tappable icons got proper content descriptions and minimum touch targets.
  • Minimal ProGuard keep rules added for PDFBox reflection paths.

Known issue: one pre-existing unit test (PDF chapter title deduplication, "the" vs "The") fails on an assertion mismatch that predates this batch; the code it covers is untouched here.

Build: versionCode 62, clean build (assembleDebug + assembleRelease).
Release APK (21,287,537 bytes) — MD5: f901ec142453e31b4911e6986daa57e6
SHA-256: 27b0a2b49f914d95aae9170ab46bae3abff9651128aede011fc4d55bf76383a5

Llunevie v0.4.1

Choose a tag to compare

@Llunatics Llunatics released this 05 Nov 11:35

Stable release: translator language selection fixes and the redesigned language picker.

  • Fixed the translator language choice lagging one step behind (choosing Japanese showed Korean): translated-PDF cache keys now include the normalized target language and mode in a dedicated cache, finished translations appear immediately via a reactive revision counter, stale flipbook bitmaps are cleared, and language codes are passed explicitly (zh -> zh-CN).
  • Canonical translation language catalog: 5 defaults (Indonesian, English, Japanese, Korean, Simplified Chinese) with native labels plus 14 additional languages; compact redesigned Top Pill language dropdown; Settings language manager with "+ Add More Languages" — custom languages persist and appear in both Settings and the reader dropdown.
  • The language selector no longer uses a Material3 DropdownMenu popup (it anchored to the whole Top Pill's left edge and had a heavy shadow halo): it is now a shadow-free card centered directly below the Top Pill, with a tap-outside catcher and auto-close.

Build: versionCode 61, clean build (assembleDebug + assembleRelease).

Llunevie v0.4.1-beta.3

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 05 Nov 10:59

Pre-release: language selector popup placement fix.

  • The translation language menu no longer opens as a Material3 DropdownMenu popup: it was anchored to the left edge of the whole Top Pill (so it appeared shifted far left) and carried a heavy native shadow halo with bloated item spacing.
  • The selector is now an in-hierarchy card rendered directly below the centered Top Pill — symmetric, shadow-free (0dp elevation, thin 1dp border), with a short fade/scale/expand animation.
  • Tapping anywhere outside the card closes it (full-screen transparent tap-catcher), and it auto-closes when translation mode turns off or the reader chrome hides.

Build: versionCode 61, clean build (assembleDebug + assembleRelease).

Llunevie v0.4.1-beta.2

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 05 Nov 09:43

Pre-release: translation language catalog and redesigned language picker.

  • Canonical translation language catalog: five defaults (Bahasa Indonesia, English, Japanese, Korean, Simplified Chinese) with native-name labels, e.g. ja (Japanese) style dropdown entries and JA (...) settings entries.
  • Redesigned the in-reader Top Pill language dropdown — compact rows with badge code and native name instead of the old cramped list.
  • Settings now has a language manager: the active languages are listed there, and "+ Add More Languages" expands an inline list of extra languages (Traditional Chinese, Spanish, French, German, Russian, Arabic, Portuguese, Italian, Thai, Vietnamese, Malay, Turkish, Hindi, Dutch). Tapping one adds it, persists it, and makes it appear in both Settings and the reader's Top Pill dropdown.
  • Language code normalization extended (cn/zh -> zh-CN, tw -> zh-TW, plus all extra codes). The translation cache keys and reactive revision logic from v0.4.1-beta.1 are unchanged.

Build: versionCode 60, clean build (assembleDebug + assembleRelease).

Llunevie v0.4.1-beta.1

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 05 Nov 09:03

Pre-release: translator language selection fix.

  • Fixed the target language lagging one step behind: choosing JA could display the previously selected language (e.g. KO), and switching away from a language could leave the old translation on screen.
  • Translated PDF page bitmaps are now cached under keys that include the target language and translation mode, in a cache separate from the original page bitmaps — a page translated into one language is never reused for another.
  • Added a reactive translation revision counter so a finished translation is flushed to the screen immediately, without needing another tap on the language dropdown.
  • Flipbook mode no longer holds on to stale page bitmaps when the language or translation mode changes.
  • Language codes are normalized (zh -> zh-CN, etc.) and passed explicitly through the translation call chain instead of being read from lagging mutable state.

Build: versionCode 59, clean build (assembleDebug + assembleRelease).

Llunevie v0.4.0

Choose a tag to compare

@Llunatics Llunatics released this 05 Nov 08:24

Llunevie v0.4.0 — reader zoom for paged modes, and a proper Fade transition.

New in 0.4.0:

  • Pinch-to-zoom and one-finger pan now work in the Slide, Fade, and No-Animation page-turn modes (previously Flipbook only). The pager locks while zoomed so page turns don't fight the pan gesture, and zoom resets automatically when you turn the page or switch modes.
  • Fixed overlapping text in EPUB Fade mode: the transition is now a smooth symmetric cross-dissolve instead of the old page holding at full opacity for 270ms and snapping off in one frame, which drew two pages of text on top of each other.

Build: versionCode 58, clean build (assembleDebug + assembleRelease).

Llunevie v0.4.0-beta.2

Pre-release

Choose a tag to compare

@Llunatics Llunatics released this 05 Nov 07:38

Pre-release: EPUB Fade mode fix.

  • Fixed overlapping text in EPUB Fade mode: the outgoing page no longer stays at full opacity for 270ms and then snaps off in a single frame — the transition is now a smooth symmetric cross-dissolve, so the incoming and outgoing pages never draw their text on top of each other. (Previous build's regression was a broken fadeOut(delay 270ms / duration 16ms) combined with the transparent page background.)
  • Audited the EPUB text page rendering so two text layers can never render inside the same page container during a transition.
  • Pointer input handling for the non-flipbook zoom layer is no longer restarted mid-transition when the page changes; the zoom reset behaviour on page change is unchanged.

Build: versionCode 58, clean build (assembleDebug + assembleRelease).