Evently is a high-performance event tracking application developed as a technical case study. It demonstrates a robust implementation of modern Android standards, focusing on clean separation of concerns, reactive data management, and lifecycle-aware components.
The project successfully implements all core requirements from the ID3 Android Case Study:
- Modern UI: Built with Material 3 and Data Binding for a seamless, declarative UI.
- Architecture: Structured using MVVM and Clean Architecture to ensure testability and scalability.
- Live Updates: Real-time "Live Status" monitoring with an automated 30-second polling cycle.
- Lifecycle Awareness: Intelligent resource management where background updates pause strictly when the tab is not visible or the fragment is in the background.
The application is strictly partitioned into three layers to ensure business logic remains independent of UI and data providers:
- Entities: Core models such as
Event,Comment, andParticipant. - Use Cases: Granular, single-responsibility classes like
GetLiveStatusUseCaseandGetEventDetailUseCase. - Repository Interfaces: Defined abstractions to decouple domain logic from specific data implementations (Dependency Inversion).
- Repository Implementation:
EventRepositoryImplleverages RxJava 3 to provide a reactive data stream from mock sources, architected for effortless transition to remote APIs.
- ViewModels: Orchestrates UI state and business logic execution.
- ViewState Pattern: Centralized state management handling Loading, Success, and Error states reactively via LiveData.
- Data Binding: Optimized interaction between XML layouts and ViewModels, significantly reducing boilerplate code in Fragments.
| Category | Technology | Implementation Detail |
|---|---|---|
| Concurrency | RxJava 3 | Manages background threading and periodic status polling. |
| DI | Hilt | Manages dependency lifecycles and injection across the app. |
| Navigation | Safe Args | Ensures type-safe argument passing (e.g., eventId) between screens. |
| UI | Material 3 | Utilizes ViewPager2, TabLayout, and modern Material components. |
A key requirement was the Live Status feature, which updates every 30 seconds but must stop when the tab is not visible.
The Solution:
I implemented a reactive timer using RxJava's Observable.interval. To maintain strict lifecycle awareness and resource optimization:
- Subscription Management: The polling mechanism is active only when the
LiveStatusFragmentis visible to the user. - Resource Cleanup: All
Disposableobjects are cleared in the ViewModel'sonCleared()and managed via fragment lifecycle hooks to prevent memory leaks and unnecessary CPU usage.
| Home (Event List) | Participants Tab | Comments Tab | Live Status Tab |
![]() |
![]() |
![]() |
![]() |
app/src/main/java/com/doseyenc/evently/
├── domain/ # Entities, Use Cases, Repository Interfaces
├── data/ # Repository Implementation, Mock Data Sources
├── di/ # Hilt Dependency Injection Modules
├── ui/
│ ├── base/ # ViewState, BaseViewModel, SingleLiveEvent
│ ├── home/ # Event list, filtering, and main navigation
│ └── detail/ # ViewPager2 setup, Participants, Comments, Live Status
└── util/ # DateTime formatters, UI Helpers, Constants
- Clone the repo:
git clone https://github.com/doseyenc/evently.git - Open in Android Studio.
- Ensure JDK 11 and Min SDK 26 are configured.



