Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

🎞 A movie Android app that mimics a real-world project environment, showcasing Clean Architecture, Kotlin, and Jetpack Compose, with Offline-first support.

License

NotificationsYou must be signed in to change notification settings

AliAsadi/Android-Clean-Architecture

Repository files navigation

An Android movie app that simulates a real-world project environment, featuring Clean Architecture, Kotlin, and Jetpack Compose with Offline-first support.

In addition, the project:

  • Iscontinually updated to stay aligned with the latest technologies.
  • Isfully unit-tested.
  • UsesDetekt to ensure code quality.
  • LeveragesKover to generate comprehensive unit test reports.

image

Features

  1. Offline-first: The app can be accessed even without an internet connection.
  2. Pagination: Efficiently loads large amounts of data to improve the user experience.
  3. Search functionality: Allows users to quickly find specific information within the app.
  4. Connectivity Status: Shows a banner to inform users of their connectivity status.
  5. Auto Sync: Uses both NetworkConnectivityStream and WorkManager to ensure data is always up-to-date.
  6. Favorites: Users can add movies to a favorites list.
  7. Pull to Refresh: Allows users to refresh the content by pulling down on the screen.

Unit Test Coverage

The app is unit-tested and uses Kover to generate detailed coverage reports.

image

To generate the coverage report, run:

./gradlew koverTask

This command covers all modules and both main and test sources. You can add this command to your CI pipelines to automatically generate coverage reports with each build. Kover also works well with products like CodeCov for continuous coverage monitoring.

For more details, refer to theOfficial Kover documentation and theCodeCov documentation.

Previous Versions

  • To explore the app's earlierXML-based UI, check out thexml_based_app branch.

  • For a basic version of the appwithout pagination, check out thexml_based_basic_app branch.

Variants

The project has two variants:production andmock.

  1. Mock Variant: Fetches generated mock data.

  2. Production Variant: Calls the production API.

Each variant has a distinctMovieRemoteDataSource implementation, ensuring that in the mock variant, data is generated, while in the production variant, the actual API is called.

image

The Motivation behind the app

This repository was created with the intention of sharing knowledge and using it to implement new challenges and ideas.

Movies Mock Server API

API:Movies Mock Server

This API is the primary data source for the app, providing a mock database of movie information. It is designed to mimic real-world data operations including fetching, updating, and managing movie data.

API Repository:Movies Mock Server Repository

This repository hosts the source code and documentation for the Movies Mock Server API

💡 Architectural Insights

Architecture by its nature isdynamic andever-evolving, there are always several solutions to every problem, and what works best will depend on the specific requirements and constraints of your project.

image

Demo

LightDark

Screenshots

image

Clean Architecture

The core principles of the clean approach can be summarized as followed:

1. The application code is separated into layers.

These layers define the separation of concerns inside the code base.

2. The layers follow a strict dependency rule.

Each layer can only interact with the layers below it.

3. As we move toward the bottom layer — the code becomes generic.

The bottom layers dictate policies and rules, and the upper layers dictate implementation details such as the database, networking manager, and UI.

Architecture Layers

The application consists of three layers:

The domain layer, the data layer, and the presentation layer.

Looking at project’s high-level structure, you’ll see that each layer is represented by a module in the project.

image

I like it because it helps me avoid accidentals “leaks” between the layers.

Structure

Built With 🛠

  • Kotlin - First class and official programming language for Android development.

  • Coroutines - For asynchronous and more..

  • Flow - A cold asynchronous data stream that sequentially emits values and completes normally or with an exception.

  • StateFlow - A live data replacement.

  • Jetpack Compose - Modern toolkit for building native UIs.

  • Android Architecture Components - Collection of libraries that help you design robust, testable, and maintainable apps.

    • Paging3 - Load and display small chunks of data at a time.
    • ViewModel - Stores UI-related data that isn't destroyed on UI changes.
    • SavedStateHandle - A handle to saved state passed down to androidx.lifecycle.ViewModel.
    • Navigation Components - Navigate fragments easier.
    • Room - Persistence library provides an abstraction layer over SQLite to allow for more robust database access while harnessing the full power of SQLite.
    • WorkManager - Schedule deferrable, asynchronous tasks
  • Dependency Injection

    • Hilt - Easier way to incorporate Dagger DI into Android application.
  • Retrofit - A type-safe HTTP client for Android and Java.

  • Mockito - For Mocking and Unit Testing

💎 Code Style

The code style in this project was ensured usingDetekt.

Check command:

./gradlew detektTask

License

   Copyright (C) 2020 Ali Asadi   Licensed under the Apache License, Version 2.0 (the "License");   you may not use this file except in compliance with the License.   You may obtain a copy of the License at       http://www.apache.org/licenses/LICENSE-2.0   Unless required by applicable law or agreed to in writing, software   distributed under the License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the License for the specific language governing permissions and   limitations under the License.

Contributing

Just make pull request. You are in!


[8]ページ先頭

©2009-2025 Movatter.jp