A personal file vault & media task board for Android
Upload, annotate, auto-tag, and track completion of images, PDFs, and files — all offline.
Wrapp is an Android application built by Basement Studios that lets you collect images, PDFs, and arbitrary files into a visual, searchable vault. Each item can be annotated with a title and description, automatically tagged using on-device ML, and tracked with a completion status — making it a hybrid between a media organizer and a task board.
The app is entirely offline — no accounts, no servers, no network requests. Everything stays on your device.
- Upload Anything — Import images from your photo library, capture new photos with the camera, or pick any file from your device (PDFs, documents, etc.).
- AI-Powered Auto-Tagging — Titles and descriptions are processed by Google ML Kit Entity Extraction to automatically generate relevant tags (dates, addresses, keywords) with a maximum of 6 tags per item.
- PDF Preview — PDF files are rendered with a first-page thumbnail using Android's native
PdfRendererAPI. - Search & Filter — Live search across titles, descriptions, and auto-generated tags. Filter items by status: All, Completed, or Not Completed.
- Task Tracking — Mark any wrap as completed or not completed. Completed items display a green checkmark badge on their card.
- Animated Preview Panel — Tap any card to see a detailed preview with slide-up animations, showing the full image/file, metadata, tags, and action buttons.
- Open in External Apps — Tap a preview image to open the file in any compatible viewer via secure
FileProviderURIs. - Dark / Light Mode — Toggle between themes from the settings drawer, with your preference persisted across app restarts.
- Masonry Grid Layout — Items are displayed in a Pinterest-style staggered 2-column grid using
StaggeredGridLayoutManager. - Entirely Offline — No networking libraries, no backend, no data leaves your device.
| Layer | Technology |
|---|---|
| Language | Java 11 |
| Build System | Gradle (Kotlin DSL) with Version Catalog |
| UI Framework | Android Views (XML layouts) |
| Design System | Material Design 3 (Material Components 1.13.0) |
| Database | Room 2.6.1 (SQLite) |
| ML / AI | Google ML Kit Entity Extraction 16.0.0-beta4 |
| PDF Rendering | Android native PdfRenderer |
| File Sharing | AndroidX FileProvider |
| Architecture | Single-Activity, Repository pattern |
| Threading | ExecutorService + runOnUiThread callbacks |
| Min SDK | 29 (Android 10) |
| Target SDK | 36 (Android 16) |
com.basementstudios.wrapp/
├── WrappApplication.java # App startup, dark/light mode init
├── MainActivity.java # Single activity hosting all UI
│ ├── WrapItem # In-memory model (inner class)
│ └── WrapAdapter # RecyclerView adapter with 3 view types (inner class)
├── BottomSheetFragment.java # Upload options (Photo Library, Camera, Files)
├── TagGenerator.java # ML Kit + keyword/bigram tag extraction
├── SquareMaterialCardView.java # Custom 1:1 aspect ratio card
└── data/
├── WrapEntity.java # Room entity for "wraps" table
├── WrapDao.java # Data access queries (CRUD + filters)
├── WrapDatabase.java # Room database singleton (v3)
├── WrapRepository.java # Repository bridging UI ↔ database
└── FileStorageManager.java # Internal file storage & PDF thumbnails
- Android Studio Hedgehog (2023.1.1) or later
- JDK 11
- Android SDK with API level 29+
# Clone the repository
git clone <repository-url>
cd Wrapp
# Build the project
./gradlew assembleDebug
# Install on a connected device or emulator
./gradlew installDebugOr open the project in Android Studio and hit the Run button.
| Permission | Purpose |
|---|---|
CAMERA |
Capture photos directly from the app |
READ_MEDIA_IMAGES |
Access images from the media store (API 33+) |
READ_MEDIA_VIDEO |
Access video from the media store (API 33+) |
READ_MEDIA_VISUAL_USER_SELECTED |
Partial media access (API 34+) |
READ_EXTERNAL_STORAGE |
Legacy file access (API 32 and below) |
The camera hardware feature is declared as not required — the app works on devices without a camera.
| Action | Command |
|---|---|
| Assemble Debug | ./gradlew assembleDebug |
| Assemble Release | ./gradlew assembleRelease |
| Run Unit Tests | ./gradlew app:testDebugUnitTest |
| Run Lint | ./gradlew lintDebug |
| Full Build | ./gradlew build |
| Clean | ./gradlew clean |
This project uses the Feature Branch Workflow (GitHub Flow).
- Pull the latest
mainbranch - Create a branch:
feature/your-featureorbugfix/your-fix - Commit your changes with clear messages
- Open a Pull Request for review
- Merge after approval and delete the branch
<type>: <short description>
Types: feat, fix, refactor, docs, test, chore
Built by Basement Studios