# File Manager An **ad-free**, **one-time-paid** Android file manager. It browses and manages the files on your device — locally, with no ads, no account and no analytics. Nothing ever leaves the device: the app declares no network permission and contains no advertising or tracking SDKs. > **Working title.** The display name and the store listing are decided before the > first Play upload (see [docs/ROADMAP.md](docs/ROADMAP.md), M10). The `applicationId` > is already fixed and can never change after the first release. ## Status **M4 — browser UI: done.** The file manager is usable: browse volumes and folders, search, sort, multi-select, copy/cut/paste, rename, delete, create folders, view details, open and share — plus the "All files access" and SAF-folder permission flows. Covered by 115 JVM unit tests (16 added here). See [docs/ROADMAP.md](docs/ROADMAP.md) for the full milestone plan. ## Tech stack | Area | Choice | |---|---| | Language | Kotlin 2.4.10 (using AGP 9 *built-in Kotlin*) | | UI | Jetpack Compose, BOM 2026.06.01, Material 3 | | Build | Gradle 9.3.1, Android Gradle Plugin 9.1.0 | | Storage access | `MANAGE_EXTERNAL_STORAGE` ("All files access") with a Storage Access Framework fallback | | Archives | Apache Commons Compress (pure Java — no NDK) | | SDK levels | `compileSdk`/`targetSdk` 36, `minSdk` 26 | `targetSdk` is 36 because Google Play requires new apps and updates to target Android 16 (API 36) from 31 August 2026. ## Project layout ``` app/src/main/java/de/softwareapp_hb/filemanager/ ├── core/ Pure-Kotlin engine (no Android imports!) — paths, sorting, formatting, │ search matching, copy/move planning, conflict policy ├── data/ Storage backends (all-files access + SAF), volumes, bookmarks, │ file operations, archives, deletion ├── domain/ Browser + operation controllers, models, permission state ├── service/ Foreground service for long-running file operations ├── ui/ Compose theme, browser screen, components, ViewModels └── text/ Domain enum → string-resource mapping app/src/test/java/… JVM unit tests for the core engine ``` `core/` deliberately has **no Android dependencies**, so the trickiest logic is covered by fast JVM tests. ## Building Prerequisites: - JDK 17+ (JDK 25 verified) - Android SDK with `platforms;android-36` and `build-tools;36.0.0` ```bash # Tell Gradle where the SDK lives (this file is git-ignored) echo "sdk.dir=$HOME/Android/Sdk" > local.properties ./gradlew :app:assembleDebug # debug APK ./gradlew :app:testDebugUnitTest # JVM unit tests for the engine ./gradlew :app:lintDebug # Android Lint ./gradlew :app:bundleRelease # Play upload bundle (.aab) ``` Release signing is optional and driven by a git-ignored `keystore.properties` (see `keystore.properties.example`); without it the release build still runs R8/minification but produces an unsigned artefact. ## Tracked in git - Source, resources and Gradle build files. - `docs/` — roadmap and release documentation. - `PRIVACY.md`, `CHANGELOG.md`, and (from M10) `store-assets/`. Not tracked: `local.properties`, `keystore.properties`, `*.jks`, build outputs. ## Licence Proprietary — all rights reserved.