Thanks to visit codestin.com
Credit goes to github.com

Skip to content

muhamedamin308/wavora

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

27 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🎡 WAVORA

Where Every Wave Tells a Story

Platform Min SDK Language License Build


WAVORA is a production-grade, offline-first Android music player built to demonstrate clean architecture, modern Android engineering, and attention to every detail β€” from battery-aware ExoPlayer buffers to TalkBack-ready semantic modifiers.

No subscriptions. No accounts. No internet required. Your music, your device, your privacy.


✨ Features

Category Feature Status
Library Songs, Albums, Artists, Folders, Playlists βœ…
Playback ExoPlayer + MediaSession + ForegroundService βœ…
Controls Background notification, Bluetooth, lock screen βœ…
Queue Add / remove / drag-reorder, persist across kills βœ…
Playlists Create / rename / delete / reorder songs βœ…
Smart Playlists Most Played, Recently Played, Recently Added, Favourites βœ…
Search FTS4 full-text search across songs, albums, artists βœ…
Now Playing Album art with palette gradient, seek bar, favourite βœ…
Equalizer 5-band EQ with 10 presets (Android AudioEffect) βœ…
Lyrics Animated panel, LRC sync ready (Phase 9 full impl) βœ…
Sleep Timer 5–60 min options, active countdown display βœ…
Settings Dark/dynamic theme, gapless, crossfade, skip duration βœ…
Performance Battery-aware buffers, Coil cache tuning, scan throttle βœ…
Accessibility Full TalkBack support with semantic modifiers βœ…
Onboarding Animated first-launch permission flow βœ…

πŸ“‹ Requirements

Tool Version
Android Studio Hedgehog (2023.1.1) or newer
JDK 17 (Temurin recommended)
Android SDK API 34
Gradle 8.x (wrapper included)

Min SDK: Android 8.0 (API 26)
Target SDK: Android 14 (API 34)


πŸš€ Getting Started

# Clone
git clone https://github.com/muhamedamin308/wavora.git
cd wavora

# Build debug APK
./gradlew assembleDebug

# Install on connected device
./gradlew installDebug

# Run unit tests
./gradlew test

# Run instrumented tests (requires emulator/device)
./gradlew connectedAndroidTest

The debug APK is placed at app/build/outputs/apk/debug/app-debug.apk.


πŸ— Architecture

WAVORA follows MVVM + Clean Architecture with strict layer separation:

UI Layer (Compose)
    ↓  uiState: StateFlow<UiState>
    ↑  events: Flow<Event>
ViewModel (BaseViewModel)
    ↓  suspend / Flow calls
Repository Interface (domain)
    ↓
Repository Implementation (data)
    β”œβ”€β”€ Room Database   (single source of truth)
    β”œβ”€β”€ MediaStore API  (device music discovery)
    └── DataStore       (user preferences)

See ARCHITECTURE.md for a detailed breakdown of every layer, key design decisions, and the reasoning behind them.


πŸ“‚ Module Map

