{"id":19264011,"url":"https://github.com/kaushikgopal/playground-android","last_synced_at":"2025-04-09T22:19:46.555Z","repository":{"id":261467736,"uuid":"863245149","full_name":"kaushikgopal/playground-android","owner":"kaushikgopal","description":"Opinionated Android app starter template. I pick the best choice(s) of libraries \u0026 solutions (imo) and keep it ready for forking off and building your next Android app.","archived":false,"fork":false,"pushed_at":"2025-03-17T18:16:42.000Z","size":2338,"stargazers_count":79,"open_issues_count":2,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-01T15:13:03.271Z","etag":null,"topics":["android","android-app","anvil","compose-navigation","compose-ui","dependency-injection","edge-to-edge","gradle","gradle-plugin","kotlin","kotlin-inject","multi-module","shared-build-tool","usf"],"latest_commit_sha":null,"homepage":"https://kau.sh","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaushikgopal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-26T01:03:03.000Z","updated_at":"2025-03-29T19:50:47.000Z","dependencies_parsed_at":"2025-02-22T07:21:57.194Z","dependency_job_id":"9fb4c504-af92-4a25-b309-7e2c0731abac","html_url":"https://github.com/kaushikgopal/playground-android","commit_stats":null,"previous_names":["kaushikgopal/playground-android"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaushikgopal%2Fplayground-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaushikgopal%2Fplayground-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaushikgopal%2Fplayground-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaushikgopal%2Fplayground-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaushikgopal","download_url":"https://codeload.github.com/kaushikgopal/playground-android/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248119621,"owners_count":21050803,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-app","anvil","compose-navigation","compose-ui","dependency-injection","edge-to-edge","gradle","gradle-plugin","kotlin","kotlin-inject","multi-module","shared-build-tool","usf"],"created_at":"2024-11-09T19:38:57.280Z","updated_at":"2025-04-09T22:19:46.541Z","avatar_url":"https://github.com/kaushikgopal.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Playground Android\n\nThis is a template project for Android development. I use it as a way\nto test new concepts or integrate libraries that are otherwise hard\nin a more complex project.\n\n\nSome of the concepts implemented here:\n\n- [x] gradle [version catalog](https://github.com/kaushikgopal/playground-android/blob/master/gradle/libs.versions.toml), BOM \u0026 Bundles (one source of truth)\n- [x] [sharing build logic](./build-logic/README.md) with [gradle convention plugin](https://docs.gradle.org/current/samples/sample_convention_plugins.html)\n- [x] [custom lint-rules](https://github.com/kaushikgopal/playground-android/pull/5/files)\n- [x] [Makefile](https://github.com/kaushikgopal/playground-android/blob/master/Makefile) with common cli commands\n- [x] [logcat](https://github.com/square/logcat) lib and injecting [multiple loggers](https://github.com/kaushikgopal/playground-android/blob/master/common/log/src/main/java/sh/kau/playground/common/log/CompositeLogger.kt)\n- [x] basic networking with [ktor](https://ktor.io/docs/client.html) [#10](https://github.com/kaushikgopal/playground-android/pull/10/files#diff-61300620752e698467343ba4270127d0cbb3c9e3153bb001ff51102244d2c7b2)\n- [ ] [Coil](https://coil-kt.github.io/coil/) for image loading\n- [x] [multi module](#app-module-diagram-multi-module-setup) setup\n- [x] compose-navigation between feature modules\n- [x] [dependency injection with kotlin-inject-anvil](https://github.com/kaushikgopal/playground-android/pull/12)\n  - [x] [function-injection](https://github.com/kaushikgopal/playground-android/pull/9/commits/aad254957a003982633006fb2f350ee7a372f11d) demo in `@Composable`\n- [ ] USF architecture (much like [usf-movies-android](https://github.com/kaushikgopal/movies-usf-android))\n\n# Getting started\n- Download this repository and open the template folder on Android Studio\n- in libs.versions.toml change app-namespace to your desired package name\n- in AndroidStudio rename the app package sh.kau.playground\n- Check if the manifest package was renamed along with the package\n- In app/build.gradle.kts, change the applicationId to the new app package\n\n\nReady to Use and you're ready to start working on your new app!\n\n\n# App module diagram (multi-module setup)\n\nBelow diagram should give you an idea of how the inter module dependencies are setup.\nIn practice, when you add feature modules it is pretty straightforward as the\ncore requirements are already setup. See the [Landing feature's build.gradle.kts file](https://github.com/kaushikgopal/playground-android/blob/master/features/landing/build.gradle.kts)\nas an example for how simple the build script for new features land up being.\n\nThe dependency graph is widest at the top (`:app` module)\nand becomes more focused and self-contained as you move down through domain and common modules.\nSo modules at the bottom have lesser dependencies and are more self-contained.\n\n![App module diagram](./app-module-diagram.webp)\n\n- new features are added to :features module\n- the core :app module itself assembles all the dependencies (and is intentionally lean)\n- template.feature = custom gradle plugin that sets up a fully functional feature for your app\n- template.android = custom gradle plugin that has the things you need for a pure android lib\n    - think jvm target, minSDK etc. that you don't want to repeat everywhere\n- :common modules are shared but can be hot-swapped with another implementation (possible)\n- :domain modules are specific to the app but also shared (but not intended to be swapped out)\n\nI talked about this in ep #252 of\n[Fragmented](https://fragmentedpodcast.com/episodes/252)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaushikgopal%2Fplayground-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaushikgopal%2Fplayground-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaushikgopal%2Fplayground-android/lists"}