An Android application displaying popular news fetched from the NY Times API
Popular News
Popular News is an Android application consuming the NY Times API
to display most popular news over the last 7 days. The app follows clean architecture principles
and uses MVVM with the Android architecture components.
Demo
Mobile | Tablet |
---|---|
Project Setup
- Clone the repo using
git clone https://github.com/tonyawino/News-App.git
- Open the project in Android Studio
- Generate a NY Times API Key
- Add the API Key to your local
gradle.properties
file with the keyNY_TIMES_API_KEY
and the value of your API Key e.gNY_TIMES_API_KEY="cjCe8546151551894561s"
- Sync and build your project.
- Hit “Run”. Done!
Architecture Overview
The application has three layers guided by clean architecture to provide clear
separation of concerns:
UI
The ui
package has files that make up the interface i.e. activities and fragments.
ViewModels are also contained in this package and they are used to handle the states
of the views, which is exposed using LiveData. Additionally, the ViewModels also
act as an interface of communicating with the other layers.
Domain
The domain
package has the domain models/entities that represent data to be handled
across the whole app i.e. from the UI to the data layer. The layer also contains
use cases that represent various actions that can be performed for data transfer
between the data and UI layers. A repository interface is also in the domain layer,
and it defines a contract to be followed by any repository implementation.
Data
The data
layer is divided into two data sources, local and remote. The two data
sources collaborate to have a single source of truth, which is the local layer.
The remote source is in the retrofit
package and is used to communicate with the
remote server, while the local source is in the room
package. The repository maps
data from these two sources into the required domain models.
Helpers
Packages used to tie the whole setup together include di
for dependency injection
and utils
which contains some shared utilities.
Testing
Most packages, and files, have their own tests, with exceptions such as the dependency
injection files.
Server responses are mocked and verified for correctness. The local
database is tested using an in-memory database that is faster than an actual database
and only lasts the duraction of the test.
Use cases are also tested for correctness and validation of data.
ViewModels were also tested for correctness using the UseCases and the repository with
a mock webserver and an in-momory database.
The instrumentation tests use a mocked context and a mocked server. This is to test
various scenarios including the unavailability of internet.
Running the tests
The application contains unit tests that run on the local machine and instrumented tests that
require the use of an emulator or connected Android device.
- Run the task
./gradlew connectedCheck
to run both local unit tests and instrumented tests - Run the task
./gradlew test
for local unit tests - Locate the test coverage results at
/app/build/reports/coverage/androidTest/debug
- Locate the local unit test results at
- HTML test result files at
/app/build/reports/tests/
- XML test result files at
/app/build/test-results/
- HTML test result files at
- Locate the instrumented test results at
- HTML test result files at
/app/build/reports/androidTests/connected/
- XML test result files at
/app/build/outputs/androidTest-results/connected/
- HTML test result files at
Libraries
Libraries used in the whole application are:
- Jetpack?
- Viewmodel – Manage UI related data in a lifecycle conscious way
and act as a channel between use cases and ui - View Binding – View binding is a feature that allows you to more easily write code that interacts with views
- Room – Provides abstraction layer over SQLite
- Navigation Components – Navigation support for Android
- Viewmodel – Manage UI related data in a lifecycle conscious way
- Retrofit – type safe http client and supports coroutines out of the box
- Gson – Library that can be used to convert Kotlin Objects into/from their JSON representation
- okhttp-logging-interceptor – logs HTTP request and response data.
- Coroutines – Threads on steroids for Kotlin
- Flow – A cold asynchronous data stream that sequentially emits values and completes normally or with an exception.
- Truth – Assertions Library,provides readability as far as assertions are concerned
- Material Design – build awesome beautiful UIs.??
- Espresso – Test framework to write UI Tests
- mockK – Mocking framework that comprehensively supports Kotlin features
- JUnit Rules – JUnit rules provide more flexibility and reduce the boilerplate code required in tests
- Glide – Media management and image loading framework for Android
- Hilt-Dagger – Standard library to incorporate Dagger dependency injection into an Android application.
- Hilt-ViewModel – DI for injecting
ViewModel
.
Copyright Notice
New York Times and all associated names are copyright The New York Times Company.
License
News App is an Android application displaying popular news using the NY Times API.
Copyright (C) 2022 Tony Awino
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.