{"id":13492773,"url":"https://github.com/thiagokimo/TMDb","last_synced_at":"2025-03-28T10:33:03.190Z","repository":{"id":32395149,"uuid":"35971703","full_name":"thiagokimo/TMDb","owner":"thiagokimo","description":"A simple Android client for The Movie DB in Material Design","archived":false,"fork":false,"pushed_at":"2018-12-04T15:22:02.000Z","size":11344,"stargazers_count":65,"open_issues_count":1,"forks_count":31,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-10-31T06:35:07.742Z","etag":null,"topics":["android","movie","tmdb"],"latest_commit_sha":null,"homepage":"https://play.google.com/store/apps/details?id=io.kimo.tmdb","language":"Java","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/thiagokimo.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}},"created_at":"2015-05-20T20:12:39.000Z","updated_at":"2023-09-20T15:08:21.000Z","dependencies_parsed_at":"2022-09-11T19:00:43.589Z","dependency_job_id":null,"html_url":"https://github.com/thiagokimo/TMDb","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/thiagokimo%2FTMDb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagokimo%2FTMDb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagokimo%2FTMDb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagokimo%2FTMDb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thiagokimo","download_url":"https://codeload.github.com/thiagokimo/TMDb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246012786,"owners_count":20709515,"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","movie","tmdb"],"created_at":"2024-07-31T19:01:09.037Z","updated_at":"2025-03-28T10:33:00.297Z","avatar_url":"https://github.com/thiagokimo.png","language":"Java","funding_links":[],"categories":["Java"],"sub_categories":[],"readme":"# TMDb\nA simple Android client for The Movie DB in Material Design\n\n[![Get it on Google Play](http://www.android.com/images/brand/get_it_on_play_logo_small.png)](https://play.google.com/store/apps/details?id=io.kimo.tmdb)\n\n## TL;DR\nThis project is an Android app which displays data from [The Movie Database](https://www.themoviedb.org) API.\n\n## Screenshots\n![Movie Search](https://raw.githubusercontent.com/thiagokimo/TMDb/master/screenshots/movie-search.png)\n![Movie Detail](https://raw.githubusercontent.com/thiagokimo/TMDb/master/screenshots/movie-detail.png)\n![Movie Images](https://raw.githubusercontent.com/thiagokimo/TMDb/master/screenshots/movie-images.png)\n![Fullscreen Image](https://raw.githubusercontent.com/thiagokimo/TMDb/master/screenshots/fullscreen-image.png)\n\n## The Mission\nIn this assignment I had to provide 3 main user features:\n\n- Search for movies\n- See details of a movie\n- Open images of a movie\n\nThe following section explains how did I organized the architecture of my code.\n\n## Architecture\nThe application is organized using a clean architecture approach consisting of 2 main layers:\n\n- Presentation (app)\n- Domain\n\n### Presentation Layer\nThe view logic resides here. The **Model-View-Presenter** pattern was used to keep all the presentation logic into  *presenters* and away from the fragments and activities (which were considered only views). The presenters are composed of the use-case that perform their tasks on background, outside the UI Thread, and returning the results through a callback into the views.\n\nThird-party dependencies:\n```\ncompile 'com.android.support:appcompat-v7:22.1.1'\ncompile 'com.android.support:recyclerview-v7:21.0.0'\ncompile 'com.android.support:cardview-v7:21.0.0'\ncompile 'com.squareup.picasso:picasso:2.5.2'\ncompile 'com.melnykov:floatingactionbutton:1.3.0'\ncompile 'com.ogaclejapan.smarttablayout:library:1.1.3@aar'\ncompile 'com.ogaclejapan.smarttablayout:utils-v4:1.1.3@aar'\ncompile 'com.mcxiaoke.photoview:library:1.2.3'\ncompile 'com.pnikosis:materialish-progress:1.5'\ncompile('com.crashlytics.sdk.android:crashlytics:2.2.4@aar') { transitive = true; }\n```\n\nThe **AppCompat** was used in order to make the app UI's look'n feel as much Material Design as possible, with the hold of **CardView**, **Materialish Progress** and **Floating Action Button**. The **RecyclerView** was used to handle all collections displayed in the app. All images loaded from the web were handled with **Picasso**, which allow us deal with asynchronous image downloading. Interfaces with tabs were build with **SmartTabLayout**. Fullscreen images are displayed with the **PhotoView** library, which allow users to zoom in/out and move around the image. The **Crashlytics** library is used to keep tracks of all non predictable crashes.\n\n### Domain Layer\nThis layer have all business rules. All use-cases implementations, server-side communication and entity objects were implemented here. This layer doesn't know the existence of the presentation layer.\n\nThird-party dependencies:\n```\ncompile 'com.path:android-priority-jobqueue:1.1.2'\ncompile 'com.squareup.retrofit:retrofit:1.9.0'\n```\n\nThe **Retrofit** library was used to do http calls. The **Priority Job Queue** was used to wrap all use cases in a thread-safe environment.\n\n## Notes\n\n- In order to solve the request search limit I called the search movie use case 1 second after the user typed in the search input.\n- Since there were different image sizes, I displayed lower-sized images in my recylerviews and bigger or original sizes of images in the detailed screens.\n- To pass data from the domain layer to the presentation layer I used a mapper to filter out all unnecessary information from the server-side that I wasn't going to use in the views.\n- I used [this](https://gist.github.com/fada21/10655652) technique to cache images loaded from Picasso.\n\n\n## Extra things I could have done\n\n- An Image transition from the movie search screen to the movie detail screen.\n- I didn't write tests. If I did I would test my presenters in the presentation layer and my use cases in the domain layer.\n\n## References\n\n- [The Clean Architecture by Uncle Bob](http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html)\n- [Architecting Android…The clean way? by Fernando Cejas](http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/)\n\n## Author\nThiago Rocha\n\n+553184349266\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthiagokimo%2FTMDb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthiagokimo%2FTMDb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthiagokimo%2FTMDb/lists"}