{"id":13774668,"url":"https://github.com/mitchtabian/Open-API-Android-App","last_synced_at":"2025-05-11T06:33:33.399Z","repository":{"id":35473672,"uuid":"197218589","full_name":"mitchtabian/Open-API-Android-App","owner":"mitchtabian","description":"Kotlin, MVI, Hilt, Retrofit2, Coroutines, Room Persistence, REST API, Token Authentication","archived":false,"fork":false,"pushed_at":"2023-03-18T16:03:50.000Z","size":2106,"stargazers_count":692,"open_issues_count":7,"forks_count":231,"subscribers_count":26,"default_branch":"master","last_synced_at":"2024-11-17T09:39:34.648Z","etag":null,"topics":["android-jetpack-components","coroutines-android","dagger2","jetpack-android","jetpack-lifecycle-components","jetpack-navigation","kotlin","mvvm-architecture","navigation-component","rest-api","retrofit2","room-persistence"],"latest_commit_sha":null,"homepage":"","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/mitchtabian.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}},"created_at":"2019-07-16T15:18:46.000Z","updated_at":"2024-10-23T14:34:33.000Z","dependencies_parsed_at":"2022-08-24T14:25:05.626Z","dependency_job_id":"f8a20014-074f-45a7-a7cb-680d8d165a87","html_url":"https://github.com/mitchtabian/Open-API-Android-App","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitchtabian%2FOpen-API-Android-App","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitchtabian%2FOpen-API-Android-App/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitchtabian%2FOpen-API-Android-App/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitchtabian%2FOpen-API-Android-App/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mitchtabian","download_url":"https://codeload.github.com/mitchtabian/Open-API-Android-App/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253528415,"owners_count":21922623,"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-jetpack-components","coroutines-android","dagger2","jetpack-android","jetpack-lifecycle-components","jetpack-navigation","kotlin","mvvm-architecture","navigation-component","rest-api","retrofit2","room-persistence"],"created_at":"2024-08-03T17:01:29.166Z","updated_at":"2025-05-11T06:33:32.612Z","avatar_url":"https://github.com/mitchtabian.png","language":"Kotlin","funding_links":[],"categories":[":art: Pattern","Android Apps (Search Results)"],"sub_categories":["MVI"],"readme":"# \"Clean\" Refactor Notes\nIn July 2021 I did a major refactor. Here's what I did:\n1. Migrate from Dagger to [Hilt](https://developer.android.com/training/dependency-injection/hilt-android).\n1. Update [Navigation Component](https://developer.android.com/guide/navigation).\n\t- Now supports [multiple backstacks](https://medium.com/androiddevelopers/multiple-back-stacks-b714d974f134) by default.\n1. Decoupling.\n\t- Avoid sharing viewmodels. It makes unit testing easier when I can test fragments in isolation.\n1. Splitting business models into Entities and Dto's. This way I have a clear [business model](https://github.com/mitchtabian/Open-API-Android-App/blob/master/app/src/main/java/com/codingwithmitch/openapi/business/domain/models/BlogPost.kt), [network model](https://github.com/mitchtabian/Open-API-Android-App/blob/master/app/src/main/java/com/codingwithmitch/openapi/business/datasource/network/main/BlogPostDto.kt), and [caching model](https://github.com/mitchtabian/Open-API-Android-App/blob/master/app/src/main/java/com/codingwithmitch/openapi/business/datasource/cache/blog/BlogPostEntity.kt).\n1. Writing use cases.\n\t- Unidirectional data flow with MVI and kotlin sealed classes. (See [Interactors](https://github.com/mitchtabian/Open-API-Android-App/tree/master/app/src/main/java/com/codingwithmitch/openapi/business/interactors))\n1. Refactor message handling system to a [Queue](https://github.com/mitchtabian/Open-API-Android-App/blob/master/app/src/main/java/com/codingwithmitch/openapi/business/domain/util/Queue.kt).\n1. Migrate from Shared Preferences to [DataStore](https://developer.android.com/topic/libraries/architecture/datastore).\n1. Migrate from Kotlin synthetics to [ViewBinding](https://developer.android.com/topic/libraries/view-binding).\n1. Write [Unit tests](https://github.com/mitchtabian/Open-API-Android-App/tree/master/app/src/test/java/com/codingwithmitch/openapi/interactors) for use-cases.\n\n# TODO\n1. Check out the new [splash screen APIs](https://developer.android.com/about/versions/12/features/splash-screen)\n1. Do a [Compose](https://developer.android.com/jetpack/compose) refactor\n\t- I will create a new repo for this\n\n# Test Account\n\nemail: `blake@tabian.ca`\n\npassword: `password`\n\n\n\u003chr\u003e\n\n\u003ca href='https://codingwithmitch.com/courses/powerful-android-apps-with-jetpack-architecture/' target='_blank'\u003e\u003cimg class='header-img' src='https://codingwithmitch.s3.amazonaws.com/static/powerful-android-apps-with-jetpack-architecture/images/powerful_android_apps_1.png' /\u003e\u003c/a\u003e\n\n\n\u003ch1\u003e\u003ca href=\"https://codingwithmitch.com/courses/powerful-android-apps-with-jetpack-architecture/\"\u003ePowerful Android Apps with Jetpack Architecture\u003c/a\u003e\u003c/h1\u003e\n\u003cp\u003eWatch the video course here: \u003ca href=\"https://codingwithmitch.com/courses/powerful-android-apps-with-jetpack-architecture/\"\u003ePowerful Android Apps with Jetpack Architecture\u003c/a\u003e.\u003c/p\u003e\n\n\u003cp\u003eIn this course you'll learn to build a real application that interacts with the website \u003ca href=\"https://open-api.xyz\" target=\"_blank\"\u003eopen-api.xyz\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eOpen-api.xyz is a sandbox website for codingwithmitch members to practice interacting with a Rest API. \u003c/p\u003e\u003cbr\u003e\n\n\u003ch2\u003e\u003cstrong\u003ePrerequisites\u003c/strong\u003e (Recommended not required):\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://codingwithmitch.com/courses/dagger22-android/\"\u003eDagger 2\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://codingwithmitch.com/courses/model-view-intent-mvi-architecture/\"\u003eMVI Architecture\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://codingwithmitch.com/courses/android-local-database-cache-rest-api/\"\u003eDatabase Caching (Retrofit + Room)\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\n\u003c/ol\u003e\n\u003cbr\u003e\n\n\u003ch2\u003e\u003cstrong\u003eWhat you'll learn:\u003c/strong\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eKotlin\u003c/strong\u003e:\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eCoroutines\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eAdvanced coroutine management using jobs\u003c/li\u003e\n\u003cli\u003eCancelling active jobs\u003c/li\u003e\n\u003cli\u003eCoroutine scoping\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eNavigation Components\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eBottom Navigation View with fragments \u003c/li\u003e\n\u003cli\u003eLeveraging multiple navigation graphs (this is cutting edge content)\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eDagger 2\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003ecustom scopes, fragment injection, activity injection, Viewmodel injection\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eMVI architecture\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eBasically this is MVVM with some additions\u003c/li\u003e\n\u003cli\u003eState management\u003c/li\u003e\n\u003cli\u003eBuilding a generic BaseViewModel\u003c/li\u003e\n\u003cli\u003eRepository pattern (NetworkBoundResource)\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eRoom Persistence\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eSQLite on Android with Room Persistence library\u003c/li\u003e\n\u003cli\u003eCustom queries, inserts, deletes, updates\u003c/li\u003e\n\u003cli\u003eForeign Key relationships\u003c/li\u003e\n\u003cli\u003eMultiple database tables\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eCache\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eDatabase caching (saving data from network into local cache)\u003c/li\u003e\n\u003cli\u003eSingle source of truth principal\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eRetrofit 2\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eHandling any type of response from server (success, error, none, etc...)\u003c/li\u003e\n\u003cli\u003eReturning LiveData from Retrofit calls (Retrofit Call Adapter)\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eViewModels\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eSharing a ViewModel between several fragments\u003c/li\u003e\n\u003cli\u003eBuilding a powerful generic BaseViewModel\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eWebViews\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eInteracting with the server through a webview (Javascript)\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eSearchView\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eProgrammatically implement a SearchView\u003c/li\u003e\n\u003cli\u003eExecute search queries to network and db cache\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eImages\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eSelecting images from phone memory\u003c/li\u003e\n\u003cli\u003eCropping images to a specific aspect ratio\u003c/li\u003e\n\u003cli\u003eSetting limitations on image size and aspect ratio\u003c/li\u003e\n\u003cli\u003eUploading a cropped image to server\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eNetwork Request Management\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eCancelling pending network requests (Kotlin coroutines)\u003c/li\u003e\n\u003cli\u003eTesting for network delays\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003ePagination\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003ePaginating objects returned from server and database cache\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eMaterial Design\u003c/strong\u003e:\u003cbr\u003e\n\u003col\u003e\n\u003cli\u003eBottom Navigation View with Fragments\u003c/li\u003e\n\u003cli\u003eCustomizing Bottom Navigation Icon behavior\u003c/li\u003e\n\u003cli\u003eHandling Different Screen Sizes (ConstraintLayout)\u003c/li\u003e\n\u003cli\u003eMaterial Dialogs\u003c/li\u003e\n\u003cli\u003eFragment transition animations\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cbr\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmitchtabian%2FOpen-API-Android-App","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmitchtabian%2FOpen-API-Android-App","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmitchtabian%2FOpen-API-Android-App/lists"}