{"id":27789141,"url":"https://github.com/arslan555/galleryon","last_synced_at":"2026-04-30T14:34:07.169Z","repository":{"id":290290172,"uuid":"972711602","full_name":"arslan555/GalleryON","owner":"arslan555","description":"GalleryOn is a modern Android gallery application built using Kotlin, Jetpack Compose, and a clean MVVM architecture. It offers a fast, beautiful, and customizable way to explore your device's images and videos, supporting both light and dark modes, multiple view layouts (Grid/List) \u0026 media details","archived":false,"fork":false,"pushed_at":"2025-04-28T02:44:27.000Z","size":25972,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-28T03:29:45.302Z","etag":null,"topics":["android","android-gallery","clean-architecture-android","coroutines-flow","dark-mode-theme","jetpack-compose","jetpack-compose-navigation","kotlin","material3","mediastore","mvi-architecture","unit-testing"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arslan555.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-25T14:29:05.000Z","updated_at":"2025-04-28T02:48:29.000Z","dependencies_parsed_at":"2025-04-28T03:39:49.368Z","dependency_job_id":null,"html_url":"https://github.com/arslan555/GalleryON","commit_stats":null,"previous_names":["arslan555/galleryon"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arslan555%2FGalleryON","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arslan555%2FGalleryON/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arslan555%2FGalleryON/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arslan555%2FGalleryON/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arslan555","download_url":"https://codeload.github.com/arslan555/GalleryON/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251754487,"owners_count":21638518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-gallery","clean-architecture-android","coroutines-flow","dark-mode-theme","jetpack-compose","jetpack-compose-navigation","kotlin","material3","mediastore","mvi-architecture","unit-testing"],"created_at":"2025-04-30T17:46:19.573Z","updated_at":"2026-04-30T14:34:07.164Z","avatar_url":"https://github.com/arslan555.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ⚡ GalleryOn App\n\nGalleryOn is a native Android application built in **Kotlin**, designed to showcase a clean, scalable, and modern approach to building a media gallery. The app uses best practices like modular clean architecture, Jetpack Compose for UI, and robust testing strategies.\n\n![Android](https://img.shields.io/badge/Platform-Android-brightgreen?logo=android)\n![Kotlin](https://img.shields.io/badge/Language-Kotlin-purple?logo=kotlin)\n![Jetpack Compose](https://img.shields.io/badge/UI-Jetpack%20Compose-blue?logo=jetpackcompose)\n![MVI](https://img.shields.io/badge/Architecture-MVI-orange)\n![MediaStore](https://img.shields.io/badge/Storage-MediaStore-yellow)\n![Unit Tests](https://img.shields.io/badge/Tests-Unit%20Tests-blue)\n\n## 📝 App Overview\n\n1.  **Albums View**\n    * Displays albums grouped by folders.\n    * Supports switching between **Grid View** and **List View**.\n    * Each album shows preview and media count.\n\n2.  **Media Listing**\n    * After selecting an album, displays media items (images/videos) within it.\n    * Supports basic viewing of media metadata like name, size, and date.\n\n3.  **Media Details**\n    * Displays basic metadata of media items:\n      * 🖼️ Media\n      * 📄 Name\n      * 📏 Size\n      * 🗓️ Date Taken\n\n4.  **Permission Handling**\n    * Requests appropriate storage permissions at runtime based on Android version.\n\n\n## 📸 Screenshots\n\n### ☀️ Light Mode\n\n| Album Screen (Grid) | Album Screen (List) | Media List Screen | Media Detail Screen | Cleanup Duplicate Screen | Cleanup Large-Media Screen | Cleanup Old-Media Screen |\n|:---------------------------------------------------------------------:|:---------------------------------------------------------------------:|:---------------------------------------------------------------:|:----------------------------------------------------------------------:|:----------------------------------------------------------------------:|:----------------------------------------------------------------------:|:----------------------------------------------------------------------:|\n| \u003cimg src=\"screenshots/day/albums-grid.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/day/albums-list.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/day/media.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/day/media-detail.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/day/duplicate-cleanup.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/day/largemedia-cleanup.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/day/oldmedia-cleanup.png\" width=\"400\" height=\"300\"/\u003e |\n\n\n\n### 🌙 Dark Mode\n\n| Album Screen (Grid) | Album Screen (List) | Media List Screen | Media Detail Screen | Cleanup Duplicate Screen | Cleanup Large-Media Screen | Cleanup Old-Media Screen |\n|:-----------------------------------------------------------------------:|:-----------------------------------------------------------------------:|:-----------------------------------------------------------------:|:------------------------------------------------------------------------:|:----------------------------------------------------------------------:|:----------------------------------------------------------------------:|:----------------------------------------------------------------------:|\n| \u003cimg src=\"screenshots/night/albums-grid.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/night/albums-list.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/night/media.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/night/media-detail.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/night/duplicate-cleanup.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/night/largemedia-cleanup.png\" width=\"400\" height=\"300\"/\u003e | \u003cimg src=\"screenshots/night/old-media-cleanup.png\" width=\"400\" height=\"300\"/\u003e |\n\n\n## 🧠 Architecture\n\n🧱 **Clean MVI + Modularized Architecture**  \nMaintains strict separation of concerns between layers.\n\n### 📁 Module Structure\n\n| Module       | Description                                              |\n|-------------------------|----------------------------------------------------------|\n| `app/`                  | Application entry point and DI setup.                   |\n| `core/`                 | Common utilities like permissions management.           |\n| `domain/`               | Business models and use cases (pure Kotlin).            |\n| `data/`                 | Repository implementations, media management.           |\n| `feature/albums/`       | Albums screen, view models, UI components.               |\n| `feature/media/`        | Media listing screen, view models, UI components.        |\n| `feature/smart-cleaner/`| Identify large files, duplicates, and low-quality media for cleanup.        |\n\n\n## 🚀 Libraries \u0026 Tech Stack\n\n### 🧰 Core Technologies\n\n- **Kotlin** — Modern Android language.\n- **Jetpack Compose** — Declarative UI toolkit.\n- **Coroutines \u0026 Flow** — Async \u0026 reactive data streams.\n- **Navigation (Compose)** — Type-safe screen navigation.\n- **Hilt** — Dependency Injection framework.\n\n### 🧪 Testing Libraries\n\n- **JUnit4** — Unit testing framework.\n- **MockK** — Mocks/stubs for testing.\n- **Turbine** — Test Kotlin Flow emissions.\n\n\n## 🧪 Testing Strategy\n\n### 🧷 Unit Tests\n\n- ✅ *ViewModel\n- ✅ *Repository\n- ✅ *UseCases\n\nAll tests utilize `MockK`, `Turbine`, and `Compose Test APIs`.\n\n```bash\n./gradlew clean test\n```\n\n## 💡 Thought Process\n\n* Adopted a **Clean MVI** architecture to ensure clear separation of concerns and scalable code structure.\n* Used **Jetpack Compose** for modern, declarative, and efficient UI development.\n* Applied **Dagger-Hilt** for lightweight and easy-to-manage dependency injection.\n* Focused heavily on **testability**, **modularization**, and **best Kotlin practices** for long-term maintainability.\n\n# 📌 GalleryOn – Phase 2 Feature Backlog\n\n| Priority | Feature                     | Module              | Description                                                                 | Status  | Target Milestone |\n|----------|-----------------------------|---------------------|-----------------------------------------------------------------------------|---------|------------------|\n| ⭐ High   | Smart Cleaner               | `feature-cleaner`   | Identify large files, duplicates, and low-quality media for cleanup.        | ✅ Done | v2.0.0           |\n| ⭐ High   | Album Management            | `feature-albums`    | Create albums.                                                              | ✅ Done | v2.0.0           |\n| ⭐ High   | Search Functionality        | `feature-search`    | Global search by name, date, tags, or file type.                            | 🔜 Todo | v2.1.0           |\n| ⭐ High   | Tagging System              | `feature-tagging`   | Let users assign tags and filter media accordingly.                         | 🔜 Todo | v2.1.0           |\n| ⭐ High   | Vault Mode (Private Albums) | `feature-vault`     | Add biometric-secured private albums.                                       | 🔜 Todo | v2.2.0           |\n| ⭐ High   | Cloud Backup Integration    | `feature-cloud`     | Optional Google Drive/Dropbox backup for media.                             | 🧪 Idea | v2.3.0           |\n| ⭐ Medium| Sort \u0026 Filter Controls      | `feature-media`     | Filter media by size, type, date; sort by date, name, or size.               | 🔜 Todo | v2.3.0           |\n| ⭐ Medium| AI Categorization            | `feature-ai`        | Use ML Kit to categorize photos (e.g., people, travel, food).               | 🧪 Idea | v2.4.0           |\n| ⭐ Medium| Media Editor Options         | `feature-edit`      | Crop, rotate, compress, or trim media within app.                           | 🧪 Idea | v2.5.0           |\n| ⭐ Medium| Crash Reporting              | `core-analytics`    | Firebase Crashlytics integration for error monitoring.                      | 🔜 Todo | v2.0.0           |\n| ⭐ Low   | Favorites View               | `feature-favorites` | Mark favorite media and access them quickly.                                | 🔜 Todo | v2.2.0           |\n| ⭐ Low   | Custom Themes                | `feature-theme`     | Offer user-selectable themes (light/dark/custom accent colors).             | 🔜 Todo | v2.6.0           |\n| ⭐ Low   | Sharing Suggestions          | `feature-share`     | Show nearby friends/devices to share media easily.                          | 🧪 Idea | v2.6.0           |\n\n\n## 👨‍💻 Author\n\n**Mirza Arslan**\u003cbr\u003e\n📧 mirzaarslan450@gmail.com\u003cbr\u003e\n🔗 [LinkedIn](https://www.linkedin.com/in/mirza-arslan/)\n\n## 🧭 Final Thoughts\n\n**GalleryOn** showcases a modern Android media application built with a focus on clean architecture, performance, and best development practices.  \nThe project emphasizes modularity, test coverage, scalability, and a smooth user experience.  \nFeel free to explore it, and suggestions for improvements are always welcome! 🚀\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farslan555%2Fgalleryon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farslan555%2Fgalleryon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farslan555%2Fgalleryon/lists"}