Commit Graph

15 Commits

Author SHA1 Message Date
SoftwareApp 9a1aa9220b Fix the delete confirmation, which still promised permanence
Hardware testing caught the dialog saying 1 item will be permanently deleted. This cannot be undone while deletes now stage into the trash. Reworded to describe what actually happens, and deliberately without promising an undo button: that lives in a snackbar and is gone in seconds, whereas the trash keeps the item for a day. Also records that the trash has no screen of its own.
2026-10-15 09:52:56 +02:00
SoftwareApp cc085b43de Receive shares and serve file requests, so other apps can reach this one
The manifest had nothing but a LAUNCHER filter, so no other app could hand Plain Files anything. It now registers for ACTION_SEND and SEND_MULTIPLE (a bar over the browser: navigate to the folder, then Save here) and for GET_CONTENT and OPEN_DOCUMENT, where tapping a file hands it back through the existing FileProvider.

Both reuse the browser instead of a second screen, because both are navigate-to-a-folder with a different verb at the end. data/ gains one port, IncomingSource, to keep a ContentResolver out of the ViewModel the way DeleteRequestFactory keeps one out of the delete path. Shared files are named from the sender OpenableColumns, allocated by the same NameAllocator a paste uses, and deleted again if they cannot be read rather than left as zero-byte stubs. While providing, a tap on a file chooses it but a tap on a folder still navigates, or the user could never reach the file.

ACTION_VIEW is deliberately not registered: the app already hands files out through the system chooser, and registering as a viewer would offer Plain Files back to itself. No new permissions - the merged release manifest still declares no INTERNET.
2026-10-15 09:18:10 +02:00
SoftwareApp ba92cf392d Support 7z extraction, and fix .xz extraction which would have crashed at runtime
Commons Compress declares its LZMA/LZMA2 support against org.tukaani:xz as an *optional* dependency, so nothing pulled it in transitively and nothing failed at build time. The app nevertheless advertised .xz as extractable, so the first user to open one would have got NoClassDefFoundError: org/tukaani/xz/FilterOptions. XZCompressorInputStream references org/tukaani/xz/XZInputStream directly. The library is now declared, and a round-trip test covers the path that was silently missing.

That same library is what 7z needs, and Commons Compress already ships a pure-Java 7z reader, so 7z extraction costs no native code and no further dependency. The docs had assumed the format was off limits and said so in three places, including the customer-facing store copy.

7z is the only format here that cannot arrive through a stream: its header sits at the end of the file, so the reader has to seek. That is now a capability the backend advertises, StorageSource.openSeekable: the all-files backend answers with a real FileChannel, the SAF fallback with null, so folder mode reports needs-a-seekable-file instead of failing obscurely. Entry names go through the same ArchivePath.safeRelativePath zip-slip guard. 7z creation stays deferred.
2026-10-15 08:47:37 +02:00
SoftwareApp a461be2a66 Docs: M10 complete, dual-pane no longer deferred, correct the 7z rationale
The last commit shipped the screenshots and the two-pane layout but left the roadmap and README saying otherwise. Also corrects the stated reason 7z is unsupported: RAR really does need native code, but SevenZFile is already inside the Commons Compress jar this app ships.
2026-10-15 00:25:09 +02:00
SoftwareApp d845a7646e M10: store assets - Plain Files naming, generated icon/feature graphic, listing copy 2026-10-14 17:47:02 +02:00
SoftwareApp e3de9a2fc0 M9: monetisation decision - one-time paid, no billing code, verified in release APK 2026-10-14 17:40:29 +02:00
SoftwareApp bf909b3485 M8: localisation groundwork - resource the file-kind labels, pseudo-locale check 2026-10-14 17:12:02 +02:00
SoftwareApp a79b7eb58e M7: on-device validation - fix usage-screen latency and first-run copy 2026-10-14 17:05:03 +02:00
SoftwareApp e2cfb5d9ca M6: release signing, privacy policy and Play release checklist 2026-10-14 16:44:58 +02:00
SoftwareApp 3e39fc9b86 M5: storage usage, ZIP/TAR/GZ archives with zip-slip guard, thumbnails, viewers + 26 tests 2026-10-14 16:29:08 +02:00
SoftwareApp 2c86f3dc67 M4: browser UI (navigation, sort, selection, dialogs, permission prompts, platform delete) 2026-10-14 16:07:08 +02:00
SoftwareApp 993cac6e5b M3: operations engine (copy/move/delete, progress, cancellation, conflicts) + foreground service 2026-10-14 15:40:48 +02:00
SoftwareApp 0863b37d70 M2: storage layer (all-files + SAF backends, volumes, access policy) + 32 JVM tests 2026-10-14 15:17:51 +02:00
SoftwareApp 6d4c2c3f87 M1: pure-Kotlin core engine (paths, classification, sorting, search, transfers) + 44 JVM tests 2026-10-14 15:05:14 +02:00
SoftwareApp adfd95fc38 M0: project scaffold (Gradle 9.3.1 / AGP 9.1.0, Compose shell, storage permissions) 2026-10-14 14:55:10 +02:00