{"adoption": {"forks": 1184, "observed_at": "2026-08-28T04:09:33.943081+00:00", "stars": 5977}, "canonical_url": "https://ross.abutalabs.com/products/effectiveandroidui", "card": {"archived": false, "artifact_type": "learning-resource", "description": "Sample project created to show some of the best Android practices to work in the Android UI Layer. The UI layer of this project has been implemented using MVP or MVVM (without binding engine) to show how this patterns works. This project is used during the talk \"EffectiveAndroidUI\".", "domain": ["mobile-development", "android-tools", "tutorials", "education"], "enriched": true, "function": ["ui-components", "state-management", "developer-tools"], "health_score": 58, "homepage": null, "language": "Java", "license": "Apache-2.0", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["pedrovgs/EffectiveAndroidUI"], "name": "pedrovgs/EffectiveAndroidUI", "platform": ["jvm"], "pushed_at": "2026-01-16T10:53:44+00:00", "repo": "pedrovgs/EffectiveAndroidUI", "stars": 5977, "tags": ["mvp", "mvvm", "android-ui", "sample-project", "dependency-injection", "dagger", "fragments", "presentation-patterns", "android", "mobile"], "topics": [], "urls": [], "use_cases": ["learn mvp pattern on android", "learn mvvm without data binding", "android ui layer best practices", "how to structure android app architecture", "dependency injection with dagger on android", "android fragment communication example", "android resource qualifiers for screen sizes and densities"], "what_it_is": "A sample Android project demonstrating best practices for the Android UI layer using MVP and MVVM (without data binding) patterns. It accompanies the 'Effective Android UI' tech talk and showcases fragments, dependency injection with Dagger, resource qualifiers, navigation, and layout techniques.", "when_to_avoid": ["you need a production-ready UI framework or library to depend on", "your project uses Kotlin, Jetpack Compose, or modern Android architecture components", "you need actively maintained code with up-to-date dependencies"], "when_to_choose": ["you are learning Android UI architecture patterns like MVP or MVVM", "you want concrete Java examples of Dagger, fragments, and resource qualifiers", "you are preparing or studying Android presentation-layer talks or training"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/effectiveandroidui", "repo": "pedrovgs/EffectiveAndroidUI", "role": "main", "score": 60}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:09:33.943081+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:50:03.164825+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "da79e3530b0885dd585b5c382eade64c4cdfea58425a8e2e3caf58fa620ec230", "fetched_at": "2026-08-28T04:09:33.943081+00:00", "kind": "readme", "missing": false, "url": "https://github.com/pedrovgs/EffectiveAndroidUI"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 62, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4443, "days_push": 229, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 60, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}