diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml
index c27757f..157f42c 100644
--- a/.github/workflows/android_ci.yml
+++ b/.github/workflows/android_ci.yml
@@ -9,23 +9,24 @@ on:
- development
jobs:
- test:
- name: Run Unit Tests
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Set Up JDK 18
- uses: actions/setup-java@v3
- with:
- java-version: '18'
- distribution: 'temurin'
- cache: gradle
-
- - name: Unit tests
- run: bash ./gradlew test --stacktrace
+ # Unit test implementation added through git hooks
+ # test:
+ # name: Run Unit Tests
+ # runs-on: ubuntu-latest
+ #
+ # steps:
+ # - name: Checkout
+ # uses: actions/checkout@v3
+ #
+ # - name: Set Up JDK 18
+ # uses: actions/setup-java@v3
+ # with:
+ # java-version: '18'
+ # distribution: 'temurin'
+ # cache: gradle
+ #
+ # - name: Unit tests
+ # run: bash ./gradlew test --stacktrace
build:
name: Build Project
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..44d8666
--- /dev/null
+++ b/README.md
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
JetJoke - Joke Generator App
+
+
+
+
+
+
+
+
+
+
+## โน๏ธ Project Info :
+**JetJoke App** is build to demonstrate the use of Clean Architecture + MVVM in Android App Development. App is mainly divided into 3 layers i.e ```data```, ```domain``` & ```app``` (presentation).
+It also showcase the implemetation of some of the Modern Jetpack Architecture Component.
+
+## โฌ๏ธ Download App :
+
+
+## ๐จโ๐ป App Demo :
+### Screenshot
+
+
+### Video
+[Video Demo](https://github.com/swapnil-musale/JetJoke/assets/15209914/15d49fc6-666f-4acd-9b16-b590fe0df464)
+
+## ๐ Libraries Used :
+* [Kotlin][0] : Kotlin is statically typed & first-class language for Android Development.
+* [Coroutines][1] : For Asynchronus or non-blocking operations.
+* [Flows][2] : Data Streaming API which is built on top of Coroutines.
+* [Jetpack Compose][3] : Toolkit for building native UI in a declarative way.
+* [Splash Screen API][4] : Launch app with animation of launcher icon.
+* [Retrofit][5] : Type-safe REST client for Android to consume RESTful web services.
+* [Dagger Hilt][6] : Dependency injection library for Android.
+
+[0]: https://kotlinlang.org/
+[1]: https://kotlinlang.org/docs/coroutines-overview.html
+[2]: https://developer.android.com/kotlin/flow
+[3]: https://developer.android.com/jetpack/compose
+[4]: https://developer.android.com/develop/ui/views/launch/splash-screen
+[5]: https://github.com/square/retrofit
+[6]: https://dagger.dev/hilt/
+
+## ๐งฐ Other Tools :
+* [Kotlin DSL][7] : For writing gradle script for Kotlin is more readable and offers better compile-time.
+* [Version Catalog][8] : Declaring gradle dependencies & plugins in central place.
+* [Github Actions(CI/CD)][9] : Automate the build, test, and deployment pipeline through Github Actions.
+* [Renovate][10] : To keep the app dependencies up-tp-date automatically.
+
+[7]: https://docs.gradle.org/current/userguide/kotlin_dsl.html
+[8]: https://docs.gradle.org/current/userguide/platforms.html
+[9]: https://github.com/features/actions
+[10]: https://docs.renovatebot.com/
+
+## ๐๏ธ App Architecture :
+App is build using Clean Architecture design pattern. Which consist of three module as follows :
+* [**app**](https://github.com/swapnil-musale/JetJoke/tree/master/app) - This module is responsible for handling user interaction, displaying data and managing user interface. Usually this module is decoupled from bossiness logic and communicate with domain module for accessing any data.
+* [**domain**](https://github.com/swapnil-musale/JetJoke/tree/master/domain) - In this module contains core bussiness logic and it doesn't contains any platform related api usage and should only use java/kotlin language apis.
+* [**data**](https://github.com/swapnil-musale/JetJoke/tree/master/data) - This module is mainly responsible for accessing data from remote or local source which is being called from domain module only.
+
+![Clean-Architecture-in-Android](https://github.com/swapnil-musale/JetJoke/assets/15209914/526ea05d-d3d1-49da-b034-74628871a774)
+
+## ๐งช Testing (ToDo):
+* Unit & UI tests are under ToDo list and will be done soon - please watch out this space after some time for more info this section.
+
+## ๐ฟ Branches :
+* [**master**](https://github.com/swapnil-musale/JetJoke) - master branch will contain the production code which is deployed by [CD Pipeline](https://github.com/swapnil-musale/JetJoke/actions/workflows/android_cd.yml).
+* [**development**](https://github.com/swapnil-musale/JetJoke/tree/development) - development branch will contain the on-going app feature developement or bug fix code which is targeted for upcoming release validated by [CI Pipeline](https://github.com/swapnil-musale/JetJoke/actions/workflows/android_ci.yml).
+
+## ๐ง ToDo's :
+- [ ] Display Joke by selected Category
+- [ ] Search Joke functionality
+- [ ] Unit Testing
+- [ ] UI Testing
+- [ ] Offline Capability for jokes
+
+## ๐ Contributions :
+We welcome contributions to improve this project, Whether you want to fix a bug, implement a new feature, or suggest an enhancement, we're open to your ideas. Please create the issue at [here](https://github.com/swapnil-musale/JetJoke/issues) & If you have implemented some changes then raise the Pull request over ```development``` branch.
+
+## ๐ค acknowledgement :
+JetJoke project use [Joke API](https://sv443.net/jokeapi/v2/) to fetch and display joke's in app.
+
+## Connect with me:
+[![Github Profile](https://skillicons.dev/icons?i=github)](https://github.com/swapnil-musale)
+[![LinkedIn](https://skillicons.dev/icons?i=linkedin)](https://linkedin.com/in/swapnil-musale)
+
+## License :
+```
+Copyright 2023 Swapnil Musale
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+```
+
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 658d6af..3c0dfb6 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -14,8 +14,8 @@ android {
applicationId = "com.devx.jetjoke"
minSdk = 21
targetSdk = 34
- versionCode = 30
- versionName = "1.0.3"
+ versionCode = 31
+ versionName = "1.0.4"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
diff --git a/build.gradle.kts b/build.gradle.kts
index 0b8e16a..57cedbc 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -8,3 +8,26 @@ plugins {
alias(libs.plugins.kotlin.kapt) apply false
alias(libs.plugins.kotlin.ksp) apply false
}
+
+tasks.register("copyGitHooks", Copy::class.java) {
+ description = "Copies the git hooks from /git-hooks to the .git folder."
+ group = "git hooks"
+ from("$rootDir/git-hooks/pre-commit")
+ into("$rootDir/.git/hooks/")
+}
+
+tasks.register("installGitHooks", Exec::class.java) {
+ description = "Installs the pre-commit git hooks from /git-hooks."
+ group = "git hooks"
+ workingDir = rootDir
+ commandLine = listOf("chmod")
+ args("-R", "+x", ".git/hooks/")
+ dependsOn("copyGitHooks")
+ doLast {
+ logger.info("Git hook installed successfully.")
+ }
+}
+
+afterEvaluate {
+ tasks.getByPath(":app:preBuild").dependsOn(":installGitHooks")
+}
diff --git a/git-hooks/pre-commit b/git-hooks/pre-commit
new file mode 100755
index 0000000..b3a82e4
--- /dev/null
+++ b/git-hooks/pre-commit
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+# pre-commit hook will run every time when we try to commit code through Android Studio IDE or Command Line
+# - It will run the unit test before committing code
+# It will return exit 0 if everything well and good else return other than zero with valid message to fix it.
+#
+
+echo "Running Unit Tests ..."
+bash ./gradlew test --stacktrace
+
+status=$?
+
+if [ "$status" = 0 ] ; then
+ echo "Unit test passed successfully."
+ exit 0
+else
+ echo 1>&2 "Unit test failed."
+ exit 1
+fi