Skip to content

Commit

Permalink
update readme
Browse files Browse the repository at this point in the history
  • Loading branch information
ndiritumichael committed Jun 7, 2024
1 parent cf9cf99 commit 34736a0
Show file tree
Hide file tree
Showing 16 changed files with 293 additions and 19 deletions.
6 changes: 4 additions & 2 deletions .github/workflows/androidbuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,16 @@ jobs:
- name: Run ktlintCheck on the codebase
run: ./gradlew ktlintCheck

- name: Build With Gradle
run: ./gradlew build

- name: Run Unit Tests
run: ./gradlew clean test

- name: Run debug Build
run: ./gradlew assembleDebug

- name : Build With Gradle
run: ./gradlew build


- name: Upload a Build Artifact
uses: actions/upload-artifact@v4.3.3
Expand Down
117 changes: 117 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
## CalorieBytez App

This is a simple Android app that uses the [Calorie Ninja](https://calorieninjas.com/api) to display
nutritional data for various food items.



*Pre-requisites*
- Built on A.S JellyFish
- JDK 17
- Access token from CalorieNinja.
- Once received place it in the local.properties file as follows:
``` properties
API_KEY = YourKey
```
To Inject the Key when using CI/CD with github actions , add the key to your projects secrets and extract in to your build workflow:

``` yaml
- name: Get local.properties from secrets
run: echo "${{secrets.LOCAL_PROPERTIES }}" > $GITHUB_WORKSPACE/local.properties
```
## Architecture
This project uses a modularized approach using MVVM with Clean architecture which has the following advantages
- Loose coupling between the code - The code can easily be modified without affecting any or a large part of the app's codebase thus easier to scale the application later on.
- Easier to test code.
- Separation of Concern - Different modules have specific responsibilities making it easier for modification and maintenance.
### Modularization Structure
- `core`
- `data`
- aggregates the data from the network and local database
- `network`
- handles getting data from any server/remote source
- `database`
- handles getting cached device data
- `domain`
- defines the core business logic for reuse
- `app`
- handles Ui logic of the app i.e navigation and use of the bottom bar.
- `feature`
- `Search`
- handles displaying data of queried item combinations
- `Food Details`
- handles displaying all food nutritional details
- `Saved Food`
- handles displaying food saved locally
- `testing`
- Encompasses the core testing functionality of the project



| Modularization Graph |
|--------------------------------------------|
| <img src="docs/graphviz.svg" /> |

### Testing

The app includes unit tests for all modules, Instrumented tests are ran as unit tests with the use of Roboelectric
#### tests screenshots

| Image | desc |
|---|-----------------------------------|
| <img src="docs/viewmodeltests.png" /> | Unit tests for the ViewModels |
| <img src="docs/datalayertests.png" /> | Unit tests for the data layer |
| <img src="docs/networktests.png"/> | Unit tests for the network layer |
| <img src="docs/dbtests.png" /> | Unit tests for the database layer |



## TechStack
### Libraries
* Tech-stack
* [Kotlin](https://kotlinlang.org/) - a modern, cross-platform, statically typed, general-purpose programming language with type inference.
* [Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html) - lightweight threads to perform asynchronous tasks.
* [Flow](https://kotlinlang.org/docs/reference/coroutines/flow.html) - a stream of data that emits multiple values sequentially.
* [StateFlow](https://developer.android.com/kotlin/flow/stateflow-and-sharedflow#:~:text=StateFlow%20is%20a%20state%2Dholder,property%20of%20the%20MutableStateFlow%20class.) - Flow APIs that enable flows to emit updated state and emit values to multiple consumers optimally.
* [Dagger Hilt](https://dagger.dev/hilt/) - a dependency injection library for Android built on top of [Dagger](https://dagger.dev/) that reduces the boilerplate of doing manual injection.
* [Jetpack](https://developer.android.com/jetpack)
* [Jetpack Compose](https://developer.android.com/jetpack/compose) - A modern toolkit for building native Android UI
* [Lifecycle](https://developer.android.com/topic/libraries/architecture/lifecycle) - perform actions in response to a change in the lifecycle state.
* [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel) - store and manage UI-related data lifecycle in a conscious manner and survive configuration change.
* [Room](https://developer.android.com/training/data-storage/room) - An ORM that provides an abstraction layer over SQLite to allow fluent database access.
* [Timber](https://github.com/JakeWharton/timber) - a highly extensible Android logger.
* [Ktor](https://ktor.io/) - A pure Create asynchronous http client


* Tests
* [JUnit](https://junit.org/junit4/) - a simple framework for writing repeatable tests.
* [MockK](https://github.com/mockk) - mocking library for Kotlin
* [Truth](https://github.com/agoda-com/Kakao) - A fluent assertions library for Android and Java.
* Gradle
* [Gradle Kotlin DSL](https://docs.gradle.org/current/userguide/kotlin_dsl.html) - An alternative syntax for writing Gradle build scripts using Koltin.
* [Version Catalogs](https://developer.android.com/build/migrate-to-catalogs) - A scalable way of maintaining dependencies and plugins in a multi-module project.
* [Convention Plugins](https://docs.gradle.org/current/samples/sample_convention_plugins.html) - A way to encapsulate and reuse common build configuration in Gradle, see [here](https://github.com/daniel-waiguru/WeatherApp/tree/main/build-logic%2Fconvention%2Fsrc%2Fmain%2Fjava)
* Plugins
* [Ktlint](https://github.com/JLLeitschuh/ktlint-gradle) - creates convenient tasks in your Gradle project that run ktlint checks or do code auto format.
* [Spotless](https://github.com/diffplug/spotless) - format Java, groovy, markdown, and license headers using gradle.
* CI/CD
* [GitHub Actions](https://github.com/features/actions)

## ScreenShots
## Screenshots with Descriptions in Columns

| Loading | Recent Searches | Food List |
|---|---|---|
| <img src="docs/loading.jpg" width="250"/> | <img src="docs/recentssearch.jpg" width="250"/> | <img src="docs/foodlist.jpg" width="250"/> |

| Idle | Details | Error Screen |
|---|---|--------------|
| <img src="docs/idle.jpg" width="250"/> | <img src="docs/details.jpg" width="250"/> |<img src="docs/errorscreen.jpg" width="250"/>


1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ plugins {
alias(libs.plugins.detekt)
alias(libs.plugins.spotless)
alias(libs.plugins.android.library) apply false
alias(libs.plugins.module.graph) apply true
}

subprojects {
Expand Down
Binary file added docs/datalayertests.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/dbtests.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/details.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/errorscreen.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/foodlist.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
169 changes: 169 additions & 0 deletions docs/graphviz.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/idle.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/loading.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/networktests.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/recentssearch.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/viewmodeltests.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 0 additions & 17 deletions feature/search/src/test/java/com/devmike/search/ExampleUnitTest.kt

This file was deleted.

2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ ktor = "2.3.7"
lifecycleRuntimeKtx = "2.8.1"
lottie = "6.0.0"
mockk = "1.13.11"
moduleGraph = "2.5.0"
robolectric = "4.12.2"
room = "2.6.1"
spotless = "6.4.2"
Expand Down Expand Up @@ -128,6 +129,7 @@ hilt-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
android-library = { id = "com.android.library", version.ref = "agp" }
kotlinX-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
room-compiler = { id = "androidx.room", version.ref = "room" }
module-graph = { id = "com.jraska.module.graph.assertion", version.ref = "moduleGraph" }


# project plugins
Expand Down

0 comments on commit 34736a0

Please sign in to comment.