4.1 KiB
Continuation brief
User objective
Replace the routine act of opening mobile file attachments in Google/Microsoft apps with an account-free local viewer. Android first; preserve an iOS path through reusable core logic. Do not turn this into a storage cloud or a new full Office suite as the first deliverable.
Current source
Read README.md, FEATURES.md, ARCHITECTURE.md, SECURITY.md, BUILD.md and VALIDATION.md.
Android Kotlin/Compose implementation, isolated PDF service, JVM ZIP adapter and genuine common
Kotlin reading-preview parsers are present. 112 offline core/JVM checks passed. Android and Apple
builds have not completed; Android bootstrap attempts fail before compilation. The archive contains no APK and no LibreOffice binary.
Browser addition in 0.2.0
Read BROWSER.md and BROWSER_ACCEPTANCE.md. Native SAF folder browsing and a separate GET_CONTENT
picker are implemented, with APP_FILES/directory VIEW registration. Shared browser models, sort/filter,
MIME/selection policy and streamed-copy limits are in commonMain. Android adapters own grants, metadata,
opt-in thumbnails and copied FileProvider results. Exported activity extras are sanitized before
SavedStateHandle defaults are created. Do not remove that protection or forward directory grants.
No broad storage access, all-files permission, raw-path enumeration, file mutation, persistent picker result or replacement system DocumentsUI is implemented. Android 11+ root/Downloads restrictions are intentional and explained in the UI. The debug-only fixture DocumentsProvider is for tests only.
First actions
Bootstrap the official checksum-verified Gradle wrapper on a connected build machine; install the
pinned Android SDK/JDK tooling; resolve/build/test/lint. Fix all actual compile/runtime issues before
extending formats. Run ViewerSmokeTest, BrowserIntegrationTest, and the manual distinct-UID real-provider flows. Preserve known limitations
in the UI and documentation. Update the validation report only with commands actually run.
Non-negotiable boundaries
Keep originals read-only; explicit copy/export/share only. Do not add INTERNET, all-files access, telemetry or account requirements to solve a document-opening problem. A selected provider may have independent networking. Do not execute scripts/macros/formulas or load external resources. Keep input/output/ZIP/XML/repetition limits enforced during parsing. Never extract archive paths to the filesystem. Preserve capability/fidelity labels and explicit error recovery.
Keep Android types out of commonMain. platform-jvm is not the iOS implementation. Use the configured
Apple framework and build a native ZIP/file/PDF adapter later. Do not call an untested interface or
placeholder native bridge an implemented engine.
Known areas for review
Custom preview XML parser is bounded but not schema/namespace validating. Office previews omit substantial content. PDF IPC, worker cancellation/lifecycle and actual device memory need testing. Image EXIF/animation handling is absent. Export/share jobs and cache cleanup need race tests. UI strings are currently English and mostly inline; move them to a localization layer before adding languages. Dependency locking/verification/SBOM requires an actual resolved build.
Follow the implementation slices in ROADMAP.md, with measurable acceptance results. Keep source
and documentation complete in each release ZIP. Do not commit user documents, local SDK paths,
private signing keys or generated build caches.
Continuation from 0.2.3
Current requested baseline: Gradle 8.14.5, installed JDK 17, Kotlin 2.2.21, AGP 8.11.1.
All sources and SAF-D1 diagnostics are integrated; no patch step remains. Check
docs/VALIDATION.md before claiming build/device success. The persistent folder
failure is unresolved; obtain the exact new message after confirming the 0.2.3 /
SAF-D1 footer. Do not infer permission failure from retained-grant=false alone.
Do not upgrade the build toolchain or add a duplicate root Kotlin JVM plugin to
investigate the storage-provider issue. Current pins are checked offline by
scripts/check-build-config.py as well as by Gradle settings at configuration time.