{"id":13773606,"url":"https://github.com/calvinnor/MovieMan","last_synced_at":"2025-05-11T05:35:00.832Z","repository":{"id":49127763,"uuid":"162825214","full_name":"calvinnor/MovieMan","owner":"calvinnor","description":"An open-source Android app for viewing Movies / TV information.","archived":false,"fork":false,"pushed_at":"2022-11-13T14:53:29.000Z","size":471,"stargazers_count":79,"open_issues_count":1,"forks_count":13,"subscribers_count":6,"default_branch":"develop","last_synced_at":"2024-11-17T08:44:25.952Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/calvinnor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-12-22T16:14:07.000Z","updated_at":"2024-10-02T19:36:53.000Z","dependencies_parsed_at":"2023-01-21T18:20:22.057Z","dependency_job_id":null,"html_url":"https://github.com/calvinnor/MovieMan","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvinnor%2FMovieMan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvinnor%2FMovieMan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvinnor%2FMovieMan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvinnor%2FMovieMan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/calvinnor","download_url":"https://codeload.github.com/calvinnor/MovieMan/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253523688,"owners_count":21921815,"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":[],"created_at":"2024-08-03T17:01:17.835Z","updated_at":"2025-05-11T05:34:55.807Z","avatar_url":"https://github.com/calvinnor.png","language":"Kotlin","funding_links":[],"categories":[":art: Pattern"],"sub_categories":["MVVM"],"readme":"# MovieMan\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/CalvinNor/MovieMan?label=Download)](https://github.com/CalvinNor/MovieMan/releases)\n[![CircleCI](https://circleci.com/gh/CalvinNor/MovieMan.svg?style=svg)](https://circleci.com/gh/CalvinNor/MovieMan)\n\nAn open-source Android app for viewing Movies / TV information.\n\n![](https://www.themoviedb.org/assets/1/v4/logos/408x161-powered-by-rectangle-green-bb4301c10ddc749b4e79463811a68afebeae66ef43d17bcfd8ff0e60ded7ce99.png \"TMDB\")\n\nIntroduction:\n=====\n\n\u003e  MovieMan is the materialization of how (I think) the Architecture of a good Android Application should be\n\nMovieMan is my sandbox project, where test my ideas, ideal architectures and play around with libraries. \u003cbr\u003eIt's pretty close to a full-fledged application, complete with Network Requests, Local DB, Material Design and Test Cases.\n\nIt contains some bells and whistles like **Kotlin**, **Coroutines**, **Jetpack** \u0026 **AndroidX**.\n\u003cbr\u003e\nIt's **Modular**, has **Dependency Injection**, and closely follows **DRY and SOLID** principles.\n\u003cbr\u003eIt's also backed by CircleCI to build and run test cases.\n\nMovieMan is built to look good. I'm no designer or UX expert, and will borrow inspiration from common Google applications. You will find Fade / Material Transitions at some places, just cause they're easy to do and maintain :)\n\nI’ll keep adding features based on what the TMDB API provides.\n\u003cbr\u003eWriting duplicate screens and code for API-completion purposes is nowhere on my TODO list\n\n\u003e The aim is to make MovieMan feature-complete in terms of a variety of features, all while learning new things and implementing useful cases.\n\nScreenshots \u0026 Gifs:\n=====\n\u003cp\u003e\n  \u003cimg src=\"https://i.imgur.com/kIHwAhw.png\" width=\"250\" style=\"margin:2px\"/\u003e\n  \u003cimg src=\"https://i.imgur.com/tFUjnrV.png\" width=\"250\" style=\"margin:2px\"/\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/33203243/54878796-65e2e280-4e57-11e9-8108-11a5bf3a0c2e.gif\" width=\"250\" style=\"margin:2px\"/\u003e\n\u003c/p\u003e\n\nDownloads:\n=====\n\nDownload the latest APK [here](https://github.com/CalvinNor/MovieMan/releases/download/0.1/app-release.apk) or browse releases on [Releases](https://github.com/CalvinNor/MovieMan/releases)\n\nBuild Instructions:\n=====\n\n1. Clone the Project\n\n2. Grab an API key from TMDB and add 'TMDB_API_KEY' to your Environment variables. Instructions can be found in **Properties.kt**\n\n3. Add the following to your Environment variables after generating a keystore. Or optionally, remove the signing config from app's **build.gradle.kts**\n\t1. MM_PASSWORD\n   \t2. MM_ALIAS\n   \t3. MM_PASSWORD\n\n4. Gradle Sync and Rebuild\n\nDesign Decisions \u0026 Dependencies:\n=====\n\n### [Kotlin](https://kotlinlang.org/):\n\nI :heart: Kotlin. It's a breath of fresh air when coming from Java, and makes code so much nicer to read and write. It has OOTB support for Lambdas, Extension Functions, DSLs and a vast stdlib. JetBrains actively maintains and releases stable versions every month. All my projects (including this one) will be 100% Kotlin.\n\n### [JetPack](https://developer.android.com/jetpack) - Architecture Components \u0026 AndroidX:\nWould be a loss to build an application without these libraries. With Google advocating MVVM, and these libraries working so flawlessly with each other, it really leaves you no choice.\n\u003cbr\u003e**Room** - Database Layer\n\u003cbr\u003e**ViewModel** - Data Preservation across configuration changes\n\u003cbr\u003e**Lifecycle** - Handling annoying issues with Activities / Fragments namely when pushing data during false states\n\u003cbr\u003e**Navigation** - Handling Intent / Fragment Transactions, isolating sources from destinations and easy argument passing!\n\u003cbr\u003e**AndroidX, Material Components** - For embracing Material Design and backporting API features to minSdk\n\n### [Koin](https://insert-koin.io/) - Dependency Injection:\nSick and tired of Dagger in Production, and annoyed by it slowing down my build, I turned to a substitute. [Kodein](https://github.com/Kodein-Framework/Kodein-DI) seemed to be the recommended (and a more established) library for Android, however I chose Koin for it's sheer simplicity. It also made strides in performance in v2.0, which makes it my current choice for DI without code generation.\n\n### [Moshi](https://github.com/square/moshi) + [Retrofit](https://square.github.io/retrofit/) - Networking:\nA very simple choice when it comes to using REST APIs. I prefer Moshi over Gson because Moshi throws correct exceptions, and has good support for Kotlin. It also doesn't come with a Date Formatter by default, forcing you to handle UTC yourself.\n\u003cbr\u003eSee [Moshi vs Gson](https://www.reddit.com/r/androiddev/comments/684flw/why_use_moshi_over_gson/) for more info about this decison.\n\n### [JUnit4](https://junit.org/junit4/) + [Mockito](https://site.mockito.org/) - Unit Testing:\nA gold combination for unit testing and mocking dependencies. Since the app follows SOLID, dependent layers can be easily mocked and tested in isolation.\n\u003cbr\u003eI'm using [Mockito-Kotlin](https://github.com/nhaarman/mockito-kotlin) for a simpler DSL (and not writing ``when`` because ‘when’ is a Kotlin keyword)\n\n### [CircleCI](https://circleci.com/) - Continuous Integration:\nI chose CircleCI because of it's easy setup and configuration. Also because it provides free build times (1000 minutes) per month. I use CircleCI to build the app and run all it's Unit Test Cases.\n\n### Multi Modular:\nSeparation of Concerns and eventually supporting Instant Apps and Dynamic Delivery.\n\u003cbr\u003eModules are split by feature, with some base modules like core and data. Multi-modular applications force you to isolate components and prevent easy imports / dependencies between them.\n\u003cbr\u003eSuch applications can build faster too, since Gradle caches the unchanged modules, and will only build the changed ones (and the modules dependent on the changed module if a public API is touched)\n\u003cbr\u003e See [How Yelp Modularized the Android App](https://engineeringblog.yelp.com/2018/06/how-yelp-modularized-the-android-app.html)\n\n### Other Gems\n\n- [Kotlin Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html)\n- [Gradle Kotlin DSL](https://docs.gradle.org/current/userguide/kotlin_dsl.html)\n- [Dependency Updates Plugin](https://github.com/ben-manes/gradle-versions-plugin)\n\n# Contributions:\n\nContributions in any form are welcome.\n\u003cbr\u003eJust make sure to have fun and learn new things :)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalvinnor%2FMovieMan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcalvinnor%2FMovieMan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalvinnor%2FMovieMan/lists"}