FeedGator (FG) is a modular Android feed aggregator built with a layered architecture (presentation, domain, data) using MVVM + Repository. Dependencies are wired manually through a shared AppContainer, which is used by the UI, ViewModels, repositories, WorkManager workers, and widgets.
This app was a project for an Android course at JTH with 2 other contributors that remain anonymous. Received grade 5 out of 5.
| Layer | Responsibilities | Key types |
|---|---|---|
| Presentation | Compose UI + ViewModels render StateFlow-driven screens and navigation. |
NewsFeedScreen, ArticleScreen, FGNavGraph, FeedViewModel |
| Domain | Stable models and contracts that are UI/persistence agnostic. | Article, DataSource, FeedMetadata, FeedRepository |
| Data | Room + repositories + provider parsing. | FGDatabase, FeedRepositoryRoom, SourceRepositoryRoom, RSSContentProvider |
| Background | WorkManager refresh pipeline. | FeedRefreshWorkManager, FeedRefreshWorker, FeedRefreshDispatcherWorker |
| Manual DI | Explicit object graph shared across UI/VM/workers/widgets. | FGApplication, FGAppContainer, FGWorkerFactory |
FGApplication builds the shared FGAppContainer, installs FGWorkerFactory for WorkManager, and seeds a default RSS source that points at docs/xml/showcase.xml. This keeps the DI graph explicit and re-used across screens, widgets, and background work.
FeedGator is DB-first: Room is the single source of truth. UI and widgets subscribe to Flow from repositories. Refresh operations fetch remote content through providers and write back to Room, which in turn emits state updates to the UI.
UI events → ViewModel → FeedRefreshController → WorkManager
→ FeedRefreshWorker → FeedRepositoryRoom → ContentProvider
→ Room update → Flow emission → UI/Widget recomposition
| Capability | Implementation |
|---|---|
| Pluggable providers | ContentProviderFactory routes to RSSContentProvider (RSS/Atom XML today) and can be easily modified for new providers. See WorldNewsAPIContentProvider placeholder |
| Refresh triggers | Pull-to-refresh and periodic background work both enqueue WorkManager jobs. |
| Rendering | Article bodies rendered via WebView with HTML decode + CSS injection. |
| Rich media | High resolution Images/video are supported when present in feed HTML and supported by WebView. |
- Navigation is route-based using
NavHost(FGNavGraph). - Screens are state-driven:
FeedViewModelandArticleViewModelexposeStateFlowUI state that Compose collects. - User input uses Material 3 UI elements, and the navigation rail surfaces sources with compact icons for quick scanning.








