This app demonstrates the best practices for Android development and contains a repository of useful features that you can learn from and use in your projects. It shows what I consider to be a "clean and pragmatic Android code".
The architecture, implementation details, tests, etc. in this application follow the practices and guidelines that I teach in my Android development courses.
Huge thanks to Bitrise for sponsoring the Continuous Integration infrastructure in this project!
You can download a prebuilt APK file attached to the latest release, or clone this repo and build the application from the source code.
The application includes auto-update feature. It uses a special Android API that will prompt you to approve the installation of each new version of the application. On the first update, this API will also ask you to enable the auto-update feature in device's settings app.
Alternatively, you can download the latest APK from here and update the application manually, or even build the update from the source code.
Parts of the source code in this app correspond to the articles I published on my blog:
The project is written in Kotlin.
Some parts of the UI use the "classical" Android UI framework (XMLs + Views), while others use Jetpack Compose. There are also screens that demonstrate alternative implementations of UI components using Views and Compose (i.e. you can switch between different implementations of the same UI component).
Packages structure of the application follows package by feature approach.
Dependency injection architectural pattern is implemented using Dagger 2 framework.
Presentation layer logic is organized according to MVC architectural pattern.
Functional flows in the app are encapsulated into Use Case classes.
The logic responsible for navigation between screens is encapsulated in ScreensNavigator
class.
DialogsNavigator
"facade" class is responsible for showing dialogs.
Kotlin Coroutines framework is used for concurrency.
Bug reports, code quality feedback and feature suggestions are welcome. Since this project aims to demonstrate a very specific approach to Android development, any external contribution should be discussed and approved in advance.