app/src/main/java/com/wavora/app/
β”œβ”€β”€ core/
β”‚   β”œβ”€β”€ base/           BaseViewModel, AsyncResult
β”‚   β”œβ”€β”€ performance/    BatteryAwareBufferConfig, CoilImageCacheConfig, ScanThrottleManager
β”‚   └── util/           Extensions, Constants
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ local/
β”‚   β”‚   β”œβ”€β”€ dao/        SongDao, AlbumDao, ArtistDao, PlaylistDao, PlayHistoryDao, QueueDao
β”‚   β”‚   └── entity/     Room entities with FTS4 shadow table
β”‚   β”œβ”€β”€ mediastore/     MediaStoreScanner
β”‚   β”œβ”€β”€ preferences/    UserPreferencesRepositoryImpl (DataStore)
β”‚   └── repository/     MusicRepositoryImpl, PlaylistRepositoryImpl, PlayerRepositoryImpl
β”œβ”€β”€ di/                 AppModule, DatabaseModule, PlayerModule, PreferencesModule, WorkerModule
β”œβ”€β”€ domain/
β”‚   β”œβ”€β”€ model/          Song, Album, Artist, Playlist, PlayerState, UserPreferences
β”‚   └── repository/     Repository interfaces (contracts)
β”œβ”€β”€ navigation/         WavoraNavHost, WavoraRoutes
β”œβ”€β”€ player/
β”‚   β”œβ”€β”€ notification/   WavoraNotificationManager (Media3 PlayerNotificationManager)
β”‚   β”œβ”€β”€ queue/          QueueManager (pure Kotlin, Fisher-Yates shuffle)
β”‚   └── service/        WavoraPlaybackService (MediaSessionService + ExoPlayer)
β”‚                       AudioFocusManager (ducking, BECOME_NOISY)
β”œβ”€β”€ ui/
β”‚   β”œβ”€β”€ album/          AlbumDetailScreen + ViewModel
β”‚   β”œβ”€β”€ artist/         ArtistDetailScreen + ViewModel
β”‚   β”œβ”€β”€ components/     MiniPlayer, SleepTimerSheet, LyricsPanel, Accessibility, Dialogs
β”‚   β”œβ”€β”€ equalizer/      EqualizerScreen + ViewModel (Android AudioEffect)
β”‚   β”œβ”€β”€ folder/         FolderDetailScreen + ViewModel
β”‚   β”œβ”€β”€ library/        LibraryScreen + LibraryViewModel (5-tab pager)
β”‚   β”œβ”€β”€ onboarding/     OnboardingScreen (first-launch permission flow)
β”‚   β”œβ”€β”€ player/         NowPlayingScreen + PlayerViewModel
β”‚   β”œβ”€β”€ playlist/       PlaylistScreen + PlaylistViewModel
β”‚   β”œβ”€β”€ queue/          QueueScreen + QueueViewModel (drag-reorder)
β”‚   β”œβ”€β”€ search/         SearchScreen + SearchViewModel (debounced FTS4)
β”‚   β”œβ”€β”€ settings/       SettingsScreen + SettingsViewModel (DataStore)
β”‚   β”œβ”€β”€ smartplaylist/  SmartPlaylistScreen + ViewModel (4 auto-playlists)
β”‚   └── theme/          Color, Shape, Type, WavoraTheme (OLED dark + Material You)
└── worker/             LibraryScanWorker (@HiltWorker, WorkManager)

πŸ›  Tech Stack

Layer Technology Reason
UI Jetpack Compose + Material 3 Declarative, type-safe, single toolkit
Navigation Navigation Compose Type-safe routes, back stack management
Playback Media3 / ExoPlayer Hardware decode, MediaSession, Auto/WearOS
Background MediaSessionService Foreground service lifecycle managed by Media3
Database Room + SQLite FTS4 for search, strict migrations, type-safe DAOs
DI Hilt (Dagger 2) Compile-time verified, scoped lifetimes
Async Coroutines + Flow Structured concurrency, reactive UI
Images Coil 2 Compose-native, disk + memory cache, RGB_565
Preferences DataStore (Preferences) Async, crash-safe, replaces SharedPreferences
Background jobs WorkManager Doze-mode safe, battery constraints
Build Gradle KTS + Version Catalogs Type-safe, single source of truth for versions

πŸ”‹ Performance & Battery

  • Adaptive ExoPlayer buffers β€” 50s generous (charging) vs 8s conservative (battery saver / < 20%)
  • Coil cache β€” 15% heap (vs default 25%), 100 MB disk, allowRgb565(true) for 50% RAM reduction
  • Scan throttle β€” 15-minute cooldown prevents MediaStore burst scans
  • WorkManager constraints β€” periodic scans only on BATTERY_NOT_LOW + STORAGE_NOT_LOW
  • Log stripping β€” android.util.Log.v/d/i removed from release via R8 assumenosideeffects
  • R8 full mode β€” enabled in gradle.properties for maximal dead-code removal

πŸ§ͺ Tests

220 unit tests    (JVM, zero Android dependencies)
 32 instrumented  (Room in-memory, Android JUnit4)
───────────────────
252 total
./gradlew test                          # unit tests, HTML report at app/build/reports/tests/
./gradlew connectedAndroidTest          # instrumented (Room DAO integration tests)
./gradlew koverXmlReport                # code coverage (add Kover plugin for full report)

Key test areas: QueueManager (27 cases), ExtensionsTest (32 cases), SongDaoIntegrationTest (19 cases), PlaylistDaoIntegrationTest (13 cases β€” including the 3-step atomic reorder transaction).


🀝 Contributing

See CONTRIBUTING.md for branch naming, commit conventions, code style requirements, and the PR checklist.


πŸ“œ Changelog

See CHANGELOG.md for a full version history.


βš–οΈ License

MIT License β€” Copyright (c) 2024 WAVORA Contributors

See LICENSE for the full text.


Built with 🎧 and clean code principles.

About

WAVORA is a premium offline-first Android music player engineered with clean architecture, deep system integration, and intelligent battery management. The name blends Wave (audio waveforms, sound physics) with Aura (presence, atmosphere) β€” reflecting music that surrounds and defines you.

Topics

Resources

License

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages