Skip to content

[EPIC] MMEX V2 Rewrite: Modernizing the Android App with Clean Architecture & Jetpack Compose聽#2963

Description

@wolfsolver

馃殌 The Vision: MMEX Android V2

The current Android codebase has served us well over the years, but it's built on older technologies (XML layouts, legacy patterns) that make adding new features, maintaining the app, and achieving high performance increasingly difficult.

It鈥檚 time for a major leap forward. I am proposing (and starting) a complete rewrite of the MMEX Android app from scratch, targeting a fully modern Android stack.

Video


馃彈 Architectural Guidelines & Tech Stack

To ensure this rewrite is sustainable, highly testable, and ready for future integrations (like MMX Sync / PocketBase syncing), we are adopting strict architectural rules.

Core Stack:

  • Language: 100% Kotlin (idiomatic, using sealed classes and scope functions).
  • UI Toolkit: Jetpack Compose + Material Design 3. (No XML, Fragments, or RecyclerViews).
  • Asynchronous Programming: Kotlin Coroutines & Flow (StateFlow / SharedFlow).
  • Dependency Injection: Hilt.
  • Database: Room (with KSP).

Clean Architecture Structure:
We are strictly separating concerns into three layers:

  1. domain: The core of the app. Pure Kotlin models (DTOs) and Use Cases. No Android or database dependencies.
  2. data: The only layer aware of Room and external sources. It maps our legacy database into clean domain models via Mappers.
  3. presentation: Jetpack Compose UI and ViewModels (MVVM/MVI pattern). UI components must be stateless, and state is hoisted via StateFlow.

馃洝 The Legacy Database Rule

The existing SQLite desktop database schema is strictly untouchable. To maintain 100% compatibility with the desktop version of Money Manager Ex, we cannot alter the tables.

  • Room will be configured using createFromFile() to hook into the existing .db.
  • We will use Room @Entity and @ColumnInfo to map the legacy naming conventions, but these entities must never leak into the presentation or domain layers. They will be immediately mapped to clean Domain Models.

馃洡 Execution Strategy: The Strangler Fig Pattern

To avoid breaking the current app and to keep the repository stable, we are not refactoring "in place".

  1. New Module: All new code will live in a completely isolated module called :app_v2.
  2. Vertical Slices: We will not build horizontal layers (e.g., "all DAOs first"). We will develop feature by feature (Vertical Slices): Database -> Mapper -> UseCase -> ViewModel -> Compose UI.
  3. Phase 1 (Read-Only MVP): The first milestone is building a read-only MVP (Homepage Dashboard, Accounts list, and Transactions) to validate the Room integration and the new Compose UI without risking data corruption.

馃 Feedback & Contributions

This is a massive undertaking, but the result will be a lightning-fast, beautiful, and easily maintainable app.
I'd love to hear feedback from the community on this architectural approach. If anyone wants to jump in, let's coordinate in the comments below to assign specific vertical slices!

screen preview

Screenshot_20260613-204105.png

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions