# Changelog ## 0.2.3 — Complete SAF-D1 diagnostic source / pinned toolchain (2026-09-24) - Integrate the previously separate SAF-D1 diagnostics into the full 0.2.2 source; retain the PDF lifecycle correction, folder cursor-result correction, and tests. - Pin Gradle 8.14.5 across the wrapper and both bootstrap scripts with official hashes. - Require a local JDK 17 via checked-in daemon criteria, compilation toolchains, bytecode targets and settings guards; keep Kotlin 2.2.21 / AGP 8.11.1 unchanged. - Add offline build-pin/plugin-ID checks; preserve the five unique root plugin aliases. - Set versionName 0.2.3 / versionCode 5 and a visible release/SAF-D1 footer. - Clarify fresh-extraction setup and that the persistent folder failure remains unresolved. - No extra permissions, document-engine changes, JDK/SDK binaries or compiled APK. ## 0.2.2 — Folder-listing runtime fix (2026-09-24) - Check the provider cursor for null before entering `use`, rather than treating the optional EXTRA_ERROR field's absence as a missing listing. - Preserve normal/empty/partial listings, cursor cleanup, row limits and provider messages. - Add five Android provider regression cases and an offline host harness that tests the actual production cursor-reading block with test doubles. - Reproduce the original exception (9/14 host failures); fixed block passes 14/14. Existing portable checks remain 112/112. Android build/device validation of this patch is not claimed; the one-file patch preserves local build-tool changes. ## 0.2.1 — Android PDF smoke-test compilation fix (2026-09-24) - Fixed `PdfDocument().use` in `ViewerSmokeTest.kt`: Android's PdfDocument exposes `close()` but implements neither Closeable nor AutoCloseable; use explicit try/finally instead. - Finish the started PDF page in finally, close the document and render client explicitly, use a unique temporary fixture, and delete that fixture even when its creation fails. - Add a narrowly scoped source check for the exact invalid constructor/use pattern. - No runtime feature changes or dependency upgrades; Android/device verification remains pending. ## 0.2.0 — Lightweight Android browser and file picker (2026-09-23) - Added native saved-folder browsing, breadcrumbs/Up/refresh, current-folder search, name/date/size/type sorting, dotfile visibility, metadata, optional provider thumbnails, and Browse/Recent tabs. - Reused the current preview pipeline; preserved browser navigation/scroll through preview and Back. - Added explicit external-open chooser using read-only copies, including unsupported preview formats. - Registered APP_FILES, content-directory VIEW, and a dedicated GET_CONTENT selection activity. - Added MIME-filtered, optional multi-selection, review/confirm/cancel, LOCAL_ONLY system delegation, narrow copied-URI results, and preserved MIME metadata for extensionless output copies. - Separated saved tree-grant ownership from recent-file cleanup; protected concurrent viewer snapshots. - Sanitized exported activity extras before SavedStateHandle defaults can be populated. - Added shared portable browser policies and stream-copy budgets; 112 offline core/JVM checks pass. - Added Android provider/picker instrumentation source and debug-only synthetic documents, not executed. - Expanded documentation, static invariants and a repeatable Kotlin PSI syntax check. - Android/Apple build and device verification are still pending; no APK or native Office engine bundled. ## 0.1.0 — MVP source release Android read-only viewer implementation with system file integration, recent files, PDF/image views, local reading previews, source/CSV/ZIP views, search, sharing, copies and labelled text export. Shared Kotlin Multiplatform core; bounded JVM ZIP adapter; isolated PDF service; policy/test suite; Apple framework targets and port plan; source-only Gradle wrapper bootstrap with pinned checksums. Executed validation: 75 core/JVM checks, source syntax and structural checks. Android/iOS builds, visual checks and runtime testing not performed; no APK included. No native Office engine, editing, full Office fidelity or iOS application claimed.