Skip to content

[ADD] [REFACOTR] KOIN for DI #20

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 20 additions & 17 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ android {
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "com.task.CustomTestRunner"
}
buildFeatures{
viewBinding = true
buildFeatures {
viewBinding = true
}
buildTypes {
debug {
Expand Down Expand Up @@ -62,7 +62,10 @@ android {
pickFirst 'META-INF/atomicfu.kotlin_module'
pickFirst 'META-INF/kotlinx-coroutines-core.kotlin_module'
pickFirst 'META-INF/kotlinx-coroutines-io.kotlin_module'
exclude 'META-INF/AL2.0'
exclude 'META-INF/LGPL2.1'
}

testOptions {
unitTests.returnDefaultValues = true
}
Expand Down Expand Up @@ -109,36 +112,29 @@ dependencies {
androidTestImplementation 'org.assertj:assertj-core:3.16.1'
androidTestImplementation "androidx.arch.core:core-testing:2.1.0"
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.3.0'
androidTestImplementation ('androidx.test.espresso:espresso-core:3.2.0',{
androidTestImplementation('androidx.test.espresso:espresso-core:3.2.0', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'androidx.test:rules:1.3.0'
androidTestImplementation 'androidx.test:runner:1.3.0'
implementation 'androidx.test.espresso:espresso-idling-resource:3.3.0'
implementation 'androidx.test.espresso:espresso-contrib:3.3.0'
implementation 'androidx.arch.core:core-testing:2.1.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.9'

/**-------------------------------------------------------------**/

//android support & recyclerview
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0-alpha02'
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.core:core-ktx:1.3.1'
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.activity:activity:1.2.0-alpha08'
implementation 'androidx.activity:activity-ktx:1.2.0-alpha05'
implementation 'androidx.activity:activity-ktx:1.2.0-alpha08'

//Dagger
implementation 'com.google.dagger:dagger:2.28.3'
kapt 'com.google.dagger:dagger-compiler:2.28.3'
implementation 'com.google.dagger:dagger-android:2.28.3'
implementation 'com.google.dagger:dagger-android-support:2.28.3'
kapt 'com.google.dagger:dagger-android-processor:2.28.3'
kaptAndroidTest 'com.google.dagger:dagger-compiler:2.28.3'

//Logging
implementation 'com.squareup.okhttp3:logging-interceptor:4.8.1'
Expand All @@ -160,9 +156,16 @@ dependencies {
androidTestImplementation "io.mockk:mockk-android:1.10.0"

//coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.4'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.7'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha04'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha04'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha07'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha07'

// KOIN
implementation 'org.koin:koin-android:2.0.1'
implementation 'org.koin:koin-androidx-viewmodel:2.0.1'
implementation 'org.koin:koin-androidx-scope:2.0.1'
implementation 'org.koin:koin-androidx-ext:2.0.1'
}
40 changes: 21 additions & 19 deletions app/src/main/java/com/task/App.kt
Original file line number Diff line number Diff line change
@@ -1,35 +1,37 @@
package com.task

import android.content.Context
import androidx.multidex.MultiDexApplication
import com.task.di.DaggerAppComponent
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
import com.task.di.*
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin

/**
* Created by AhmedEltaher
*/

open class App : MultiDexApplication(), HasAndroidInjector {

@Inject
lateinit var androidInjector: DispatchingAndroidInjector<Any>

override fun androidInjector(): AndroidInjector<Any> = androidInjector
open class App : MultiDexApplication(){

override fun onCreate() {
super.onCreate()
context = applicationContext
initDagger()
initKoin()
}

open fun initDagger() {
DaggerAppComponent.builder().build().inject(this)
open fun initKoin() {
startKoin {
androidLogger()
// this provides app context anywhere using get()
androidContext(this@App.applicationContext)
modules(
listOf(
AppModule,
NetworkModule,
RepositoriesModule,
ViewModelModule,
ErrorModule
)
)
}
}

companion object {
lateinit var context: Context
}
}
8 changes: 6 additions & 2 deletions app/src/main/java/com/task/data/DataRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ import com.task.data.remote.RemoteData
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext


/**
* Created by AhmedEltaher
*/

class DataRepository @Inject constructor(private val remoteRepository: RemoteData, private val localRepository: LocalData, private val ioDispatcher: CoroutineContext) : DataRepositorySource {
class DataRepository
constructor(
private val remoteRepository: RemoteData,
private val localRepository: LocalData,
private val ioDispatcher: CoroutineContext
) : DataRepositorySource {

override suspend fun requestRecipes(): Flow<Resource<Recipes>> {
return flow {
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/java/com/task/data/error/mapper/ErrorMapper.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package com.task.data.error.mapper

import android.content.Context
import com.task.App
import com.task.R
import com.task.data.error.*
import javax.inject.Inject

class ErrorMapper @Inject constructor() : ErrorMapperInterface {
class ErrorMapper constructor(private val context: Context) : ErrorMapperInterface {

override fun getErrorString(errorId: Int): String {
return App.context.getString(errorId)
return context.getString(errorId)
}

override val errorsMap: Map<Int, String>
Expand Down
8 changes: 2 additions & 6 deletions app/src/main/java/com/task/data/local/LocalData.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package com.task.data.local

import android.content.Context
import android.content.SharedPreferences
import com.task.App.Companion.context
import com.task.data.Resource
import com.task.data.dto.login.LoginRequest
import com.task.data.dto.login.LoginResponse
import com.task.FAVOURITES_KEY
import com.task.SHARED_PREFERENCES_FILE_NAME
import com.task.data.error.PASS_WORD_ERROR
import javax.inject.Inject

/**
* Created by AhmedEltaher
*/

class LocalData @Inject constructor() {
class LocalData constructor(private val context: Context) {

fun doLogin(loginRequest: LoginRequest): Resource<LoginResponse> {
if (loginRequest == LoginRequest("ahmed@ahmed.ahmed", "ahmed")) {
Expand Down
13 changes: 7 additions & 6 deletions app/src/main/java/com/task/data/remote/RemoteData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,19 @@ import com.task.data.dto.recipes.RecipesItem
import com.task.data.error.NETWORK_ERROR
import com.task.data.error.NO_INTERNET_CONNECTION
import com.task.data.remote.service.RecipesService
import com.task.di.ServiceGenerator
import com.task.utils.Network
import com.task.utils.NetworkConnectivity
import retrofit2.Response
import java.io.IOException
import javax.inject.Inject


/**
* Created by AhmedEltaher
*/
class RemoteData
constructor(
private val serviceGenerator: ServiceGenerator,
private val networkConnectivity: Network
) : RemoteDataSource {

class RemoteData @Inject
constructor(private val serviceGenerator: ServiceGenerator, private val networkConnectivity: NetworkConnectivity) : RemoteDataSource {
override suspend fun requestRecipes(): Resource<Recipes> {
val recipesService = serviceGenerator.createService(RecipesService::class.java)
return when (val response = processCall(recipesService::fetchRecipes)) {
Expand Down
73 changes: 0 additions & 73 deletions app/src/main/java/com/task/data/remote/ServiceGenerator.kt

This file was deleted.

24 changes: 0 additions & 24 deletions app/src/main/java/com/task/di/ActivityModuleBuilder.kt

This file was deleted.

26 changes: 0 additions & 26 deletions app/src/main/java/com/task/di/AppComponent.kt

This file was deleted.

Loading