Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Pagination was implemented using Jetpack Paging3 due to the fact that NYT book list APIs support pagination via offset query parameter.
Cache was implemented using Room and as part of Paging3 using a RemoteMediator (BookListRemoteMediator). This implies that the application is still usable even without Internet connection.
The application automatically retries a failed load due to lack of internet once it gets online. (InternetConnectionMonitor)
Unit tests were written for BookListMediator as Intrumented test because a memory SQLite database was needed. We could have done Fake DAOs, but this would have introduced boilerplate and more untested code.
Multiple screen support was implemented using Window Size classes breakpoints (see: https://developer.android.com/develop/ui/compose/layouts/adaptive/window-size-classes).
Elements in the list are slightly bigger in Medium width screens and laid out as a Grid in Expanded width screens.
This feature was designed with scalability and mantainability in mind. It can be noticed that BookListFragment accepts parameters for loading any list from NYT API. However it will always load the Hardcover Fiction list since list name fetching is not supported.
Techstack:
Testing techstack:
Screenshots:
![Screenshot_20240722_002040](https://private-user-images.githubusercontent.com/61490804/350873141-dec8b6bf-edb3-45a2-80f6-67236322a61c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3MDU0OTAsIm5iZiI6MTczOTcwNTE5MCwicGF0aCI6Ii82MTQ5MDgwNC8zNTA4NzMxNDEtZGVjOGI2YmYtZWRiMy00NWEyLTgwZjYtNjcyMzYzMjJhNjFjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDExMjYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMwZTBkMDMzNmQ2NjBmYjcxZTVhNTU0NDA2YzliZDc2MTA1YThlN2ExYzA1YWUwZTdjZTUzNWY1ZWM1NWIxYzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2ggh79Q2ekK6_ejXFLJO7VJc36yg7pg9iogu6QLxdqQ)
![Screenshot_20240722_002131](https://private-user-images.githubusercontent.com/61490804/350873185-54f19b07-3466-460f-a144-1bd6d026da73.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3MDU0OTAsIm5iZiI6MTczOTcwNTE5MCwicGF0aCI6Ii82MTQ5MDgwNC8zNTA4NzMxODUtNTRmMTliMDctMzQ2Ni00NjBmLWExNDQtMWJkNmQwMjZkYTczLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDExMjYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ2NDhkZDczMWJjMmI5ZmViYThkM2M3NmQ4YjM3Mjc4ODZmMzYxYmQyYzRjODMxMjY1ZmMwY2NjMzM0NzMyYWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.gA-9CKABrnGwwlp8ChZ1HwCuHESFLVCW08oNZsGWuRk)
![Screenshot_20240722_002153](https://private-user-images.githubusercontent.com/61490804/350873219-082d2e62-25f6-4868-b6da-d262fc41b736.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3MDU0OTAsIm5iZiI6MTczOTcwNTE5MCwicGF0aCI6Ii82MTQ5MDgwNC8zNTA4NzMyMTktMDgyZDJlNjItMjVmNi00ODY4LWI2ZGEtZDI2MmZjNDFiNzM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDExMjYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA4ZDUxZWVmNzhlZTQwZDQxZWJkZjQzZjZhNDdkZGZiNTFlMTUzNmU0OGQ3OWEyY2Y5NTQ4ZjkxMGQzODE5YTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.qZ9PvEfeuiifkykSbYR4UvLD2E7UM3U5ApfrJDp64Zc)
![Screenshot_20240722_002211](https://private-user-images.githubusercontent.com/61490804/350873246-cb635ab1-080e-4ed7-8d15-7ef398bcf4a3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk3MDU0OTAsIm5iZiI6MTczOTcwNTE5MCwicGF0aCI6Ii82MTQ5MDgwNC8zNTA4NzMyNDYtY2I2MzVhYjEtMDgwZS00ZWQ3LThkMTUtN2VmMzk4YmNmNGEzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDExMjYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWEwMWVmZTIzYjdhOWU5OTZjYjdlZDQyYmQ2MDllMjk5NTQ0Yjc1NDlhZGExZDBiZDUxOTc1M2YzMzdmY2I2NGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Ub6s8JNVp2t3DVR63-xmZGGOT6hE9L6Vfk0NKbVwflI)