This is a News application with MVVM Architecture and Jetpack Components with unit and instrumentation testing.
- MVVM Architecture
- Offline First architecture with a single source of truth
- Kotlin
- Dagger
- Room Database
- Retrofit
- Coroutines
- Flow
- StateFlow
- ViewBinding
- Pagination
- Unit Test
- UI Test
- NewsApp
- Instant search using Flow operators
- Debounce
- Filter
- DistinctUntilChanged
- FlatMapLatest
- Offline news
- Pagination
- Unit Test
- Mockito
- Turbine https://github.com/cashapp/turbine
- Espresso
- TopHeadlines of the news
- Country-wise news
- Multiple Languages selection-wise news
- Multiple sources wise news
- Recycler View for listing
implementation "androidx.recyclerview:recyclerview:1.2.1"
implementation 'androidx.recyclerview:recyclerview-selection:1.1.0' //multi item selection
- Glide for image loading
implementation 'com.github.bumptech.glide:glide:4.11.0'
- Retrofit for networking
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.8.0'
- Android Lifecycle aware component
implementation 'android.arch.lifecycle:extensions:1.1.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
- Dagger for dependency Injection
implementation "com.google.dagger:dagger:2.42"
kapt "com.google.dagger:dagger-compiler:2.42"
- For WebView browser
implementation 'androidx.browser:browser:1.4.0'
- Room Database
implementation "androidx.room:room-runtime:2.4.2"
kapt "androidx.room:room-compiler:2.4.2"
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:2.4.2"
- Paging library
implementation "androidx.paging:paging-runtime:3.1.1"
- Local Unit test
testImplementation 'junit:junit:4.13.2'
testImplementation "org.mockito:mockito-core:4.9.0"
kaptTest "com.google.dagger:dagger-compiler:2.42"
testImplementation "android.arch.core:core-testing:1.1.1"
testImplementation "org.hamcrest:hamcrest-library:2.1"
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1'
testImplementation 'app.cash.turbine:turbine:0.12.1'
testImplementation 'androidx.test.espresso:espresso-core:3.5.0'
- UI Test
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
androidTestImplementation "androidx.test.espresso:espresso-contrib:3.4.0"
androidTestImplementation "androidx.test.espresso:espresso-intents:3.4.0"
androidTestImplementation "org.mockito:mockito-core:4.9.0"
androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1'
androidTestImplementation "org.mockito:mockito-core:4.9.0"
kaptAndroidTest "com.google.dagger:dagger-compiler:2.42"
├── NewsApplication.kt
├── data
│ ├── api
│ ├── local
│ ├── model
│ └── repository
├── di
│ ├── component
│ ├── module
│ ├── qualifiers.kt
│ └── scopes.kt
├── ui
│ ├── MainActivity.kt
│ ├── base
│ ├── country
│ ├── language
│ ├── newsListScreen
│ ├── pagination
│ ├── search
│ ├── sources
│ └── topheadline
└── utils
├── AppConstant.kt
├── DispatcherProvider.kt
├── Extentions.kt
├── NetworkHelper.kt
├── Resource.kt
├── Status.kt
├── TypeAliases.kt
└── network