Skip to content
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

Issue 06 Add dependency injection #10

Merged
merged 3 commits into from
Jan 29, 2020
Merged
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
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ dependencies {
implementation("com.squareup.okhttp3:logging-interceptor:4.0.1")
implementation("com.airbnb.android:lottie:3.3.0")
implementation("us.feras.mdv:markdownview:1.1.0")
implementation("org.koin:koin-android:2.0.1")
implementation("org.koin:koin-androidx-scope:2.0.1")
implementation("org.koin:koin-androidx-viewmodel:2.0.1")
kapt("com.github.bumptech.glide:compiler:4.11.0")
testImplementation("junit:junit:4.12")
androidTestImplementation("androidx.test:runner:1.2.0")
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
android:theme="@style/AppTheme"
android:name=".App">

<activity android:name=".reposlist.presentation.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/dev/claucookielabs/kotlinreposapp/App.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.claucookielabs.kotlinreposapp

import android.app.Application

class App : Application() {

override fun onCreate() {
super.onCreate()
initKoin()
}
}
51 changes: 51 additions & 0 deletions app/src/main/java/dev/claucookielabs/kotlinreposapp/di.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package dev.claucookielabs.kotlinreposapp

import dev.claucookielabs.kotlinreposapp.common.data.datasource.GithubDataSource
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubContentServiceFactory
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubRemoteDataSource
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubServiceFactory
import dev.claucookielabs.kotlinreposapp.common.data.repository.GithubDataRepository
import dev.claucookielabs.kotlinreposapp.common.domain.GithubRepository
import dev.claucookielabs.kotlinreposapp.repodetail.domain.GetReadmeFileContent
import dev.claucookielabs.kotlinreposapp.repodetail.presentation.RepoDetailActivity
import dev.claucookielabs.kotlinreposapp.repodetail.presentation.RepoDetailViewModel
import dev.claucookielabs.kotlinreposapp.reposlist.domain.GetListOfRepos
import dev.claucookielabs.kotlinreposapp.reposlist.presentation.MainActivity
import dev.claucookielabs.kotlinreposapp.reposlist.presentation.MainViewModel
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.context.startKoin
import org.koin.core.logger.Level
import org.koin.core.qualifier.named
import org.koin.dsl.module

fun App.initKoin() {
startKoin {
androidLogger(Level.DEBUG)
androidContext(this@initKoin)
modules(listOf(appModule, dataModule, scopedModules))
}
}

private val appModule = module {
single { GithubServiceFactory.create() }
single { GithubContentServiceFactory.create() }
}

private val dataModule = module {
factory<GithubRepository> { GithubDataRepository(get()) }
factory<GithubDataSource> { GithubRemoteDataSource(get(), get()) }
}

private val scopedModules = module {
scope(named<MainActivity>()) {
viewModel { MainViewModel(get()) }
scoped { GetListOfRepos(get()) }
}

scope(named<RepoDetailActivity>()) {
viewModel { RepoDetailViewModel(get()) }
scoped { GetReadmeFileContent(get()) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package dev.claucookielabs.kotlinreposapp.repodetail.presentation

import android.os.Bundle
import android.view.MenuItem
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import dev.claucookielabs.kotlinreposapp.R
import dev.claucookielabs.kotlinreposapp.common.domain.model.Repo
import dev.claucookielabs.kotlinreposapp.common.presentation.utils.REPO_EXTRA
import dev.claucookielabs.kotlinreposapp.databinding.ActivityRepoDetailBinding
import org.koin.androidx.scope.currentScope
import org.koin.androidx.viewmodel.ext.android.viewModel

/**
* This class will display the complete information for a repository.
Expand All @@ -29,7 +30,7 @@ import dev.claucookielabs.kotlinreposapp.databinding.ActivityRepoDetailBinding
*/
class RepoDetailActivity : AppCompatActivity() {

private val viewModel: RepoDetailViewModel by viewModels { RepoDetailViewModelFactory() }
private val viewModel: RepoDetailViewModel by currentScope.viewModel(this)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package dev.claucookielabs.kotlinreposapp.repodetail.presentation

import androidx.lifecycle.*
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubContentServiceFactory
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubRemoteDataSource
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubServiceFactory
import dev.claucookielabs.kotlinreposapp.common.data.repository.GithubDataRepository
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dev.claucookielabs.kotlinreposapp.common.domain.model.Repo
import dev.claucookielabs.kotlinreposapp.common.domain.model.ResultWrapper
import dev.claucookielabs.kotlinreposapp.repodetail.domain.GetReadmeFileContent
Expand Down Expand Up @@ -40,19 +39,3 @@ class RepoDetailViewModel(private val getReadmeFileContent: GetReadmeFileContent
}
}
}

class RepoDetailViewModelFactory : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val remoteDataSource = GithubRemoteDataSource(
GithubServiceFactory.create(),
GithubContentServiceFactory.create()
)
val githubRepository = GithubDataRepository(remoteDataSource)
val getReadmeFileContent =
GetReadmeFileContent(
githubRepository
)
return RepoDetailViewModel(getReadmeFileContent) as T
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package dev.claucookielabs.kotlinreposapp.reposlist.domain

import dev.claucookielabs.kotlinreposapp.common.data.repository.GithubDataRepository
import dev.claucookielabs.kotlinreposapp.common.domain.BaseRequest
import dev.claucookielabs.kotlinreposapp.common.domain.GithubRepository
import dev.claucookielabs.kotlinreposapp.common.domain.UseCase
import dev.claucookielabs.kotlinreposapp.common.domain.model.Repo
import dev.claucookielabs.kotlinreposapp.common.domain.model.ResultWrapper

class GetListOfRepos(private val githubRepository: GithubDataRepository) :
class GetListOfRepos(private val githubRepository: GithubRepository) :
UseCase<GetReposRequest, ResultWrapper<List<Repo>>> {

override suspend fun execute(request: GetReposRequest): ResultWrapper<List<Repo>> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package dev.claucookielabs.kotlinreposapp.reposlist.presentation

import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import dev.claucookielabs.kotlinreposapp.R
import dev.claucookielabs.kotlinreposapp.databinding.ActivityMainBinding
import dev.claucookielabs.kotlinreposapp.reposlist.ui.ReposAdapter
import org.koin.androidx.scope.currentScope
import org.koin.androidx.viewmodel.ext.android.viewModel

/**
* This class will display a list of repositories using Kotlin language.
Expand Down Expand Up @@ -37,7 +38,7 @@ import dev.claucookielabs.kotlinreposapp.reposlist.ui.ReposAdapter
*/
class MainActivity : AppCompatActivity() {

private val mainViewModel: MainViewModel by viewModels { MainViewModelFactory() }
private val mainViewModel: MainViewModel by currentScope.viewModel(this)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package dev.claucookielabs.kotlinreposapp.reposlist.presentation

import androidx.lifecycle.*
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubContentServiceFactory
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubRemoteDataSource
import dev.claucookielabs.kotlinreposapp.common.data.datasource.remote.GithubServiceFactory
import dev.claucookielabs.kotlinreposapp.common.data.repository.GithubDataRepository
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dev.claucookielabs.kotlinreposapp.common.domain.model.ResultWrapper
import dev.claucookielabs.kotlinreposapp.reposlist.domain.GetListOfRepos
import dev.claucookielabs.kotlinreposapp.reposlist.domain.GetReposRequest
Expand Down Expand Up @@ -33,16 +32,3 @@ class MainViewModel(private val getListOfRepos: GetListOfRepos) : ViewModel() {
}
}
}

class MainViewModelFactory : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val remoteDataSource = GithubRemoteDataSource(
GithubServiceFactory.create(),
GithubContentServiceFactory.create()
)
val repository = GithubDataRepository(remoteDataSource)
val useCase = GetListOfRepos(repository)
return MainViewModel(useCase) as T
}

}