Skip to content
This repository was archived by the owner on Dec 16, 2023. It is now read-only.

Commit ff23706

Browse files
committed
Replace Koin with Hilt
1 parent 941e59a commit ff23706

63 files changed

Lines changed: 413 additions & 274 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/build.gradle

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-kapt'
44
apply plugin: 'kotlinx-serialization'
55
apply plugin: 'kotlin-parcelize'
6+
apply plugin: 'dagger.hilt.android.plugin'
67

78
// A properties file is located at projectFolder/keys.properties
89
def keysPropertiesFile = rootProject.file("keys.properties")
@@ -78,6 +79,7 @@ dependencies {
7879
implementation "androidx.recyclerview:recyclerview:1.2.1"
7980
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
8081
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
82+
implementation "androidx.activity:activity-ktx:1.2.3"
8183

8284
// Firebase libraries
8385
implementation "com.google.firebase:firebase-messaging:22.0.0"
@@ -92,9 +94,8 @@ dependencies {
9294
kapt "androidx.room:room-compiler:2.3.0"
9395

9496
// DI
95-
implementation "io.insert-koin:koin-core:2.2.3"
96-
implementation "io.insert-koin:koin-android:2.2.3"
97-
implementation "io.insert-koin:koin-androidx-viewmodel:2.2.3"
97+
implementation "com.google.dagger:hilt-android:2.35"
98+
kapt "com.google.dagger:hilt-compiler:2.35"
9899

99100
// Other libraries
100101
implementation "com.squareup.picasso:picasso:2.71828"
@@ -108,18 +109,21 @@ dependencies {
108109
implementation "com.android.volley:volley:1.2.0"
109110

110111
// Test libraries
111-
testImplementation "junit:junit:4.13"
112+
testImplementation "junit:junit:4.13.2"
112113
testImplementation "io.mockk:mockk:1.11.0"
113114
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.5"
114115
testImplementation "androidx.arch.core:core-testing:2.1.0"
115116
androidTestImplementation "io.mockk:mockk:1.11.0"
116117
androidTestImplementation "io.mockk:mockk-android:1.11.0"
117-
androidTestImplementation "androidx.test:runner:1.3.0-rc01"
118-
androidTestImplementation "androidx.test:rules:1.3.0-rc01"
119-
androidTestImplementation "androidx.test.espresso:espresso-core:3.3.0-rc01"
120-
androidTestImplementation "androidx.test.espresso:espresso-intents:3.3.0-rc01"
121-
androidTestImplementation "androidx.test.espresso:espresso-contrib:3.3.0-rc01"
122-
androidTestImplementation "androidx.test:core:1.2.0"
118+
androidTestImplementation "androidx.test:runner:1.4.0"
119+
androidTestImplementation "androidx.test:rules:1.4.0"
120+
androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0"
121+
androidTestImplementation "androidx.test.espresso:espresso-intents:3.4.0"
122+
androidTestImplementation "androidx.test.espresso:espresso-contrib:3.4.0"
123+
androidTestImplementation "androidx.test:core:1.4.0"
124+
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.35'
125+
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.35'
126+
123127
}
124128

125129
apply plugin: 'com.google.gms.google-services'

app/src/androidTest/java/com/marknkamau/justjava/SmokeTest.kt

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,20 @@ import androidx.test.core.app.ActivityScenario
44
import com.marknjunge.core.data.model.Resource
55
import com.marknkamau.justjava.testUtils.*
66
import com.marknkamau.justjava.ui.main.MainActivity
7+
import dagger.hilt.android.testing.HiltAndroidRule
8+
import dagger.hilt.android.testing.HiltAndroidTest
79
import io.mockk.coEvery
810
import io.mockk.just
911
import io.mockk.runs
12+
import org.junit.Rule
1013
import org.junit.Test
1114

15+
@HiltAndroidTest
1216
class SmokeTest {
17+
18+
@get:Rule(order = 0)
19+
var hiltRule = HiltAndroidRule(this)
20+
1321
@Test
1422
fun canPerformAppFunctions() {
1523
setupMockResponses()
@@ -33,14 +41,22 @@ class SmokeTest {
3341
}
3442

3543
private fun setupMockResponses() {
36-
coEvery { TestApp.mockProductsRepository.getProducts() } returns Resource.Success(listOf(SampleData.product))
37-
coEvery { TestApp.mockPreferencesRepository.isSignedIn } returns true
38-
coEvery { TestApp.mockPreferencesRepository.user } returns SampleData.user
39-
coEvery { TestApp.mockDbRepository.saveItemToCart(any(), any()) } just runs
40-
coEvery { TestApp.mockDbRepository.getCartItems() } returns SampleData.cartItems
41-
coEvery { TestApp.mockCartRepository.verifyOrder(any()) } returns Resource.Success(listOf(SampleData.verifyOrderResponse))
42-
coEvery { TestApp.mockOrdersRepository.placeOrder(any()) } returns Resource.Success(SampleData.order)
43-
coEvery { TestApp.mockDbRepository.clearCart() } just runs
44-
coEvery { TestApp.mockOrdersRepository.getOrderById(any()) } returns Resource.Success(SampleData.order)
44+
coEvery { TestRepositoriesModule.mockProductsRepository.getProducts() } returns Resource.Success(
45+
listOf(
46+
SampleData.product
47+
)
48+
)
49+
coEvery { TestRepositoriesModule.mockPreferencesRepository.isSignedIn } returns true
50+
coEvery { TestRepositoriesModule.mockPreferencesRepository.user } returns SampleData.user
51+
coEvery { TestRepositoriesModule.mockDbRepository.saveItemToCart(any(), any()) } just runs
52+
coEvery { TestRepositoriesModule.mockDbRepository.getCartItems() } returns SampleData.cartItems
53+
coEvery { TestRepositoriesModule.mockCartRepository.verifyOrder(any()) } returns Resource.Success(
54+
listOf(
55+
SampleData.verifyOrderResponse
56+
)
57+
)
58+
coEvery { TestRepositoriesModule.mockOrdersRepository.placeOrder(any()) } returns Resource.Success(SampleData.order)
59+
coEvery { TestRepositoriesModule.mockDbRepository.clearCart() } just runs
60+
coEvery { TestRepositoriesModule.mockOrdersRepository.getOrderById(any()) } returns Resource.Success(SampleData.order)
4561
}
4662
}

app/src/androidTest/java/com/marknkamau/justjava/testUtils/TestApp.kt

Lines changed: 0 additions & 60 deletions
This file was deleted.

app/src/androidTest/java/com/marknkamau/justjava/testUtils/TestApplicationRunner.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package com.marknkamau.justjava.testUtils
33
import android.app.Application
44
import android.content.Context
55
import androidx.test.runner.AndroidJUnitRunner
6+
import dagger.hilt.android.testing.HiltTestApplication
67

78
@Suppress("unused")
89
class TestApplicationRunner : AndroidJUnitRunner() {
910
override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application {
10-
return super.newApplication(cl, TestApp::class.java.name, context)
11+
return super.newApplication(cl, HiltTestApplication::class.java.name, context)
1112
}
1213
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.marknkamau.justjava.testUtils
2+
3+
import com.marknjunge.core.data.local.PreferencesRepository
4+
import com.marknjunge.core.data.repository.*
5+
import com.marknkamau.justjava.data.db.DbRepository
6+
import com.marknkamau.justjava.di.RepositoriesModule
7+
import com.marknkamau.justjava.utils.NotificationHelper
8+
import dagger.Module
9+
import dagger.Provides
10+
import dagger.hilt.components.SingletonComponent
11+
import dagger.hilt.testing.TestInstallIn
12+
import io.mockk.mockk
13+
14+
@Module
15+
@TestInstallIn(
16+
components = [SingletonComponent::class],
17+
replaces = [RepositoriesModule::class]
18+
)
19+
object TestRepositoriesModule {
20+
val mockPreferencesRepository = mockk<PreferencesRepository>()
21+
val mockNotificationHelper = mockk<NotificationHelper>()
22+
23+
val mockAuthRepository = mockk<AuthRepository>()
24+
val mockProductsRepository = mockk<ProductsRepository>()
25+
val mockUsersRepository = mockk<UsersRepository>()
26+
val mockCartRepository = mockk<CartRepository>()
27+
val mockOrdersRepository = mockk<OrdersRepository>()
28+
val mockPaymentsRepository = mockk<PaymentsRepository>()
29+
30+
val mockDbRepository = mockk<DbRepository>()
31+
32+
@Provides
33+
fun providesDbRepository(): DbRepository = mockDbRepository
34+
35+
@Provides
36+
fun provideProductsRepository(): ProductsRepository = mockProductsRepository
37+
38+
@Provides
39+
fun provideAuthRepository(): AuthRepository = mockAuthRepository
40+
41+
@Provides
42+
fun provideCartRepository(): CartRepository = mockCartRepository
43+
44+
@Provides
45+
fun provideOrdersRepository(): OrdersRepository = mockOrdersRepository
46+
47+
@Provides
48+
fun providePaymentsRepository(): PaymentsRepository = mockPaymentsRepository
49+
50+
@Provides
51+
fun provideUsersRepository(): UsersRepository = mockUsersRepository
52+
}

app/src/main/java/com/marknkamau/justjava/JustJavaApp.kt

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,26 @@ import com.marknjunge.core.data.local.PreferencesRepository
66
import com.marknjunge.core.data.model.Resource
77
import com.marknjunge.core.data.repository.AuthRepository
88
import com.marknjunge.core.data.repository.UsersRepository
9-
import com.marknjunge.core.di.repositoriesModule
10-
import com.marknkamau.justjava.di.appModule
11-
import com.marknkamau.justjava.di.dbModule
12-
import com.marknkamau.justjava.di.viewModelModule
139
import com.marknkamau.justjava.utils.ReleaseTree
1410
import com.marknkamau.justjava.utils.toast
11+
import dagger.hilt.android.HiltAndroidApp
1512
import io.sentry.android.core.SentryAndroid
1613
import kotlinx.coroutines.CoroutineScope
1714
import kotlinx.coroutines.Dispatchers
1815
import kotlinx.coroutines.flow.collect
1916
import kotlinx.coroutines.launch
20-
import org.koin.android.ext.android.inject
21-
import org.koin.android.ext.koin.androidContext
22-
import org.koin.core.context.startKoin
2317
import timber.log.Timber
18+
import javax.inject.Inject
2419

2520
@Suppress("unused")
21+
@HiltAndroidApp
2622
open class JustJavaApp : Application() {
27-
private val preferencesRepository: PreferencesRepository by inject()
28-
private val usersRepository: UsersRepository by inject()
29-
private val authRepository: AuthRepository by inject()
23+
@Inject
24+
lateinit var preferencesRepository: PreferencesRepository
25+
@Inject
26+
lateinit var usersRepository: UsersRepository
27+
@Inject
28+
lateinit var authRepository: AuthRepository
3029

3130
private val coroutineScope = CoroutineScope(Dispatchers.Main)
3231

@@ -46,18 +45,6 @@ open class JustJavaApp : Application() {
4645
}
4746
}
4847

49-
startKoin {
50-
androidContext(this@JustJavaApp)
51-
modules(
52-
listOf(
53-
appModule,
54-
repositoriesModule,
55-
viewModelModule,
56-
dbModule
57-
)
58-
)
59-
}
60-
6148
Places.initialize(this, getString(R.string.google_api_key))
6249

6350
if (preferencesRepository.isSignedIn) {

app/src/main/java/com/marknkamau/justjava/data/db/CartDao.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.marknkamau.justjava.data.db
22

33
import androidx.room.*
4+
import com.marknkamau.justjava.data.models.CartItem
45
import com.marknkamau.justjava.data.models.CartOptionEntity
56
import com.marknkamau.justjava.data.models.CartProductEntity
6-
import com.marknkamau.justjava.data.models.CartItem
77

88
@Dao
99
interface CartDao {

app/src/main/java/com/marknkamau/justjava/data/db/DbRepositoryImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.marknkamau.justjava.data.db
22

33
import com.marknkamau.justjava.data.models.AppProduct
4-
import com.marknkamau.justjava.data.models.CartOptionEntity
54
import com.marknkamau.justjava.data.models.CartItem
5+
import com.marknkamau.justjava.data.models.CartOptionEntity
66
import com.marknkamau.justjava.data.models.CartProductEntity
77
import kotlinx.coroutines.Dispatchers
88
import kotlinx.coroutines.withContext

app/src/main/java/com/marknkamau/justjava/data/models/CartProductEntity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.marknkamau.justjava.data.models
22

33
import android.os.Parcelable
4-
import androidx.room.*
4+
import androidx.room.ColumnInfo
5+
import androidx.room.Entity
6+
import androidx.room.PrimaryKey
57
import kotlinx.parcelize.Parcelize
68

79
@Entity(tableName = "cart_products")

app/src/main/java/com/marknkamau/justjava/data/network/JustJavaFirebaseMessagingService.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@ import com.marknjunge.core.data.model.Resource
99
import com.marknjunge.core.data.repository.UsersRepository
1010
import com.marknkamau.justjava.data.models.NotificationReason
1111
import com.marknkamau.justjava.utils.NotificationHelper
12+
import com.marknkamau.justjava.utils.NotificationHelperImpl
13+
import dagger.hilt.EntryPoint
14+
import dagger.hilt.InstallIn
15+
import dagger.hilt.android.EntryPointAccessors
16+
import dagger.hilt.components.SingletonComponent
1217
import kotlinx.coroutines.CoroutineScope
1318
import kotlinx.coroutines.Dispatchers
1419
import kotlinx.coroutines.launch
15-
import org.koin.android.ext.android.inject
16-
import org.koin.core.component.KoinComponent
1720
import timber.log.Timber
1821

1922
/**
@@ -22,10 +25,19 @@ import timber.log.Timber
2225
* https://github.com/MarkNjunge
2326
*/
2427

25-
class JustJavaFirebaseMessagingService : FirebaseMessagingService(), KoinComponent {
26-
private val notificationHelper: NotificationHelper by inject()
28+
class JustJavaFirebaseMessagingService : FirebaseMessagingService() {
29+
private val notificationHelper: NotificationHelper = NotificationHelperImpl(applicationContext)
2730
private val broadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
28-
private val usersRepository: UsersRepository by inject()
31+
private val usersRepository by lazy {
32+
val entryPoint = EntryPointAccessors.fromApplication(applicationContext, JustJavaFCMEntryPoint::class.java)
33+
entryPoint.usersRepository()
34+
}
35+
36+
@EntryPoint
37+
@InstallIn(SingletonComponent::class)
38+
interface JustJavaFCMEntryPoint {
39+
fun usersRepository(): UsersRepository
40+
}
2941

3042
private val coroutineScope = CoroutineScope(Dispatchers.IO)
3143

0 commit comments

Comments
 (0)