Skip to content

imgurujeet/MFET

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📈 MFET — Mutual Fund Explorer & Tracker

A production-grade Android application for discovering, analysing, and tracking mutual funds — built with modern Kotlin and Jetpack Compose.

Kotlin Jetpack Compose Architecture DI API Release

📱 Screenshots

Explore Empty State FundDetail AddToWatchList
View All Watchlist Search EmptyPortfolio

✨ Features

  • Explore Screen — Curated discovery across 4 fund categories: Index, Bluechip, Tax Saver (ELSS), and Large Cap
  • Fund Detail Screen — AMC info, scheme type, latest NAV, and an interactive NAV history line chart
  • Watchlist Management — Create and manage multiple custom watchlist folders with persistent local storage
  • Infinite Scroll View All — Lazy-loaded list of all funds in a category with smooth performance
  • Fund Search — Real-time search with 300ms debounce to minimise unnecessary API calls
  • Add to Watchlist BottomSheet — Select multiple folders or create a new one directly from the product screen
  • Offline Support — Explore screen data is cached locally; app shows stale data gracefully when offline
  • Empty States — Illustrated, descriptive empty states across all screens
  • Light / Dark Theme — Dynamic theme switching with full system support
  • Loading / Error States — Explicit UI states for every async operation

🏗️ Architecture

The project follows MVVM + Clean Architecture, with a clear separation of concerns across three layers:

com.imgurujeet.mfet/
│
├── data/
│   ├── local/          # Room database — entities, DAOs, database class
│   ├── mapper/         # Data ↔ domain model mappers
│   ├── remote/         # Retrofit API service + response DTOs
│   └── repository/     # Repository implementations
│
├── di/                 # Koin modules (network, database, repository bindings)
│
├── domain/
│   ├── model/          # Pure Kotlin domain models
│   ├── repository/     # Repository interfaces
│   └── usecase/        # Use cases (one action per class)
│
├── ui/
│   ├── common/         # Shared utilities, extensions, base classes
│   ├── components/     # Reusable Composables (charts, cards, loaders)
│   ├── explore/        # Explore screen — ViewModel + Composables
│   ├── navigation/     # Compose navigation graph & routes
│   ├── product/        # Fund detail screen — ViewModel + Composables
│   ├── search/         # Search screen — ViewModel + Composables
│   ├── theme/          # Material 3 theme, typography, colour tokens
│   ├── viewall/        # View All screen — ViewModel + Composables
│   ├── watchlist/      # Watchlist screen — ViewModel + Composables
│   ├── MainActivity    # Single activity host
│   └── MyApp           # Application class (Koin initialisation)
│
└── res/                # Drawables, strings, fonts

Data Flow

UI (Composable)
     ↕ State / Events
ViewModel (StateFlow)
     ↕ Use Cases
Repository (Interface)
     ↕
Repository Impl ─── Remote (Retrofit + MFAPI)
                └── Local  (Room)

🧰 Tech Stack & Libraries

Category Library Purpose
UI Jetpack Compose + Material 3 Declarative UI, theming
Architecture ViewModel + StateFlow MVVM state management
DI Koin Dependency injection
Networking Retrofit + OkHttp + Gson REST API calls to mfapi.in
Local DB Room Persistent watchlist storage
Caching Room / local storage Explore screen offline cache
Charts Vico (or MPAndroidChart) NAV history line chart
Navigation Compose Navigation Type-safe screen navigation
Coroutines Kotlin Coroutines + Flow Async / reactive data streams

🌐 API Reference

All data is sourced from the free MFAPI endpoint.

Endpoint Usage
GET /mf/search?q={query} Populate Explore categories (e.g. q=index, q=bluechip, q=tax, q=large cap)
GET /mf/{scheme_code} Fetch fund details + full NAV history

Note on Explore screen data: Since mfapi.in has no category endpoint, each category is populated by querying the Search API with a relevant keyword (e.g. q=index, q=bluechip). Results are cached locally so the Explore screen can show the last known data when offline.


🚀 Getting Started

Prerequisites

  • Android Studio Hedgehog or later
  • JDK 17+
  • Android SDK 26+

Run Locally

# 1. Clone the repository
git clone https://github.com/imgurujeet/MFET.git

# 2. Open in Android Studio
# File → Open → Select the MFET folder

# 3. Let Gradle sync complete

# 4. Run on emulator or physical device
# Run → Run 'app'

No API keys required — MFAPI is completely free and open.

Install APK directly

⬇️ Download app-release.apk (v1.0)

Enable Install from unknown sources in your device settings, then open the downloaded APK.


🔑 Key Implementation Decisions

NAV chart — Uses a limited set of data instead of full history to keep the chart responsive, with options like 1M, 6M, 1Y, and All.

Watchlist state — Bookmark icon is connected to Room via StateFlow, so it updates automatically.

Scrolling — Uses LazyColumn for efficient rendering of lists.

Content-aware scroll — Some UI elements adjust based on scroll to give more space to content.


🙋‍♂️ Connect with me

   


Built with ❤️ using Kotlin & Jetpack Compose

About

Mutual Fund Explorer app built with Kotlin & Jetpack Compose featuring fund discovery, NAV charts, search, and watchlist management.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages