[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7224":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":17,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":16,"starSnapshotCount":16,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},7224,"android-showcase","igorwojda\u002Fandroid-showcase","igorwojda","💎 Android application following best practices:  Kotlin, Coroutines, JetPack, Clean Architecture, Feature Modules, Tests, MVVM, DI, Static Analysis...","",null,"Kotlin",6760,907,108,5,0,1,8,39.87,"MIT License",false,"main",true,[25,26,27,28,29,30,31,32,33,34],"android","android-application","architecture","best-practices","clean-architecture","gradle","jetpack","kotlin","kotlin-coroutines","mvvm","2026-06-12 02:01:36","# 💎 Android Showcase 2.0\n\n[![Kotlin Version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FKotlin-2.x-blue.svg)](https:\u002F\u002Fkotlinlang.org)\n[![AGP](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FAGP-8.x-blue?style=flat)](https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Freleases\u002Fgradle-plugin)\n[![Gradle](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGradle-9.x-blue?style=flat)](https:\u002F\u002Fgradle.org)\n[![CodeFactor](https:\u002F\u002Fwww.codefactor.io\u002Frepository\u002Fgithub\u002Figorwojda\u002Fandroid-showcase\u002Fbadge)](https:\u002F\u002Fwww.codefactor.io\u002Frepository\u002Fgithub\u002Figorwojda\u002Fandroid-showcase)\n\nA production-ready Android application demonstrating modern development practices and architectural patterns. This project showcases how to build scalable, maintainable, and testable Android applications using industry-standard tools and libraries.\n\nBuilt with **Clean Architecture** principles, this app serves as a comprehensive example of modular design, advanced Gradle configuration, and robust CI\u002FCD practices. Perfect for teams looking to establish solid architectural foundations for large-scale Android projects.\n\n- [💎 Android Showcase 2.0](#-android-showcase-20)\n  - [Application Scope](#application-scope)\n  - [Tech-Stack](#tech-stack)\n  - [Architecture](#architecture)\n    - [Module Types and Dependencies](#module-types-and-dependencies)\n    - [Feature Module Structure](#feature-module-structure)\n      - [Presentation Layer](#presentation-layer)\n      - [Domain Layer](#domain-layer)\n      - [Data Layer](#data-layer)\n      - [Common Module Components](#common-module-components)\n    - [Data Flow](#data-flow)\n  - [Project Features](#project-features)\n    - [Development \\& Debugging](#development--debugging)\n    - [Custom Icons For Each Variant](#custom-icons-for-each-variant)\n    - [Themed Icons](#themed-icons)\n  - [Gradle Config](#gradle-config)\n    - [Dependency Management](#dependency-management)\n    - [Convention Plugins](#convention-plugins)\n    - [Type Safe Project Accessors](#type-safe-project-accessors)\n    - [Unified Version Configuration](#unified-version-configuration)\n      - [Java\u002FJVM Version Configuration](#javajvm-version-configuration)\n    - [Generated type-safe version catalogs accessors in `build-logic` module](#generated-type-safe-version-catalogs-accessors-in-build-logic-module)\n    - [Gradle Configuration Cache](#gradle-configuration-cache)\n  - [Code Verification](#code-verification)\n    - [CI Pipeline](#ci-pipeline)\n    - [Pre-push Hooks](#pre-push-hooks)\n  - [Project Scope \\& Limitations](#project-scope--limitations)\n  - [Getting Started](#getting-started)\n  - [Roadmap](#roadmap)\n  - [Resources](#resources)\n  - [Contributing](#contributing)\n  - [Author](#author)\n  - [License](#license)\n  - [Animations License](#animations-license)\n\n## Application Scope\n\nA music discovery app built with Jetpack Compose that displays album information sourced from the [Last.fm API](https:\u002F\u002Fwww.last.fm\u002Fapi). The application demonstrates real-world scenarios including network requests, local caching, navigation, and state management.\n\n**Features:**\n- **Album List** - Browse albums with search functionality\n- **Album Details** - View detailed album information and track listings  \n- **Favorites** - Save preferred albums (WIP)\n- **Profile** - User preferences and settings (WIP)\n\n\u003Cp>\n  \u003Cimg src=\"misc\u002Fimage\u002Fscreen_album_list.png\" width=\"250\" \u002F>\n  \u003Cimg src=\"misc\u002Fimage\u002Fscreen_album_detail.png\" width=\"250\" \u002F>\n  \u003Cimg src=\"misc\u002Fimage\u002Fscreen_favorites.png\" width=\"250\" \u002F>\n  \u003Cimg src=\"misc\u002Fimage\u002Fscreen_settings.png\" width=\"250\" \u002F>\n  \u003Cimg src=\"misc\u002Fimage\u002Fscreen_open_source_libraries.png\" width=\"250\" \u002F>\n\u003C\u002Fp>\n\n## Tech-Stack\n\nBuilt with modern Android development tools and libraries, prioritizing, project structure stability and production-readiness.\n\n**Core Technologies:**\n- **[Kotlin 2.2+](https:\u002F\u002Fkotlinlang.org\u002F)** - Modern, expressive programming language\n  - **[Coroutines](https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fcoroutines-overview.html)** - Asynchronous programming\n  - **[Flow](https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fflow.html)** - Reactive data streams\n  - **[KSP (Kotlin Symbol Processing)](https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fksp-overview.html)** - Kotlin Symbol Processing\n  - **[Serialization](https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fserialization.html)** - JSON parsing\n\n**Android Jetpack:**\n- **[Compose](https:\u002F\u002Fdeveloper.android.com\u002Fjetpack\u002Fcompose)** - Declarative UI framework\n- **[Navigation Compose](https:\u002F\u002Fdeveloper.android.com\u002Fjetpack\u002Fcompose\u002Fnavigation)** - Type-safe navigation\n- **[ViewModel](https:\u002F\u002Fdeveloper.android.com\u002Ftopic\u002Flibraries\u002Farchitecture\u002Fviewmodel)** - UI-related data management\n- **[Room](https:\u002F\u002Fdeveloper.android.com\u002Fjetpack\u002Fandroidx\u002Freleases\u002Froom)** - Local database with SQLite\n- **[Core Splashscreen](https:\u002F\u002Fdeveloper.android.com\u002Fjetpack\u002Fandroidx\u002Freleases\u002Fcore#core_splashscreen_version_12_2)** - app Splashscreen\n\n**Networking & Images:**\n- **[Retrofit](https:\u002F\u002Fsquare.github.io\u002Fretrofit\u002F)** - HTTP client for API communication\n- **[Coil](https:\u002F\u002Fgithub.com\u002Fcoil-kt\u002Fcoil)** - Image loading optimized for Compose\n\n**Dependency Injection:**\n- **[Koin](https:\u002F\u002Finsert-koin.io\u002F)** - Lightweight dependency injection framework\n\n**Architecture:**\n- **[Clean Architecture](https:\u002F\u002Fblog.cleancoder.com\u002Funcle-bob\u002F2012\u002F08\u002F13\u002Fthe-clean-architecture.html)** - Separation of concerns with defined layers\n- **Single Activity Architecture** - Modern navigation approach\n- **MVVM + MVI** - Reactive presentation layer pattern providing common UI state.\n- **Modular Design** - Feature-based modules for scalability\n\n**UI & Design:**\n- **[Material Design 3](https:\u002F\u002Fm3.material.io\u002F)** - Latest design system\n- **[Dynamic Theming](https:\u002F\u002Fm3.material.io\u002Fstyles\u002Fcolor\u002Fdynamic-color\u002Foverview)** - Wallpaper-based themes (Android 12+)\n- **[Dark Theme](https:\u002F\u002Fmaterial.io\u002Fdevelop\u002Fandroid\u002Ftheming\u002Fdark)** - System-aware dark mode\n- **[Lottie](http:\u002F\u002Fairbnb.io\u002Flottie)** - Vector animations\n\n**Testing:**\n- **[JUnit 6](https:\u002F\u002Fjunit.org\u002F)** - Modern testing framework\n- **[Mockk](https:\u002F\u002Fmockk.io\u002F)** - Kotlin-first mocking library\n- **[Kluent](https:\u002F\u002Fgithub.com\u002FMarkusAmshove\u002FKluent)** - Fluent assertion library\n- **[Espresso](https:\u002F\u002Fdeveloper.android.com\u002Ftraining\u002Ftesting\u002Fespresso)** - UI testing (WIP)\n\n**Code Quality:**\n- **[Konsist](https:\u002F\u002Fdocs.konsist.lemonappdev.com\u002F)** - Architecture and code structure convention tests\n- **[Ktlint](https:\u002F\u002Fgithub.com\u002Fpinterest\u002Fktlint)** - Kotlin code formatting and issue detection\n  - **[Ktlint Standard Rules](https:\u002F\u002Fpinterest.github.io\u002Fktlint\u002F0.49.1\u002Frules\u002Fstandard\u002F)** - set of custom rules for Jetpack Compose\n  - **[Nlopez Jetpack Compose Rules](https:\u002F\u002Fmrmans0n.github.io\u002Fcompose-rules\u002F)** - set of custom rules for Jetpack Compose\n  - **[Twitter's Jetpack Compose Rules](https:\u002F\u002Ftwitter.github.io\u002Fcompose-rules\u002F)** - set of custom rules for Jetpack Compose\n- **[Detekt](https:\u002F\u002Fgithub.com\u002Farturbosch\u002Fdetekt)** - Static analysis and complexity checks\n- **[Android Lint](http:\u002F\u002Ftools.android.com\u002Ftips\u002Flint)** - Android-specific code analysis\n- **[Spotless](https:\u002F\u002Fgithub.com\u002Fdiffplug\u002Fspotless)** - Code formatting enforcement\n\n**Build & CI:**\n- **[Gradle Kotlin DSL](https:\u002F\u002Fdocs.gradle.org\u002Fcurrent\u002Fuserguide\u002Fkotlin_dsl.html)** - Type-safe build scripts\n- **[Version Catalogs](https:\u002F\u002Fdocs.gradle.org\u002Fcurrent\u002Fuserguide\u002Fplatforms.html#sub:version-catalog)** - Centralized dependency management\n- **[Convention Plugins](https:\u002F\u002Fdocs.gradle.org\u002Fcurrent\u002Fsamples\u002Fsample_convention_plugins.html)** - Shared build logic\n- **[Renovate](https:\u002F\u002Fgithub.com\u002Frenovatebot\u002Frenovate)** - Automated dependency updates\n\n**GitHub Actions:**\n- **[Check](.github\u002Fworkflows\u002Fcheck.yml)** - CI pipeline with build, lint, test, and code quality checks\n- **[Auto Approve](.github\u002Fworkflows\u002Fauto-approve.yml)** - Auto-approval for trusted bot and maintainer PRs\n- **[Claude Code](.github\u002Fworkflows\u002Fclaude.yml)** - AI-powered code assistance and review\n- **[Claude Code Review](.github\u002Fworkflows\u002Fclaude-code-review.yml)** - Automated PR reviews using Claude\n\n**Gradle Plugins:**\n- **[Android Application](https:\u002F\u002Fdeveloper.android.com\u002Fbuild\u002Freleases\u002Fgradle-plugin)** (`com.android.application`) - Android app module configuration\n- **[Android Library](https:\u002F\u002Fdeveloper.android.com\u002Fbuild\u002Freleases\u002Fgradle-plugin)** (`com.android.library`) - Android library module configuration\n- **[Kotlin Android](https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fgradle.html)** (`org.jetbrains.kotlin.android`) - Kotlin compilation for Android\n- **[Kotlin Serialization](https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fserialization.html)** (`org.jetbrains.kotlin.plugin.serialization`) - JSON serialization support\n- **[Kotlin Compose Compiler](https:\u002F\u002Fdeveloper.android.com\u002Fjetpack\u002Fandroidx\u002Freleases\u002Fcompose-kotlin)** (`org.jetbrains.kotlin.plugin.compose`) - Compose compiler plugin\n- **[KSP](https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fksp-overview.html)** - Kotlin Symbol Processing\n- **[Detekt](https:\u002F\u002Fdetekt.dev\u002F)** - Static code analysis\n- **[Spotless](https:\u002F\u002Fgithub.com\u002Fdiffplug\u002Fspotless)** - Code formatting\n- **[Test Logger](https:\u002F\u002Fgithub.com\u002Fradarsh\u002Fgradle-test-logger-plugin)** - Enhanced test log output\n- **[Easylauncher](https:\u002F\u002Fgithub.com\u002Fusefulness\u002Feasylauncher-gradle-plugin)** - Modify the launcher icon of each of your app-variants\n- **[AboutLibraries](https:\u002F\u002Fgithub.com\u002Fmikepenz\u002FAboutLibraries)** - collects dependency details, including licenses and visualize these in the app\n\n## Architecture\n\nThe project implements **Clean Architecture** with a modular approach, treating each feature as an independent, reusable component similar to a microservice. This design enables maintainability and scalability for large development teams.\n\n**Benefits of Modular Architecture:**\n- **Reusability** - Shared code across multiple app variants\n- **Separation of Concerns** - Clear module boundaries with explicit dependencies\n- **Parallel Development** - Teams can work on features independently\n- **Faster Build Times** - Incremental compilation and build caching\n- **Testability** - Isolated testing of individual components\n\n### Module Types and Dependencies\n\n![Module Dependencies](.\u002Fmisc\u002Fimage\u002Fmodule_dependencies.png)\n\n**Module Types:**\n- **`app`** - Main application module containing navigation setup, DI configuration, and app-level components\n- **`feature-*`** - Feature modules (album, profile, favourite) containing feature-specific business logic  \n- **`feature-base`** - Shared foundation module providing common utilities and base classes\n- **`library-*`** - Utility modules for testing and shared functionality\n\n### Feature Module Structure\n\n`Clean Architecture` is implemented at the module level - each module contains its own set of Clean Architecture layers:\n\n![module_dependencies_layers](.\u002Fmisc\u002Fimage\u002Fmodule_layers.png)\n\n> Notice that the `app` module and `library_x` modules structure differs a bit from the feature module structure.\n\nEach feature module contains 3 layers with a distinct set of responsibilities and common module components.\n\n![feature_structure](.\u002Fmisc\u002Fimage\u002Fmodule_layers_details.png)\n\n#### Presentation Layer\n\nThis layer is closest to what the user sees on the screen.\n\nThe `presentation` layer mixes `MVVM` and `MVI` patterns:\n\n- `MVVM` - Jetpack `ViewModel` is used to encapsulate a `common UI state`. It exposes the `state` via observable state\n  holder (`Kotlin Flow`)\n- `MVI` - `action` modifies the `common UI state` and emits a new state to a view via `Kotlin Flow`\n\n> The `common state` is a single source of truth for each view. This solution derives from\n> [Unidirectional Data Flow](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FUnidirectional_Data_Flow_(computer_science)) and [Redux\n> principles](https:\u002F\u002Fredux.js.org\u002Fintroduction\u002Fthree-principles).\n\nThis approach facilitates the creation of consistent states. The state is collected via `collectAsUiStateWithLifecycle`\nmethod. Flows collection happens in a lifecycle-aware manner, so\n[no resources are wasted](https:\u002F\u002Fmedium.com\u002Fandroiddevelopers\u002Fconsuming-flows-safely-in-jetpack-compose-cde014d0d5a3).\n\nStated is annotated with [Immutable](https:\u002F\u002Fdeveloper.android.com\u002Freference\u002Fkotlin\u002Fandroidx\u002Fcompose\u002Fruntime\u002FImmutable)\nannotation that is used by Jetpack compose to enable composition optimizations.\n\nComponents:\n\n- **Screen (Composable)** - observes common view state (through `Kotlin Flow`). Compose transform state (emitted by Kotlin\n  Flow) into application UI Consumes the state and transforms it into application UI (via `Jetpack Compose`). Pass user\n  interactions to `ViewModel`. Views are hard to test, so they should be as simple as possible.\n- **ViewModel** - emits (through `Kotlin Flow`) view state changes to the view and deals with user interactions (these\n  view models are not simply [POJO classes](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPlain_old_Java_object)).\n- **ViewState** - common state for a single view\n- **StateTimeTravelDebugger** - logs actions and view state transitions to facilitate debugging.\n- **NavManager** - singleton that facilitates handling all navigation events inside `NavHostActivity` (instead of\n  separately, inside each view)\n\n#### Domain Layer\n\nThis is the core layer of the application. Notice that the `domain` layer is independent of any other layers. This\nallows making domain models and business logic independent from other layers. In other words, changes in other layers\nwill not affect the `domain` layer eg. changing the database (`data` layer) or screen UI (`presentation` layer) ideally will\nnot result in any code change within the `domain` layer.\n\nComponents:\n\n- **UseCase** - contains business logic\n- **DomainModel** - defines the core structure of the data that will be used within the application. This is the source\n  of truth for application data.\n- **Repository interface** - required to keep the `domain` layer independent from\n  the `data layer` ([Dependency inversion](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDependency_inversion_principle)).\n\n#### Data Layer\n\nEncapsulates application data. Provides the data to the `domain` layer eg. retrieves data from the internet and cache the\ndata in disk cache (when the device is offline).\n\nComponents:\n\n- **Repository** is exposing data to the `domain` layer. Depending on the application structure and quality of the\n  external API repository can also merge, filter, and transform the data. These operations intend to create\n  a high-quality data source for the `domain` layer. It is the responsibility of the Repository (one or more) to construct\n  Domain models by reading from the `Data Source` and accepting Domain models to be written to the `Data Source`\n- **Mapper** - maps `data model` to `domain model` (to keep `domain` layer independent from the `data` layer).\n\nThis application has two `Data Sources` - `Retrofit` (used for network access) and `Room` (local storage used to access\ndevice persistent memory). These data sources can be treated as an implicit sub-layer. Each data source consists of\nmultiple classes:\n\n- **Retrofit Service** - defines a set of API endpoints\n- **Retrofit Response Model** - definition of the network objects for a given endpoint (top-level model for the data\n  consists of `ApiModels`)\n- **Retrofit Api Data Model** - defines the network objects (sub-objects of the `Response Model`)\n- **Room Database** - persistence database to store app data\n- **Room DAO** - interact with the stored data\n- **Room Entity** - definition of the stored objects\n\nBoth `Retrofit API Data Models` and `Room Entities` contain annotations, so the given framework understands how to parse the\ndata into objects.\n\n#### Common Module Components\n\nEach module in the Android project contains several standard items that provide essential functionality and configuration:\n\nComponents:\n- **Gradle Build Script** - `build.gradle.kts` defining dependencies, build configurations, and plugins.\n- **Koin DI Module** - Dependency injection configuration\n- **Tests** - Unit tests (`test\u002F`) and integration tests (`androidTest\u002F`)\n- **Android Resources** - resources (`res\u002F`) including strings, drawables, and assets.\n- **Android Manifest** - The `AndroidManifest.xml` file declaring module metadata.\n\n### Data Flow\n\nThe below diagram presents application data flow when a user interacts with the `album list screen`:\n\n![app_data_flow](.\u002Fmisc\u002Fimage\u002Fapp_data_flow.png)\n\n## Project Features\n\n### Development & Debugging\n\nTags ([LogTags](feature\u002Fbase\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Ffeature\u002Fbase\u002Futil\u002FLogTags.kt)) help filter and identify different types of logs during development and debugging.\n\nThe app provides detailed logging for development and debugging, with each log easily filterable by its tag:\n\n- `Navigation` - Navigation events and route changes\n![Navigation Logs](misc\u002Fimage\u002Flogs_navigation.png)\n\n- `Action` - User actions and UI state modifications\n![Action Logs](misc\u002Fimage\u002Flogs_action.png)\n\n- `Network` - Network requests, responses, and HTTP-related logs\n![Network Logs](misc\u002Fimage\u002Flogs_network.png)\n\n### Custom Icons For Each Variant\n\nThanks to [Easylauncher Gradle plugin](https:\u002F\u002Fgithub.com\u002Fusefulness\u002Feasylauncher-gradle-plugin) the `debug` build has custom icon label:\n\n\u003Cimg src=\".\u002Fmisc\u002Fimage\u002Fapplication_icon_label.png\" alt=\"application_icon_label\" width=\"114\"\u002F>\n\n### Themed Icons\n\nApp supports [Themed Icons](https:\u002F\u002Fmedium.com\u002F@enikebraimoh\u002Fandroid-themed-icons-a-comprehensive-guide-3abb33ab51a7).\n\nLeft (classic icon), Right (themed icon):\n\n\u003Cimg src=\".\u002Fmisc\u002Fimage\u002Fapplication_themed_icon.png\" alt=\"application_icon_label\" width=\"225\"\u002F>\n\n## Gradle Config\n\n### Dependency Management\n\nGradle [versions catalog](https:\u002F\u002Fdocs.gradle.org\u002Fcurrent\u002Fuserguide\u002Fplatforms.html#sub:version-catalog) is used as a centralized dependency management third-party dependency coordinates (group, artifact, version) are shared across all modules (Gradle projects and subprojects).\n\nGradle versions catalog consists of a few major sections:\n\n- `[versions]` - declare versions that can be referenced by all dependencies\n- `[libraries]` - declare the aliases to library coordinates\n- `[bundles]` - declare dependency bundles (groups)\n- `[plugins]` - declare Gradle plugin dependencies\n\nEach module uses convention a plugin, so common dependencies are shared without the need to add them explicitly in each module.\n\n### Convention Plugins\n\n[Convention plugins](https:\u002F\u002Fdocs.gradle.org\u002Fcurrent\u002Fsamples\u002Fsample_convention_plugins.html) standardize build configuration across modules by encapsulating common build logic into reusable plugins:\n\n- **[`Application Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FApplicationConventionPlugin.kt)** - Main application module configuration with Android app setup\n- **[`Feature Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FFeatureConventionPlugin.kt)** - Feature module configuration combining library and Kotlin conventions\n- **[`Library Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FLibraryConventionPlugin.kt)** - Android library module setup with common Android configuration\n- **[`Lotlin Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FKotlinConventionPlugin.kt)** - Kotlin compilation settings, toolchain, and compiler options\n- **[`Test Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FTestConventionPlugin.kt)** - Testing framework setup (JUnit, test logging, and test configurations)\n- **[`Test Library Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FTestConventionLibraryPlugin.kt)** - Testing setup specifically for library modules\n- **[`Detekt Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FDetektConventionPlugin.kt)** - Static code analysis configuration with Detekt\n- **[`Spotless Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FSpotlessConventionPlugin.kt)** - Code formatting and style enforcement with Spotless\n- **[`Easylauncher Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FEasyLauncherConventionPlugin.kt)** - App icon customization for different build variants\n- **[`AboutLibraries Convention`](.\u002Fbuild-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002FAboutLibrariesConventionPlugin.kt)** - About libraries configuration\n\n### Type Safe Project Accessors\n\nEnables type-safe project references instead of error-prone string-based module paths:\n\n```kotlin\n\u002F\u002F Before\nimplementation(project(\":feature:album\"))\n\n\u002F\u002F After  \nimplementation(projects.feature.album)\n```\n\n### Unified Version Configuration\n\nAll dependency and Gradle plugin versions are defined in the TOML version catalog file ([libs.versions.toml](gradle\u002Flibs.versions.toml)).\n\n#### Java\u002FJVM Version Configuration\n\nThe Java\u002FJVM version is centralized across the project.\nIt is defined once in [`libs.versions.toml`](gradle\u002Flibs.versions.toml) file under the java entry.\nThe `generateJavaBuildConfig` task reads this value and generates a `JavaBuildConfig.kt` file with constants.\nThese constants are then used in Gradle convention plugins to configure both Java and Kotlin consistently:\n\n```kotlin\n compileOptions {\n     sourceCompatibility = JavaBuildConfig.JAVA_VERSION\n     targetCompatibility = JavaBuildConfig.JAVA_VERSION\n }\n \n kotlin {\n     compilerOptions {\n         jvmTarget = JavaBuildConfig.jvmTarget\n     }\n\n     jvmToolchain(JavaBuildConfig.jvmToolchainVersion)\n }\n```\n\n### Generated type-safe version catalogs accessors in `build-logic` module \n\nThe `build-logic` module provides type-safe access to version catalogs from within precompiled script plugins.\n\nThis is enabled via the `versionCatalogs` block in `build-logic\u002Fsettings.gradle.kts`, which references the main version catalog file and `implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))` dependency in `build-logic\u002Fbuild.gradle.kts` file. \n\nThis setup allows you to use catalog dependencies in plugins, for example:\n\n```kotlin\nadd(\"implementation\", libs.timber)\n```\n\nAdditionally, extensions defined in [DependencyHandlerScope](build-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fcom\u002Figorwojda\u002Fshowcase\u002Fbuildlogic\u002Fext\u002FDependencyHandlerExt.kt) make the syntax more natural and equivalent to standard Gradle usage:\n\n```kotlin\nimplementation(libs.timber)\n```\n\n### Gradle Configuration Cache\n\nEnabled [Gradle Configuration Cache](https:\u002F\u002Fdocs.gradle.org\u002F9.0.0\u002Fuserguide\u002Fconfiguration_cache_enabling.html).\n\n## Code Verification\n\n**Quality Checks:**\n```bash\n.\u002Fgradlew konsist-test:test --rerun-tasks          # Architecture & convention validation\n.\u002Fgradlew lintDebug                               # Android lint analysis  \n.\u002Fgradlew detektCheck                             # Code complexity & style analysis\n.\u002Fgradlew spotlessCheck                           # Code formatting verification\n.\u002Fgradlew testDebugUnitTest -x konsist-test:test   # Unit test execution (without Konsist tests)\n.\u002Fgradlew connectedCheck                          # UI test execution (WIP)\n.\u002Fgradlew :app:bundleDebug                        # Production build verification\n```\n\n**Auto-fix Commands:**\n```bash\n.\u002Fgradlew detektApply             # Apply Detekt formatting fixes\n.\u002Fgradlew spotlessApply           # Apply code formatting fixes\n.\u002Fgradlew lintDebug               # Update lint baseline\n```\n\n### CI Pipeline\n\n[GitHub Actions](https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions) workflows execute quality checks automatically:\n- **PR Validation** - All checks run in parallel on pull requests\n- **Main Branch Protection** - Post-merge validation ensures code quality\n- **Automated Dependency Updates** - Renovate bot creates PRs for dependency updates\n\nConfiguration: [`.github\u002Fworkflows`](.github\u002Fworkflows)\n\n### Pre-push Hooks\n\nOptional [Git hooks](https:\u002F\u002Fgit-scm.com\u002Fdocs\u002Fgithooks#_pre_push) can execute quality checks before pushing code, providing fast feedback during development.\n\n## Project Scope & Limitations\n\nThis showcase prioritizes **architecture, tooling, and development practices** over complex UI design. The interface uses Material Design 3 components but remains intentionally straightforward to focus on the underlying technical implementation.\n\n## Getting Started\n\n**Prerequisites:**\n- Android Studio Giraffe | 2022.3.1+ \n- JDK 17+\n- Android SDK 34+\n\n**Setup:**\n```bash\n# Clone the repository\ngit clone https:\u002F\u002Fgithub.com\u002Figorwojda\u002Fandroid-showcase.git\n\n# Open in Android Studio\n# File -> Open -> Select cloned directory\n```\n\n**Recommended IDE Plugins:**\n- [Detekt](https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F10761-detekt) - Configure with [detekt.yml](detekt.yml)\n- [Kotlin](https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F6954-kotlin) - Usually pre-installed\n- [Android](https:\u002F\u002Fdeveloper.android.com\u002Fstudio) - Usually pre-installed\n\n## Roadmap\n\nActive development continues with focus on modern Android practices. View planned [enhancements](https:\u002F\u002Fgithub.com\u002Figorwojda\u002Fandroid-showcase\u002Fissues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aenhancement) and contribute ideas.\n\n## Resources\n\n**Development Tools:**\n- [Material Theme Builder](https:\u002F\u002Fm3.material.io\u002Ftheme-builder#\u002Fdynamic) - Generate Material 3 dynamic themes\n- [Compose Material 3 Components](https:\u002F\u002Fdeveloper.android.com\u002Freference\u002Fkotlin\u002Fandroidx\u002Fcompose\u002Fmaterial3\u002Fpackage-summary) - Component reference\n- [Android Ecosystem Cheat Sheet](https:\u002F\u002Fgithub.com\u002Figorwojda\u002Fandroid-ecosystem-cheat-sheet) - 200+ essential Android tools\n- [Kotlin Coroutines Use Cases](https:\u002F\u002Fgithub.com\u002FLukasLechnerDev\u002FKotlin-Coroutine-Use-Cases-on-Android) - Practical coroutine examples\n\n**Recommended Projects:**\n- [Now in Android](https:\u002F\u002Fgithub.com\u002Fandroid\u002Fnowinandroid) - Google's official modern Android showcase\n- [Android Architecture Blueprints](https:\u002F\u002Fgithub.com\u002Fgooglesamples\u002Fandroid-architecture) - Architecture pattern examples\n- [Compose Samples](https:\u002F\u002Fgithub.com\u002Fandroid\u002Fcompose-samples) - Official Jetpack Compose examples\n- [Kotlin Android Template](https:\u002F\u002Fgithub.com\u002Fcortinico\u002Fkotlin-android-template) - Pre-configured project template\n- [Androidify](https:\u002F\u002Fgithub.com\u002Fandroid\u002Fandroidify) - Android's official character customization app\n- [WeatherXM Android](https:\u002F\u002Fgithub.com\u002FWeatherXM\u002Fwxm-android) - Weather data collection and rewards platform\n- [Songify](https:\u002F\u002Fgithub.com\u002FJamesBuhanan\u002FSongify) - Spotify-inspired music streaming app\n- [Alkaa](https:\u002F\u002Fgithub.com\u002Figorescodro\u002Falkaa) - Task management app with modern architecture\n- [KotlinConf App](https:\u002F\u002Fgithub.com\u002FJetBrains\u002Fkotlinconf-app) - JetBrains' official conference app\n- [Tivi](https:\u002F\u002Fgithub.com\u002Fchrisbanes\u002Ftivi) - TV show tracking app by Chris Banes\n- [CatchUp](https:\u002F\u002Fgithub.com\u002FZacSweers\u002FCatchUp) - News aggregation app with modular architecture\n- [Heron](https:\u002F\u002Fgithub.com\u002Ftunjid\u002Fheron) - Social media client showcasing modern Android development\n\n## Contributing\n\nContributions are welcome! Please check the [CONTRIBUTING.md](CONTRIBUTING.md) guidelines before submitting PRs.\n\n**Areas for Contribution:**\n- Feature implementations (Profile, Favorites screens)\n- UI\u002FUX improvements and animations  \n- Performance optimizations\n- Testing coverage expansion\n- Documentation improvements\n\n## Author\n\n**Igor Wojda** - Senior Android Engineer\n\n[![Twitter Follow](https:\u002F\u002Fimg.shields.io\u002Ftwitter\u002Ffollow\u002Figorwojda?style=social)](https:\u002F\u002Ftwitter.com\u002Figorwojda)\n[![GitHub](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Ffollowers\u002Figorwojda?style=social)](https:\u002F\u002Fgithub.com\u002Figorwojda)\n\n## License\n\n```\nMIT License\n\nCopyright (c) 2025 Igor Wojda\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and\nassociated documentation files (the \"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and\u002For sell\ncopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial\nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\nNO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n```\n\n## Animations License\n\nFlowing animations are distributed under `Creative Commons License 2.0`:\n\n- [Error screen](https:\u002F\u002Flottiefiles.com\u002F8049-error-screen) by Chetan Potnuru\n- [Building Screen](https:\u002F\u002Flottiefiles.com\u002F1271-building-screen) by Carolina Cajazeira\n","这是一个遵循最佳实践的Android应用程序，旨在展示如何使用现代开发技术和架构模式构建可扩展、可维护和可测试的应用。项目基于Kotlin语言，采用了协程、Jetpack组件、Clean Architecture、MVVM设计模式、依赖注入等技术特性，并且通过静态分析和全面的测试覆盖来确保代码质量。它特别适合于希望在大型Android项目中建立坚实架构基础的开发团队使用。此外，该应用还展示了如何实现模块化设计以及先进的Gradle配置，对于想要学习或参考高质量Android工程结构的人来说非常有价值。",2,"2026-06-11 03:11:16","top_language"]