M0: project scaffold (Gradle 9.3.1 / AGP 9.1.0, Compose shell, storage permissions)
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
# 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
|
||||
|
||||
**M0 — toolchain & scaffold: done.** The project builds, installs and runs a themed
|
||||
Compose shell. 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.
|
||||
Reference in New Issue
Block a user