Skip to content

StarProfile, multimodule android app following the Test Driven Development (TDD) approach and clean code architecture

Notifications You must be signed in to change notification settings

arslan555/StarProfiles

Repository files navigation

GituhbStarRepos App ✨📱🚀

Overview 🌟📱🧪🔧🚀

  • Application for viewing starred github repositories 📱🌟✨
  • Implement a test-driven development (TDD) approach to ensure high code quality and reliability 🧪📝
  • Utilize a multi-module architecture to achieve modularity and maintainability 🧩
  • Integrate Hilt for dependency injection and enhance code organization 🗝️
  • Utilize Coroutines and Flow for asynchronous programming and reactive data streams ⚡🌊
  • Follow Material Design guidelines to provide a visually appealing and user-friendly interface 🎨

Previews 📷

🌞 Light Theme 🌞

drawing drawing drawing drawing drawing

🌑 Dark Theme 🌑

drawing drawing drawing drawing drawing

Test Cases 🧪

🔬 Unit Tests (with code coverage) 🔬

includes unit tests of Network module, data module( repository layer), common module, Feature module (ViewModels)

drawing drawing drawing drawing drawing

📱 UI Tests 📱

drawing

drawing

drawing

drawing

Tech Stack & Open Source Libraries 🛠

Architecture 🏛️

This app has been fully modularized.

🌟 Overview 🌟

Modularization is the practice of breaking the concept of a monolithic, one-module codebase into loosely coupled, self contained modules.

💡 Benefits of Modularization 💡

This offers many benefits, including:

Scalability - In a tightly coupled codebase, a single change can trigger a cascade of alterations. A properly modularized project will embrace the separation of concerns principle. This in turn empowers the contributors with more autonomy while also enforcing architectural patterns.

Enabling work in parallel - Modularization helps decrease version control conflicts and enables more efficient work in parallel for developers in larger teams.

Ownership - A module can have a dedicated owner who is responsible for maintaining the code and tests, fixing bugs, and reviewing changes.

Encapsulation - Isolated code is easier to read, understand, test and maintain.

Reduced build time - Leveraging Gradle’s parallel and incremental build can reduce build times.

Dynamic delivery - Modularization is a requirement for Play Feature Delivery which allows certain features of your app to be delivered conditionally or downloaded on demand.

Reusability - Proper modularization enables opportunities for code sharing and building multiple apps, across different platforms, from the same foundation.

📦 Types of Modules in GitHubStarRepos 📦

  • The app module - contains app level and scaffolding classes that bind the rest of the codebase, such as MainActivity. The app module depends on all feature modules and required core modules.

  • feature: modules - feature specific modules which are scoped to handle a single responsibility in the app. These modules can be reused by any app, including test or other flavoured apps, when needed, while still keeping it separated and isolated.

  • core: modules - common library modules containing auxiliary code and specific dependencies that need to be shared between other modules in the app. These modules can depend on other core modules, but they shouldn’t depend on feature nor app modules.

🧩 Modules 🧩

Name Responsibilities
app Brings everything together required for the app to function correctly. This includes UI scaffolding and navigation.
feature:1,
...
Functionality associated with a specific feature or user journey. Typically contains UI components and ViewModels which read data from other modules.
Examples include:
    feature:trending displays information about starred repositories of specific programming language
core:data Fetching app data from multiple sources, shared by different features.
core:ui Composite UI components and resources used by feature modules, such as the repos feed. It is dependent on the data layer since it renders models, like star repos.
core:common Common classes shared between modules.
core:network Making network requests and handling responses from a remote data source.
core:testing Testing dependencies, repositories and util classes.
core:datastore Storing persistent data using DataStore.
core:model Model classes used throughout the app.

Developed by 👨‍💻

Mirza Arslan

Medium Linkedin