{"id":15040820,"url":"https://github.com/tunjid/android-extensions","last_synced_at":"2026-01-14T03:32:49.188Z","repository":{"id":38456779,"uuid":"89848117","full_name":"tunjid/Android-Extensions","owner":"tunjid","description":"An Android library with modules to quickly bootstrap an Android application.","archived":true,"fork":false,"pushed_at":"2023-01-16T10:04:34.000Z","size":3618,"stargazers_count":593,"open_issues_count":5,"forks_count":60,"subscribers_count":10,"default_branch":"develop","last_synced_at":"2024-10-02T02:43:24.921Z","etag":null,"topics":["android","android-animation","android-application","android-extensions","android-library","android-navigation","constraintlayout","data-table","floating-action-button","fragments","kotlin","kotlin-android","material","material-design","material-design-android","recyclerview","recycleview","speed-dial","table","tableview"],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tunjid.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-04-30T11:59:17.000Z","updated_at":"2024-09-22T08:58:35.000Z","dependencies_parsed_at":"2023-02-02T08:02:13.541Z","dependency_job_id":null,"html_url":"https://github.com/tunjid/Android-Extensions","commit_stats":null,"previous_names":[],"tags_count":67,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tunjid%2FAndroid-Extensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tunjid%2FAndroid-Extensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tunjid%2FAndroid-Extensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tunjid%2FAndroid-Extensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tunjid","download_url":"https://codeload.github.com/tunjid/Android-Extensions/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235656464,"owners_count":19024770,"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-animation","android-application","android-extensions","android-library","android-navigation","constraintlayout","data-table","floating-action-button","fragments","kotlin","kotlin-android","material","material-design","material-design-android","recyclerview","recycleview","speed-dial","table","tableview"],"created_at":"2024-09-24T20:45:07.407Z","updated_at":"2025-10-07T21:30:52.000Z","avatar_url":"https://github.com/tunjid.png","language":"Kotlin","readme":"# Android Extensions\n\n![Navigation Tests](https://github.com/tunjid/Android-Extensions/workflows/Navigation%20Tests/badge.svg)\n\nPlease note, this is not an official Google or Android repository and has no affiliation with the aforementioned parties.\n\nIt is merely a fairly long lived, albeit well maintained side project. Caveat emptor.\n\nThis repository is a collection of modules to help bootstrap an Android Application.\nThere are 10 modules:\n\n|   | Name  | Description  |   |   |\n| ------------| ------------ | ------------ | ------------ | ------------ |\n| 1  | App | A sample app demoing the modules in the repository.  |   |   |\n| 2  | [![Core](https://img.shields.io/maven-central/v/com.tunjid.androidx/core/1?label=core)](https://github.com/tunjid/Android-Extensions/blob/develop/core/README.md)  | A few added utilities to the core Android KTX libraries.  Includes extension methods on objects to side step ContextCompat, DrawableCompat, and a fluent SpannableString API | ![](https://i.imgur.com/AFZpZ1K.png)  | ![](https://miro.medium.com/max/4904/1*o4p71Uid8vzAHvHH7W_LjQ.png)  |\n| 3  | [![Navigation](https://img.shields.io/maven-central/v/com.tunjid.androidx/navigation/1?label=navigation)](https://github.com/tunjid/Android-Extensions/blob/develop/navigation/README.md)  | Interfaces and implementations of Fragment based Navigators, including single and multiple stacks. The APIs allow for hooking into the raw `FragmentTransactions` that run allow you to customize it to your heart's content. Suspending APIs are also available to preform navigation actions sequentially without having to deal with the asynchrosity of the `FragmentManager`.| ![](https://i.imgur.com/2Ai74xI.png)  | ![](https://cdn-images-1.medium.com/max/1600/1*q1WqvY91CWlmAjdEiwbA_g.gif)  |\n| 4  | [![View](https://img.shields.io/maven-central/v/com.tunjid.androidx/view/1?label=view)](https://github.com/tunjid/Android-Extensions/blob/develop/view/README.md)  | A module containing UI building blocks, like animators and helper methods for views.  Built mostly around the `SpringAnimation` from the Jetpack `DynamicAnimation` library. In the example to the right, it is responsible for animating the margin, and padding of the container views, and the hiding and showing of bouncing FABs.| ![](https://i.imgur.com/K3qGDKb.gif)  |   |\n| 5  | [![RecyclerView](https://img.shields.io/maven-central/v/com.tunjid.androidx/recyclerview/1?label=recyclerview)](https://github.com/tunjid/Android-Extensions/blob/develop/recyclerview/README.md)  | Utility classes for the ```RecyclerView``` ```ViewGroup``` like drag and drop, swipe gestures, endless scrolling, a composable adapter, diffing, tables and much more.  | ![](https://miro.medium.com/max/580/1*SjjLx1ghigvJP7kax-K6gA.gif)  | ![](https://i.imgur.com/hpb3YFu.gif)  |\n| 6  | [![ViewPager2](https://img.shields.io/maven-central/v/com.tunjid.androidx/viewpager2/1?label=viewpager2)](https://github.com/tunjid/Android-Extensions/blob/develop/viewpager2/README.md)  | Utility classes for the ```ViewPager2``` ```ViewGroup``` particularly diff util for dispatching updates  | ![](https://i.imgur.com/G1KxP4m.gif)  |   |\n| 7  | [![Material](https://img.shields.io/maven-central/v/com.tunjid.androidx/material/1?label=material)](https://github.com/tunjid/Android-Extensions/blob/develop/material/README.md)  | Utility classes around Google's Material Design components including an expandable floating action button.  | ![](https://miro.medium.com/max/648/1*NHgDmR6QVqQwj7VJToQE5w.gif)  |   |\n| 8  | [![Communications](https://img.shields.io/maven-central/v/com.tunjid.androidx/communications/1?label=communications)](https://github.com/tunjid/Android-Extensions/blob/develop/communications/README.md)  | Utility classes for Near Service Discovery (NSD) and Bluetooth Low Energy (BLE) communication.  |   |   |\n| 9  | [![Saved State](https://img.shields.io/maven-central/v/com.tunjid.androidx/savedstate/1?label=savedstate)](https://github.com/tunjid/Android-Extensions/blob/develop/savedstate/README.md)  | Delegated implementation of Android Jetpack's Saved State Registry for Components that also have a lifecycle.  |   |   |\n| 10  | [ConstraintLayout (Unmaintained, MotionLayout is here)](https://github.com/tunjid/Android-Extensions/blob/develop/constraintlayout/README.md)  | Utility classes for the ```ConstraintLayout``` ```ViewGroup```.  |   |   |\n| 11  | [Test (Unmaintained)](https://github.com/tunjid/Android-Extensions/blob/develop/test/README.md)  | Testing utilities built mostly around Espresso.  |   |   |\n\nbuild.gradle lines\n\nThe built artifacts are hosted on Jcenter (pending the looming shutdown) and Maven Central:\n\n```\n    allprojects {\n        repositories {\n            // Pre jcenter shutdown\n            Jcenter()\n            // Now or post Jcenter shutdown\n            mavenCentral()\n        }\n    }\n\n    implementation 'com.tunjid.androidx:module:x.x.x'\n```\n\nRefer to the table above for the latest version information.\n\nIf you so desire, you can fork the repo and host the artifacts your self using github packages.\nRefer to publishing information below for more details.\n\nProjects that use This library include:\n\n1. [DigiLux Fingerprint gestures app](https://play.google.com/store/apps/details?id=com.tunjid.fingergestures)\n2. [BluetoothRcSwitch IOT Github project](https://github.com/tunjid/BluetoothRcSwitch)\n\n## Core\nRead more about the core module, classes and components [here](https://github.com/tunjid/Android-Extensions/blob/develop/core/README.md).\n\nA medium post with some of it's offerings can be read [here](https://medium.com/@Tunji_D/i-want-it-all-owning-the-system-window-and-consuming-insets-718b7e19960)\n                                                             and [here](https://medium.com/@Tunji_D/concatenating-arbitrary-text-spans-in-android-90305ebb8e9b) .\n\n## View\nRead more about the view module, classes and components [here](https://github.com/tunjid/Android-Extensions/blob/develop/view/README.md).\nA medium post with some of it's offerings can be read [here](https://proandroiddev.com/creating-an-expandable-floating-action-button-in-android-6626b968559e).\n\n## RecyclerView\nRead more about the RecyclerView module, classes and components [here](https://github.com/tunjid/Android-Extensions/blob/develop/recyclerview/README.md).\nA medium post with some of it's offerings can be read [here](https://medium.com/@Tunji_D/composing-attributes-of-a-dynamic-recyclerview-with-functions-300064990bd4).\n\n## ConstraintLayout\nRead more about the ConstraintLayout module, classes and components [here](https://github.com/tunjid/Android-Extensions/blob/develop/constraintlayout/README.md).\nA medium post with some of it's offerings can be read [here](https://proandroiddev.com/sliding-along-composing-a-dynamic-reusable-viewpager-indicator-animator-f7c46d559a21).\n\n## Material\nRead more about the Material module, classes and components [here](https://github.com/tunjid/Android-Extensions/blob/develop/material/README.md).\nA medium post with some of it's offerings can be read [here](https://proandroiddev.com/creating-an-expandable-floating-action-button-in-android-6626b968559e).\n\n## Communications\nRead more about the communications module, classes and components [here](https://github.com/tunjid/Android-Extensions/blob/develop/communications/README.md).\nA project using it can be seen [here](https://github.com/tunjid/BluetoothRcSwitch).\n\n## Test\nWarning, here be dragons, I haven't updated this in a bit; move fast, break things and all that.\nI mean, yeah I could test more, but thank Heavens for QA, amirite? 🙃\nYou can read more about the testing module and classes [here](https://github.com/tunjid/Android-Extensions/blob/develop/test/README.md).\n\nImage attribution\nApp icon made by [Freepik](https://www.freepik.com/?__hstc=57440181.7a5d7d3cc018b38de5851a6c095932c9.1558869007278.1558869007278.1558869007278.1\u0026__hssc=57440181.5.1558869007279\u0026__hsfp=1983466168 \"Freepik\") from [www.flaticon.com](https://www.flaticon.com/ \"Flaticon\") is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/ \"Creative Commons BY 3.0\"\n\n## Publishing\n\nPublishing is done with the `maven-publish` plugin.\n\nTo publish, run:\n\n`./gradlew incrementalPublish`\n\nThis will publish the latest version of every module, and will not override existing versions.\nThe version of the module is determined by the version.properties file. To bump a module version, bump it in version.properties.\n\nPublishing configuration is done by using a `publishInfo.json` file in the project root directory.\nA sample `publishInfo.json` looks like:\n\n```\n{\n  \"signArtifacts\": true,\n  \"signingPassword\": \"mySigningPassword\",\n  \"signingKey\": \"-----BEGIN PGP PRIVATE KEY BLOCK-----ADD YOUR GPG KEY HERE-----END PGP PRIVATE KEY BLOCK-----\\n\",\n  \"versionSuffix\": \"myVersionSuffix\",\n  \"repositories\": [\n    {\n      \"name\": \"TunjiGithub\",\n      \"publishUrl\": \"https://maven.pkg.github.com/tunjid/Android-Extensions\",\n      \"downloadUrl\": \"https://maven.pkg.github.com/tunjid/Android-Extensions\",\n      \"credentials\": {\n        \"username\": \"tunjid\",\n        \"password\": \"githubAuthToken\"\n      }\n    },\n    {\n      \"name\": \"TunjiMavenCentral\",\n      \"publishUrl\": \"https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/\",\n      \"downloadUrl\": \"https://repo1.maven.org/maven2\",\n      \"credentials\": {\n        \"username\": \"myMavenCentralUsername\",\n        \"password\": \"myMavenCentralPassword\"\n      }\n    }\n  ]\n}\n```\n\n`signArtifacts`, `signingPassword`, `signingKey` and `versionSuffix` properties are not necessary and may be omitted;\nin fact, I personally only need to sign my artifacts when uploading to maven central.\n\nNote that the repository name *NEEDS* to be camel cased as it's used when finding the gradle task to publish the artifact.\n\nYou do however need to specify at least 1 maven repository to publish to if you intend to publish artifacts.\n\nIf you intend to host your own version of the artifacts on github packages after forking the repository, you will need to add a secret to your github action pipeline.\nThe secret key is `PUBLISH_INFO_JSON`, and the value is the `publishInfo.json` described above, substituting the values of `publishUrl` and `downloadUrl`\nto match the url of your github fork and the credentials matching your username and github auth token.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftunjid%2Fandroid-extensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftunjid%2Fandroid-extensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftunjid%2Fandroid-extensions/lists"}