Skip to content

Commit

Permalink
- add dagger 2 dependency injection
Browse files Browse the repository at this point in the history
  • Loading branch information
10zgurr committed Nov 17, 2019
1 parent a8217cb commit 055c8cc
Show file tree
Hide file tree
Showing 15 changed files with 152 additions and 25 deletions.
4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ android {

dependencies {
def room_version = "2.2.1"
def dagger_version = "2.25.2"
implementation fileTree(dir: 'libs', include: ['*.jar'])
// kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
Expand All @@ -50,6 +51,9 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
implementation "androidx.lifecycle:lifecycle-runtime:2.1.0"
kapt "androidx.lifecycle:lifecycle-compiler:2.1.0"
// dagger 2
api "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"

testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
package com.sample.libraryapplication

import android.app.Application
import com.sample.libraryapplication.dagger.components.DaggerLibraryComponent
import com.sample.libraryapplication.dagger.components.LibraryComponent
import com.sample.libraryapplication.dagger.modules.AppModule

class LibraryApplication : Application() {

companion object {
lateinit var instance: LibraryApplication
}
lateinit var libraryComponent: LibraryComponent

override fun onCreate() {
super.onCreate()
instance = this

libraryComponent = DaggerLibraryComponent
.builder()
.appModule(AppModule(this))
.build()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.sample.libraryapplication.dagger.builders

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.sample.libraryapplication.repository.BookRepository
import com.sample.libraryapplication.repository.CategoryRepository
import com.sample.libraryapplication.viewmodel.BookListViewModel
import javax.inject.Inject

class BookListViewModelFactory @Inject constructor(private var categoryRepository: CategoryRepository,
private var bookRepository: BookRepository) : ViewModelProvider.Factory {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return BookListViewModel(categoryRepository, bookRepository) as T
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.sample.libraryapplication.dagger.builders

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.sample.libraryapplication.repository.BookRepository
import com.sample.libraryapplication.viewmodel.BookViewModel
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class BookViewModelFactory @Inject constructor(private var bookRepository: BookRepository) : ViewModelProvider.Factory {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return BookViewModel(bookRepository) as T
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.sample.libraryapplication.dagger.components

import com.sample.libraryapplication.dagger.modules.AppModule
import com.sample.libraryapplication.dagger.modules.LibraryModule
import com.sample.libraryapplication.view.BookActivity
import com.sample.libraryapplication.view.BookListActivity
import dagger.Component
import javax.inject.Singleton

@Singleton
@Component(modules = [AppModule::class, LibraryModule::class])
interface LibraryComponent {
fun inject(bookActivity: BookActivity)
fun inject(bookListActivity: BookListActivity)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sample.libraryapplication.dagger.modules

import android.app.Application
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module
class AppModule(application: Application) {

private var libraryApplication = application

@Singleton
@Provides
fun providesApplication(): Application {
return libraryApplication
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sample.libraryapplication.dagger.modules

import android.app.Application
import com.sample.libraryapplication.repository.BookRepository
import com.sample.libraryapplication.repository.CategoryRepository
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module
class LibraryModule {

@Singleton
@Provides
fun providesBookRepository(application: Application): BookRepository {
return BookRepository(application)
}

@Singleton
@Provides
fun providesCategoryRepository(application: Application): CategoryRepository {
return CategoryRepository(application)
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.sample.libraryapplication.database

import android.app.Application
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import com.sample.libraryapplication.LibraryApplication
import com.sample.libraryapplication.database.dao.BookDAO
import com.sample.libraryapplication.database.dao.CategoryDAO
import com.sample.libraryapplication.database.entity.BookEntity
Expand Down Expand Up @@ -48,12 +48,12 @@ abstract class LibraryDatabase : RoomDatabase() {
val book7 = BookEntity(7, "Can I Run?", 99.99, NOVELS_CATEGORY_ID)
val book8 = BookEntity(8, "Basic of Physics", 10.50, EDUCATIONAL_BOOKS_CATEGORY_ID)

val categoryDAO = getInstance().getCategoryDAO()
val categoryDAO = getInstance(libraryApplication).getCategoryDAO()
categoryDAO.addCategory(category1)
categoryDAO.addCategory(category2)
categoryDAO.addCategory(category3)

val bookDAO = getInstance().getBookDAO()
val bookDAO = getInstance(libraryApplication).getBookDAO()
bookDAO.addBook(book1)
bookDAO.addBook(book2)
bookDAO.addBook(book3)
Expand All @@ -64,10 +64,13 @@ abstract class LibraryDatabase : RoomDatabase() {
bookDAO.addBook(book8)
}

private lateinit var libraryApplication: Application

private var instance: LibraryDatabase? = null
fun getInstance(): LibraryDatabase {
fun getInstance(application: Application): LibraryDatabase {
libraryApplication = application
return if (instance == null) synchronized(this) {
instance = Room.databaseBuilder(LibraryApplication.instance, LibraryDatabase::class.java, "library_database")
instance = Room.databaseBuilder(application, LibraryDatabase::class.java, "library_database")
.fallbackToDestructiveMigration()
.addCallback(databaseCallback)
.build()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sample.libraryapplication.repository

import android.app.Application
import androidx.lifecycle.LiveData
import com.sample.libraryapplication.database.LibraryDatabase
import com.sample.libraryapplication.database.dao.BookDAO
Expand All @@ -8,9 +9,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class BookRepository {
class BookRepository(application: Application) {

private var bookDAO: BookDAO = LibraryDatabase.getInstance().getBookDAO()
private var bookDAO: BookDAO = LibraryDatabase.getInstance(application).getBookDAO()

fun getBooks(categoryID: Long): LiveData<List<BookEntity>> {
return bookDAO.getCategoryBooks(categoryID)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sample.libraryapplication.repository

import android.app.Application
import androidx.lifecycle.LiveData
import com.sample.libraryapplication.database.LibraryDatabase
import com.sample.libraryapplication.database.dao.CategoryDAO
Expand All @@ -8,9 +9,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class CategoryRepository {
class CategoryRepository(application: Application) {

private var categoryDAO: CategoryDAO = LibraryDatabase.getInstance().getCategoryDAO()
private var categoryDAO: CategoryDAO = LibraryDatabase.getInstance(application).getCategoryDAO()

fun getCategories(): LiveData<List<CategoryEntity>> {
return categoryDAO.getAllCategories()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@ package com.sample.libraryapplication.view

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.sample.libraryapplication.LibraryApplication
import com.sample.libraryapplication.R
import com.sample.libraryapplication.dagger.builders.BookViewModelFactory
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.databinding.ActivityBookBinding
import com.sample.libraryapplication.viewmodel.BookViewModel
import kotlinx.android.synthetic.main.activity_book.*
import javax.inject.Inject

class BookActivity : AppCompatActivity() {

Expand All @@ -23,10 +24,15 @@ class BookActivity : AppCompatActivity() {
private var selectedBook: BookEntity? = null
private var selectedCategoryId: Long? = null

@Inject
lateinit var bookViewModelFactory: BookViewModelFactory

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_book)

injectDagger()

getIntentExtras()

createViewModel()
Expand All @@ -36,6 +42,10 @@ class BookActivity : AppCompatActivity() {
observeViewModel()
}

private fun injectDagger() {
LibraryApplication.instance.libraryComponent.inject(this)
}

private fun getIntentExtras() {
if(intent?.extras != null && intent?.extras!!.containsKey("is_update_book"))
isUpdateBook = intent.getBooleanExtra("is_update_book", false)
Expand All @@ -44,7 +54,7 @@ class BookActivity : AppCompatActivity() {
}

private fun createViewModel() {
bookViewModel = ViewModelProviders.of(this)[BookViewModel::class.java]
bookViewModel = ViewModelProviders.of(this, bookViewModelFactory)[BookViewModel::class.java]
bookViewModel.selectedCategoryId = selectedCategoryId
bookViewModel.selectedBook = selectedBook
bookViewModel.isUpdateBook = isUpdateBook
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.sample.libraryapplication.LibraryApplication
import com.sample.libraryapplication.R
import com.sample.libraryapplication.dagger.builders.BookListViewModelFactory
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.database.entity.CategoryEntity
import com.sample.libraryapplication.databinding.ActivityBookListBinding
import com.sample.libraryapplication.viewmodel.BookListViewModel
import kotlinx.android.synthetic.main.activity_book_list.*
import javax.inject.Inject

class BookListActivity : AppCompatActivity() {

Expand All @@ -33,17 +36,30 @@ class BookListActivity : AppCompatActivity() {
private var booksAdapter: BooksAdapter? = null
private var selectedCategory: CategoryEntity? = null

@Inject
lateinit var bookListViewModelFactory: BookListViewModelFactory

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

bookListViewModel = ViewModelProviders.of(this)[BookListViewModel::class.java]
bookListClickHandlers = BookListClickHandlers()
injectDagger()

createViewModel()

setBinding()

observeViewModel(bookListViewModel)
}

private fun createViewModel() {
bookListViewModel = ViewModelProviders.of(this, bookListViewModelFactory)[BookListViewModel::class.java]
bookListClickHandlers = BookListClickHandlers()
}

private fun injectDagger() {
LibraryApplication.instance.libraryComponent.inject(this)
}

private fun observeViewModel(bookListViewModel: BookListViewModel) {
bookListViewModel.allCategories.observe(this, Observer { list ->
if (!isDestroyed) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
package com.sample.libraryapplication.viewmodel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.database.entity.CategoryEntity
import com.sample.libraryapplication.repository.BookRepository
import com.sample.libraryapplication.repository.CategoryRepository

class BookListViewModel(application: Application): AndroidViewModel(application) {

private var categoryRepository = CategoryRepository()
private var bookRepository = BookRepository()
class BookListViewModel(categoryRepository: CategoryRepository, private var bookRepository: BookRepository) : ViewModel() {

var allCategories: LiveData<List<CategoryEntity>> = categoryRepository.getCategories()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.sample.libraryapplication.viewmodel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.repository.BookRepository

class BookViewModel(application: Application) : AndroidViewModel(application) {
class BookViewModel(private var bookRepository: BookRepository) : ViewModel() {

private var bookRepository = BookRepository()
val isBookNameEmpty = MutableLiveData<Boolean>()
val isBookPriceEmpty = MutableLiveData<Boolean>()
val shouldFinishActivity = MutableLiveData<Boolean>()
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ buildscript {

}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.1'
classpath 'com.android.tools.build:gradle:3.5.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down

0 comments on commit 055c8cc

Please sign in to comment.